From 86067dcffdc806cd659d7ca7c102e54dbd212b41 Mon Sep 17 00:00:00 2001 From: nhmall Date: Thu, 16 Nov 2023 00:10:06 -0500 Subject: [PATCH] use ctrl_nhwindow() for menu prompt style This implements the mechanics to use the ctrl_nhwindow() interface capability to pass down a setting change from the core to the active window port, without resorting to accessing a core global variable from within the window port, and without altering the interface.. The passed setting is honored in the tty and curses window ports. X11 and mswin receive and store the values, but no implementation to change the menu prompt style is there yet. Qt does not store the values or have an implementation. The setting change is done in allmain.c immediately after creating the WIN_INVEN window. --- include/extern.h | 1 + include/flag.h | 4 ---- include/global.h | 4 ++++ include/wintype.h | 7 +++++-- src/allmain.c | 3 +++ src/invent.c | 1 - src/windows.c | 14 ++++++++++++++ win/Qt/qt_bind.cpp | 20 ++++++++++++++++---- win/X11/winX.c | 14 +++++++++++++- win/curses/cursdial.c | 8 ++++++-- win/curses/cursmain.c | 29 ++++++++++++++++++++++++++--- win/tty/wintty.c | 18 +++++++++++------- win/win32/mswproc.c | 14 +++++++++++++- 13 files changed, 112 insertions(+), 25 deletions(-) diff --git a/include/extern.h b/include/extern.h index aeeacb26a..2919fc29a 100644 --- a/include/extern.h +++ b/include/extern.h @@ -3437,6 +3437,7 @@ extern void genl_putmixed(winid, int, const char *); extern void genl_display_file(const char *, boolean); extern boolean menuitem_invert_test(int, unsigned, boolean); extern const char *mixed_to_glyphinfo(const char *str, glyph_info *gip); +extern void adjust_menu_promptstyle(winid, color_attr *); extern void add_menu(winid, const glyph_info *, const ANY_P *, char, char, int, int, const char *, unsigned int); extern void add_menu_heading(winid, const char *); diff --git a/include/flag.h b/include/flag.h index e5331e761..19771a830 100644 --- a/include/flag.h +++ b/include/flag.h @@ -186,10 +186,6 @@ struct debug_flags { #endif }; -typedef struct color_and_attr { - int color, attr; -} color_attr; - /* * Stuff that really isn't option or platform related and does not * get saved and restored. They are set and cleared during the game diff --git a/include/global.h b/include/global.h index c734ccaf7..be484bcfb 100644 --- a/include/global.h +++ b/include/global.h @@ -445,6 +445,10 @@ extern struct nomakedefs_s nomakedefs; #define MAXMONNO 120 /* extinct monst after this number created */ #define MHPMAX 500 /* maximum monster hp */ +typedef struct color_and_attr { + int color, attr; +} color_attr; + /* * Version 3.7.x has aspirations of portable file formats. We * make a distinction between MAIL functionality and MAIL_STRUCTURES diff --git a/include/wintype.h b/include/wintype.h index 99100e12f..6c4c4a58d 100644 --- a/include/wintype.h +++ b/include/wintype.h @@ -204,8 +204,9 @@ enum to_core_flags { }; enum from_core_requests { - set_mode = 1, - request_settings = 2, + set_mode = 1, + request_settings = 2, + set_menu_promptstyle = 3 }; struct to_core { @@ -220,6 +221,7 @@ struct to_core { struct from_core { enum from_core_requests core_request; enum inv_modes invmode; + color_attr menu_promptstyle; }; struct win_request_info_t { @@ -228,6 +230,7 @@ struct win_request_info_t { }; typedef struct win_request_info_t win_request_info; +extern win_request_info zerowri; /* windows.c */ /* #define CORE_INVENT */ diff --git a/src/allmain.c b/src/allmain.c index 72817ed8a..7681a5b58 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -662,6 +662,7 @@ void init_sound_disp_gamewindows(void) { int menu_behavior = MENU_BEHAVE_STANDARD; + color_attr menu_promptstyle = { NO_COLOR, ATR_INVERSE }; activate_chosen_soundlib(); @@ -680,6 +681,8 @@ init_sound_disp_gamewindows(void) } WIN_MAP = create_nhwindow(NHW_MAP); WIN_INVEN = create_nhwindow(NHW_MENU); + if (WIN_INVEN != WIN_ERR) + adjust_menu_promptstyle(WIN_INVEN, &menu_promptstyle); #ifdef TTY_PERM_INVENT if (WINDOWPORT(tty) && WIN_INVEN != WIN_ERR) { menu_behavior = MENU_BEHAVE_PERMINV; diff --git a/src/invent.c b/src/invent.c index 5bb226432..cf7f4f462 100644 --- a/src/invent.c +++ b/src/invent.c @@ -45,7 +45,6 @@ static void itemactions_pushkeys(struct obj *, int); static void mime_action(const char *); /* enum and structs are defined in wintype.h */ -static win_request_info zerowri = { { 0L, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0 } }; static win_request_info wri_info; static int perminv_flags = InvOptNone; static boolean in_perm_invent_toggled; diff --git a/src/windows.c b/src/windows.c index 68a69385a..f9ab36221 100644 --- a/src/windows.c +++ b/src/windows.c @@ -1593,6 +1593,20 @@ mixed_to_glyphinfo(const char *str, glyph_info *gip) return str; } +/* enum and structs are defined in wintype.h */ + +win_request_info zerowri = { { 0L, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, { NO_COLOR, ATR_NONE }}}; + +void +adjust_menu_promptstyle(winid window, color_attr *style) +{ + win_request_info wri = zerowri; + wri.fromcore.menu_promptstyle.color = style->color; + wri.fromcore.menu_promptstyle.attr = style->attr; + /* relay the style change to the window port */ + (void) ctrl_nhwindow(window, set_menu_promptstyle, &wri); +} /* * Common code point leading into the interface-specifc diff --git a/win/Qt/qt_bind.cpp b/win/Qt/qt_bind.cpp index 96a727a35..02fb59036 100644 --- a/win/Qt/qt_bind.cpp +++ b/win/Qt/qt_bind.cpp @@ -504,12 +504,24 @@ void NetHackQtBind::qt_update_inventory(int arg UNUSED) } win_request_info *NetHackQtBind::qt_ctrl_nhwindow( - winid wid UNUSED, - int request UNUSED, - win_request_info *wri UNUSED) + winid wid, + int request, + win_request_info *wri) { NetHackQtWindow* window UNUSED =id_to_window[(int)wid]; - return (win_request_info *) 0; + + if (!wri) + return (win_request_info *) 0; + + switch(request) { + case set_menu_promptstyle: + /* = wri->fromcore.menu_promptstyle; */ + break; + default: + impossible("invalid request to ctrl_nhwindow: %d", request); + break; + } + return wri; } void NetHackQtBind::qt_mark_synch() diff --git a/win/X11/winX.c b/win/X11/winX.c index 059ca06ea..13b5af993 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -98,6 +98,7 @@ void (*input_func)(Widget, XEvent *, String *, Cardinal *); int click_x, click_y, click_button; /* Click position on a map window * (filled by set_button_values()). */ int updated_inventory; /* used to indicate perm_invent updating */ +color_attr X11_menu_promptstyle = { NO_COLOR, ATR_NONE }; static void X11_error_handler(String) NORETURN; static int X11_io_error_handler(Display *); @@ -1308,7 +1309,18 @@ X11_ctrl_nhwindow( int request UNUSED, win_request_info *wri UNUSED) { - return (win_request_info *) 0; + if (!wri) + return (win_request_info *) 0; + + switch(request) { + case set_menu_promptstyle: + X11_menu_promptstyle = wri->fromcore.menu_promptstyle; + break; + default: + impossible("invalid request to ctrl_nhwindow: %d", request); + break; + } + return wri; } /* The current implementation has all of the saved lines on the screen. */ diff --git a/win/curses/cursdial.c b/win/curses/cursdial.c index be75e68e6..2b558112a 100644 --- a/win/curses/cursdial.c +++ b/win/curses/cursdial.c @@ -1164,6 +1164,8 @@ get_menuitem_y( /* Displays menu selections in the given window */ +extern color_attr curses_menu_promptstyle; /*cursmain.c */ + static void menu_display_page( nhmenu *menu, WINDOW *win, @@ -1207,9 +1209,11 @@ menu_display_page( for (count = 0; count < num_lines; count++) { tmpstr = curses_break_str(menu->prompt, menu->width, count + 1); - curses_toggle_color_attr(win, NO_COLOR, A_NORMAL, ON); + curses_toggle_color_attr(win, curses_menu_promptstyle.color, + curses_menu_promptstyle.attr, ON); mvwprintw(win, count + 1, 1, "%s", tmpstr); - curses_toggle_color_attr(win, NO_COLOR, A_NORMAL, OFF); + curses_toggle_color_attr(win, curses_menu_promptstyle.color, + curses_menu_promptstyle.attr, OFF); free(tmpstr); } } diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c index 9f46d68eb..94889129f 100644 --- a/win/curses/cursmain.c +++ b/win/curses/cursmain.c @@ -149,6 +149,7 @@ int orig_cursor; /* Preserve initial cursor state */ WINDOW *base_term; /* underlying terminal window */ boolean counting; /* Count window is active */ WINDOW *mapwin, *statuswin, *messagewin; /* Main windows */ +color_attr curses_menu_promptstyle = { NO_COLOR, ATR_NONE }; /* Track if we're performing an update to the permanent window. Needed since we aren't using the normal menu functions to handle @@ -799,10 +800,32 @@ curses_update_inventory(int arg) win_request_info * curses_ctrl_nhwindow( winid window UNUSED, - int request UNUSED, - win_request_info *wri UNUSED) + int request, + win_request_info *wri) { - return (win_request_info *) 0; + int attr; + + if (!wri) + return (win_request_info *) 0; + + switch (request) { +#if 0 + case set_mode: + case request_settings: + break; +#endif + case set_menu_promptstyle: + curses_menu_promptstyle.color = wri->fromcore.menu_promptstyle.color; + if (curses_menu_promptstyle.color == NO_COLOR) + curses_menu_promptstyle.color = NONE; + attr = wri->fromcore.menu_promptstyle.attr; + curses_menu_promptstyle.attr = curses_convert_attr(attr);; + break; + default: + impossible("invalid request to ctrl_nhwindow: %d", request); + break; + } + return wri; } /* diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 0ebbed4dd..3c2299c3b 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -2593,6 +2593,8 @@ reverse(tty_menu_item *curr) return head; } +static color_attr tty_menu_promptstyle = { NO_COLOR, ATR_NONE }; + /* * End a menu in this window, window must a type NHW_MENU. This routine * processes the string list. We calculate the # of pages, then assign @@ -2642,7 +2644,8 @@ tty_end_menu( tty_add_menu(window, &nul_glyphinfo, &any, 0, 0, ATR_NONE, clr, "", MENU_ITEMFLAGS_NONE); tty_add_menu(window, &nul_glyphinfo, &any, 0, 0, - ATR_NONE, clr, prompt, MENU_ITEMFLAGS_NONE); + tty_menu_promptstyle.attr, tty_menu_promptstyle.color, + prompt, MENU_ITEMFLAGS_NONE); } /* 52: 'a'..'z' and 'A'..'Z'; avoids selector duplication within a page */ @@ -2807,22 +2810,20 @@ RESTORE_WARNING_FORMAT_NONLITERAL win_request_info * tty_ctrl_nhwindow(winid window UNUSED, int request, win_request_info *wri) { -#if !defined(TTY_PERM_INVENT) - wri = (win_request_info *) 0; - nhUse(window); - nhUse(request); -#else +#if defined(TTY_PERM_INVENT) boolean tty_ok /*, show_gold */, inuse_only; int maxslot; /* these types are set match the wintty.h field declarations */ long minrow; /* long to match maxrow declaration in wintty.h */ short offx, offy; long rows, cols, maxrow, maxcol; +#endif if (!wri) return (win_request_info *) 0; switch (request) { +#if defined(TTY_PERM_INVENT) case set_mode: case request_settings: ttyinvmode = wri->fromcore.invmode; @@ -2850,11 +2851,14 @@ tty_ctrl_nhwindow(winid window UNUSED, int request, win_request_info *wri) wri->tocore.maxslot = maxslot; } break; +#endif /* TTY_PERM_INVENT */ + case set_menu_promptstyle: + tty_menu_promptstyle = wri->fromcore.menu_promptstyle; + break; default: impossible("invalid request to tty_ctrl_nhwindow: %d", request); break; } -#endif return wri; } diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index 02d48b775..684b4d659 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -76,6 +76,7 @@ COLORREF message_bg_color = RGB(0, 0, 0); COLORREF message_fg_color = RGB(0xFF, 0xFF, 0xFF); strbuf_t raw_print_strbuf = { 0 }; +mswin_menu_promptstyle = { NO_COLOR, ATR_NONE }; /* Interface definition, for windows.c */ struct window_procs mswin_procs = { @@ -1255,7 +1256,18 @@ mswin_ctrl_nhwindow( int request, win_request_info *wri) { - return (win_request_info *) 0; + if (!wri) + return (win_request_info *) 0; + + switch(request) { + case set_menu_promptstyle: + mswin_menu_promptstyle = wri->fromcore.menu_promptstyle; + break; + default: + impossible("invalid request to ctrl_nhwindow: %d", request); + break; + } + return wri; } /*