aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Janík2002-04-19 18:56:51 +0000
committerPavel Janík2002-04-19 18:56:51 +0000
commita7e19a26743f0d5338c5e85f8fbb13224c07e547 (patch)
treef5d4fc97b7eb280d94e7d472ce266988380696f6
parent3d90c96c540ff2219a26ce0b3242b5050c16073d (diff)
downloademacs-a7e19a26743f0d5338c5e85f8fbb13224c07e547.tar.gz
emacs-a7e19a26743f0d5338c5e85f8fbb13224c07e547.zip
(xlwMenuTranslations, xlwMenuActionsList): Add translations for cursor keys
and RET. (find_next_selectable, find_prev_selectable): New functions used for finding menu-items. (Down, Up, Left, Right): New functions.
-rw-r--r--lwlib/xlwmenu.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/lwlib/xlwmenu.c b/lwlib/xlwmenu.c
index 3561fb966ba..2d879722823 100644
--- a/lwlib/xlwmenu.c
+++ b/lwlib/xlwmenu.c
@@ -1,5 +1,6 @@
1/* Implements a lightweight menubar widget. 1/* Implements a lightweight menubar widget.
2 Copyright (C) 1992 Lucid, Inc. 2 Copyright (C) 1992 Lucid, Inc.
3 Copyright (C) 2002 Free Software Foundation, Inc.
3 4
4This file is part of the Lucid Widget Library. 5This file is part of the Lucid Widget Library.
5 6
@@ -114,10 +115,21 @@ xlwMenuTranslations [] =
114<KeyUp>Alt_R: nothing()\n\ 115<KeyUp>Alt_R: nothing()\n\
115<KeyUp>Caps_Lock: nothing()\n\ 116<KeyUp>Caps_Lock: nothing()\n\
116<KeyUp>Shift_Lock:nothing()\n\ 117<KeyUp>Shift_Lock:nothing()\n\
118<Key>Return: select()\n\
119<Key>Down: down()\n\
120<Key>Up: up()\n\
121<Key>Left: left()\n\
122<Key>Right: right()\n\
117<Key>: key()\n\ 123<Key>: key()\n\
118<KeyUp>: key()\n\ 124<KeyUp>: key()\n\
119"; 125";
120 126
127/* FIXME: Space should toggle toggleable menu item but not remove the menu
128 so you can toggle the next one without entering the menu again. */
129
130/* FIXME: Should ESC close one level of menu structure or the complete menu? */
131
132
121#define offset(field) XtOffset(XlwMenuWidget, field) 133#define offset(field) XtOffset(XlwMenuWidget, field)
122static XtResource 134static XtResource
123xlwMenuResources[] = 135xlwMenuResources[] =
@@ -174,6 +186,10 @@ static void XlwMenuDestroy();
174static void XlwMenuClassInitialize(); 186static void XlwMenuClassInitialize();
175static void Start(); 187static void Start();
176static void Drag(); 188static void Drag();
189static void Down();
190static void Up();
191static void Left();
192static void Right();
177static void Select(); 193static void Select();
178static void Key(); 194static void Key();
179static void Nothing(); 195static void Nothing();
@@ -184,6 +200,10 @@ xlwMenuActionsList [] =
184{ 200{
185 {"start", Start}, 201 {"start", Start},
186 {"drag", Drag}, 202 {"drag", Drag},
203 {"down", Down},
204 {"up", Up},
205 {"left", Left},
206 {"right", Right},
187 {"select", Select}, 207 {"select", Select},
188 {"key", Key}, 208 {"key", Key},
189 {"nothing", Nothing}, 209 {"nothing", Nothing},
@@ -1984,6 +2004,146 @@ Nothing (w, ev, params, num_params)
1984{ 2004{
1985} 2005}
1986 2006
2007widget_value *
2008find_next_selectable (mw, item)
2009 XlwMenuWidget mw;
2010 widget_value *item;
2011{
2012 widget_value *current = item;
2013 enum menu_separator separator;
2014
2015 while (current->next && (current=current->next) &&
2016 (lw_separator_p (current->name, &separator, 0) || !current->enabled))
2017 ;
2018
2019 if (current == item)
2020 {
2021 current = mw->menu.old_stack [mw->menu.old_depth - 2]->contents;
2022
2023 while (lw_separator_p (current->name, &separator, 0) || !current->enabled)
2024 if (current->next)
2025 current=current->next;
2026 }
2027
2028 return current;
2029}
2030
2031widget_value *
2032find_prev_selectable (mw, item)
2033 XlwMenuWidget mw;
2034 widget_value *item;
2035{
2036 widget_value *current = item;
2037 widget_value *prev = item;
2038
2039 while ((current=find_next_selectable (mw, current)) != item)
2040 prev=current;
2041
2042 return prev;
2043}
2044
2045static void
2046Down (w, ev, params, num_params)
2047 Widget w;
2048 XEvent *ev;
2049 String *params;
2050 Cardinal *num_params;
2051{
2052 XlwMenuWidget mw = (XlwMenuWidget) w;
2053 widget_value* selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
2054
2055 /* Inside top-level menu-bar? */
2056 if (mw->menu.old_depth == 2)
2057 /* When <down> in the menu-bar is pressed, display the corresponding
2058 sub-menu and select the first menu item there. */
2059 set_new_state (mw, selected_item->contents, mw->menu.old_depth);
2060 else
2061 /* Highlight next possible (enabled and not separator) menu item. */
2062 set_new_state (mw, find_next_selectable (mw, selected_item), mw->menu.old_depth - 1);
2063
2064 remap_menubar (mw);
2065}
2066
2067static void
2068Up (w, ev, params, num_params)
2069 Widget w;
2070 XEvent *ev;
2071 String *params;
2072 Cardinal *num_params;
2073{
2074 XlwMenuWidget mw = (XlwMenuWidget) w;
2075 widget_value* selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
2076
2077 /* Inside top-level menu-bar? */
2078 if (mw->menu.old_depth == 2)
2079 {
2080 /* FIXME: this is tricky. <up> in the menu-bar should select the
2081 last selectable item in the list. So we select the first one and
2082 find the previous selectable item. Is there a better way? */
2083 set_new_state (mw, selected_item->contents, mw->menu.old_depth);
2084 remap_menubar (mw);
2085 selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
2086 set_new_state (mw, find_prev_selectable (mw, selected_item), mw->menu.old_depth - 1);
2087 }
2088 else
2089 /* Highlight previous (enabled and not separator) menu item. */
2090 set_new_state (mw, find_prev_selectable (mw, selected_item), mw->menu.old_depth - 1);
2091
2092 remap_menubar (mw);
2093}
2094
2095static void
2096Left (w, ev, params, num_params)
2097 Widget w;
2098 XEvent *ev;
2099 String *params;
2100 Cardinal *num_params;
2101{
2102 XlwMenuWidget mw = (XlwMenuWidget) w;
2103 widget_value* selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
2104
2105 /* Inside top-level menu-bar? */
2106 if (mw->menu.old_depth == 2)
2107 /* When <left> in the menu-bar is pressed, display the previous item on
2108 the menu-bar. If the current item is the first one, highlight the
2109 last item in the menubar (probably Help). */
2110 set_new_state (mw, find_prev_selectable (mw, selected_item), mw->menu.old_depth - 1);
2111 else
2112 {
2113 pop_new_stack_if_no_contents (mw);
2114 set_new_state (mw, mw->menu.old_stack [mw->menu.old_depth - 2], mw->menu.old_depth - 2);
2115 }
2116
2117 remap_menubar (mw);
2118}
2119
2120static void
2121Right (w, ev, params, num_params)
2122 Widget w;
2123 XEvent *ev;
2124 String *params;
2125 Cardinal *num_params;
2126{
2127 XlwMenuWidget mw = (XlwMenuWidget) w;
2128 widget_value* selected_item = mw->menu.old_stack [mw->menu.old_depth - 1];
2129
2130 /* Inside top-level menu-bar? */
2131 if (mw->menu.old_depth == 2)
2132 /* When <right> in the menu-bar is pressed, display the next item on
2133 the menu-bar. If the current item is the last one, highlight the
2134 first item (probably File). */
2135 set_new_state (mw, find_next_selectable (mw, selected_item), mw->menu.old_depth - 1);
2136 else if (selected_item->contents) /* Is this menu item expandable? */
2137 set_new_state (mw, selected_item->contents, mw->menu.old_depth);
2138 else
2139 {
2140 pop_new_stack_if_no_contents (mw);
2141 set_new_state (mw, mw->menu.old_stack [mw->menu.old_depth - 2], mw->menu.old_depth - 2);
2142 }
2143
2144 remap_menubar (mw);
2145}
2146
1987/* Handle key press and release events while menu is popped up. 2147/* Handle key press and release events while menu is popped up.
1988 Our action is to get rid of the menu. */ 2148 Our action is to get rid of the menu. */
1989static void 2149static void