alternative to display_inventory for window-port

Several window ports that support perm_invent were
using a call back to the core display_inventory()
function.

While calling from the window port back to core functions
is arguably not ideal in the first place, it was recently
brought to light that code NetHack-3.7 code changes to
display_inventory() actually caused it to stop repopulating
the perm_invent window as intended under certain circumstances.

For now, provide an alternative function, repopulate_perminvent(),
that hopefullshould still work the way it did previously.

There will likely be some additional changes after this to
further improve things, at some point.

For now though, this
Resolves #1454
This commit is contained in:
nhmall
2025-11-08 14:26:07 -05:00
parent 6fa324d52a
commit d5658018ac
8 changed files with 21 additions and 9 deletions
+5 -1
View File
@@ -284,7 +284,7 @@ update_inventory(arg)
-- For an argument of 0: -- For an argument of 0:
-- Indicate to the window port that the inventory has -- Indicate to the window port that the inventory has
been changed. been changed.
-- Merely calls display_inventory() for window-ports -- Merely calls repopulate_perminvent() for window-ports
that leave the window up, otherwise empty. that leave the window up, otherwise empty.
-- or for a non-zero argument: -- or for a non-zero argument:
-- Prompts the user for a menu scrolling action and -- Prompts the user for a menu scrolling action and
@@ -1001,6 +1001,10 @@ char display_inventory(lets, want_reply)
-- Calls a start_menu()/add_menu()/select_menu() sequence. -- Calls a start_menu()/add_menu()/select_menu() sequence.
It returns the item selected, or '\0' if none is selected. It returns the item selected, or '\0' if none is selected.
Returns '\033' if the menu was canceled. Returns '\033' if the menu was canceled.
void repopulate_perminvent(void)
-- a minimal alternative to display_inventory() that
focuses only on repopulating the permanent inventory
window.
raw_printf(str, ...) raw_printf(str, ...)
-- Like raw_print(), but accepts arguments like printf(). This -- Like raw_print(), but accepts arguments like printf(). This
routine processes the arguments and then calls raw_print(). routine processes the arguments and then calls raw_print().
+1
View File
@@ -1358,6 +1358,7 @@ extern void sync_perminvent(void);
extern void perm_invent_toggled(boolean negated); extern void perm_invent_toggled(boolean negated);
extern void prepare_perminvent(winid window); extern void prepare_perminvent(winid window);
extern struct obj *carrying_stoning_corpse(void); extern struct obj *carrying_stoning_corpse(void);
extern void repopulate_perminvent(void);
/* ### ioctl.c ### */ /* ### ioctl.c ### */
+7
View File
@@ -4047,6 +4047,13 @@ display_inventory(const char *lets, boolean want_reply)
FALSE, want_reply, (long *) 0); FALSE, want_reply, (long *) 0);
} }
void
repopulate_perminvent(void)
{
(void) display_pickinv(NULL, (char *) 0, (char *) 0,
FALSE, FALSE, (long *) 0);
}
/* /*
* Show what is current using inventory letters. * Show what is current using inventory letters.
* *
+1 -1
View File
@@ -502,7 +502,7 @@ void NetHackQtBind::qt_update_inventory(int arg UNUSED)
/* doesn't work yet /* doesn't work yet
if (program_state.something_worth_saving && iflags.perm_invent) if (program_state.something_worth_saving && iflags.perm_invent)
display_inventory(NULL, false); repopulate_perminvent();
*/ */
} }
+1 -1
View File
@@ -1295,7 +1295,7 @@ X11_update_inventory(int arg)
if (program_state.in_moveloop || program_state.gameover) { if (program_state.in_moveloop || program_state.gameover) {
updated_inventory = 1; /* hack to avoid mapping&raising window */ updated_inventory = 1; /* hack to avoid mapping&raising window */
if (!arg) { if (!arg) {
(void) display_inventory((char *) 0, FALSE); repopulate_perminvent();
} else { } else {
x11_scroll_perminv(arg); x11_scroll_perminv(arg);
} }
+1 -1
View File
@@ -96,7 +96,7 @@ curs_update_invt(int arg)
/* ask core to display full inventory in a PICK_NONE menu; /* ask core to display full inventory in a PICK_NONE menu;
instead of setting up an ordinary menu, it will indirectly instead of setting up an ordinary menu, it will indirectly
call curs_add_invt() for each line (including class headers) */ call curs_add_invt() for each line (including class headers) */
display_inventory(NULL, FALSE); repopulate_perminvent();
curs_invt_updated(win); curs_invt_updated(win);
} else { } else {
+3 -3
View File
@@ -172,11 +172,11 @@ VDECLCB(shim_status_update,
"vipiiip", "vipiiip",
A2P fldidx, P2V ptr, A2P chg, A2P percent, A2P color, P2V colormasks) A2P fldidx, P2V ptr, A2P chg, A2P percent, A2P color, P2V colormasks)
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
/* XXX: calling display_inventory() from shim_update_inventory() causes reentrancy that breaks emscripten Asyncify */ /* XXX: calling repopulate_perminvent() from shim_update_inventory() causes reentrancy that breaks emscripten Asyncify */
/* this should be fine since according to windows.doc, the only purpose of shim_update_inventory() is to call display_inventory() */ /* this should be fine since according to windows.doc, the only purpose of shim_update_inventory() is to call repopulate_perminvent() */
void shim_update_inventory(int a1 UNUSED) { void shim_update_inventory(int a1 UNUSED) {
if(iflags.perm_invent) { if(iflags.perm_invent) {
display_inventory(NULL, FALSE); repopulate_perminvent();
} }
} }
+2 -2
View File
@@ -1248,7 +1248,7 @@ mswin_select_menu(winid wid, int how, MENU_ITEM_P **selected)
/* /*
-- Indicate to the window port that the inventory has been changed. -- Indicate to the window port that the inventory has been changed.
-- Merely calls display_inventory() for window-ports that leave the -- Merely calls repopulate_perminvent() for window-ports that leave the
window up, otherwise empty. window up, otherwise empty.
*/ */
void void
@@ -1257,7 +1257,7 @@ mswin_update_inventory(int arg)
logDebug("mswin_update_inventory(%d)\n", arg); logDebug("mswin_update_inventory(%d)\n", arg);
if (iflags.perm_invent && program_state.something_worth_saving if (iflags.perm_invent && program_state.something_worth_saving
&& iflags.window_inited && WIN_INVEN != WIN_ERR) && iflags.window_inited && WIN_INVEN != WIN_ERR)
display_inventory(NULL, FALSE); repopulate_perminvent();
} }
win_request_info * win_request_info *