| 881 | } |
| 882 | |
| 883 | int |
| 884 | X11_select_menu(winid window, int how, menu_item **menu_list) |
| 885 | { |
| 886 | x11_menu_item *curr; |
| 887 | struct xwindow *wp; |
| 888 | struct menu_info_t *menu_info; |
| 889 | Arg args[10]; |
| 890 | Cardinal num_args; |
| 891 | int retval; |
| 892 | Dimension v_pixel_width, v_pixel_height; |
| 893 | boolean labeled; |
| 894 | Widget viewport_widget, form, label, all; |
| 895 | char gacc[QBUFSZ], *ap; |
| 896 | boolean permi; |
| 897 | |
| 898 | *menu_list = (menu_item *) 0; |
| 899 | check_winid(window); |
| 900 | wp = &window_list[window]; |
| 901 | menu_info = wp->menu_information; |
| 902 | if (!menu_info->is_menu) { |
| 903 | impossible("select_menu: called before start_menu"); |
| 904 | return 0; |
| 905 | } |
| 906 | |
| 907 | debugpline2("X11_select_menu(%i, %i)", window, how); |
| 908 | |
| 909 | create_menu_translation_tables(); |
| 910 | |
| 911 | if (menu_info->permi && how != PICK_NONE) { |
| 912 | /* Core is reusing perm_invent window for picking an item. |
| 913 | But it could be even on a different screen! |
| 914 | Create a new temp window for it instead. */ |
| 915 | winid newwin = X11_create_nhwindow(NHW_MENU); |
| 916 | struct xwindow *nwp = &window_list[newwin]; |
| 917 | |
| 918 | X11_start_menu(newwin, MENU_BEHAVE_STANDARD); |
| 919 | move_menu(&menu_info->new_menu, &nwp->menu_information->new_menu); |
| 920 | for (curr = nwp->menu_information->new_menu.base; curr; |
| 921 | curr = curr->next) |
| 922 | curr->window = newwin; |
| 923 | nwp->menu_information->permi = FALSE; |
| 924 | retval = X11_select_menu(newwin, how, menu_list); |
| 925 | destroy_menu_entry_widgets(nwp); |
| 926 | X11_destroy_nhwindow(newwin); |
| 927 | return retval; |
| 928 | } |
| 929 | |
| 930 | menu_info->how = (short) how; |
| 931 | |
| 932 | /* collect group accelerators; for PICK_NONE, they're ignored; |
| 933 | for PICK_ONE, only those which match exactly one entry will be |
| 934 | accepted; for PICK_ANY, those which match any entry are okay */ |
| 935 | gacc[0] = '\0'; |
| 936 | if (menu_info->how != PICK_NONE) { |
| 937 | int i, n, gcnt[128]; |
| 938 | #define GSELIDX(c) ((c) & 127) /* guard against `signed char' */ |
| 939 | |
| 940 | for (i = 0; i < SIZE(gcnt); i++) |
no test coverage detected