From f051ecb3882315c20bd459ac53ec00ebefc48b4a Mon Sep 17 00:00:00 2001 From: PatR Date: Wed, 17 Oct 2018 14:43:44 -0700 Subject: [PATCH] X11 winmenu.c housekeeping Fix a couple of compiler complaints, and move some new local functions out of the region of the file labeled `global functions'. --- win/X11/winmenu.c | 550 +++++++++++++++++++++++----------------------- 1 file changed, 279 insertions(+), 271 deletions(-) diff --git a/win/X11/winmenu.c b/win/X11/winmenu.c index 514de3325..e44b31eda 100644 --- a/win/X11/winmenu.c +++ b/win/X11/winmenu.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 winmenu.c $NHDT-Date: 1539216247 2018/10/11 00:04:07 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.18 $ */ +/* NetHack 3.6 winmenu.c $NHDT-Date: 1539812601 2018/10/17 21:43:21 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.28 $ */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ @@ -37,8 +37,8 @@ XColor FDECL(get_nhcolor, (struct xwindow *, int)); static void FDECL(init_menu_nhcolors, (struct xwindow *)); -static void FDECL(menu_size_change_handler, (Widget, XtPointer, XEvent *, Boolean *)); - +static void FDECL(menu_size_change_handler, (Widget, XtPointer, + XEvent *, Boolean *)); static void FDECL(menu_select, (Widget, XtPointer, XtPointer)); static void FDECL(invert_line, (struct xwindow *, x11_menu_item *, int, long)); static void FDECL(menu_ok, (Widget, XtPointer, XtPointer)); @@ -53,10 +53,10 @@ static void FDECL(select_match, (struct xwindow *, char *)); static void FDECL(invert_all, (struct xwindow *)); static void FDECL(invert_match, (struct xwindow *, char *)); static void FDECL(menu_popdown, (struct xwindow *)); -Widget FDECL(menu_create_buttons, (struct xwindow *, Widget, Widget)); -void FDECL(load_boldfont, (struct xwindow *, Widget)); -void FDECL(menu_create_entries, (struct xwindow *, struct menu *)); -void FDECL(destroy_menu_entry_widgets, (struct xwindow *)); +static Widget FDECL(menu_create_buttons, (struct xwindow *, Widget, Widget)); +static void FDECL(load_boldfont, (struct xwindow *, Widget)); +static void FDECL(menu_create_entries, (struct xwindow *, struct menu *)); +static void FDECL(destroy_menu_entry_widgets, (struct xwindow *)); static void NDECL(create_menu_translation_tables); static void FDECL(move_menu, (struct menu *, struct menu *)); @@ -90,11 +90,14 @@ create_menu_translation_tables() { if (!menu_translation_table) { menu_translation_table = XtParseTranslationTable(menu_translations); - menu_entry_translation_table = XtParseTranslationTable(menu_entry_translations); - menu_del_translation_table = XtParseTranslationTable("WM_PROTOCOLS: menu_delete()"); + menu_entry_translation_table + = XtParseTranslationTable(menu_entry_translations); + menu_del_translation_table + = XtParseTranslationTable("WM_PROTOCOLS: menu_delete()"); } } +/*ARGSUSED*/ static void menu_size_change_handler(w, ptr, event, flag) Widget w; @@ -104,6 +107,9 @@ Boolean *flag; { struct xwindow *wp = (struct xwindow *) ptr; + nhUse(w); + nhUse(flag); + if (!wp || !event) return; @@ -572,8 +578,7 @@ struct xwindow *wp; wp->menu_information->is_up = FALSE; /* menu is down */ } -/* Global functions ======================================================== - */ +/* Global functions ======================================================= */ void X11_start_menu(window) @@ -687,260 +692,6 @@ const char *query; menu_info->new_menu.query = copy_of(query); } -/* - * Create ok, cancel, all, none, invert, and search buttons. - */ -Widget -menu_create_buttons(wp, form, under) -struct xwindow *wp; -Widget form,under; -{ - Arg args[15]; - Cardinal num_args; - int how = wp->menu_information->how; - Boolean sens; - Widget ok, cancel, all, none, invert, search, lblwidget[6]; - Dimension lblwidth[6], maxlblwidth; - Widget label = under; - - maxlblwidth = 0; - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - ok = XtCreateManagedWidget("OK", commandWidgetClass, form, - args, num_args); - XtAddCallback(ok, XtNcallback, menu_ok, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[0]); - XtGetValues(lblwidget[0] = ok, args, ONE); - if (lblwidth[0] > maxlblwidth) - maxlblwidth = lblwidth[0]; - - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNfromHoriz), ok); num_args++; - XtSetArg(args[num_args], nhStr(XtNsensitive), how != PICK_NONE); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, - args, num_args); - XtAddCallback(cancel, XtNcallback, menu_cancel, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[1]); - XtGetValues(lblwidget[1] = cancel, args, ONE); - if (lblwidth[1] > maxlblwidth) - maxlblwidth = lblwidth[1]; - - sens = (how == PICK_ANY); - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNfromHoriz), cancel); num_args++; - XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - all = XtCreateManagedWidget("all", commandWidgetClass, form, - args, num_args); - XtAddCallback(all, XtNcallback, menu_all, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[2]); - XtGetValues(lblwidget[2] = all, args, ONE); - if (lblwidth[2] > maxlblwidth) - maxlblwidth = lblwidth[2]; - - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNfromHoriz), all); num_args++; - XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - none = XtCreateManagedWidget("none", commandWidgetClass, form, - args, num_args); - XtAddCallback(none, XtNcallback, menu_none, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[3]); - XtGetValues(lblwidget[3] = none, args, ONE); - if (lblwidth[3] > maxlblwidth) - maxlblwidth = lblwidth[3]; - - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNfromHoriz), none); num_args++; - XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - invert = XtCreateManagedWidget("invert", commandWidgetClass, form, - args, num_args); - XtAddCallback(invert, XtNcallback, menu_invert, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[4]); - XtGetValues(lblwidget[4] = invert, args, ONE); - if (lblwidth[4] > maxlblwidth) - maxlblwidth = lblwidth[4]; - - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; - XtSetArg(args[num_args], nhStr(XtNfromHoriz), invert); num_args++; - XtSetArg(args[num_args], nhStr(XtNsensitive), how != PICK_NONE); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - search = XtCreateManagedWidget("search", commandWidgetClass, form, - args, num_args); - XtAddCallback(search, XtNcallback, menu_search, (XtPointer) wp); - XtSetArg(args[0], XtNwidth, &lblwidth[5]); - XtGetValues(lblwidget[5] = search, args, ONE); - if (lblwidth[5] > maxlblwidth) - maxlblwidth = lblwidth[5]; - - /* make all buttons be the same width */ - { - int i; - - XtSetArg(args[0], XtNwidth, maxlblwidth); - for (i = 0; i < 6; ++i) - if (lblwidth[i] < maxlblwidth) - XtSetValues(lblwidget[i], args, ONE); - } - - return all; -} - -void -load_boldfont(wp, w) -struct xwindow *wp; -Widget w; -{ - Arg args[1]; - XFontStruct *fs; - unsigned long ret; - char *fontname; - Display *dpy; - - if (wp->menu_information->boldfs) - return; - - XtSetArg(args[0], nhStr(XtNfont), &fs); - XtGetValues(w, args, 1); - - if (!XGetFontProperty(fs, XA_FONT, &ret)) - return; - - wp->menu_information->boldfs_dpy = dpy = XtDisplay(w); - fontname = fontname_boldify(XGetAtomName(dpy, (Atom)ret)); - wp->menu_information->boldfs = XLoadQueryFont(dpy, fontname); -} - -void -menu_create_entries(wp, curr_menu) -struct xwindow *wp; -struct menu *curr_menu; -{ - x11_menu_item *curr; - int menulineidx = 0; - Widget prevlinewidget; - int how = wp->menu_information->how; - Arg args[15]; - Cardinal num_args; - - for (curr = curr_menu->base; curr; curr = curr->next) { - char tmpbuf[BUFSZ]; - Widget linewidget; - String str = (String) curr->str; - int attr = ATR_NONE; - int color = NO_COLOR; - boolean canpick = (how != PICK_NONE && curr->identifier.a_void); - - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNlabel), str); num_args++; - XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; - XtSetArg(args[num_args], nhStr(XtNborderWidth), 0); num_args++; - XtSetArg(args[num_args], nhStr(XtNvertDistance), 0); num_args++; - - if (!iflags.use_menu_color - || !get_menu_coloring(curr->str, &color, &attr)) - attr = curr->attr; - - if (color != NO_COLOR) { - if (attr != ATR_INVERSE) - XtSetArg(args[num_args], nhStr(XtNforeground), - get_nhcolor(wp, color).pixel); num_args++; - } - - /* TODO: ATR_BOLD, ATR_DIM, ATR_ULINE, ATR_BLINK */ - - if (attr == ATR_INVERSE) { - XtSetArg(args[num_args], nhStr(XtNforeground), - get_nhcolor(wp, CLR_BLACK).pixel); num_args++; - XtSetArg(args[num_args], nhStr(XtNbackground), - get_nhcolor(wp, color).pixel); num_args++; - } - - if (menulineidx) { - XtSetArg(args[num_args], nhStr(XtNfromVert), prevlinewidget); num_args++; - } else { - XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; - } - - XtSetArg(args[num_args], XtNtranslations, - menu_entry_translation_table); num_args++; - - menulineidx++; - Sprintf(tmpbuf, "menuline_%s", (canpick) ? "command" : "label"); - curr->w = linewidget - = XtCreateManagedWidget(tmpbuf, - canpick ? commandWidgetClass - : labelWidgetClass, - wp->w, args, num_args); - - if (attr == ATR_BOLD) { - load_boldfont(wp, curr->w); - num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfont), wp->menu_information->boldfs); num_args++; - XtSetValues(curr->w, args, num_args); - } - - if (canpick) - XtAddCallback(linewidget, XtNcallback, menu_select, - (XtPointer) curr); - prevlinewidget = linewidget; - } -} - -void -destroy_menu_entry_widgets(wp) -struct xwindow *wp; -{ - WidgetList wlist; - Cardinal numchild; - Arg args[5]; - Cardinal num_args; - x11_menu_item *curr; - struct menu_info_t *menu_info; - - if (!wp || !wp->w) - return; - - menu_info = wp->menu_information; - num_args = 0; - XtSetArg(args[num_args], XtNchildren, &wlist); num_args++; - XtSetArg(args[num_args], XtNnumChildren, &numchild); num_args++; - XtGetValues(wp->w, args, num_args); - XtUnmanageChildren(wlist, numchild); - for (curr = menu_info->curr_menu.base; curr; curr = curr->next) - if (curr->w) - XtDestroyWidget(curr->w); -} - int X11_select_menu(window, how, menu_list) winid window; @@ -978,15 +729,17 @@ menu_item **menu_list; Create a new temp window for it instead. */ winid newwin = X11_create_nhwindow(NHW_MENU); struct xwindow *nwp = &window_list[newwin]; + X11_start_menu(newwin); move_menu(&menu_info->new_menu, &nwp->menu_information->new_menu); - for (curr = nwp->menu_information->new_menu.base; curr; curr = curr->next) + for (curr = nwp->menu_information->new_menu.base; curr; + curr = curr->next) curr->window = newwin; nwp->menu_information->permi = FALSE; - int ret = X11_select_menu(newwin, how, menu_list); + retval = X11_select_menu(newwin, how, menu_list); destroy_menu_entry_widgets(nwp); X11_destroy_nhwindow(newwin); - return ret; + return retval; } menu_info->how = (short) how; @@ -1206,8 +959,7 @@ menu_item **menu_list; return retval; } -/* End global functions ==================================================== - */ +/* End global functions =================================================== */ /* * Allocate a copy of the given string. If null, return a string of @@ -1222,6 +974,261 @@ const char *s; return dupstr(s); } +/* + * Create ok, cancel, all, none, invert, and search buttons. + */ +static Widget +menu_create_buttons(wp, form, under) +struct xwindow *wp; +Widget form,under; +{ + Arg args[15]; + Cardinal num_args; + int how = wp->menu_information->how; + Boolean sens; + Widget ok, cancel, all, none, invert, search, lblwidget[6]; + Dimension lblwidth[6], maxlblwidth; + Widget label = under; + + maxlblwidth = 0; + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + ok = XtCreateManagedWidget("OK", commandWidgetClass, form, + args, num_args); + XtAddCallback(ok, XtNcallback, menu_ok, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[0]); + XtGetValues(lblwidget[0] = ok, args, ONE); + if (lblwidth[0] > maxlblwidth) + maxlblwidth = lblwidth[0]; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), ok); num_args++; + XtSetArg(args[num_args], nhStr(XtNsensitive), how != PICK_NONE); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, + args, num_args); + XtAddCallback(cancel, XtNcallback, menu_cancel, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[1]); + XtGetValues(lblwidget[1] = cancel, args, ONE); + if (lblwidth[1] > maxlblwidth) + maxlblwidth = lblwidth[1]; + + sens = (how == PICK_ANY); + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), cancel); num_args++; + XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + all = XtCreateManagedWidget("all", commandWidgetClass, form, + args, num_args); + XtAddCallback(all, XtNcallback, menu_all, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[2]); + XtGetValues(lblwidget[2] = all, args, ONE); + if (lblwidth[2] > maxlblwidth) + maxlblwidth = lblwidth[2]; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), all); num_args++; + XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + none = XtCreateManagedWidget("none", commandWidgetClass, form, + args, num_args); + XtAddCallback(none, XtNcallback, menu_none, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[3]); + XtGetValues(lblwidget[3] = none, args, ONE); + if (lblwidth[3] > maxlblwidth) + maxlblwidth = lblwidth[3]; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), none); num_args++; + XtSetArg(args[num_args], nhStr(XtNsensitive), sens); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + invert = XtCreateManagedWidget("invert", commandWidgetClass, form, + args, num_args); + XtAddCallback(invert, XtNcallback, menu_invert, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[4]); + XtGetValues(lblwidget[4] = invert, args, ONE); + if (lblwidth[4] > maxlblwidth) + maxlblwidth = lblwidth[4]; + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfromVert), label); num_args++; + XtSetArg(args[num_args], nhStr(XtNfromHoriz), invert); num_args++; + XtSetArg(args[num_args], nhStr(XtNsensitive), how != PICK_NONE); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + search = XtCreateManagedWidget("search", commandWidgetClass, form, + args, num_args); + XtAddCallback(search, XtNcallback, menu_search, (XtPointer) wp); + XtSetArg(args[0], XtNwidth, &lblwidth[5]); + XtGetValues(lblwidget[5] = search, args, ONE); + if (lblwidth[5] > maxlblwidth) + maxlblwidth = lblwidth[5]; + + /* make all buttons be the same width */ + { + int i; + + XtSetArg(args[0], XtNwidth, maxlblwidth); + for (i = 0; i < 6; ++i) + if (lblwidth[i] < maxlblwidth) + XtSetValues(lblwidget[i], args, ONE); + } + + return all; +} + +static void +load_boldfont(wp, w) +struct xwindow *wp; +Widget w; +{ + Arg args[1]; + XFontStruct *fs; + unsigned long ret; + char *fontname; + Display *dpy; + + if (wp->menu_information->boldfs) + return; + + XtSetArg(args[0], nhStr(XtNfont), &fs); + XtGetValues(w, args, 1); + + if (!XGetFontProperty(fs, XA_FONT, &ret)) + return; + + wp->menu_information->boldfs_dpy = dpy = XtDisplay(w); + fontname = fontname_boldify(XGetAtomName(dpy, (Atom)ret)); + wp->menu_information->boldfs = XLoadQueryFont(dpy, fontname); +} + +static void +menu_create_entries(wp, curr_menu) +struct xwindow *wp; +struct menu *curr_menu; +{ + x11_menu_item *curr; + int menulineidx = 0; + Widget prevlinewidget; + int how = wp->menu_information->how; + Arg args[15]; + Cardinal num_args; + + for (curr = curr_menu->base; curr; curr = curr->next) { + char tmpbuf[BUFSZ]; + Widget linewidget; + String str = (String) curr->str; + int attr = ATR_NONE; + int color = NO_COLOR; + boolean canpick = (how != PICK_NONE && curr->identifier.a_void); + + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNlabel), str); num_args++; + XtSetArg(args[num_args], nhStr(XtNleft), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNright), XtChainLeft); num_args++; + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNbottom), XtChainTop); num_args++; + XtSetArg(args[num_args], nhStr(XtNborderWidth), 0); num_args++; + XtSetArg(args[num_args], nhStr(XtNvertDistance), 0); num_args++; + + if (!iflags.use_menu_color + || !get_menu_coloring(curr->str, &color, &attr)) + attr = curr->attr; + + if (color != NO_COLOR) { + if (attr != ATR_INVERSE) + XtSetArg(args[num_args], nhStr(XtNforeground), + get_nhcolor(wp, color).pixel); num_args++; + } + + /* TODO: ATR_BOLD, ATR_DIM, ATR_ULINE, ATR_BLINK */ + + if (attr == ATR_INVERSE) { + XtSetArg(args[num_args], nhStr(XtNforeground), + get_nhcolor(wp, CLR_BLACK).pixel); num_args++; + XtSetArg(args[num_args], nhStr(XtNbackground), + get_nhcolor(wp, color).pixel); num_args++; + } + + if (menulineidx) { + XtSetArg(args[num_args], nhStr(XtNfromVert), prevlinewidget); num_args++; + } else { + XtSetArg(args[num_args], nhStr(XtNtop), XtChainTop); num_args++; + } + + XtSetArg(args[num_args], XtNtranslations, + menu_entry_translation_table); num_args++; + + menulineidx++; + Sprintf(tmpbuf, "menuline_%s", (canpick) ? "command" : "label"); + curr->w = linewidget = XtCreateManagedWidget(tmpbuf, + canpick + ? commandWidgetClass + : labelWidgetClass, + wp->w, args, num_args); + + if (attr == ATR_BOLD) { + load_boldfont(wp, curr->w); + num_args = 0; + XtSetArg(args[num_args], nhStr(XtNfont), + wp->menu_information->boldfs); num_args++; + XtSetValues(curr->w, args, num_args); + } + + if (canpick) + XtAddCallback(linewidget, XtNcallback, menu_select, + (XtPointer) curr); + prevlinewidget = linewidget; + } +} + +static void +destroy_menu_entry_widgets(wp) +struct xwindow *wp; +{ + WidgetList wlist; + Cardinal numchild; + Arg args[5]; + Cardinal num_args; + x11_menu_item *curr; + struct menu_info_t *menu_info; + + if (!wp || !wp->w) + return; + + menu_info = wp->menu_information; + num_args = 0; + XtSetArg(args[num_args], XtNchildren, &wlist); num_args++; + XtSetArg(args[num_args], XtNnumChildren, &numchild); num_args++; + XtGetValues(wp->w, args, num_args); + XtUnmanageChildren(wlist, numchild); + for (curr = menu_info->curr_menu.base; curr; curr = curr->next) + if (curr->w) + XtDestroyWidget(curr->w); +} + static void move_menu(src_menu, dest_menu) struct menu *src_menu, *dest_menu; @@ -1397,7 +1404,8 @@ struct xwindow *wp; { clear_old_menu(wp); /* this will also destroy the widgets */ if (wp->menu_information->boldfs) - XFreeFont(wp->menu_information->boldfs_dpy, wp->menu_information->boldfs); + XFreeFont(wp->menu_information->boldfs_dpy, + wp->menu_information->boldfs); free((genericptr_t) wp->menu_information); wp->menu_information = (struct menu_info_t *) 0; wp->type = NHW_NONE; /* allow re-use */