From: PatR Date: Mon, 22 Feb 2021 09:10:14 +0000 (-0800) Subject: X11 yn_function() again X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed349cd5feaebe9768b8c739ac3092acf64cbc7b;p=nethack X11 yn_function() again Widget widths should have type 'Dimension' rather than plain 'int'. Perform a couple of things once during popup widget creation rather than every time it gets popped up. --- diff --git a/win/X11/winX.c b/win/X11/winX.c index 3290a0a9f..2ce3ac5f6 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 winX.c $NHDT-Date: 1613957400 2021/02/22 01:30:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.101 $ */ +/* NetHack 3.7 winX.c $NHDT-Date: 1613985000 2021/02/22 09:10:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.102 $ */ /* Copyright (c) Dean Luick, 1992 */ /* NetHack may be freely redistributed. See license for details. */ @@ -2159,6 +2159,7 @@ X11_yn_function( char def) /* default if user hits or */ { static XFontStruct *yn_font = 0; + static Dimension yn_minwidth = 0; char buf[BUFSZ], buf2[BUFSZ]; Arg args[4]; Cardinal num_args; @@ -2261,6 +2262,8 @@ X11_yn_function( XtParseTranslationTable("WM_PROTOCOLS: yn_delete()")); num_args = 0; + XtSetArg(args[num_args], nhStr(XtNjustify), XtJustifyLeft); + num_args++; XtSetArg(args[num_args], XtNtranslations, XtParseTranslationTable(yn_translations)); num_args++; yn_label = XtCreateManagedWidget("yn_label", labelWidgetClass, @@ -2274,6 +2277,12 @@ X11_yn_function( (void) memset((genericptr_t) args, 0, sizeof args); XtSetArg(args[0], nhStr(XtNfont), &yn_font); XtGetValues(yn_label, args, ONE); + + /* set up minimum yn_label width; we don't actually set + the XtNminWidth attribute */ + (void) memset(buf2, 'X', 25), buf2[25] = '\0'; /* 25 'X's */ + yn_minwidth = (Dimension) XTextWidth(yn_font, buf2, + (int) strlen(buf2)); } } @@ -2294,30 +2303,21 @@ X11_yn_function( * It also enforces a minimum prompt width, which wasn't being * done before, so that really short prompts are more noticeable * if they pop up where the pointer is parked and it happens to - * be parked somewhere other than where it usually sits. + * be setting somewhere the player isn't looking. */ - int promptwidth, minwidth, labelwidth = 0; + Dimension promptwidth, labelwidth = 0; (void) memset((genericptr_t) args, 0, sizeof args); num_args = 0; - XtSetArg(args[num_args], nhStr(XtNfont), &yn_font); num_args++; XtSetArg(args[num_args], XtNwidth, &labelwidth); num_args++; XtGetValues(yn_label, args, num_args); - (void) memset(buf2, 'X', 25), buf2[25] = '\0'; - minwidth = XTextWidth(yn_font, buf2, (int) strlen(buf2)); /* 25 'X' */ - promptwidth = XTextWidth(yn_font, buf, (int) strlen(buf)); - - if (labelwidth != promptwidth || labelwidth < minwidth) { - labelwidth = max(promptwidth, minwidth); + promptwidth = (Dimension) XTextWidth(yn_font, buf, (int) strlen(buf)); + if (labelwidth != promptwidth || labelwidth < yn_minwidth) { + labelwidth = max(promptwidth, yn_minwidth); (void) memset((genericptr_t) args, 0, sizeof args); num_args = 0; XtSetArg(args[num_args], XtNwidth, labelwidth); num_args++; - if (promptwidth < minwidth) { - /* [This could be set just once during widget creation.] */ - XtSetArg(args[num_args], nhStr(XtNjustify), XtJustifyLeft); - num_args++; - } XtSetValues(yn_label, args, num_args); } @@ -2328,7 +2328,7 @@ X11_yn_function( yn_getting_num = FALSE; (void) x_event(EXIT_ON_EXIT); /* get keystroke(s) */ - /* erase and/or remove the prompt */ + /* erase or remove the prompt */ if (appResources.slow) { (void) memset((genericptr_t) args, 0, sizeof args); num_args = 0;