From 4ba7af7cdc21cda9ddfb689517ab266001926632 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sun, 24 Jul 2016 20:18:23 +0200 Subject: [PATCH] Remove callbacks and accelerator keys from FDialogListMenu on closing a dialog window --- ChangeLog | 7 +++++++ src/fapp.cpp | 27 +++++++++++++++++++-------- src/fapp.h | 4 ++-- src/fmenu.cpp | 5 +---- src/fmenubar.cpp | 4 ++-- src/fmenuitem.cpp | 20 ++++++++++++++++++++ src/fmenuitem.h | 1 + src/fwindow.cpp | 9 ++++----- 8 files changed, 56 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index d743747a..d4578f77 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2016-07-23 Markus Gans + * Add missing null pointer check in FOptiAttr before dereferencing + * Remove callbacks and accelerator keys from FDialogListMenu + on closing of a dialog window + * Execute accelerator keys only once + * Improved window focus behavior + 2016-07-23 Markus Gans * Add a modifier key correction for the linux tty * Support to read meta+enter from keyboard diff --git a/src/fapp.cpp b/src/fapp.cpp index 2a27fd5d..d04676d3 100644 --- a/src/fapp.cpp +++ b/src/fapp.cpp @@ -393,17 +393,20 @@ void FApplication::processKeyboardEvent() && ! k_press_ev.isAccepted() && ! k_down_ev.isAccepted() ) { + bool accpt = false; + // switch to a specific dialog with Meta + 1..9 + if ( ! accpt ) + accpt = processDialogSwitchAccelerator(); + // windows keyboard accelerator FWidget* window = static_cast(active_window); - if ( window ) - processAccelerator (window); + if ( window && ! accpt ) + accpt = processAccelerator (window); // global keyboard accelerator - processAccelerator (getRootWidget()); - - // switch to a specific dialog with Meta + 1..9 - processDialogSwitchAccelerator(); + if ( ! accpt ) + accpt = processAccelerator (getRootWidget()); } } // end of else } @@ -715,7 +718,7 @@ int FApplication::modifierKeyCorrection (int& key_id) } //---------------------------------------------------------------------- -void FApplication::processDialogSwitchAccelerator() +bool FApplication::processDialogSwitchAccelerator() { if ( key >= fc::Fmkey_1 && key <= fc::Fmkey_9 ) { @@ -726,13 +729,18 @@ void FApplication::processDialogSwitchAccelerator() { FAccelEvent a_ev (fc::Accelerator_Event, focus_widget); sendEvent (dialog_list->at(n-1), &a_ev); + return true; } } + + return false; } //---------------------------------------------------------------------- -void FApplication::processAccelerator (FWidget* widget) +bool FApplication::processAccelerator (FWidget* widget) { + bool accpt = false; + if ( widget && widget->accelerator_list && ! widget->accelerator_list->empty() ) @@ -750,12 +758,15 @@ void FApplication::processAccelerator (FWidget* widget) { FAccelEvent a_ev (fc::Accelerator_Event, focus_widget); sendEvent (iter->object, &a_ev); + accpt = a_ev.isAccepted(); break; }; ++iter; } } + + return accpt; } //---------------------------------------------------------------------- diff --git a/src/fapp.h b/src/fapp.h index ed147642..e9cea50c 100644 --- a/src/fapp.h +++ b/src/fapp.h @@ -125,8 +125,8 @@ class FApplication : public FWidget ssize_t readKey(); void processKeyboardEvent(); int modifierKeyCorrection (int& key); - void processDialogSwitchAccelerator(); - void processAccelerator (FWidget*); + bool processDialogSwitchAccelerator(); + bool processAccelerator (FWidget*); void getX11ButtonState (int); bool parseX11Mouse(); bool parseSGRMouse(); diff --git a/src/fmenu.cpp b/src/fmenu.cpp index f2da5910..13cd7fa5 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -1026,10 +1026,7 @@ void FMenu::onKeyPress (FKeyEvent* ev) if ( statusBar() ) statusBar()->clearMessage(); - activatePrevWindow(); - raiseWindow (getActiveWindow()); - getActiveWindow()->getFocusWidget()->setFocus(); - getActiveWindow()->redraw(); + switchToPrevWindow(); } if ( statusBar() ) diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index c9c70692..19222239 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -644,7 +644,7 @@ void FMenuBar::onMouseDown (FMouseEvent* ev) (*iter)->setSelected(); (*iter)->setFocus(); - if ( focused_widget ) + if ( focused_widget && ! focused_widget->isWindow() ) focused_widget->redraw(); (*iter)->openMenu(); @@ -820,7 +820,7 @@ void FMenuBar::onMouseMove (FMouseEvent* ev) (*iter)->setSelected(); (*iter)->setFocus(); - if ( focused_widget ) + if ( focused_widget && ! focused_widget->isWindow() ) focused_widget->redraw(); (*iter)->openMenu(); diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index b014cb88..4f8d0178 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -280,6 +280,13 @@ void FMenuItem::createDialogList (FMenu* winmenu) _METHOD_CALLBACK (this, &FMenuItem::cb_switchToDialog), dynamic_cast(win) ); + + win->addCallback + ( + "destroy", + _METHOD_CALLBACK (this, &FMenuItem::cb_destroyDialog), + static_cast(win_item) + ); } ++iter; @@ -307,6 +314,19 @@ void FMenuItem::cb_switchToDialog (FWidget*, void* data_ptr) } } +//---------------------------------------------------------------------- +void FMenuItem::cb_destroyDialog (FWidget* widget, void* data_ptr) +{ + FDialog* win = static_cast(widget); + FMenuItem* win_item = static_cast(data_ptr); + + if ( win_item && win ) + { + win_item->delAccelerator(win); + win_item->delCallback(this); + } +} + //---------------------------------------------------------------------- void FMenuItem::processClicked() { diff --git a/src/fmenuitem.h b/src/fmenuitem.h index 26b8e388..7c8a35d2 100644 --- a/src/fmenuitem.h +++ b/src/fmenuitem.h @@ -65,6 +65,7 @@ class FMenuItem : public FWidget void processDeactivate(); void createDialogList (FMenu*); void cb_switchToDialog (FWidget*, void*); + void cb_destroyDialog (FWidget*, void*); virtual void processClicked(); protected: diff --git a/src/fwindow.cpp b/src/fwindow.cpp index e1e3a493..07ec208c 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -396,12 +396,11 @@ void FWindow::switchToPrevWindow() if ( ! active_window->isActiveWindow() ) setActiveWindow(active_window); - raiseWindow (active_window); - - if ( focus_widget ) + if ( focus_widget && ! focus_widget->isWindow() ) + { focus_widget->setFocus(); - - active_window->redraw(); + active_window->redraw(); + } } }