Windows startup modifications
Changes to be committed: modified: include/winprocs.h modified: src/options.c modified: sys/share/pcmain.c new file: sys/share/safeproc.c modified: sys/winnt/Makefile.msc modified: sys/winnt/stubs.c new file: sys/winnt/windmain.c modified: sys/winnt/winnt.c modified: win/win32/vs2017/NetHack.vcxproj modified: win/win32/vs2017/NetHackW.vcxproj modified: win/win32/winhack.c Because multiple window ports are supported on Windows now, even in the same executable and selectable via config file in some cases, some adjustments became necessary. There will likely be some further refining of this over the next day or two. List of changes: Move Windows startup from sys/share/pcmain.c and into its own sys/winnt/windmain.c so that it can be modified to fix some current breakage, and allow altering the order of some things. There is startup processing code that is common to all of the Windows WindowPorts, but that startup processing code needs to have no dependency on any one of those WindowPorts. Yet, during startup processing, some of the initialization routines can end up calling NetHack functions that expect an active Window port underneath, and if there isn't one, routines like pline, impossible, panic can end up invoking null function pointers. Place a new file sys/share/safeproc.c, in which a complete window port is available for early startup processing purposes. It's WindowPort name field is set to "safe-startup" just for reference. The prototypes in include/winprocs.h require that SAFEPROCS be Usage: windowprocs = get_safe_procs(0); initializes a set of winprocs function pointers that ensure none of the function pointers are left null, but that's all it does. windowprocs = get_safe_procs(1); initializes a set of winprocs functions pointers that ensure none of the function pointers are left null, but also provides some basic output and input functionality using nothing other than C stdio routines (no platform or OS specific code). The conditional code related to WIN32 has been removed from sys/share/pcmain.c The code common to all of the Windows WindowPorts calls get_safe_procs() almost immediately to ensure that there is a set of WindowPort winprocs available.
This commit is contained in:
@@ -375,4 +375,77 @@ struct chain_procs {
|
||||
};
|
||||
#endif /* WINCHAIN */
|
||||
|
||||
#ifdef SAFEPROCS
|
||||
/*
|
||||
* window port routines available in sys/share/safeproc.c
|
||||
*/
|
||||
extern struct window_procs *FDECL(get_safe_procs, (int));
|
||||
extern void FDECL(safe_init_nhwindows, (int *, char **));
|
||||
extern void NDECL(safe_player_selection);
|
||||
extern void NDECL(safe_askname);
|
||||
extern void NDECL(safe_get_nh_event);
|
||||
extern void FDECL(safe_exit_nhwindows, (const char *));
|
||||
extern void FDECL(safe_suspend_nhwindows, (const char *));
|
||||
extern void NDECL(safe_resume_nhwindows);
|
||||
extern winid FDECL(safe_create_nhwindow, (int));
|
||||
extern void FDECL(safe_clear_nhwindow, (winid));
|
||||
extern void FDECL(safe_display_nhwindow, (winid, BOOLEAN_P));
|
||||
extern void FDECL(safe_destroy_nhwindow, (winid));
|
||||
extern void FDECL(safe_curs, (winid, int, int));
|
||||
extern void FDECL(safe_putstr, (winid, int, const char *));
|
||||
extern void FDECL(safe_putmixed, (winid, int, const char *));
|
||||
extern void FDECL(safe_display_file, (const char *, BOOLEAN_P));
|
||||
extern void FDECL(safe_start_menu, (winid));
|
||||
extern void FDECL(safe_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P,
|
||||
int, const char *, BOOLEAN_P));
|
||||
extern void FDECL(safe_end_menu, (winid, const char *));
|
||||
extern int FDECL(safe_select_menu, (winid, int, MENU_ITEM_P **));
|
||||
extern char FDECL(safe_message_menu, (CHAR_P, int, const char *));
|
||||
extern void NDECL(safe_update_inventory);
|
||||
extern void NDECL(safe_mark_synch);
|
||||
extern void NDECL(safe_wait_synch);
|
||||
#ifdef CLIPPING
|
||||
extern void FDECL(safe_cliparound, (int, int));
|
||||
#endif
|
||||
#ifdef POSITIONBAR
|
||||
extern void FDECL(safe_update_positionbar, (char *));
|
||||
#endif
|
||||
extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
|
||||
extern void FDECL(safe_raw_print, (const char *));
|
||||
extern void FDECL(safe_raw_print_bold, (const char *));
|
||||
extern int NDECL(safe_nhgetch);
|
||||
extern int FDECL(safe_nh_poskey, (int *, int *, int *));
|
||||
extern void NDECL(safe_nhbell);
|
||||
extern int NDECL(safe_doprev_message);
|
||||
extern char FDECL(safe_yn_function, (const char *, const char *, CHAR_P));
|
||||
extern void FDECL(safe_getlin, (const char *, char *));
|
||||
extern int NDECL(safe_get_ext_cmd);
|
||||
extern void FDECL(safe_number_pad, (int));
|
||||
extern void NDECL(safe_delay_output);
|
||||
#ifdef CHANGE_COLOR
|
||||
extern void FDECL(safe_change_color, (int, long, int));
|
||||
#ifdef MAC
|
||||
extern void FDECL(safe_change_background, (int));
|
||||
extern short FDECL(safe_set_font_name, (winid, char *));
|
||||
#endif
|
||||
extern char *NDECL(safe_get_color_string);
|
||||
#endif
|
||||
extern void NDECL(safe_start_screen);
|
||||
extern void NDECL(safe_end_screen);
|
||||
extern void FDECL(safe_outrip, (winid, int, time_t));
|
||||
extern void FDECL(safe_preference_update, (const char *));
|
||||
extern char *FDECL(safe_getmsghistory, (BOOLEAN_P));
|
||||
extern void FDECL(safe_putmsghistory, (const char *, BOOLEAN_P));
|
||||
extern void NDECL(safe_status_init);
|
||||
extern void NDECL(safe_status_finish);
|
||||
extern void FDECL(safe_status_enablefield,
|
||||
(int, const char *, const char *, BOOLEAN_P));
|
||||
extern void FDECL(safe_status_update, (int, genericptr_t, int, int, int, unsigned long *));
|
||||
extern boolean NDECL(safe_can_suspend);
|
||||
extern void FDECL(stdio_raw_print, (const char *));
|
||||
extern void FDECL(stdio_raw_print_bold, (const char *));
|
||||
extern void NDECL(stdio_wait_synch);
|
||||
extern int NDECL(stdio_nhgetch);
|
||||
#endif /* SAFEPROCS */
|
||||
#endif /* WINPROCS_H */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user