diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 11 | ||||
| -rw-r--r-- | src/gtkutil.h | 2 | ||||
| -rw-r--r-- | src/xmenu.c | 59 |
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 @@ | |||
| 1 | 2004-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 | |||
| 1 | 2004-08-30 Steven Tamm <steventamm@mac.com> | 12 | 2004-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_ | |||
| 96 | typedef struct _widget_value | 96 | typedef 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. */ | ||
| 1796 | static void | ||
| 1797 | update_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; |