# HG changeset patch # User Pantxo Diribarne # Date 1562694087 -7200 # Node ID 9b8903d3e626a36f01961111164b867b7514e62f # Parent 1ae91e5d70cc1fe849945b6aba6da727b8768ff5 Allow figure "keypressfcn" to work with uipanel on the way (bug #56598) * Panel.cc (Panel::Panel): Make sure the canvas listens to key events when the parent figure has non empty "key*fcn" properties. * Figure.cc (Figure::update): Look for uipanel children objects and update their canvas key event mask when the "key*fcn" are changed. * Canvas.cc (Canvas::canvasKeyPressEvent, Canvas::canvasKeyReleaseEvent): Use the handle of the ancestor figure to post changes since the m_handle may a handle to a uipanel. diff -r 1ae91e5d70cc -r 9b8903d3e626 libgui/graphics/Canvas.cc --- a/libgui/graphics/Canvas.cc Thu Jul 04 21:14:09 2019 +0200 +++ b/libgui/graphics/Canvas.cc Tue Jul 09 19:41:27 2019 +0200 @@ -664,9 +664,10 @@ fprop.set_currentobject (Matrix ()); // Update figure "selectiontype" and "currentpoint" - gh_manager::post_set ( - figObj.get_handle (), "selectiontype", - Utils::figureSelectionType (event, isdblclick), false); + gh_manager::post_set (figObj.get_handle (), "selectiontype", + Utils::figureSelectionType (event, + isdblclick), + false); updateCurrentPoint (figObj, obj, event); @@ -1029,13 +1030,14 @@ graphics_object figObj (obj.get_ancestor ("figure")); updateCurrentPoint (figObj, obj); - } - octave_scalar_map eventData = Utils::makeKeyEventStruct (event); + octave_scalar_map eventData = Utils::makeKeyEventStruct (event); - gh_manager::post_set (m_handle, "currentcharacter", - eventData.getfield ("Character"), false); - gh_manager::post_callback (m_handle, "keypressfcn", eventData); + gh_manager::post_set (figObj.get_handle (), "currentcharacter", + eventData.getfield ("Character"), false); + gh_manager::post_callback (figObj.get_handle (), "keypressfcn", + eventData); + } return true; } @@ -1048,8 +1050,15 @@ { if (! event->isAutoRepeat () && (m_eventMask & KeyRelease)) { - gh_manager::post_callback (m_handle, "keyreleasefcn", - Utils::makeKeyEventStruct (event)); + gh_manager::auto_lock lock; + graphics_object obj = gh_manager::get_object (m_handle); + + if (obj.valid_object ()) + { + graphics_object figObj (obj.get_ancestor ("figure")); + gh_manager::post_callback (figObj.get_handle (), "keyreleasefcn", + Utils::makeKeyEventStruct (event)); + } return true; } diff -r 1ae91e5d70cc -r 9b8903d3e626 libgui/graphics/Figure.cc --- a/libgui/graphics/Figure.cc Thu Jul 04 21:14:09 2019 +0200 +++ b/libgui/graphics/Figure.cc Tue Jul 09 19:41:27 2019 +0200 @@ -425,6 +425,25 @@ m_container->canvas (m_handle)->clearEventMask (Canvas::KeyPress); else m_container->canvas (m_handle)->addEventMask (Canvas::KeyPress); + // Signal the change to uipanels as well + foreach (QObject *qobj, + qWidget ()->findChildren ()) + { + if (qobj->objectName () == "UIPanel") + { + Object *obj = Object::fromQObject (qobj); + + if (obj) + { + if (fp.get_keypressfcn ().isempty ()) + obj->innerContainer ()->canvas (m_handle)-> + clearEventMask (Canvas::KeyPress); + else + obj->innerContainer ()->canvas (m_handle)-> + addEventMask (Canvas::KeyPress); + } + } + } break; case figure::properties::ID_KEYRELEASEFCN: @@ -433,6 +452,26 @@ else m_container->canvas (m_handle)->addEventMask (Canvas::KeyRelease); break; + // Signal the change to uipanels as well + foreach (QObject *qobj, + qWidget ()->findChildren ()) + { + if (qobj->objectName () == "UIPanel") + { + Object *obj = Object::fromQObject (qobj); + + if (obj) + { + if (fp.get_keypressfcn ().isempty ()) + obj->innerContainer ()->canvas (m_handle)-> + clearEventMask (Canvas::KeyRelease); + else + obj->innerContainer ()->canvas (m_handle)-> + addEventMask (Canvas::KeyRelease); + } + } + } + break; case figure::properties::ID_WINDOWSTYLE: if (fp.windowstyle_is ("modal")) diff -r 1ae91e5d70cc -r 9b8903d3e626 libgui/graphics/Panel.cc --- a/libgui/graphics/Panel.cc Thu Jul 04 21:14:09 2019 +0200 +++ b/libgui/graphics/Panel.cc Tue Jul 09 19:41:27 2019 +0200 @@ -138,6 +138,13 @@ frame->installEventFilter (this); m_container->installEventFilter (this); + + graphics_object fig (go.get_ancestor ("figure")); + if (! fig.get ("keypressfcn").isempty ()) + m_container->canvas (m_handle)->addEventMask (Canvas::KeyPress); + + if (! fig.get ("keyreleasefcn").isempty ()) + m_container->canvas (m_handle)->addEventMask (Canvas::KeyRelease); if (pp.is_visible ()) QTimer::singleShot (0, frame, SLOT (show (void)));