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'.
This commit is contained in:
PatR
2018-10-17 14:43:44 -07:00
parent c2825991f3
commit f051ecb388

View File

@@ -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("<Message>WM_PROTOCOLS: menu_delete()");
menu_entry_translation_table
= XtParseTranslationTable(menu_entry_translations);
menu_del_translation_table
= XtParseTranslationTable("<Message>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 */