]> granicus.if.org Git - nethack/commitdiff
have core ask windowport if suspend is ok
authorkeni <keni>
Fri, 15 Jan 2010 17:51:28 +0000 (17:51 +0000)
committerkeni <keni>
Fri, 15 Jan 2010 17:51:28 +0000 (17:51 +0000)
PORTS: Please make sure I've done the right thing for/to your code.
This patch adds a new winproc that lets the window port approve or cancel
the suspend request - this should take care of the Mac Qt lockup issue.
In addition, Unix suspend is restricted to accounts that can use the shell
if SYSCF is defined.

15 files changed:
doc/window.doc
include/extern.h
include/winprocs.h
src/cmd.c
src/windows.c
sys/amiga/winami.c
sys/mac/macwin.c
sys/share/ioctl.c
sys/unix/sysconf
sys/wince/mswproc.c
win/X11/winX.c
win/gem/wingem.c
win/gnome/gnbind.c
win/tty/wintty.c
win/win32/mswproc.c

index 79b66326514965ba5f6398c61f4ca3054c74bbbb..29c955ace02a9bb42888194ae0544e6ca97e18b6 100644 (file)
@@ -488,6 +488,9 @@ suspend_nhwindows(str)
                -- Prepare the window to be suspended.
 resume_nhwindows()
                -- Restore the windows after being suspended.
+can_suspend()   -- Tell the core if the window system will allow the game
+                   to be suspended now.  If unconditionally yes or no, use
+                  genl_can_suspend_yes() or genl_can_suspend_no().
 
 start_screen() -- Only used on Unix tty ports, but must be declared for
                   completeness.  Sets up the tty to work in full-screen
index d6c855abe2cf4b2cac5437e8f92d80346052b28a..5d5e29413ebe083120e7174ed338f8e442b25715 100644 (file)
@@ -2574,6 +2574,8 @@ E boolean FDECL(mwelded, (struct obj *));
 /* ### windows.c ### */
 
 E void FDECL(choose_windows, (const char *));
+E boolean NDECL(genl_can_suspend_no);
+E boolean NDECL(genl_can_suspend_yes);
 E char FDECL(genl_message_menu, (CHAR_P,int,const char *));
 E void FDECL(genl_preference_update, (const char *));
 E char *FDECL(genl_getmsghistory, (BOOLEAN_P));
index da65f220c6daa59fa34b6bc452d377f2ba3edc01..c2c3f0019121e7ec27356f7a4102b73948dead99 100644 (file)
@@ -80,6 +80,7 @@ struct window_procs {
     void FDECL((*win_status_threshold), (int,int,anything,int,int,int));
 # endif
 #endif
+    boolean NDECL((*win_can_suspend));
 };
 
 extern
index d0877a465950cfcbeac90265254a9e5959017567..878ab5565481392d36b0be9eca7d1bda009a1924 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -109,6 +109,8 @@ extern int NDECL(dozap); /**/
 extern int NDECL(doorganize); /**/
 #endif /* DUMB */
 
+static int NDECL(dosuspend_core); /**/
+
 static int NDECL((*timed_occ_fn));
 
 STATIC_PTR int NDECL(doprev_message);
@@ -2124,9 +2126,7 @@ static const struct func_tab cmdlist[] = {
        {C('w'), TRUE, wiz_wish},
 #endif
        {C('x'), TRUE, doattributes},
-#ifdef SUSPEND
-       {C('z'), TRUE, dosuspend},
-#endif
+       {C('z'), TRUE, dosuspend_core},
        {'a', FALSE, doapply},
        {'A', FALSE, doddoremarm},
        {M('a'), TRUE, doorganize},
@@ -3586,4 +3586,16 @@ char def;
        return (*windowprocs.win_yn_function)(qbuf, resp, def);
 }
 
+int
+dosuspend_core(){
+#ifdef SUSPEND
+               /* Does current window system support suspend? */
+       if( (*windowprocs.win_can_suspend)()){
+                       /* NB: SYSCF SHELLERS handled in port code. */
+               dosuspend();
+       } else
+#endif
+               Norep("Suspend command not available.");
+}
+
 /*cmd.c*/
index 8816bb737560a71791925eed5489d2899b7b3d4e..03f2db51ad57fe842d0e607e015474c5e11ca0e5 100644 (file)
@@ -88,6 +88,16 @@ struct win_choices {
     { 0, 0 }           /* must be last */
 };
 
+boolean
+genl_can_suspend_no(){
+    return FALSE;
+}
+
+boolean
+genl_can_suspend_yes(){
+    return TRUE;
+}
+
 STATIC_OVL
 void
 def_raw_print(s)
