Files
NX2navi/runtime/gfx_wsys.h
chrg6 cd3f015732 Log the guest's ExitProcess line after the exit guard, and bring the comments on gfx_window_closed's return up to date.
The review of the exit sequence found that svc.c case 0x07 logged "guest ExitProcess at ...; exiting" before
rt_exit_begin. When a close had already begun, the guest thread that the guard then parks still claimed to exit, and
past the log cap the line fell outside the end's reserve, which rt_exit_begin opens. It also found that host.h and
gfx_wsys.h still said gfx_window_closed does not return, though it returns for its own thread coming back, and that
rt_exit_begin's comment spoke of the window thread handling a message inside the sequence, which since the close
runs on a thread of its own happens only in the fallback.

svc.c logs the line after rt_exit_begin returns 1. The two header comments say gfx_window_closed returns only for its
own thread coming back (gfx_present.c rt_exit_begin), and rt_exit_begin's comment says the window thread runs the
sequence itself only when gfx_window_win.c exit_start could make no thread.

tests/exit_order_check.py checks statically that 0x07's rt_log comes after rt_exit_begin; it fails on the code
before this change and passes after it. exit_order_check and the compile check of every runtime file (a header
changed) pass, with no new -Wall warnings in svc.c and gfx_present.c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-13 18:43:24 -05:00

28 lines
1.8 KiB
C

// Between gfx_present.c (swapchain, present, vsync) and the window system's back end (gfx_window_win.c with Win32,
// gfx_window_sdl.c with SDL). Host threads only.
#pragma once
#include "vk.h"
// ---- what the back end provides
int wsys_open(void); // makes the window (and its thread); 0 on failure. Once.
VkSurfaceKHR wsys_surface(VkInstance inst); // a new Vulkan surface of the window; VK_NULL_HANDLE on failure
void wsys_client_size(int *w, int *h); // the drawable area in pixels
int wsys_minimized(void); // nothing to present into
void wsys_resize(int w, int h); // gfx_window_resize: the drawable area becomes w x h
// --probe-window (gfx_window_probe.c): synthetic window events, handled on the window thread before these return.
void wsys_probe_focus(int in); // the window gains (1) or loses (0) the focus
void wsys_probe_escape(void); // Esc pressed
// A left click: 0 in the client area, 1 activating the window from its client area, 2 activating it from the title bar.
// 0 when the window system has no such event (then the caller skips that check).
int wsys_probe_click(int where);
// ---- what gfx_present.c provides the back end
void gfx_window_mark_dirty(void); // the window changed size: the next present rebuilds the swapchain
void gfx_window_focus_changed(int in); // the window gained (1) or lost (0) the focus
// the player closed the window: saves, then ends the process. It does not return, but for its own thread coming back
// (gfx_present.c rt_exit_begin)
void gfx_window_closed(void);
void gfx_window_set_refresh(double hz); // the refresh rate of the window's monitor, 0 unknown
int gfx_cfg_fullscreen(void); // NX2NAVI_FULLSCREEN
void gfx_cfg_window_size(int *w, int *h); // NX2NAVI_WINDOW_SIZE, the default when unparsable or out of range