diff --git a/ChangeLog b/ChangeLog index bb432607..69a41db3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2016-07-30 Markus Gans - * Delete all callbacks from a widget, when it will be destroyed + * Delete all callbacks from a widget with delCallbacks() + * Remove dialog list item callback from the associated window 2016-07-28 Markus Gans * Improvements for the window focus diff --git a/src/fapp.cpp b/src/fapp.cpp index f39b2ac5..7215639a 100644 --- a/src/fapp.cpp +++ b/src/fapp.cpp @@ -31,7 +31,8 @@ std::deque* FApplication::event_queue = 0; // constructors and destructor //---------------------------------------------------------------------- FApplication::FApplication (int& _argc, char**& _argv) - : app_argc(_argc) + : FWidget(0) + , app_argc(_argc) , app_argv(_argv) , skipped_terminal_update(0) , key(0) diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index cfbab8ce..1e011d41 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -29,6 +29,7 @@ FMenuItem::FMenuItem (FWidget* parent) , accel_key(0) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -48,6 +49,7 @@ FMenuItem::FMenuItem (FString& txt, FWidget* parent) , accel_key(0) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -67,6 +69,7 @@ FMenuItem::FMenuItem (const std::string& txt, FWidget* parent) , accel_key(0) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -86,6 +89,7 @@ FMenuItem::FMenuItem (const char* txt, FWidget* parent) , accel_key(0) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -105,6 +109,7 @@ FMenuItem::FMenuItem (int k, FString& txt, FWidget* parent) , accel_key(k) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -124,6 +129,7 @@ FMenuItem::FMenuItem (int k, const std::string& txt, FWidget* parent) , accel_key(k) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -143,6 +149,7 @@ FMenuItem::FMenuItem (int k, const char* txt, FWidget* parent) , accel_key(k) , menu(0) , super_menu(0) + , associated_window(0) { init (parent); } @@ -151,6 +158,10 @@ FMenuItem::FMenuItem (int k, const char* txt, FWidget* parent) FMenuItem::~FMenuItem() // destructor { delAccelerator(); + + // remove dialog list item callback from the dialog + if ( associated_window ) + associated_window->delCallback(this); } @@ -268,8 +279,10 @@ void FMenuItem::createDialogList (FMenu* winmenu) if ( win ) { int n = int(std::distance(begin, iter)); - FString win_title = win->getText(); - FMenuItem* win_item = new FMenuItem (win_title, winmenu); + // get the dialog title + FString name = win->getText(); + // create a new dialog list item + FMenuItem* win_item = new FMenuItem (name, winmenu); if ( n < 9 ) win_item->addAccelerator (fc::Fmkey_1 + n); // Meta + 1..9 @@ -277,16 +290,17 @@ void FMenuItem::createDialogList (FMenu* winmenu) win_item->addCallback ( "clicked", - _METHOD_CALLBACK (this, &FMenuItem::cb_switchToDialog), + _METHOD_CALLBACK (win_item, &FMenuItem::cb_switchToDialog), dynamic_cast(win) ); win->addCallback ( "destroy", - _METHOD_CALLBACK (this, &FMenuItem::cb_destroyDialog), - static_cast(win_item) + _METHOD_CALLBACK (win_item, &FMenuItem::cb_destroyDialog) ); + + win_item->associated_window = win; } ++iter; @@ -310,16 +324,16 @@ void FMenuItem::cb_switchToDialog (FWidget*, void* data_ptr) } //---------------------------------------------------------------------- -void FMenuItem::cb_destroyDialog (FWidget* widget, void* data_ptr) +void FMenuItem::cb_destroyDialog (FWidget* widget, void*) { FDialog* win = static_cast(widget); - FMenuItem* win_item = static_cast(data_ptr); FApplication* fapp = static_cast(getRootWidget()); - if ( win_item && win && fapp && ! fapp->isQuit() ) + if ( win && fapp ) { - win_item->delAccelerator(win); - win_item->delCallback(this); + delAccelerator(win); + delCallback(win); + associated_window = 0; } } diff --git a/src/fmenuitem.h b/src/fmenuitem.h index 7c8a35d2..e9021a86 100644 --- a/src/fmenuitem.h +++ b/src/fmenuitem.h @@ -29,7 +29,7 @@ #include "fwidget.h" - +class FDialog; class FMenu; class FMenuList; @@ -55,6 +55,7 @@ class FMenuItem : public FWidget int accel_key; FMenu* menu; FWidget* super_menu; + FDialog* associated_window; private: FMenuItem (const FMenuItem&); diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 60cc01b8..a780f411 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -103,7 +103,6 @@ FWidget::FWidget (FWidget* parent) //---------------------------------------------------------------------- FWidget::~FWidget() // destructor { - delCallbacks(); processDestroy(); FApplication::removeQueuedEvent(this);