@@ -316,6 +326,7 @@ static struct window_procs hup_procs = {
     genl_status_threshold,
 #  endif
 # endif /* STATUS_VIA_WINDOWPORT */
+    genl_can_suspend_no,
 };
 
 static void FDECL((*previnterface_exit_nhwindows), (const char *)) = 0;
index 623a2b9bdab87578afdb71632e9354372b9222c6..a663f14ea00b94b74f0a6f39280eb9a0d6455eed 100644 (file)
@@ -93,6 +93,7 @@ struct window_procs amii_procs =
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_yes,
 };
 
 /* The view window layout uses the same function names so we can use
@@ -164,6 +165,7 @@ struct window_procs amiv_procs =
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_yes,
 };
 
 unsigned short amii_initmap[ AMII_MAXCOLORS ];
index 8e5bea8a1826d8437882938f3266a947be19a75b..9f40b6f3459c1bd0ddf7472f062134eecc706975 100644 (file)
@@ -3293,6 +3293,7 @@ struct window_procs mac_procs = {
        0, //    mac_end_screen,
        genl_outrip,
        genl_preference_update,
+       genl_can_suspend_no,
 };
 
 /*macwin.c*/
index 240ee777457ff754b59bd42809876e14ca4c8f89..779fdd5b75381af00af490bb841075d882d25154 100644 (file)
@@ -155,6 +155,16 @@ setioctls()
 int
 dosuspend()
 {
+#ifdef SYSCF
+               /* NB: check_user_string() is port-specific. */
+       if(   !sysopt.shellers
+          || !sysopt.shellers[0]
+          || !check_user_string(sysopt.shellers)
+       ){
+               Norep("Suspend command not available.");
+               return;
+       }
+#endif
 # ifdef SIGTSTP
        if(signal(SIGTSTP, SIG_IGN) == SIG_DFL) {
                suspend_nhwindows((char *)0);
index 6b8e71fdd1edf7e454405e1e50f91fb3b7a97c47..64433909811204bacb9e5b8766f0521534c98ecf 100644 (file)
@@ -9,11 +9,11 @@
 # A value of * allows anyone to enter debugging mode.
 WIZARDS=root,games
 
-# Users allowed to use the ! (shell escape) command.  Uses the same syntax
-# as the WIZARDS option above.
+# Users allowed to use the ! (shell escape) command or to suspend the game.
+# Uses the same syntax as the WIZARDS option above.
 #SHELLERS=
 
-# Limit the number of simultaneous games (see also and nethack.sh).
+# Limit the number of simultaneous games (see also nethack.sh).
 MAXPLAYERS=10
 
 # If not null, added to string "To get local support, " in the support
index 3f8c80e64662ad41116f2b4b83cfcd994eb76b02..64ebb0c4b547aad0ab33b3902c0bad3b12c4d578 100644 (file)
@@ -108,6 +108,7 @@ struct window_procs mswin_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_no,
 };
 
 /*  
index 8facc8e5b9ddb63e463e10fbdeb630cd07333125..1532c1f246a99337b5d69bf24cd45c5cb4580759 100644 (file)
@@ -173,6 +173,7 @@ struct window_procs X11_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_no,       /* XXX may not always be correct */
 };
 
 /*
index fc257c1e275c2c6f925ebda58592f1ee85975554..69b0790302fe2e544f7556e1d66d86c086140a99 100644 (file)
@@ -111,6 +111,7 @@ struct window_procs Gem_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_no,
 };
 
 #ifdef MAC
index ef74ea7ffe51a931d4771f2bb8a5cb3799b1a49e..c304cdb5bb5a1742ca2e42c3b446b4cf3c23fc01 100644 (file)
@@ -90,6 +90,7 @@ struct window_procs Gnome_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_yes,
 };
 
 /*  
index cbdf85d0158e34d3ba6f4acb80736d916d4c14c3..948d8e459cd033b8306dcb1193f80b7301fb0bff 100644 (file)
@@ -137,6 +137,7 @@ struct window_procs tty_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_yes,
 };
 
 static int maxwin = 0;                 /* number of windows in use */
index 78b7c9be354df4cddb1158a75dd87c964d1f0eb7..de2d6df5c80011f0f5d224b1537b64cce93590f1 100644 (file)
@@ -136,6 +136,7 @@ struct window_procs mswin_procs = {
     genl_status_threshold,
 # endif
 #endif
+    genl_can_suspend_yes,
 };