* macmenu.c (_widget_value): Added lname and lkey.

(single_submenu): Set lname and lkey in widget_value
instead of name and key.
(update_submenu_strings): New function.
(set_frame_menubar): Remove call to inhibit_garbage_collection,
call update_submenu_strings.
This commit is contained in:
Jan Djärv 2004-08-30 20:32:00 +00:00
parent 5560d460b3
commit 16ceacc222
2 changed files with 50 additions and 10 deletions

View file

@ -1,5 +1,12 @@
2004-08-30 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* macmenu.c (_widget_value): Added lname and lkey.
(single_submenu): Set lname and lkey in widget_value
instead of name and key.
(update_submenu_strings): New function.
(set_frame_menubar): Remove call to inhibit_garbage_collection,
call update_submenu_strings.
* xmenu.c (digest_single_submenu): Set lname and lkey in widget_value
instead of name and key.
(update_submenu_strings): New function.

View file

@ -90,10 +90,12 @@ enum button_type
typedef struct _widget_value
{
/* name of widget */
Lisp_Object lname;
char* name;
/* value (meaning depend on widget type) */
char* value;
/* keyboard equivalent. no implications for XtTranslations */
Lisp_Object lkey;
char* key;
/* Help string or nil if none.
GC finds this string through the frame's menu_bar_vector
@ -1221,12 +1223,9 @@ single_submenu (item_key, item_name, maps)
save_wv->next = wv;
else
first_wv->contents = wv;
wv->name = pane_string;
/* Ignore the @ that means "separate pane".
This is a kludge, but this isn't worth more time. */
if (!NILP (prefix) && wv->name[0] == '@')
wv->name++;
wv->value = 0;
wv->lname = pane_name;
/* Set value to 1 so update_submenu_strings can handle '@' */
wv->value = (char *)1;
wv->enabled = 1;
wv->button_type = BUTTON_TYPE_NONE;
wv->help = Qnil;
@ -1269,9 +1268,9 @@ single_submenu (item_key, item_name, maps)
else
save_wv->contents = wv;
wv->name = (char *) SDATA (item_name);
wv->lname = item_name;
if (!NILP (descrip))
wv->key = (char *) SDATA (descrip);
wv->lkey = descrip;
wv->value = 0;
/* The EMACS_INT cast avoids a warning. There's no problem
as long as pointers have enough bits to hold small integers. */
@ -1310,6 +1309,41 @@ single_submenu (item_key, item_name, maps)
return first_wv;
}
/* Walk through the widget_value tree starting at FIRST_WV and update
the char * pointers from the corresponding lisp values.
We do this after building the whole tree, since GC may happen while the
tree is constructed, and small strings are relocated. So we must wait
until no GC can happen before storing pointers into lisp values. */
static void
update_submenu_strings (first_wv)
widget_value *first_wv;
{
widget_value *wv;
for (wv = first_wv; wv; wv = wv->next)
{
if (wv->lname && ! NILP (wv->lname))
{
wv->name = SDATA (wv->lname);
/* Ignore the @ that means "separate pane".
This is a kludge, but this isn't worth more time. */
if (wv->value == (char *)1)
{
if (wv->name[0] == '@')
wv->name++;
wv->value = 0;
}
}
if (wv->lkey && ! NILP (wv->lkey))
wv->key = SDATA (wv->lkey);
if (wv->contents)
update_submenu_strings (wv->contents);
}
}
/* Set the contents of the menubar widgets of frame F.
The argument FIRST_TIME is currently ignored;
@ -1388,8 +1422,6 @@ set_frame_menubar (f, first_time, deep_p)
items = FRAME_MENU_BAR_ITEMS (f);
inhibit_garbage_collection ();
/* Save the frame's previous menu bar contents data. */
if (previous_menu_items_used)
bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items,
@ -1454,6 +1486,7 @@ set_frame_menubar (f, first_time, deep_p)
if (NILP (string))
break;
wv->name = (char *) SDATA (string);
update_submenu_strings (wv->contents);
wv = wv->next;
}