mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
6bab8267eb
commit
0c74f7a2c8
8 changed files with 24 additions and 76 deletions
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue