summaryrefslogtreecommitdiff
path: root/platform/windows
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2021-12-15 20:00:57 +0200
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2021-12-15 20:00:57 +0200
commit1fdb6a99c8f1ac14db94c6a24bc82b0eb57b1a8a (patch)
tree11eda90dcd9b40cc4cb40377aa5748191db2ab9b /platform/windows
parent1cbf3947d60e1edd39101ebd806d641d54cf53f1 (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.cpp7
-rw-r--r--platform/windows/os_windows.cpp13
-rw-r--r--platform/windows/os_windows.h1
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;