]> code.delx.au - gnu-emacs/blobdiff - src/menu.c
Merge from emacs-23
[gnu-emacs] / src / menu.c
index 44eebe8dbe7a2198cbeeb9913cc50eedb50e9d9e..ca00c06a98b08bfbe26bb8f4e91e180aa7127e09 100644 (file)
@@ -1,6 +1,6 @@
 /* Platform-independent code for terminal communications.
    Copyright (C) 1986, 1988, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2003,
-                 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+                 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -61,6 +61,10 @@ extern HMENU current_popup_menu;
 #define HAVE_BOXES 1
 #endif
 
+/* The timestamp of the last input event Emacs received from the X server.  */
+/* Defined in keyboard.c.  */
+extern unsigned long last_event_timestamp;
+
 extern Lisp_Object QCtoggle, QCradio;
 
 Lisp_Object menu_items;
@@ -248,14 +252,16 @@ push_menu_item (name, enable, key, def, equiv, type, selected, help)
   if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated)
     grow_menu_items ();
 
-  XVECTOR (menu_items)->contents[menu_items_used++] = name;
-  XVECTOR (menu_items)->contents[menu_items_used++] = enable;
-  XVECTOR (menu_items)->contents[menu_items_used++] = key;
-  XVECTOR (menu_items)->contents[menu_items_used++] = equiv;
-  XVECTOR (menu_items)->contents[menu_items_used++] = def;
-  XVECTOR (menu_items)->contents[menu_items_used++] = type;
-  XVECTOR (menu_items)->contents[menu_items_used++] = selected;
-  XVECTOR (menu_items)->contents[menu_items_used++] = help;
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_NAME,    name);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_ENABLE,  enable);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_VALUE,   key);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_EQUIV_KEY, equiv);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_DEFINITION, def);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_TYPE,    type);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_SELECTED,        selected);
+  ASET (menu_items, menu_items_used + MENU_ITEMS_ITEM_HELP,    help);
+
+  menu_items_used += MENU_ITEMS_ITEM_LENGTH;
 }
 
 /* Args passed between single_keymap_panes and single_menu_item.  */
@@ -691,6 +697,12 @@ digest_single_submenu (start, end, top_level_items)
 
              ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
            }
+#elif defined (USE_LUCID) && defined (HAVE_XFT)
+         if (STRINGP (pane_name))
+            {
+              pane_name = ENCODE_UTF_8 (pane_name);
+             ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
+            }
 #elif !defined (HAVE_MULTILINGUAL_MENU)
          if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
            {
@@ -764,6 +776,18 @@ digest_single_submenu (start, end, top_level_items)
              descrip = ENCODE_SYSTEM (descrip);
              ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
            }
+#elif USE_LUCID
+         if (STRINGP (item_name))
+           {
+              item_name = ENCODE_UTF_8 (item_name);
+             ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
+           }
+
+         if (STRINGP (descrip))
+           {
+             descrip = ENCODE_UTF_8 (descrip);
+             ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
+           }
 #elif !defined (HAVE_MULTILINGUAL_MENU)
           if (STRING_MULTIBYTE (item_name))
            {
@@ -1071,13 +1095,8 @@ no quit occurs and `x-popup-menu' returns nil.  */)
   int keymaps = 0;
   int for_click = 0;
   int specpdl_count = SPECPDL_INDEX ();
-  Lisp_Object timestamp = Qnil;
   struct gcpro gcpro1;
 
-#ifdef HAVE_NS
-  NSTRACE (ns_popup_menu);
-#endif
-
   if (NILP (position))
     /* This is an obsolete call, which wants us to precompute the
        keybinding equivalents, but we don't do that any more anyway.  */
@@ -1109,10 +1128,9 @@ no quit occurs and `x-popup-menu' returns nil.  */)
            for_click = 1;
            tem = Fcar (Fcdr (position));  /* EVENT_START (position) */
            window = Fcar (tem);             /* POSN_WINDOW (tem) */
-           tem = Fcdr (Fcdr (tem));
-           x = Fcar (Fcar (tem));
-           y = Fcdr (Fcar (tem));
-           timestamp = Fcar (Fcdr (tem));
+           tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */
+           x = Fcar (tem);
+           y = Fcdr (tem);
          }
 
        /* If a click happens in an external tool bar or a detached
@@ -1186,13 +1204,8 @@ no quit occurs and `x-popup-menu' returns nil.  */)
        CHECK_LIVE_WINDOW (window);
        f = XFRAME (WINDOW_FRAME (win));
 
-#ifdef HAVE_NS              /* FIXME: Is this necessary??  --Stef  */
-       p.x = FRAME_COLUMN_WIDTH (f) * WINDOW_LEFT_EDGE_COL (win);
-       p.y = FRAME_LINE_HEIGHT (f) * WINDOW_TOP_EDGE_LINE (win);
-#else
        xpos = WINDOW_LEFT_EDGE_X (win);
        ypos = WINDOW_TOP_EDGE_Y (win);
-#endif
       }
     else
       /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME,
@@ -1290,8 +1303,10 @@ no quit occurs and `x-popup-menu' returns nil.  */)
   unbind_to (specpdl_count, Qnil);
 
 #ifdef HAVE_MENUS
+#ifdef HAVE_WINDOW_SYSTEM
   /* Hide a previous tip, if any.  */
   Fx_hide_tip ();
+#endif
 
 #ifdef HAVE_NTGUI     /* FIXME: Is it really w32-specific?  --Stef  */
   /* If resources from a previous popup menu still exist, does nothing
@@ -1323,9 +1338,13 @@ no quit occurs and `x-popup-menu' returns nil.  */)
   selection = ns_menu_show (f, xpos, ypos, for_click,
                            keymaps, title, &error_name);
 #else /* MSDOS and X11 */
+  /* Assume last_event_timestamp is the timestamp of the button event.
+     Is this assumption ever violated?  We can't use the timestamp
+     stored within POSITION because there the top bits from the actual
+     timestamp may be truncated away (Bug#4930).  */
   selection = xmenu_show (f, xpos, ypos, for_click,
                          keymaps, title, &error_name,
-                         INTEGERP (timestamp) ? XUINT (timestamp) : 0);
+                         last_event_timestamp);
 #endif
 
   UNBLOCK_INPUT;