From: Jan Djärv Date: Mon, 22 Apr 2002 18:21:06 +0000 (+0000) Subject: Add calls to Grab/UngrabKeyboard to remove strange interactions with X-Git-Tag: ttn-vms-21-2-B4~15480 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=4db7db7d55c7b9778180e7f4c94fd9afc18e4d7c;p=emacs.git Add calls to Grab/UngrabKeyboard to remove strange interactions with window managers that steal keypresses. --- diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c index c63422bacc6..53dc7022857 100644 --- a/lwlib/xlwmenu.c +++ b/lwlib/xlwmenu.c @@ -257,10 +257,22 @@ WidgetClass xlwMenuWidgetClass = (WidgetClass) &xlwMenuClassRec; int submenu_destroyed; +/* For debug, set this to 0 to not grab the keyboard on menu popup */ +int x_menu_grab_keyboard = 1; + static int next_release_must_exit; /* Utilities */ +/* Ungrab pointer and keyboard */ +static void +ungrab_all (w, ungrabtime) + Widget w; + Time ungrabtime; +{ + XtUngrabPointer (w, ungrabtime); + if (x_menu_grab_keyboard) XtUngrabKeyboard (w, ungrabtime); +} /* Like abort, but remove grabs from widget W before. */ @@ -270,7 +282,7 @@ abort_gracefully (w) { if (XtIsShell (XtParent (w))) XtRemoveGrab (w); - XtUngrabPointer (w, CurrentTime); + ungrab_all (w, CurrentTime); abort (); } @@ -1795,7 +1807,7 @@ XlwMenuDestroy (w) XlwMenuWidget mw = (XlwMenuWidget) w; if (pointer_grabbed) - XtUngrabPointer ((Widget)w, CurrentTime); + ungrab_all ((Widget)w, CurrentTime); pointer_grabbed = 0; submenu_destroyed = 1; @@ -2197,7 +2209,7 @@ Key (w, ev, params, num_params) if (mw->menu.popped_up) { mw->menu.popped_up = False; - XtUngrabPointer ((Widget)mw, ev->xmotion.time); + ungrab_all ((Widget)mw, ev->xmotion.time); if (XtIsShell (XtParent ((Widget) mw))) XtPopdown (XtParent ((Widget) mw)); else @@ -2238,7 +2250,7 @@ Select (w, ev, params, num_params) if (mw->menu.popped_up) { mw->menu.popped_up = False; - XtUngrabPointer ((Widget)mw, ev->xmotion.time); + ungrab_all ((Widget)mw, ev->xmotion.time); if (XtIsShell (XtParent ((Widget) mw))) XtPopdown (XtParent ((Widget) mw)); else @@ -2313,15 +2325,26 @@ pop_up_menu (mw, event) #ifdef emacs count = x_catch_errors (display); #endif - XtGrabPointer ((Widget)mw, False, - (PointerMotionMask - | PointerMotionHintMask - | ButtonReleaseMask - | ButtonPressMask), - GrabModeAsync, GrabModeAsync, None, - mw->menu.cursor_shape, - event->time); - pointer_grabbed = 1; + if (XtGrabPointer ((Widget)mw, False, + (PointerMotionMask + | PointerMotionHintMask + | ButtonReleaseMask + | ButtonPressMask), + GrabModeAsync, GrabModeAsync, None, + mw->menu.cursor_shape, + event->time) == Success) + { + if (! x_menu_grab_keyboard + || XtGrabKeyboard ((Widget)mw, False, GrabModeAsync, + GrabModeAsync, event->time) == Success) + { + XtSetKeyboardFocus((Widget)mw, None); + pointer_grabbed = 1; + } + else + XtUngrabPointer ((Widget)mw, event->time); + } + #ifdef emacs if (x_had_errors_p (display)) {