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.
This commit is contained in:
nhmall
2023-11-16 00:10:06 -05:00
parent 657d0f6105
commit 86067dcffd
13 changed files with 112 additions and 25 deletions

View File

@@ -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()

View File

@@ -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. */

View File

@@ -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);
}
}

View File

@@ -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;
}
/*

View File

@@ -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;
}

View File

@@ -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;
}
/*