/* 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.
#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;
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. */
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))
{
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))
{
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. */
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
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,
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
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;