diff options
author | Ron Yorston <rmy@pobox.com> | 2024-04-29 11:10:53 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2024-04-29 11:10:53 +0100 |
commit | 818cf3b0c7dae0b06d0103998f1eef14964b63c7 (patch) | |
tree | 68d3c01abb2a6dcc832e21adf25a09c016f2bb6b | |
parent | af195b0c979c53739d0ba7e054667b3c548feaa9 (diff) | |
download | busybox-w32-818cf3b0c7dae0b06d0103998f1eef14964b63c7.tar.gz busybox-w32-818cf3b0c7dae0b06d0103998f1eef14964b63c7.tar.bz2 busybox-w32-818cf3b0c7dae0b06d0103998f1eef14964b63c7.zip |
ash: add 'noiconify' option
The 'noiconify' option controls how the console window is concealed
when the 'noconsole' option is used. The default is to iconify
the console. When 'noiconify' is 'on' the console is hidden.
Adds 8-16 bytes.
(GitHub issue #325)
-rw-r--r-- | shell/ash.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/shell/ash.c b/shell/ash.c index 9ed8506ab..da139f89b 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -192,9 +192,10 @@ | |||
192 | //config: depends on (ASH || SH_IS_ASH || BASH_IS_ASH) && PLATFORM_MINGW32 | 192 | //config: depends on (ASH || SH_IS_ASH || BASH_IS_ASH) && PLATFORM_MINGW32 |
193 | //config: help | 193 | //config: help |
194 | //config: Enable support for the 'noconsole' option, which attempts to | 194 | //config: Enable support for the 'noconsole' option, which attempts to |
195 | //config: hide the console normally associated with a command line | 195 | //config: conceal the console normally associated with a command line |
196 | //config: application. This may be useful when running a shell script | 196 | //config: application. This may be useful when running a shell script |
197 | //config: from a GUI application. | 197 | //config: from a GUI application. Also the 'noiconify' option, which |
198 | //config: controls whether the console is iconfified or hidden. | ||
198 | //config: | 199 | //config: |
199 | //config:config ASH_GLOB_OPTIONS | 200 | //config:config ASH_GLOB_OPTIONS |
200 | //config: bool "Globbing options" | 201 | //config: bool "Globbing options" |
@@ -505,6 +506,7 @@ static const char *const optletters_optnames[] ALIGN_PTR = { | |||
505 | #endif | 506 | #endif |
506 | #if ENABLE_ASH_NOCONSOLE | 507 | #if ENABLE_ASH_NOCONSOLE |
507 | ,"\0" "noconsole" | 508 | ,"\0" "noconsole" |
509 | ,"\0" "noiconify" | ||
508 | #endif | 510 | #endif |
509 | #if ENABLE_ASH_GLOB_OPTIONS | 511 | #if ENABLE_ASH_GLOB_OPTIONS |
510 | ,"\0" "nocaseglob" | 512 | ,"\0" "nocaseglob" |
@@ -635,11 +637,12 @@ struct globals_misc { | |||
635 | # define winxp optlist[16 + BASH_PIPEFAIL + 2*(DEBUG != 0)] | 637 | # define winxp optlist[16 + BASH_PIPEFAIL + 2*(DEBUG != 0)] |
636 | # if ENABLE_ASH_NOCONSOLE | 638 | # if ENABLE_ASH_NOCONSOLE |
637 | # define noconsole optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0)] | 639 | # define noconsole optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0)] |
640 | # define noiconify optlist[18 + BASH_PIPEFAIL + 2*(DEBUG != 0)] | ||
638 | # endif | 641 | # endif |
639 | # if ENABLE_ASH_GLOB_OPTIONS | 642 | # if ENABLE_ASH_GLOB_OPTIONS |
640 | # define nocaseglob optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | 643 | # define nocaseglob optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0) + 2*ENABLE_ASH_NOCONSOLE] |
641 | # define nohiddenglob optlist[18 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | 644 | # define nohiddenglob optlist[18 + BASH_PIPEFAIL + 2*(DEBUG != 0) + 2*ENABLE_ASH_NOCONSOLE] |
642 | # define nohidsysglob optlist[19 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | 645 | # define nohidsysglob optlist[19 + BASH_PIPEFAIL + 2*(DEBUG != 0) + 2*ENABLE_ASH_NOCONSOLE] |
643 | # endif | 646 | # endif |
644 | #endif | 647 | #endif |
645 | 648 | ||
@@ -2969,17 +2972,25 @@ setwinxp(int on) | |||
2969 | /* | 2972 | /* |
2970 | * Console state is either: | 2973 | * Console state is either: |
2971 | * 0 normal | 2974 | * 0 normal |
2972 | * 1 iconified | 2975 | * 1 iconified/hidden |
2973 | * 2 unknown | 2976 | * 2 unknown |
2974 | */ | 2977 | */ |
2975 | static int console_state(void) | 2978 | static int console_state(void) |
2976 | { | 2979 | { |
2977 | DECLARE_PROC_ADDR(BOOL, ShowWindow, HWND, int); | 2980 | DECLARE_PROC_ADDR(BOOL, ShowWindow, HWND, int); |
2978 | DECLARE_PROC_ADDR(BOOL, IsIconic, HWND); | ||
2979 | 2981 | ||
2980 | if (INIT_PROC_ADDR(user32.dll, ShowWindow) && | 2982 | if (INIT_PROC_ADDR(user32.dll, ShowWindow)) { |
2981 | INIT_PROC_ADDR(user32.dll, IsIconic)) { | 2983 | BOOL state; |
2982 | return IsIconic(GetConsoleWindow()) != 0; | 2984 | |
2985 | if (noiconify) { | ||
2986 | state = IsWindowVisible(GetConsoleWindow()); | ||
2987 | if (state >= 0) | ||
2988 | return state == 0; | ||
2989 | } else { | ||
2990 | state = IsIconic(GetConsoleWindow()); | ||
2991 | if (state >= 0) | ||
2992 | return state != 0; | ||
2993 | } | ||
2983 | } | 2994 | } |
2984 | return 2; | 2995 | return 2; |
2985 | } | 2996 | } |
@@ -2988,7 +2999,8 @@ static void hide_console(int hide) | |||
2988 | { | 2999 | { |
2989 | // Switch console state if it's known and isn't the required state | 3000 | // Switch console state if it's known and isn't the required state |
2990 | if (console_state() == !hide) | 3001 | if (console_state() == !hide) |
2991 | ShowWindow(GetConsoleWindow(), hide ? SW_MINIMIZE : SW_NORMAL); | 3002 | ShowWindow(GetConsoleWindow(), hide ? |
3003 | (noiconify ? SW_HIDE : SW_MINIMIZE) : SW_NORMAL); | ||
2992 | } | 3004 | } |
2993 | # endif | 3005 | # endif |
2994 | #endif | 3006 | #endif |