diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2021-12-15 20:00:57 +0200 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2021-12-15 20:00:57 +0200 |
commit | 1fdb6a99c8f1ac14db94c6a24bc82b0eb57b1a8a (patch) | |
tree | 11eda90dcd9b40cc4cb40377aa5748191db2ab9b /platform/windows | |
parent | 1cbf3947d60e1edd39101ebd806d641d54cf53f1 (diff) |
[Windows] Detect new Windows Terminal and disable unsupported set_console_visible code.
Diffstat (limited to 'platform/windows')
-rw-r--r-- | platform/windows/display_server_windows.cpp | 7 | ||||
-rw-r--r-- | platform/windows/os_windows.cpp | 13 | ||||
-rw-r--r-- | platform/windows/os_windows.h | 1 |
3 files changed, 18 insertions, 3 deletions
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 2878981078..f83029e662 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -1204,8 +1204,11 @@ void DisplayServerWindows::console_set_visible(bool p_enabled) { if (console_visible == p_enabled) { return; } - ShowWindow(GetConsoleWindow(), p_enabled ? SW_SHOW : SW_HIDE); - console_visible = p_enabled; + if (!((OS_Windows *)OS::get_singleton())->_is_win11_terminal()) { + // GetConsoleWindow is not supported by the Windows Terminal. + ShowWindow(GetConsoleWindow(), p_enabled ? SW_SHOW : SW_HIDE); + console_visible = p_enabled; + } } bool DisplayServerWindows::is_console_visible() const { diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index d7d78ff5dc..bb6a077a5d 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -467,6 +467,16 @@ Error OS_Windows::execute(const String &p_path, const List<String> &p_arguments, return OK; }; +bool OS_Windows::_is_win11_terminal() const { + HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD dwMode = 0; + if (GetConsoleMode(hStdOut, &dwMode)) { + return ((dwMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == ENABLE_VIRTUAL_TERMINAL_PROCESSING); + } else { + return false; + } +} + Error OS_Windows::create_process(const String &p_path, const List<String> &p_arguments, ProcessID *r_child_id) { String path = p_path.replace("/", "\\"); String command = _quote_command_line_argument(path); @@ -484,7 +494,8 @@ Error OS_Windows::create_process(const String &p_path, const List<String> &p_arg #ifndef DEBUG_ENABLED dwCreationFlags |= CREATE_NO_WINDOW; #endif - if (p_path == get_executable_path() && GetConsoleWindow() != nullptr) { + if (p_path == get_executable_path() && GetConsoleWindow() != nullptr && _is_win11_terminal()) { + // Open a new terminal as a workaround for Windows Terminal bug. dwCreationFlags |= CREATE_NEW_CONSOLE; } diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 1342d95575..086f63eb3e 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -157,6 +157,7 @@ public: void run(); + bool _is_win11_terminal() const; virtual bool _check_internal_feature_support(const String &p_feature) override; virtual void disable_crash_handler() override; |