HCoop
/
bpt
/
emacs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge from emacs-23; up to 2010-06-03T05:41:49Z!rgm@gnu.org.
[bpt/emacs.git]
/
src
/
menu.c
diff --git
a/src/menu.c
b/src/menu.c
index
ad6054d
..
851f1ac
100644
(file)
--- a/
src/menu.c
+++ b/
src/menu.c
@@
-1,6
+1,7
@@
/* Platform-independent code for terminal communications.
/* Platform-independent code for terminal communications.
- Copyright (C) 1986, 1988, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+Copyright (C) 1986, 1988, 1993-1994, 1996, 1999-2011
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
This file is part of GNU Emacs.
@@
-61,8
+62,6
@@
extern HMENU current_popup_menu;
#define HAVE_BOXES 1
#endif
#define HAVE_BOXES 1
#endif
-extern Lisp_Object QCtoggle, QCradio;
-
Lisp_Object menu_items;
/* If non-nil, means that the global vars defined here are already in use.
Lisp_Object menu_items;
/* If non-nil, means that the global vars defined here are already in use.
@@
-83,7
+82,7
@@
int menu_items_n_panes;
static int menu_items_submenu_depth;
void
static int menu_items_submenu_depth;
void
-init_menu_items ()
+init_menu_items (
void
)
{
if (!NILP (menu_items_inuse))
error ("Trying to use a menu from within a menu-entry");
{
if (!NILP (menu_items_inuse))
error ("Trying to use a menu from within a menu-entry");
@@
-103,13
+102,12
@@
init_menu_items ()
/* Call at the end of generating the data in menu_items. */
void
/* Call at the end of generating the data in menu_items. */
void
-finish_menu_items ()
+finish_menu_items (
void
)
{
}
Lisp_Object
{
}
Lisp_Object
-unuse_menu_items (dummy)
- Lisp_Object dummy;
+unuse_menu_items (Lisp_Object dummy)
{
return menu_items_inuse = Qnil;
}
{
return menu_items_inuse = Qnil;
}
@@
-118,7
+116,7
@@
unuse_menu_items (dummy)
in menu_items. */
void
in menu_items. */
void
-discard_menu_items ()
+discard_menu_items (
void
)
{
/* Free the structure if it is especially large.
Otherwise, hold on to it, to save time. */
{
/* Free the structure if it is especially large.
Otherwise, hold on to it, to save time. */
@@
-130,19
+128,20
@@
discard_menu_items ()
xassert (NILP (menu_items_inuse));
}
xassert (NILP (menu_items_inuse));
}
+#ifdef HAVE_NS
static Lisp_Object
cleanup_popup_menu (Lisp_Object arg)
{
discard_menu_items ();
return Qnil;
}
static Lisp_Object
cleanup_popup_menu (Lisp_Object arg)
{
discard_menu_items ();
return Qnil;
}
+#endif
/* This undoes save_menu_items, and it is called by the specpdl unwind
mechanism. */
static Lisp_Object
/* This undoes save_menu_items, and it is called by the specpdl unwind
mechanism. */
static Lisp_Object
-restore_menu_items (saved)
- Lisp_Object saved;
+restore_menu_items (Lisp_Object saved)
{
menu_items = XCAR (saved);
menu_items_inuse = (! NILP (menu_items) ? Qt : Qnil);
{
menu_items = XCAR (saved);
menu_items_inuse = (! NILP (menu_items) ? Qt : Qnil);
@@
-160,7
+159,7
@@
restore_menu_items (saved)
It will be restored when the specpdl is unwound. */
void
It will be restored when the specpdl is unwound. */
void
-save_menu_items ()
+save_menu_items (
void
)
{
Lisp_Object saved = list4 (!NILP (menu_items_inuse) ? menu_items : Qnil,
make_number (menu_items_used),
{
Lisp_Object saved = list4 (!NILP (menu_items_inuse) ? menu_items : Qnil,
make_number (menu_items_used),
@@
-175,7
+174,7
@@
save_menu_items ()
/* Make the menu_items vector twice as large. */
static void
/* Make the menu_items vector twice as large. */
static void
-grow_menu_items ()
+grow_menu_items (
void
)
{
menu_items_allocated *= 2;
menu_items = larger_vector (menu_items, menu_items_allocated, Qnil);
{
menu_items_allocated *= 2;
menu_items = larger_vector (menu_items, menu_items_allocated, Qnil);
@@
-184,7
+183,7
@@
grow_menu_items ()
/* Begin a submenu. */
static void
/* Begin a submenu. */
static void
-push_submenu_start ()
+push_submenu_start (
void
)
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
@@
-196,7
+195,7
@@
push_submenu_start ()
/* End a submenu. */
static void
/* End a submenu. */
static void
-push_submenu_end ()
+push_submenu_end (
void
)
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
@@
-208,7
+207,7
@@
push_submenu_end ()
/* Indicate boundary between left and right. */
static void
/* Indicate boundary between left and right. */
static void
-push_left_right_boundary ()
+push_left_right_boundary (
void
)
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
{
if (menu_items_used + 1 > menu_items_allocated)
grow_menu_items ();
@@
-220,8
+219,7
@@
push_left_right_boundary ()
NAME is the pane name. PREFIX_VEC is a prefix key for this pane. */
static void
NAME is the pane name. PREFIX_VEC is a prefix key for this pane. */
static void
-push_menu_pane (name, prefix_vec)
- Lisp_Object name, prefix_vec;
+push_menu_pane (Lisp_Object name, Lisp_Object prefix_vec)
{
if (menu_items_used + MENU_ITEMS_PANE_LENGTH > menu_items_allocated)
grow_menu_items ();
{
if (menu_items_used + MENU_ITEMS_PANE_LENGTH > menu_items_allocated)
grow_menu_items ();
@@
-242,8
+240,7
@@
push_menu_pane (name, prefix_vec)
item, one of nil, `toggle' or `radio'. */
static void
item, one of nil, `toggle' or `radio'. */
static void
-push_menu_item (name, enable, key, def, equiv, type, selected, help)
- Lisp_Object name, enable, key, def, equiv, type, selected, help;
+push_menu_item (Lisp_Object name, Lisp_Object enable, Lisp_Object key, Lisp_Object def, Lisp_Object equiv, Lisp_Object type, Lisp_Object selected, Lisp_Object help)
{
if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated)
grow_menu_items ();
{
if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated)
grow_menu_items ();
@@
-268,8
+265,8
@@
struct skp
int notbuttons;
};
int notbuttons;
};
-static void single_menu_item
P_ (
(Lisp_Object, Lisp_Object, Lisp_Object,
-
void *)
);
+static void single_menu_item (Lisp_Object, Lisp_Object, Lisp_Object,
+
void *
);
/* This is a recursive subroutine of keymap_panes.
It handles one keymap, KEYMAP.
/* This is a recursive subroutine of keymap_panes.
It handles one keymap, KEYMAP.
@@
-328,9
+325,7
@@
single_keymap_panes (Lisp_Object keymap, Lisp_Object pane_name,
If we encounter submenus deeper than SKP->MAXDEPTH levels, ignore them. */
static void
If we encounter submenus deeper than SKP->MAXDEPTH levels, ignore them. */
static void
-single_menu_item (key, item, dummy, skp_v)
- Lisp_Object key, item, dummy;
- void *skp_v;
+single_menu_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy, void *skp_v)
{
Lisp_Object map, item_string, enabled;
struct gcpro gcpro1, gcpro2;
{
Lisp_Object map, item_string, enabled;
struct gcpro gcpro1, gcpro2;
@@
-452,9
+447,7
@@
single_menu_item (key, item, dummy, skp_v)
and generate menu panes for them in menu_items. */
static void
and generate menu panes for them in menu_items. */
static void
-keymap_panes (keymaps, nmaps)
- Lisp_Object *keymaps;
- int nmaps;
+keymap_panes (Lisp_Object *keymaps, int nmaps)
{
int mapno;
{
int mapno;
@@
-473,8
+466,7
@@
keymap_panes (keymaps, nmaps)
/* Push the items in a single pane defined by the alist PANE. */
static void
/* Push the items in a single pane defined by the alist PANE. */
static void
-list_of_items (pane)
- Lisp_Object pane;
+list_of_items (Lisp_Object pane)
{
Lisp_Object tail, item, item1;
{
Lisp_Object tail, item, item1;
@@
-501,8
+493,7
@@
list_of_items (pane)
alist-of-alists MENU.
This handles old-fashioned calls to x-popup-menu. */
void
alist-of-alists MENU.
This handles old-fashioned calls to x-popup-menu. */
void
-list_of_panes (menu)
- Lisp_Object menu;
+list_of_panes (Lisp_Object menu)
{
Lisp_Object tail;
{
Lisp_Object tail;
@@
-527,8
+518,7
@@
list_of_panes (menu)
whose event type is ITEM_KEY (with string ITEM_NAME)
and whose contents come from the list of keymaps MAPS. */
int
whose event type is ITEM_KEY (with string ITEM_NAME)
and whose contents come from the list of keymaps MAPS. */
int
-parse_single_submenu (item_key, item_name, maps)
- Lisp_Object item_key, item_name, maps;
+parse_single_submenu (Lisp_Object item_key, Lisp_Object item_name, Lisp_Object maps)
{
Lisp_Object length;
int len;
{
Lisp_Object length;
int len;
@@
-579,7
+569,7
@@
parse_single_submenu (item_key, item_name, maps)
/* Allocate a widget_value, blocking input. */
widget_value *
/* Allocate a widget_value, blocking input. */
widget_value *
-xmalloc_widget_value ()
+xmalloc_widget_value (
void
)
{
widget_value *value;
{
widget_value *value;
@@
-596,8
+586,7
@@
xmalloc_widget_value ()
must be left alone. */
void
must be left alone. */
void
-free_menubar_widget_value_tree (wv)
- widget_value *wv;
+free_menubar_widget_value_tree (widget_value *wv)
{
if (! wv) return;
{
if (! wv) return;
@@
-623,8
+612,7
@@
free_menubar_widget_value_tree (wv)
in menu_items starting at index START, up to index END. */
widget_value *
in menu_items starting at index START, up to index END. */
widget_value *
-digest_single_submenu (start, end, top_level_items)
- int start, end, top_level_items;
+digest_single_submenu (int start, int end, int top_level_items)
{
widget_value *wv, *prev_wv, *save_wv, *first_wv;
int i;
{
widget_value *wv, *prev_wv, *save_wv, *first_wv;
int i;
@@
-675,7
+663,7
@@
digest_single_submenu (start, end, top_level_items)
{
/* Create a new pane. */
Lisp_Object pane_name, prefix;
{
/* Create a new pane. */
Lisp_Object pane_name, prefix;
- char *pane_string;
+ c
onst c
har *pane_string;
panes_seen++;
panes_seen++;
@@
-693,6
+681,12
@@
digest_single_submenu (start, end, top_level_items)
ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
}
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))
{
#elif !defined (HAVE_MULTILINGUAL_MENU)
if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
{
@@
-702,7
+696,7
@@
digest_single_submenu (start, end, top_level_items)
#endif
pane_string = (NILP (pane_name)
#endif
pane_string = (NILP (pane_name)
- ? "" :
(char *)
SDATA (pane_name));
+ ? "" :
S
SDATA (pane_name));
/* If there is just one top-level pane, put all its items directly
under the top-level menu. */
if (menu_items_n_panes == 1)
/* If there is just one top-level pane, put all its items directly
under the top-level menu. */
if (menu_items_n_panes == 1)
@@
-766,6
+760,18
@@
digest_single_submenu (start, end, top_level_items)
descrip = ENCODE_SYSTEM (descrip);
ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
}
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))
{
#elif !defined (HAVE_MULTILINGUAL_MENU)
if (STRING_MULTIBYTE (item_name))
{
@@
-834,8
+840,7
@@
digest_single_submenu (start, end, top_level_items)
tree is constructed, and small strings are relocated. So we must wait
until no GC can happen before storing pointers into lisp values. */
void
tree is constructed, and small strings are relocated. So we must wait
until no GC can happen before storing pointers into lisp values. */
void
-update_submenu_strings (first_wv)
- widget_value *first_wv;
+update_submenu_strings (widget_value *first_wv)
{
widget_value *wv;
{
widget_value *wv;
@@
-843,7
+848,7
@@
update_submenu_strings (first_wv)
{
if (STRINGP (wv->lname))
{
{
if (STRINGP (wv->lname))
{
- wv->name =
(char *)
SDATA (wv->lname);
+ wv->name =
S
SDATA (wv->lname);
/* Ignore the @ that means "separate pane".
This is a kludge, but this isn't worth more time. */
/* Ignore the @ that means "separate pane".
This is a kludge, but this isn't worth more time. */
@@
-856,7
+861,7
@@
update_submenu_strings (first_wv)
}
if (STRINGP (wv->lkey))
}
if (STRINGP (wv->lkey))
- wv->key =
(char *)
SDATA (wv->lkey);
+ wv->key =
S
SDATA (wv->lkey);
if (wv->contents)
update_submenu_strings (wv->contents);
if (wv->contents)
update_submenu_strings (wv->contents);
@@
-869,11
+874,7
@@
update_submenu_strings (first_wv)
VECTOR is an array of menu events for the whole menu. */
void
VECTOR is an array of menu events for the whole menu. */
void
-find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data)
- FRAME_PTR f;
- int menu_bar_items_used;
- Lisp_Object vector;
- void *client_data;
+find_and_call_menu_selection (FRAME_PTR f, int menu_bar_items_used, Lisp_Object vector, void *client_data)
{
Lisp_Object prefix, entry;
Lisp_Object *subprefix_stack;
{
Lisp_Object prefix, entry;
Lisp_Object *subprefix_stack;
@@
-1060,20
+1061,18
@@
keyboard input, then this normally results in a quit and
`x-popup-menu' does not return. But if POSITION is a mouse button
event (indicating that the user invoked the menu with the mouse) then
no quit occurs and `x-popup-menu' returns nil. */)
`x-popup-menu' does not return. But if POSITION is a mouse button
event (indicating that the user invoked the menu with the mouse) then
no quit occurs and `x-popup-menu' returns nil. */)
- (position, menu)
- Lisp_Object position, menu;
+ (Lisp_Object position, Lisp_Object menu)
{
Lisp_Object keymap, tem;
int xpos = 0, ypos = 0;
Lisp_Object title;
{
Lisp_Object keymap, tem;
int xpos = 0, ypos = 0;
Lisp_Object title;
- char *error_name = NULL;
+ c
onst c
har *error_name = NULL;
Lisp_Object selection = Qnil;
FRAME_PTR f = NULL;
Lisp_Object x, y, window;
int keymaps = 0;
int for_click = 0;
int specpdl_count = SPECPDL_INDEX ();
Lisp_Object selection = Qnil;
FRAME_PTR f = NULL;
Lisp_Object x, y, window;
int keymaps = 0;
int for_click = 0;
int specpdl_count = SPECPDL_INDEX ();
- Lisp_Object timestamp = Qnil;
struct gcpro gcpro1;
if (NILP (position))
struct gcpro gcpro1;
if (NILP (position))
@@
-1107,10
+1106,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) */
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
}
/* If a click happens in an external tool bar or a detached
@@
-1144,12
+1142,12
@@
no quit occurs and `x-popup-menu' returns nil. */)
Lisp_Object bar_window;
enum scroll_bar_part part;
unsigned long time;
Lisp_Object bar_window;
enum scroll_bar_part part;
unsigned long time;
-
void (*mouse_position_hook) P_ (
(struct frame **, int,
-
Lisp_Object *,
-
enum scroll_bar_part *,
-
Lisp_Object *,
-
Lisp_Object *,
-
unsigned long *)
) =
+
void (*mouse_position_hook)
(struct frame **, int,
+ Lisp_Object *,
+ enum scroll_bar_part *,
+ Lisp_Object *,
+ Lisp_Object *,
+
unsigned long *
) =
FRAME_TERMINAL (new_f)->mouse_position_hook;
if (mouse_position_hook)
FRAME_TERMINAL (new_f)->mouse_position_hook;
if (mouse_position_hook)
@@
-1318,9
+1316,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 */
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,
selection = xmenu_show (f, xpos, ypos, for_click,
keymaps, title, &error_name,
-
INTEGERP (timestamp) ? XUINT (timestamp) : 0
);
+
last_event_timestamp
);
#endif
UNBLOCK_INPUT;
#endif
UNBLOCK_INPUT;
@@
-1344,7
+1346,7
@@
no quit occurs and `x-popup-menu' returns nil. */)
}
void
}
void
-syms_of_menu ()
+syms_of_menu (
void
)
{
staticpro (&menu_items);
menu_items = Qnil;
{
staticpro (&menu_items);
menu_items = Qnil;
@@
-1352,6
+1354,3
@@
syms_of_menu ()
defsubr (&Sx_popup_menu);
}
defsubr (&Sx_popup_menu);
}
-
-/* arch-tag: 78bbc7cf-8025-4156-aa8a-6c7fd99bf51d
- (do not change this comment) */