]> granicus.if.org Git - nethack/commitdiff
SAFERHANGUP win32gui (from <Someone>)
authornethack.allison <nethack.allison>
Tue, 30 Sep 2003 03:42:01 +0000 (03:42 +0000)
committernethack.allison <nethack.allison>
Tue, 30 Sep 2003 03:42:01 +0000 (03:42 +0000)
include/ntconf.h
win/win32/mhinput.c
win/win32/mhmain.c

index ca111963c21f9b434147508defb6299282f8b85e..e6764fb5e4588c934e9e96560787a01c65dd1561 100644 (file)
 
 #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)
index 946d4797e0c61372224828ca37cd7e381d59d253..5ee0d37726612e7fe070244d48bf52675cee5ccb 100644 (file)
@@ -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 ) {
index 440e4599a9fa6948239ee714352133551f07ee99..7f56e195f804560a5c451f0dcd61328990090c7b 100644 (file)
@@ -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;
                            }