diff options
author | Ron Yorston <rmy@pobox.com> | 2023-08-20 12:53:10 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2023-08-20 13:35:20 +0100 |
commit | 67ed7484be88e3be5a5a51f404f1325a569be173 (patch) | |
tree | 095e176c3a09fdef23831852a87964d35b5470b2 /shell/ash.c | |
parent | 77aa74d151643ff2ec96156942e004fba19464a5 (diff) | |
download | busybox-w32-noconsole2.tar.gz busybox-w32-noconsole2.tar.bz2 busybox-w32-noconsole2.zip |
ash: detect console state on shell start upnoconsole2
Set 'noconsole' to match the actual state of the console (normal/
iconified) when the shell is started. Thus ShowWindow() will only
be called if the actual state differs from the default or user
defined state.
Costs 20-24 bytes.
(GitHub issue #325)
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/shell/ash.c b/shell/ash.c index 41bf45734..2ea87a049 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -252,6 +252,7 @@ | |||
252 | #endif | 252 | #endif |
253 | #if ENABLE_PLATFORM_MINGW32 | 253 | #if ENABLE_PLATFORM_MINGW32 |
254 | # include <conio.h> | 254 | # include <conio.h> |
255 | # include "lazyload.h" | ||
255 | #endif | 256 | #endif |
256 | 257 | ||
257 | /* So far, all bash compat is controlled by one config option */ | 258 | /* So far, all bash compat is controlled by one config option */ |
@@ -2994,6 +2995,33 @@ setwinxp(int on) | |||
2994 | } | 2995 | } |
2995 | } | 2996 | } |
2996 | } | 2997 | } |
2998 | |||
2999 | # if ENABLE_ASH_NOCONSOLE | ||
3000 | /* | ||
3001 | * Console state is either: | ||
3002 | * 0 normal | ||
3003 | * 1 iconified | ||
3004 | * 2 unknown | ||
3005 | */ | ||
3006 | static int console_state(void) | ||
3007 | { | ||
3008 | DECLARE_PROC_ADDR(BOOL, ShowWindow, HWND, int); | ||
3009 | DECLARE_PROC_ADDR(BOOL, IsIconic, HWND); | ||
3010 | |||
3011 | if (INIT_PROC_ADDR(user32.dll, ShowWindow) && | ||
3012 | INIT_PROC_ADDR(user32.dll, IsIconic)) { | ||
3013 | return IsIconic(GetConsoleWindow()) != 0; | ||
3014 | } | ||
3015 | return 2; | ||
3016 | } | ||
3017 | |||
3018 | static void hide_console(int hide) | ||
3019 | { | ||
3020 | // Switch console state if it's known and isn't the required state | ||
3021 | if (console_state() == !hide) | ||
3022 | ShowWindow(GetConsoleWindow(), hide ? SW_MINIMIZE : SW_NORMAL); | ||
3023 | } | ||
3024 | # endif | ||
2997 | #endif | 3025 | #endif |
2998 | 3026 | ||
2999 | 3027 | ||
@@ -12616,6 +12644,9 @@ options(int *login_sh) | |||
12616 | #if ENABLE_PLATFORM_MINGW32 | 12644 | #if ENABLE_PLATFORM_MINGW32 |
12617 | dirarg = NULL; | 12645 | dirarg = NULL; |
12618 | title = NULL; | 12646 | title = NULL; |
12647 | # if ENABLE_ASH_NOCONSOLE | ||
12648 | noconsole = console_state(); | ||
12649 | # endif | ||
12619 | # if ENABLE_SUW32 | 12650 | # if ENABLE_SUW32 |
12620 | delayexit = 0; | 12651 | delayexit = 0; |
12621 | # endif | 12652 | # endif |