summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2017-11-03 01:51:33 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-11-03 07:49:11 -0700
commit0c74f7a2c8e0af7ac006c16fc9ef05e5f9245518 (patch)
tree6e282217d0e6a9bffa6c438bc718bd39cf38e39b
parent6bab8267ebaa324ff0cbd32303ad04ae4bc998b9 (diff)
downloadsubsurface-0c74f7a2c8e0af7ac006c16fc9ef05e5f9245518.tar.gz
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 <neolit123@gmail.com>
-rw-r--r--core/android.cpp4
-rw-r--r--core/dive.h2
-rw-r--r--core/linux.c4
-rw-r--r--core/macos.c4
-rw-r--r--core/subsurfacestartup.c6
-rw-r--r--core/windows.c66
-rw-r--r--subsurface-desktop-main.cpp10
-rw-r--r--subsurface-mobile-main.cpp4
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=<test> Choose configuration space for user <test>");
printf("\n --cloud-timeout=<nr> 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);
- }
-
- /* 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 */
+ 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);
}
- 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);