From: nethack.allison Date: Tue, 30 Sep 2003 03:42:01 +0000 (+0000) Subject: SAFERHANGUP win32gui (from ) X-Git-Tag: MOVE2GIT~1740 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1bdf37ec00a5d8f7d6e477ffe3e2f30ae7382f79;p=nethack SAFERHANGUP win32gui (from ) --- diff --git a/include/ntconf.h b/include/ntconf.h index ca111963c..e6764fb5e 100644 --- a/include/ntconf.h +++ b/include/ntconf.h @@ -57,12 +57,13 @@ #ifdef WIN32CON #define PORT_DEBUG /* include ability to debug international keyboard issues */ +#endif + #define SAFERHANGUP /* Define SAFERHANGUP to delay hangup processing * until the main command loop. 'safer' because it * avoids certain cheats and also avoids losing * objects being thrown when the hangup occurs. */ -#endif /* The following is needed for prototypes of certain functions */ #if defined(_MSC_VER) diff --git a/win/win32/mhinput.c b/win/win32/mhinput.c index 946d4797e..5ee0d3772 100644 --- a/win/win32/mhinput.c +++ b/win/win32/mhinput.c @@ -33,7 +33,12 @@ void mswin_nh_input_init(void) /* check for input */ int mswin_have_input() { - return (nhi_read_pos!=nhi_write_pos); + return +#ifdef SAFERHANGUP + /* we always have input (ESC) if hangup was requested */ + program_state.done_hup || +#endif + (nhi_read_pos!=nhi_write_pos); } /* add event to the queue */ @@ -57,6 +62,16 @@ PMSNHEvent mswin_input_pop() { PMSNHEvent retval; +#ifdef SAFERHANGUP + /* always return ESC when hangup was requested */ + if( program_state.done_hup ) { + static MSNHEvent hangup_event; + hangup_event.type = NHEVENT_CHAR; + hangup_event.kbd.ch = '\033'; + return &hangup_event; + } +#endif + if( !nhi_init_input ) mswin_nh_input_init(); if( nhi_read_pos!=nhi_write_pos ) { @@ -74,6 +89,16 @@ PMSNHEvent mswin_input_peek() { PMSNHEvent retval; +#ifdef SAFERHANGUP + /* always return ESC when hangup was requested */ + if( program_state.done_hup ) { + static MSNHEvent hangup_event; + hangup_event.type = NHEVENT_CHAR; + hangup_event.kbd.ch = '\033'; + return &hangup_event; + } +#endif + if( !nhi_init_input ) mswin_nh_input_init(); if( nhi_read_pos!=nhi_write_pos ) { diff --git a/win/win32/mhmain.c b/win/win32/mhmain.c index 440e4599a..7f56e195f 100644 --- a/win/win32/mhmain.c +++ b/win/win32/mhmain.c @@ -496,8 +496,21 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar } else { + /* prompt user for action */ switch (NHMessageBox(hWnd, TEXT("Save?"), MB_YESNOCANCEL | MB_ICONQUESTION)) { - case IDYES: NHEVENT_KBD('y'); dosave(); break; + case IDYES: +#ifdef SAFERHANGUP + /* destroy popup window - it has its own loop and we need to + return control to NetHack core at this point */ + if( IsWindow( GetNHApp()->hPopupWnd ) ) + SendMessage( GetNHApp()->hPopupWnd, WM_COMMAND, IDCANCEL, 0); + + /* tell NetHack core that "hangup" is requested */ + hangup(1); +#else + NHEVENT_KBD('y'); dosave(); +#endif + break; case IDNO: NHEVENT_KBD('q'); done(QUIT); break; case IDCANCEL: break; }