diff --git a/common/include/ui.h b/common/include/ui.h index e59efa72c..d6d7fe4ce 100644 --- a/common/include/ui.h +++ b/common/include/ui.h @@ -241,6 +241,8 @@ public: template UI_DIALOG(short x, short y, short w, short h, enum dialog_flags flags, ui_subclass_subfunction_t callback) : UI_DIALOG(x, y, w, h, flags, reinterpret_cast>(callback), nullptr, nullptr) {} + + ~UI_DIALOG(); }; #define B1_JUST_PRESSED (event.type == EVENT_MOUSE_BUTTON_DOWN && event_mouse_get_button(event) == 0) diff --git a/common/ui/dialog.cpp b/common/ui/dialog.cpp index c704e49ce..37eb46a01 100644 --- a/common/ui/dialog.cpp +++ b/common/ui/dialog.cpp @@ -133,10 +133,9 @@ static window_event_result ui_dialog_handler(window *wind,const d_event &event, } case EVENT_WINDOW_CLOSE: - ui_gadget_delete_all(dlg); - selected_gadget = NULL; - delete dlg; - return window_event_result::ignored; + if (rval != window_event_result::deleted) // check if handler already deleted dialog (e.g. if UI_DIALOG was subclassed) + delete dlg; + return window_event_result::ignored; // free the window in any case (until UI_DIALOG is subclass of window) default: return window_event_result::ignored; } @@ -194,6 +193,12 @@ void ui_dialog_set_current_canvas(UI_DIALOG *dlg) gr_set_current_canvas(window_get_canvas(*dlg->wind)); } +UI_DIALOG::~UI_DIALOG() +{ + ui_gadget_delete_all(this); + selected_gadget = NULL; +} + void ui_close_dialog( UI_DIALOG * dlg ) { window_close(dlg->wind);