X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6114b889a2aa965ef8849a0042bc7248aea16400..2f45a8ede0658e94862019ccefca6ab557b728a8:/oldXMenu/Activate.c diff --git a/oldXMenu/Activate.c b/oldXMenu/Activate.c index c4816142bb..4de752c840 100644 --- a/oldXMenu/Activate.c +++ b/oldXMenu/Activate.c @@ -1,8 +1,24 @@ -/* $Header: /cvsroot/emacs/emacs/oldXMenu/Activate.c,v 1.6 2003/09/01 15:45:47 miles Exp $ */ /* Copyright Massachusetts Institute of Technology 1985 */ #include "copyright.h" +/* +Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ + /* * XMenu: MIT Project Athena, X Window system menu package * @@ -82,10 +98,25 @@ #include #include "XMenuInt.h" +#include /* For debug, set this to 0 to not grab the keyboard on menu popup */ int x_menu_grab_keyboard = 1; +typedef void (*Wait_func)(); + +static Wait_func wait_func; +static void* wait_data; + +void +XMenuActivateSetWaitFunction (func, data) + Wait_func func; + void *data; +{ + wait_func = func; + wait_data = data; +} + int XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, help_callback) @@ -118,6 +149,7 @@ XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, Window root, child; int root_x, root_y, win_x, win_y; unsigned int mask; + KeySym keysym; /* * Define and allocate a foreign event queue to hold events @@ -267,6 +299,7 @@ XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, * Begin event processing loop. */ while (1) { + if (wait_func) (*wait_func) (wait_data); XNextEvent(display, &event); /* Get next event. */ switch (event.type) { /* Dispatch on the event type. */ case Expose: @@ -444,6 +477,18 @@ XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, } selection = True; break; + case KeyPress: + case KeyRelease: + keysym = XLookupKeysym (&event.xkey, 0); + + /* Pop down on C-g and Escape. */ + if ((keysym == XK_g && (event.xkey.state & ControlMask) != 0) + || keysym == XK_Escape) /* Any escape, ignore modifiers. */ + { + ret_val = XM_NO_SELECT; + selection = True; + } + break; default: /* * If AEQ mode is enabled then queue the event. @@ -558,6 +603,8 @@ XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, free((char *)feq_tmp); } + wait_func = 0; + /* * Return successfully. */