aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog11
-rw-r--r--src/gtkutil.h2
-rw-r--r--src/xmenu.c59
3 files changed, 59 insertions, 13 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index e45f9b6e563..b761d28b29e 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,14 @@
12004-08-30 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2
3 * xmenu.c (digest_single_submenu): Set lname and lkey in widget_value
4 instead of name and key.
5 (update_submenu_strings): New function.
6 (set_frame_menubar): Remove call to inhibit_garbage_collection,
7 call update_submenu_strings. Call ENCODE_MENU_STRING for top level
8 menu names.
9
10 * gtkutil.h (_widget_value): Added lname and lkey.
11
12004-08-30 Steven Tamm <steventamm@mac.com> 122004-08-30 Steven Tamm <steventamm@mac.com>
2 13
3 * macmenu.c (mac_menu_show): Remove shadowing of menu variable 14 * macmenu.c (mac_menu_show): Remove shadowing of menu variable
diff --git a/src/gtkutil.h b/src/gtkutil.h
index b31ec8c2a1f..b35ab94b2cb 100644
--- a/src/gtkutil.h
+++ b/src/gtkutil.h
@@ -96,10 +96,12 @@ typedef struct xg_menu_item_cb_data_
96typedef struct _widget_value 96typedef struct _widget_value
97{ 97{
98 /* name of widget */ 98 /* name of widget */
99 Lisp_Object lname;
99 char *name; 100 char *name;
100 /* value (meaning depend on widget type) */ 101 /* value (meaning depend on widget type) */
101 char *value; 102 char *value;
102 /* keyboard equivalent. no implications for XtTranslations */ 103 /* keyboard equivalent. no implications for XtTranslations */
104 Lisp_Object lkey;
103 char *key; 105 char *key;
104 /* Help string or nil if none. 106 /* Help string or nil if none.
105 GC finds this string through the frame's menu_bar_vector 107 GC finds this string through the frame's menu_bar_vector
diff --git a/src/xmenu.c b/src/xmenu.c
index 7ef0e8c857d..2eed2b4987e 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -1701,12 +1701,9 @@ digest_single_submenu (start, end, top_level_items)
1701 save_wv->next = wv; 1701 save_wv->next = wv;
1702 else 1702 else
1703 first_wv->contents = wv; 1703 first_wv->contents = wv;
1704 wv->name = pane_string; 1704 wv->lname = pane_name;
1705 /* Ignore the @ that means "separate pane". 1705 /* Set value to 1 so update_submenu_strings can handle '@' */
1706 This is a kludge, but this isn't worth more time. */ 1706 wv->value = (char *)1;
1707 if (!NILP (prefix) && wv->name[0] == '@')
1708 wv->name++;
1709 wv->value = 0;
1710 wv->enabled = 1; 1707 wv->enabled = 1;
1711 wv->button_type = BUTTON_TYPE_NONE; 1708 wv->button_type = BUTTON_TYPE_NONE;
1712 wv->help = Qnil; 1709 wv->help = Qnil;
@@ -1749,9 +1746,9 @@ digest_single_submenu (start, end, top_level_items)
1749 else 1746 else
1750 save_wv->contents = wv; 1747 save_wv->contents = wv;
1751 1748
1752 wv->name = (char *) SDATA (item_name); 1749 wv->lname = item_name;
1753 if (!NILP (descrip)) 1750 if (!NILP (descrip))
1754 wv->key = (char *) SDATA (descrip); 1751 wv->lkey = descrip;
1755 wv->value = 0; 1752 wv->value = 0;
1756 /* The EMACS_INT cast avoids a warning. There's no problem 1753 /* The EMACS_INT cast avoids a warning. There's no problem
1757 as long as pointers have enough bits to hold small integers. */ 1754 as long as pointers have enough bits to hold small integers. */
@@ -1790,6 +1787,42 @@ digest_single_submenu (start, end, top_level_items)
1790 1787
1791 return first_wv; 1788 return first_wv;
1792} 1789}
1790
1791/* Walk through thw widget_value tree starting at FIRST_WV and update
1792 the char * pointers from the corresponding lisp values.
1793 We do this after building the whole tree, since GC may happen while the
1794 tree is constructed, and small strings are relocated. So we must wait
1795 until no GC can happen before storing pointers into lisp values. */
1796static void
1797update_submenu_strings (first_wv)
1798 widget_value *first_wv;
1799{
1800 widget_value *wv;
1801
1802 for (wv = first_wv; wv; wv = wv->next)
1803 {
1804 if (wv->lname && ! NILP (wv->lname))
1805 {
1806 wv->name = SDATA (wv->lname);
1807
1808 /* Ignore the @ that means "separate pane".
1809 This is a kludge, but this isn't worth more time. */
1810 if (wv->value == (char *)1)
1811 {
1812 if (wv->name[0] == '@')
1813 wv->name++;
1814 wv->value = 0;
1815 }
1816 }
1817
1818 if (wv->lkey && ! NILP (wv->lkey))
1819 wv->key = SDATA (wv->lkey);
1820
1821 if (wv->contents)
1822 update_submenu_strings (wv->contents);
1823 }
1824}
1825
1793 1826
1794/* Recompute all the widgets of frame F, when the menu bar has been 1827/* Recompute all the widgets of frame F, when the menu bar has been
1795 changed. Value is non-zero if widgets were updated. */ 1828 changed. Value is non-zero if widgets were updated. */
@@ -1930,7 +1963,6 @@ set_frame_menubar (f, first_time, deep_p)
1930 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); 1963 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
1931 1964
1932 items = FRAME_MENU_BAR_ITEMS (f); 1965 items = FRAME_MENU_BAR_ITEMS (f);
1933 inhibit_garbage_collection ();
1934 1966
1935 /* Save the frame's previous menu bar contents data. */ 1967 /* Save the frame's previous menu bar contents data. */
1936 if (previous_menu_items_used) 1968 if (previous_menu_items_used)
@@ -2023,9 +2055,10 @@ set_frame_menubar (f, first_time, deep_p)
2023 Lisp_Object string; 2055 Lisp_Object string;
2024 string = XVECTOR (items)->contents[i + 1]; 2056 string = XVECTOR (items)->contents[i + 1];
2025 if (NILP (string)) 2057 if (NILP (string))
2026 break; 2058 break;
2027 wv->name = (char *) SDATA (string); 2059 wv->name = (char *) SDATA (ENCODE_MENU_STRING (string));
2028 wv = wv->next; 2060 update_submenu_strings (wv->contents);
2061 wv = wv->next;
2029 } 2062 }
2030 2063
2031 f->menu_bar_vector = menu_items; 2064 f->menu_bar_vector = menu_items;
@@ -2055,7 +2088,7 @@ set_frame_menubar (f, first_time, deep_p)
2055 break; 2088 break;
2056 2089
2057 wv = xmalloc_widget_value (); 2090 wv = xmalloc_widget_value ();
2058 wv->name = (char *) SDATA (string); 2091 wv->name = (char *) SDATA (ENCODE_MENU_STRING (string));
2059 wv->value = 0; 2092 wv->value = 0;
2060 wv->enabled = 1; 2093 wv->enabled = 1;
2061 wv->button_type = BUTTON_TYPE_NONE; 2094 wv->button_type = BUTTON_TYPE_NONE;