From 0c74f7a2c8e0af7ac006c16fc9ef05e5f9245518 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Fri, 3 Nov 2017 01:51:33 +0200 Subject: [PATCH] win32: optimize the console and logging logic Currently one has to explicitly use --win32console and/or --win32log to enable a dedicated console (a console window that opens next to the Subsurface window) or to enable file logging on Win32. This patch makes the following changes: - removes the --win32* command line arguments - removes the dedicated console window support - if the app starts from a shortcut and not from a console, always redirect stderr and stdout to _err & _out log files - if the app starts from a console redirect stderr and stdout to that console Signed-off-by: Lubomir I. Ivanov --- core/android.cpp | 4 +-- core/dive.h | 2 +- core/linux.c | 4 +-- core/macos.c | 4 +-- core/subsurfacestartup.c | 6 ---- core/windows.c | 66 ++++++++++--------------------------- subsurface-desktop-main.cpp | 10 +----- subsurface-mobile-main.cpp | 4 +-- 8 files changed, 24 insertions(+), 76 deletions(-) diff --git a/core/android.cpp b/core/android.cpp index c98321e70..7c9965c16 100644 --- a/core/android.cpp +++ b/core/android.cpp @@ -194,10 +194,8 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated, bool logfile) +void subsurface_console_init(void) { - (void)dedicated; - (void)logfile; /* NOP */ } diff --git a/core/dive.h b/core/dive.h index d3b755491..0bbbd6b0c 100644 --- a/core/dive.h +++ b/core/dive.h @@ -767,7 +767,7 @@ extern int subsurface_access(const char *path, int mode); extern int subsurface_stat(const char* path, struct stat* buf); extern struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp); extern int subsurface_zip_close(struct zip *zip); -extern void subsurface_console_init(bool dedicated, bool logfile); +extern void subsurface_console_init(void); extern void subsurface_console_exit(void); extern bool subsurface_user_is_root(void); diff --git a/core/linux.c b/core/linux.c index 9f8121d09..da96ecb49 100644 --- a/core/linux.c +++ b/core/linux.c @@ -221,10 +221,8 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated, bool logfile) +void subsurface_console_init(void) { - (void)dedicated; - (void)logfile; /* NOP */ } diff --git a/core/macos.c b/core/macos.c index 6af474e85..b16225c78 100644 --- a/core/macos.c +++ b/core/macos.c @@ -207,10 +207,8 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated, bool logfile) +void subsurface_console_init(void) { - (void)dedicated; - (void)logfile; /* NOP */ } diff --git a/core/subsurfacestartup.c b/core/subsurfacestartup.c index 91d2098fd..7fbfbdc57 100644 --- a/core/subsurfacestartup.c +++ b/core/subsurfacestartup.c @@ -197,8 +197,6 @@ static void print_help() printf("\n --survey Offer to submit a user survey"); printf("\n --user= Choose configuration space for user "); printf("\n --cloud-timeout= Set timeout for cloud connection (0 < timeout < 60)"); - printf("\n --win32console Create a dedicated console if needed (Windows only). Add option before everything else"); - printf("\n --win32log Write the program output to subsurface.log (Windows only). Add option before everything else\n\n"); } void parse_argument(const char *arg) @@ -254,10 +252,6 @@ void parse_argument(const char *arg) ++force_root; return; } - if (strcmp(arg, "--win32console") == 0) - return; - if (strcmp(arg, "--win32log") == 0) - return; /* fallthrough */ case 'p': /* ignore process serial number argument when run as native macosx app */ diff --git a/core/windows.c b/core/windows.c index 6a852bf6f..ebee3436c 100644 --- a/core/windows.c +++ b/core/windows.c @@ -390,7 +390,7 @@ static struct { FILE *out, *err; } console_desc; -void subsurface_console_init(bool dedicated, bool logfile) +void subsurface_console_init(void) { (void)console_desc; /* if this is a console app already, do nothing */ @@ -398,69 +398,39 @@ void subsurface_console_init(bool dedicated, bool logfile) /* just in case of multiple calls */ memset((void *)&console_desc, 0, sizeof(console_desc)); - /* the AttachConsole(..) call can be used to determine if the parent process - * is a terminal. if it succeeds, there is no need for a dedicated console - * window and we don't need to call the AllocConsole() function. on the other - * hand if the user has set the 'dedicated' flag to 'true' and if AttachConsole() - * has failed, we create a dedicated console window. + + /* if AttachConsole(ATTACH_PARENT_PROCESS) returns true the parent process + * is a terminal. based on the result, either redirect to that terminal or + * to log files. */ console_desc.allocated = AttachConsole(ATTACH_PARENT_PROCESS); - if (console_desc.allocated) - dedicated = false; - if (!console_desc.allocated && dedicated) - console_desc.allocated = AllocConsole(); - if (!console_desc.allocated) - return; - - console_desc.cp = GetConsoleCP(); - SetConsoleOutputCP(CP_UTF8); /* make the ouput utf8 */ - - /* set some console modes; we don't need to reset these back. - * ENABLE_EXTENDED_FLAGS = 0x0080, ENABLE_QUICK_EDIT_MODE = 0x0040 */ - HANDLE h_in = GetStdHandle(STD_INPUT_HANDLE); - if (h_in) { - SetConsoleMode(h_in, 0x0080 | 0x0040); - CloseHandle(h_in); + if (console_desc.allocated) { + console_desc.cp = GetConsoleCP(); + SetConsoleOutputCP(CP_UTF8); /* make the ouput utf8 */ + console_desc.out = freopen("CON", "w", stdout); + console_desc.err = freopen("CON", "w", stderr); + } else { + console_desc.out = freopen("subsurface_out.log", "w", stdout); + console_desc.err = freopen("subsurface_err.log", "w", stderr); } - /* dedicated only; disable the 'x' button as it will close the main process as well */ - HWND h_cw = GetConsoleWindow(); - if (h_cw && dedicated) { - SetWindowTextA(h_cw, "Subsurface Console"); - HMENU h_menu = GetSystemMenu(h_cw, 0); - if (h_menu) { - EnableMenuItem(h_menu, SC_CLOSE, MF_BYCOMMAND | MF_DISABLED); - DrawMenuBar(h_cw); - } - SetConsoleCtrlHandler(NULL, TRUE); /* disable the CTRL handler */ - } - - const char *location_out = logfile ? "subsurface_out.log" : "CON"; - const char *location_err = logfile ? "subsurface_err.log" : "CON"; - - /* redirect; on win32, CON is a reserved pipe target, like NUL */ - console_desc.out = freopen(location_out, "w", stdout); - console_desc.err = freopen(location_err, "w", stderr); - if (!dedicated) - puts(""); /* add an empty line */ + puts(""); /* add an empty line */ #endif } void subsurface_console_exit(void) { #ifndef WIN32_CONSOLE_APP - if (!console_desc.allocated) - return; - /* close handles */ if (console_desc.out) fclose(console_desc.out); if (console_desc.err) fclose(console_desc.err); - /* reset code page and free */ - SetConsoleOutputCP(console_desc.cp); - FreeConsole(); + if (console_desc.allocated) { + SetConsoleOutputCP(console_desc.cp); + FreeConsole(); + } #endif } diff --git a/subsurface-desktop-main.cpp b/subsurface-desktop-main.cpp index ff92236a9..ded3aee1f 100644 --- a/subsurface-desktop-main.cpp +++ b/subsurface-desktop-main.cpp @@ -41,15 +41,7 @@ int main(int argc, char **argv) QStringList importedFiles; QStringList arguments = QCoreApplication::arguments(); - bool win32_log = arguments.length() > 1 && - (arguments.at(1) == QString("--win32log")); - if (win32_log) { - subsurface_console_init(true, true); - } else { - bool dedicated_console = arguments.length() > 1 && - (arguments.at(1) == QString("--win32console")); - subsurface_console_init(dedicated_console, false); - } + subsurface_console_init(); const char *default_directory = system_default_directory(); const char *default_filename = system_default_filename(); diff --git a/subsurface-mobile-main.cpp b/subsurface-mobile-main.cpp index 96a0d4f54..0ee2890c6 100644 --- a/subsurface-mobile-main.cpp +++ b/subsurface-mobile-main.cpp @@ -28,9 +28,7 @@ int main(int argc, char **argv) (void)application; QStringList arguments = QCoreApplication::arguments(); - bool dedicated_console = arguments.length() > 1 && - (arguments.at(1) == QString("--win32console")); - subsurface_console_init(dedicated_console, false); + subsurface_console_init(); for (i = 1; i < arguments.length(); i++) { QString a = arguments.at(i);