comparison src/macmenu.c @ 49600:23a1cea22d13

Trailing whitespace deleted.
author Juanma Barranquero <lekktu@gmail.com>
date Tue, 04 Feb 2003 14:56:31 +0000
parents 3cabed8b65b7
children 22a5614b558f d7ddb3e565de
comparison
equal deleted inserted replaced
49599:5ade352e8d1c 49600:23a1cea22d13
118 { 118 {
119 /* name of widget */ 119 /* name of widget */
120 char* name; 120 char* name;
121 /* value (meaning depend on widget type) */ 121 /* value (meaning depend on widget type) */
122 char* value; 122 char* value;
123 /* keyboard equivalent. no implications for XtTranslations */ 123 /* keyboard equivalent. no implications for XtTranslations */
124 char* key; 124 char* key;
125 /* Help string or nil if none. 125 /* Help string or nil if none.
126 GC finds this string through the frame's menu_bar_vector 126 GC finds this string through the frame's menu_bar_vector
127 or through menu_items. */ 127 or through menu_items. */
128 Lisp_Object help; 128 Lisp_Object help;
172 172
173 #ifndef TRUE 173 #ifndef TRUE
174 #define TRUE 1 174 #define TRUE 1
175 #define FALSE 0 175 #define FALSE 0
176 #endif /* no TRUE */ 176 #endif /* no TRUE */
177 177
178 Lisp_Object Vmenu_updating_frame; 178 Lisp_Object Vmenu_updating_frame;
179 179
180 Lisp_Object Qdebug_on_next_call; 180 Lisp_Object Qdebug_on_next_call;
181 181
182 extern Lisp_Object Qmenu_bar; 182 extern Lisp_Object Qmenu_bar;
505 } 505 }
506 } 506 }
507 507
508 /* This is a subroutine of single_keymap_panes that handles one 508 /* This is a subroutine of single_keymap_panes that handles one
509 keymap entry. 509 keymap entry.
510 KEY is a key in a keymap and ITEM is its binding. 510 KEY is a key in a keymap and ITEM is its binding.
511 PENDING_MAPS_PTR points to a list of keymaps waiting to be made into 511 PENDING_MAPS_PTR points to a list of keymaps waiting to be made into
512 separate panes. 512 separate panes.
513 If NOTREAL is nonzero, only check for equivalent key bindings, don't 513 If NOTREAL is nonzero, only check for equivalent key bindings, don't
514 evaluate expressions in menu items and don't make any menu. 514 evaluate expressions in menu items and don't make any menu.
515 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */ 515 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */
521 int maxdepth, notreal; 521 int maxdepth, notreal;
522 { 522 {
523 Lisp_Object map, item_string, enabled; 523 Lisp_Object map, item_string, enabled;
524 struct gcpro gcpro1, gcpro2; 524 struct gcpro gcpro1, gcpro2;
525 int res; 525 int res;
526 526
527 /* Parse the menu item and leave the result in item_properties. */ 527 /* Parse the menu item and leave the result in item_properties. */
528 GCPRO2 (key, item); 528 GCPRO2 (key, item);
529 res = parse_menu_item (item, notreal, 0); 529 res = parse_menu_item (item, notreal, 0);
530 UNGCPRO; 530 UNGCPRO;
531 if (!res) 531 if (!res)
532 return; /* Not a menu item. */ 532 return; /* Not a menu item. */
533 533
534 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; 534 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP];
535 535
536 if (notreal) 536 if (notreal)
537 { 537 {
538 /* We don't want to make a menu, just traverse the keymaps to 538 /* We don't want to make a menu, just traverse the keymaps to
539 precompute equivalent key bindings. */ 539 precompute equivalent key bindings. */
540 if (!NILP (map)) 540 if (!NILP (map))
541 single_keymap_panes (map, Qnil, key, 1, maxdepth - 1); 541 single_keymap_panes (map, Qnil, key, 1, maxdepth - 1);
542 return; 542 return;
543 } 543 }
544 544
545 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE]; 545 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE];
546 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; 546 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
547 547
548 if (!NILP (map) && SREF (item_string, 0) == '@') 548 if (!NILP (map) && SREF (item_string, 0) == '@')
549 { 549 {
550 if (!NILP (enabled)) 550 if (!NILP (enabled))
551 /* An enabled separate pane. Remember this to handle it later. */ 551 /* An enabled separate pane. Remember this to handle it later. */
816 816
817 list_of_panes (Fcdr (menu)); 817 list_of_panes (Fcdr (menu));
818 818
819 keymaps = 0; 819 keymaps = 0;
820 } 820 }
821 821
822 if (NILP (position)) 822 if (NILP (position))
823 { 823 {
824 discard_menu_items (); 824 discard_menu_items ();
825 UNGCPRO; 825 UNGCPRO;
826 return Qnil; 826 return Qnil;
969 processing of the menus. 969 processing of the menus.
970 970
971 But first we recompute the menu bar contents (the whole tree). 971 But first we recompute the menu bar contents (the whole tree).
972 972
973 This way we can safely execute Lisp code. */ 973 This way we can safely execute Lisp code. */
974 974
975 void 975 void
976 x_activate_menubar (f) 976 x_activate_menubar (f)
977 FRAME_PTR f; 977 FRAME_PTR f;
978 { 978 {
979 SInt32 menu_choice; 979 SInt32 menu_choice;
1180 wv->button_type = BUTTON_TYPE_NONE; 1180 wv->button_type = BUTTON_TYPE_NONE;
1181 wv->help = Qnil; 1181 wv->help = Qnil;
1182 first_wv = wv; 1182 first_wv = wv;
1183 save_wv = 0; 1183 save_wv = 0;
1184 prev_wv = 0; 1184 prev_wv = 0;
1185 1185
1186 /* Loop over all panes and items made during this call 1186 /* Loop over all panes and items made during this call
1187 and construct a tree of widget_value objects. 1187 and construct a tree of widget_value objects.
1188 Ignore the panes and items made by previous calls to 1188 Ignore the panes and items made by previous calls to
1189 single_submenu, even though those are also in menu_items. */ 1189 single_submenu, even though those are also in menu_items. */
1190 i = previous_items; 1190 i = previous_items;
1284 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; 1284 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
1285 } 1285 }
1286 #endif /* not HAVE_MULTILINGUAL_MENU */ 1286 #endif /* not HAVE_MULTILINGUAL_MENU */
1287 1287
1288 wv = xmalloc_widget_value (); 1288 wv = xmalloc_widget_value ();
1289 if (prev_wv) 1289 if (prev_wv)
1290 prev_wv->next = wv; 1290 prev_wv->next = wv;
1291 else 1291 else
1292 save_wv->contents = wv; 1292 save_wv->contents = wv;
1293 1293
1294 wv->name = (char *) SDATA (item_name); 1294 wv->name = (char *) SDATA (item_name);
1430 maps = XVECTOR (items)->contents[i + 2]; 1430 maps = XVECTOR (items)->contents[i + 2];
1431 if (NILP (string)) 1431 if (NILP (string))
1432 break; 1432 break;
1433 1433
1434 wv = single_submenu (key, string, maps); 1434 wv = single_submenu (key, string, maps);
1435 if (prev_wv) 1435 if (prev_wv)
1436 prev_wv->next = wv; 1436 prev_wv->next = wv;
1437 else 1437 else
1438 first_wv->contents = wv; 1438 first_wv->contents = wv;
1439 /* Don't set wv->name here; GC during the loop might relocate it. */ 1439 /* Don't set wv->name here; GC during the loop might relocate it. */
1440 wv->enabled = 1; 1440 wv->enabled = 1;
1506 menu item is really supposed to be empty. */ 1506 menu item is really supposed to be empty. */
1507 /* The EMACS_INT cast avoids a warning. 1507 /* The EMACS_INT cast avoids a warning.
1508 This value just has to be different from small integers. */ 1508 This value just has to be different from small integers. */
1509 wv->call_data = (void *) (EMACS_INT) (-1); 1509 wv->call_data = (void *) (EMACS_INT) (-1);
1510 1510
1511 if (prev_wv) 1511 if (prev_wv)
1512 prev_wv->next = wv; 1512 prev_wv->next = wv;
1513 else 1513 else
1514 first_wv->contents = wv; 1514 first_wv->contents = wv;
1515 prev_wv = wv; 1515 prev_wv = wv;
1516 } 1516 }
1535 { 1535 {
1536 DeleteMenu (i); 1536 DeleteMenu (i);
1537 DisposeMenu (menu); 1537 DisposeMenu (menu);
1538 menu = GetMenuHandle (++i); 1538 menu = GetMenuHandle (++i);
1539 } 1539 }
1540 1540
1541 i = MIN_SUBMENU_ID; 1541 i = MIN_SUBMENU_ID;
1542 menu = GetMenuHandle (i); 1542 menu = GetMenuHandle (i);
1543 while (menu != NULL) 1543 while (menu != NULL)
1544 { 1544 {
1545 DeleteMenu (i); 1545 DeleteMenu (i);
1547 menu = GetMenuHandle (++i); 1547 menu = GetMenuHandle (++i);
1548 } 1548 }
1549 } 1549 }
1550 1550
1551 fill_menubar (first_wv->contents); 1551 fill_menubar (first_wv->contents);
1552 1552
1553 DrawMenuBar (); 1553 DrawMenuBar ();
1554 1554
1555 free_menubar_widget_value_tree (first_wv); 1555 free_menubar_widget_value_tree (first_wv);
1556 1556
1557 UNBLOCK_INPUT; 1557 UNBLOCK_INPUT;
1558 } 1558 }
1559 1559
1638 wv->enabled = 1; 1638 wv->enabled = 1;
1639 wv->button_type = BUTTON_TYPE_NONE; 1639 wv->button_type = BUTTON_TYPE_NONE;
1640 wv->help = Qnil; 1640 wv->help = Qnil;
1641 first_wv = wv; 1641 first_wv = wv;
1642 first_pane = 1; 1642 first_pane = 1;
1643 1643
1644 /* Loop over all panes and items, filling in the tree. */ 1644 /* Loop over all panes and items, filling in the tree. */
1645 i = 0; 1645 i = 0;
1646 while (i < menu_items_used) 1646 while (i < menu_items_used)
1647 { 1647 {
1648 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) 1648 if (EQ (XVECTOR (menu_items)->contents[i], Qnil))
1741 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; 1741 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
1742 } 1742 }
1743 #endif /* not HAVE_MULTILINGUAL_MENU */ 1743 #endif /* not HAVE_MULTILINGUAL_MENU */
1744 1744
1745 wv = xmalloc_widget_value (); 1745 wv = xmalloc_widget_value ();
1746 if (prev_wv) 1746 if (prev_wv)
1747 prev_wv->next = wv; 1747 prev_wv->next = wv;
1748 else 1748 else
1749 save_wv->contents = wv; 1749 save_wv->contents = wv;
1750 wv->name = (char *) SDATA (item_name); 1750 wv->name = (char *) SDATA (item_name);
1751 if (!NILP (descrip)) 1751 if (!NILP (descrip))
1752 wv->key = (char *) SDATA (descrip); 1752 wv->key = (char *) SDATA (descrip);
1753 wv->value = 0; 1753 wv->value = 0;
1828 /* Display the menu. */ 1828 /* Display the menu. */
1829 menu_item_choice = PopUpMenuSelect (menu, pos.v, pos.h, 0); 1829 menu_item_choice = PopUpMenuSelect (menu, pos.v, pos.h, 0);
1830 menu_item_selection = LoWord (menu_item_choice); 1830 menu_item_selection = LoWord (menu_item_choice);
1831 1831
1832 /* Get the refcon to find the correct item*/ 1832 /* Get the refcon to find the correct item*/
1833 if (menu_item_selection) 1833 if (menu_item_selection)
1834 { 1834 {
1835 menu = GetMenuHandle (HiWord (menu_item_choice)); 1835 menu = GetMenuHandle (HiWord (menu_item_choice));
1836 if (menu) { 1836 if (menu) {
1837 GetMenuItemRefCon (menu, menu_item_selection, &refcon); 1837 GetMenuItemRefCon (menu, menu_item_selection, &refcon);
1838 } 1838 }
1839 } 1839 }
1840 1840
1841 #if 0 1841 #if 0
1842 /* Clean up extraneous mouse events which might have been generated 1842 /* Clean up extraneous mouse events which might have been generated
1843 during the call. */ 1843 during the call. */
1844 discard_mouse_events (); 1844 discard_mouse_events ();
1845 #endif 1845 #endif
1942 int left; 1942 int left;
1943 EventRecord event_record; 1943 EventRecord event_record;
1944 SInt16 part_code; 1944 SInt16 part_code;
1945 int control_part_code; 1945 int control_part_code;
1946 Point mouse; 1946 Point mouse;
1947 1947
1948 dialog_name = wv->name; 1948 dialog_name = wv->name;
1949 nb_buttons = dialog_name[1] - '0'; 1949 nb_buttons = dialog_name[1] - '0';
1950 left_count = nb_buttons - (dialog_name[4] - '0'); 1950 left_count = nb_buttons - (dialog_name[4] - '0');
1951 button_labels = (char **) alloca (sizeof (char *) * nb_buttons); 1951 button_labels = (char **) alloca (sizeof (char *) * nb_buttons);
1952 ref_cons = (UInt32 *) alloca (sizeof (UInt32) * nb_buttons); 1952 ref_cons = (UInt32 *) alloca (sizeof (UInt32) * nb_buttons);
1953 1953
1954 wv = wv->contents; 1954 wv = wv->contents;
1955 prompt = (char *) alloca (strlen (wv->value) + 1); 1955 prompt = (char *) alloca (strlen (wv->value) + 1);
1956 strcpy (prompt, wv->value); 1956 strcpy (prompt, wv->value);
1957 c2pstr (prompt); 1957 c2pstr (prompt);
1958 1958
1972 #if TARGET_API_MAC_CARBON 1972 #if TARGET_API_MAC_CARBON
1973 SetPort (GetWindowPort (window_ptr)); 1973 SetPort (GetWindowPort (window_ptr));
1974 #else 1974 #else
1975 SetPort (window_ptr); 1975 SetPort (window_ptr);
1976 #endif 1976 #endif
1977 1977
1978 TextFont (0); 1978 TextFont (0);
1979 /* Left and right margins in the dialog are 13 pixels each.*/ 1979 /* Left and right margins in the dialog are 13 pixels each.*/
1980 dialog_width = 14; 1980 dialog_width = 14;
1981 /* Calculate width of dialog box: 8 pixels on each side of the text 1981 /* Calculate width of dialog box: 8 pixels on each side of the text
1982 label in each button, 12 pixels between buttons. */ 1982 label in each button, 12 pixels between buttons. */
1994 #if TARGET_API_MAC_CARBON 1994 #if TARGET_API_MAC_CARBON
1995 SetPort (GetWindowPort (window_ptr)); 1995 SetPort (GetWindowPort (window_ptr));
1996 #else 1996 #else
1997 SetPort (window_ptr); 1997 SetPort (window_ptr);
1998 #endif 1998 #endif
1999 1999
2000 TextFont (0); 2000 TextFont (0);
2001 2001
2002 MoveTo (13, 29); 2002 MoveTo (13, 29);
2003 DrawString (prompt); 2003 DrawString (prompt);
2004 2004
2032 } 2032 }
2033 } 2033 }
2034 } 2034 }
2035 2035
2036 DisposeWindow (window_ptr); 2036 DisposeWindow (window_ptr);
2037 2037
2038 return i; 2038 return i;
2039 } 2039 }
2040 2040
2041 static char * button_names [] = { 2041 static char * button_names [] = {
2042 "button1", "button2", "button3", "button4", "button5", 2042 "button1", "button2", "button3", "button4", "button5",
2074 Lisp_Object pane_name, prefix; 2074 Lisp_Object pane_name, prefix;
2075 char *pane_string; 2075 char *pane_string;
2076 pane_name = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME]; 2076 pane_name = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME];
2077 prefix = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_PREFIX]; 2077 prefix = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_PREFIX];
2078 pane_string = (NILP (pane_name) 2078 pane_string = (NILP (pane_name)
2079 ? "" : (char *) SDATA (pane_name)); 2079 ? "" : (char *) SDATA (pane_name));
2080 prev_wv = xmalloc_widget_value (); 2080 prev_wv = xmalloc_widget_value ();
2081 prev_wv->value = pane_string; 2081 prev_wv->value = pane_string;
2082 if (keymaps && !NILP (prefix)) 2082 if (keymaps && !NILP (prefix))
2083 prev_wv->name++; 2083 prev_wv->name++;
2084 prev_wv->enabled = 1; 2084 prev_wv->enabled = 1;
2085 prev_wv->name = "message"; 2085 prev_wv->name = "message";
2086 prev_wv->help = Qnil; 2086 prev_wv->help = Qnil;
2087 first_wv = prev_wv; 2087 first_wv = prev_wv;
2088 2088
2089 /* Loop over all panes and items, filling in the tree. */ 2089 /* Loop over all panes and items, filling in the tree. */
2090 i = MENU_ITEMS_PANE_LENGTH; 2090 i = MENU_ITEMS_PANE_LENGTH;
2091 while (i < menu_items_used) 2091 while (i < menu_items_used)
2092 { 2092 {
2093 2093
2094 /* Create a new item within current pane. */ 2094 /* Create a new item within current pane. */
2095 Lisp_Object item_name, enable, descrip, help; 2095 Lisp_Object item_name, enable, descrip, help;
2096 2096
2097 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; 2097 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME];
2098 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; 2098 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE];
2099 descrip 2099 descrip
2100 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; 2100 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY];
2101 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; 2101 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP];
2102 2102
2103 if (NILP (item_name)) 2103 if (NILP (item_name))
2104 { 2104 {
2105 free_menubar_widget_value_tree (first_wv); 2105 free_menubar_widget_value_tree (first_wv);
2106 *error = "Submenu in dialog items"; 2106 *error = "Submenu in dialog items";
2107 return Qnil; 2107 return Qnil;
2238 Str255 item_name; 2238 Str255 item_name;
2239 int pos, i; 2239 int pos, i;
2240 2240
2241 if (name_is_separator (wv->name)) 2241 if (name_is_separator (wv->name))
2242 AppendMenu (menu, "\p-"); 2242 AppendMenu (menu, "\p-");
2243 else 2243 else
2244 { 2244 {
2245 AppendMenu (menu, "\pX"); 2245 AppendMenu (menu, "\pX");
2246 2246
2247 #if TARGET_API_MAC_CARBON 2247 #if TARGET_API_MAC_CARBON
2248 pos = CountMenuItems (menu); 2248 pos = CountMenuItems (menu);
2249 #else 2249 #else
2250 pos = CountMItems (menu); 2250 pos = CountMItems (menu);
2251 #endif 2251 #endif
2338 2338
2339 for (id = MIN_MENU_ID; wv != NULL; wv = wv->next, id++) 2339 for (id = MIN_MENU_ID; wv != NULL; wv = wv->next, id++)
2340 { 2340 {
2341 MenuHandle menu; 2341 MenuHandle menu;
2342 Str255 title; 2342 Str255 title;
2343 2343
2344 strncpy (title, wv->name, 255); 2344 strncpy (title, wv->name, 255);
2345 title[255] = 0; 2345 title[255] = 0;
2346 c2pstr (title); 2346 c2pstr (title);
2347 menu = NewMenu (id, title); 2347 menu = NewMenu (id, title);
2348 2348
2349 if (wv->contents) 2349 if (wv->contents)
2350 fill_menu (menu, wv->contents); 2350 fill_menu (menu, wv->contents);
2351 2351
2352 InsertMenu (menu, 0); 2352 InsertMenu (menu, 0);
2353 } 2353 }
2354 } 2354 }
2355 2355
2356 #endif /* HAVE_MENUS */ 2356 #endif /* HAVE_MENUS */