Fix crash if menu is deleted while menu is open (SGR #3503).
This can happen if a menu widget (e.g. Fl_Choice) is deleted in a timer callback while the menu is open (pulldown active).
This commit is contained in:
parent
f9228e55b3
commit
d87ac9b597
@ -867,6 +867,10 @@ const Fl_Menu_Item* Fl_Menu_Item::pulldown(
|
|||||||
int menubar) const {
|
int menubar) const {
|
||||||
Fl_Group::current(0); // fix possible user error...
|
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;
|
button = pbutton;
|
||||||
if (pbutton && pbutton->window()) {
|
if (pbutton && pbutton->window()) {
|
||||||
for (Fl_Window* w = pbutton->window(); w; w = w->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;
|
initial_item = pp.current_item;
|
||||||
if (initial_item) goto STARTUP;
|
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 (;;) {
|
for (;;) {
|
||||||
|
|
||||||
// make sure all the menus are shown:
|
// 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;
|
const Fl_Menu_Item* oldi = pp.current_item;
|
||||||
Fl::wait();
|
Fl::wait();
|
||||||
|
if (wp.deleted()) // menu widget has been deleted (STR #3503)
|
||||||
|
break;
|
||||||
if (pp.state == DONE_STATE) break; // done.
|
if (pp.state == DONE_STATE) break; // done.
|
||||||
if (pp.current_item == oldi) continue;
|
if (pp.current_item == oldi) continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user