changeset 13899:3fbe9b840379

(xlwMenuActionsList): Add "key" and "nothing". (xlwMenuTranslations): Add translations for Key, KeyUp, and for the modifier keysyms. (Nothing, Key): New functions. (XlwMenuSetValues): Do redisplay if non-null contents get replaced by empty contents.
author Richard M. Stallman <rms@gnu.org>
date Sun, 31 Dec 1995 19:15:18 +0000
parents dceb33c07f9e
children 37c5ece37d71
files lwlib/xlwmenu.c
diffstat 1 files changed, 86 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lwlib/xlwmenu.c	Sun Dec 31 19:10:03 1995 +0000
+++ b/lwlib/xlwmenu.c	Sun Dec 31 19:15:18 1995 +0000
@@ -37,9 +37,39 @@
 
 static char 
 xlwMenuTranslations [] = 
-"<BtnDown>:	start()\n\
-<Motion>:	drag()\n\
-<BtnUp>:	select()\n\
+"<BtnDown>:	  start()\n\
+<Motion>:	  drag()\n\
+<BtnUp>:	  select()\n\
+<Key>Shift_L:     nothing()\n\
+<Key>Shift_R:     nothing()\n\
+<Key>Meta_L:      nothing()\n\
+<Key>Meta_R:      nothing()\n\
+<Key>Control_L:   nothing()\n\
+<Key>Control_R:   nothing()\n\
+<Key>Hyper_L:     nothing()\n\
+<Key>Hyper_R:     nothing()\n\
+<Key>Super_L:     nothing()\n\
+<Key>Super_R:     nothing()\n\
+<Key>Alt_L:       nothing()\n\
+<Key>Alt_R:       nothing()\n\
+<Key>Caps_Lock:   nothing()\n\
+<Key>Shift_Lock:  nothing()\n\
+<KeyUp>Shift_L:   nothing()\n\
+<KeyUp>Shift_R:   nothing()\n\
+<KeyUp>Meta_L:    nothing()\n\
+<KeyUp>Meta_R:    nothing()\n\
+<KeyUp>Control_L: nothing()\n\
+<KeyUp>Control_R: nothing()\n\
+<KeyUp>Hyper_L:   nothing()\n\
+<KeyUp>Hyper_R:   nothing()\n\
+<KeyUp>Super_L:   nothing()\n\
+<KeyUp>Super_R:   nothing()\n\
+<KeyUp>Alt_L:     nothing()\n\
+<KeyUp>Alt_R:     nothing()\n\
+<KeyUp>Caps_Lock: nothing()\n\
+<KeyUp>Shift_Lock:nothing()\n\
+<Key>:            key()\n\
+<KeyUp>:          key()\n\
 ";
 
 #define offset(field) XtOffset(XlwMenuWidget, field)
@@ -97,6 +127,8 @@
 static void Start();
 static void Drag();
 static void Select();
+static void Key();
+static void Nothing();
 
 static XtActionsRec 
 xlwMenuActionsList [] =
@@ -104,6 +136,8 @@
   {"start",		Start},
   {"drag",		Drag},
   {"select",		Select},
+  {"key",		Key},
+  {"nothing",		Nothing},
 };
 
 #define SuperClass ((CoreWidgetClass)&coreClassRec)
@@ -1251,6 +1285,11 @@
       && newmw->menu.contents->contents
       && newmw->menu.contents->contents->change >= VISIBLE_CHANGE)
     redisplay = True;
+  /* Do redisplay if the contents are entirely eliminated.  */
+  if (newmw->menu.contents
+      && newmw->menu.contents->contents == 0
+      && newmw->menu.contents->change >= VISIBLE_CHANGE)
+    redisplay = True;
 
   if (newmw->core.background_pixel != oldmw->core.background_pixel
       || newmw->menu.foreground != oldmw->menu.foreground
@@ -1378,7 +1417,50 @@
     handle_motion_event (mw, &ev->xmotion);
 }
 
-static void 
+/* Do nothing.
+   This is how we handle presses and releases of modifier keys.  */
+static void
+Nothing (w, ev, params, num_params)
+     Widget w;
+     XEvent *ev;
+     String *params;
+     Cardinal *num_params;
+{
+}
+
+/* Handle key press and release events while menu is popped up.
+   Our action is to get rid of the menu.  */
+static void
+Key (w, ev, params, num_params)
+     Widget w;
+     XEvent *ev;
+     String *params;
+     Cardinal *num_params;
+{
+  XlwMenuWidget mw = (XlwMenuWidget)w;
+
+  /* Pop down everything.  */
+  mw->menu.new_depth = 1;
+  remap_menubar (mw);
+
+  if (mw->menu.popped_up)
+    {
+      mw->menu.popped_up = False;
+      XtUngrabPointer ((Widget)mw, ev->xmotion.time);
+      if (XtIsShell (XtParent ((Widget) mw)))
+	XtPopdown (XtParent ((Widget) mw));
+      else
+	{
+	  XtRemoveGrab ((Widget) mw);
+	  display_menu (mw, 0, False, NULL, NULL, NULL, NULL, NULL);
+	}
+    }
+
+  /* callback */
+  XtCallCallbackList ((Widget)mw, mw->menu.select, (XtPointer)0);
+}
+
+static void
 Select (w, ev, params, num_params)
      Widget w;
      XEvent *ev;