From 6c8226a52fd45c2ea08d632235ecf75dceb716f2 Mon Sep 17 00:00:00 2001 From: kojima Date: Mon, 6 Mar 2000 21:52:43 +0000 Subject: [PATCH] fixed lockup when multi-clicking menu --- src/menu.c | 16 ++++++++++++---- src/menu.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/menu.c b/src/menu.c index dba824a5..582aa229 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1949,6 +1949,11 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) d_data.magic = WMAddTimerHandler(wPreferences.dblclick_time, delaySelection, &d_data); } + + if (menu->flags.inside_handler) { + return; + } + menu->flags.inside_handler = 1; wRaiseFrame(menu->frame->core); @@ -1963,7 +1968,7 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) } if (menu->flags.editing) { - return; + goto byebye; } entry_no = getEntryAt(menu, x, y); if (entry_no>=0) { @@ -1972,9 +1977,9 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) if (!close_on_exit && (bev->state & ControlMask) && smenu && entry->flags.editable) { editEntry(smenu, entry); - return; + goto byebye; } else if (bev->state & ControlMask) { - return; + goto byebye; } if (entry->flags.enabled && entry->cascade>=0 && menu->cascades) { @@ -2005,7 +2010,7 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) while (!done) { int x, y; - XAllowEvents(dpy, SyncPointer, CurrentTime); + XAllowEvents(dpy, AsyncPointer|SyncPointer, CurrentTime); WMMaskEvent(dpy, ExposureMask|ButtonMotionMask|ButtonReleaseMask |ButtonPressMask, &ev); @@ -2205,6 +2210,9 @@ menuMouseDown(WObjDescriptor *desc, XEvent *event) if (!wPreferences.wrap_menus) wMenuMove(parentMenu(desc->parent), old_frame_x, old_frame_y, True); + +byebye: + ((WMenu*)desc->parent)->flags.inside_handler = 0; } diff --git a/src/menu.h b/src/menu.h index 81e103dd..4168714c 100644 --- a/src/menu.h +++ b/src/menu.h @@ -98,6 +98,8 @@ typedef struct WMenu { unsigned int brother:1; /* if this is a copy of the menu*/ unsigned int editing:1; unsigned int jump_back_pending:1; + + unsigned int inside_handler:1; } flags; } WMenu;