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.
-- 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
/* ### 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));
void FDECL((*win_status_threshold), (int,int,anything,int,int,int));
# endif
#endif
+ boolean NDECL((*win_can_suspend));
};
extern
extern int NDECL(doorganize); /**/
#endif /* DUMB */
+static int NDECL(dosuspend_core); /**/
+
static int NDECL((*timed_occ_fn));
STATIC_PTR int NDECL(doprev_message);
{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},
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*/
{ 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)
genl_status_threshold,
# endif
# endif /* STATUS_VIA_WINDOWPORT */
+ genl_can_suspend_no,
};
static void FDECL((*previnterface_exit_nhwindows), (const char *)) = 0;
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_yes,
};
/* The view window layout uses the same function names so we can use
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_yes,
};
unsigned short amii_initmap[ AMII_MAXCOLORS ];
0, // mac_end_screen,
genl_outrip,
genl_preference_update,
+ genl_can_suspend_no,
};
/*macwin.c*/
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);
# 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
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_no,
};
/*
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_no, /* XXX may not always be correct */
};
/*
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_no,
};
#ifdef MAC
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_yes,
};
/*
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_yes,
};
static int maxwin = 0; /* number of windows in use */
genl_status_threshold,
# endif
#endif
+ genl_can_suspend_yes,
};