summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManolo Gouy <mgouy@biomp2.univ-lyon1.fr>2018-12-07 16:59:11 +0100
committerManolo Gouy <mgouy@biomp2.univ-lyon1.fr>2018-12-07 16:59:11 +0100
commit6e49ce0a2816cd332db9ca16d0c0c0d9156fb251 (patch)
treed3c41c74f8c1f3fe06fc0140f896ac6bdf1a7161 /src
parented87d98c24ff4b9faeddf6025600850578cd8589 (diff)
parentd87ac9b59783dec5628e7ae242b390cf5097b77a (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Menu.cxx9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index 1d7f47672..b3e1f5c65 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -867,6 +867,10 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
int menubar) const {
Fl_Group::current(0); // fix possible user error...
+ // track the Fl_Menu_ widget to make sure we notice if it gets
+ // deleted while the menu is open (STR #3503)
+ Fl_Widget_Tracker wp((Fl_Widget *)pbutton);
+
button = pbutton;
if (pbutton && pbutton->window()) {
for (Fl_Window* w = pbutton->window(); w; w = w->window()) {
@@ -903,7 +907,8 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
initial_item = pp.current_item;
if (initial_item) goto STARTUP;
- // the main loop, runs until p.state goes to DONE_STATE:
+ // the main loop: runs until p.state goes to DONE_STATE or the menu
+ // widget is deleted (e.g. from a timer callback, see STR #3503):
for (;;) {
// make sure all the menus are shown:
@@ -920,6 +925,8 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
{
const Fl_Menu_Item* oldi = pp.current_item;
Fl::wait();
+ if (wp.deleted()) // menu widget has been deleted (STR #3503)
+ break;
if (pp.state == DONE_STATE) break; // done.
if (pp.current_item == oldi) continue;
}