|
@@ -1306,10 +1306,10 @@ DisplayServer::WindowID DisplayServerWindows::get_window_at_screen_position(cons
|
|
return INVALID_WINDOW_ID;
|
|
return INVALID_WINDOW_ID;
|
|
}
|
|
}
|
|
|
|
|
|
-DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
|
|
|
|
|
|
+DisplayServer::WindowID DisplayServerWindows::create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect, bool p_exclusive, WindowID p_transient_parent) {
|
|
_THREAD_SAFE_METHOD_
|
|
_THREAD_SAFE_METHOD_
|
|
|
|
|
|
- WindowID window_id = _create_window(p_mode, p_vsync_mode, p_flags, p_rect);
|
|
|
|
|
|
+ WindowID window_id = _create_window(p_mode, p_vsync_mode, p_flags, p_rect, p_exclusive, p_transient_parent);
|
|
ERR_FAIL_COND_V_MSG(window_id == INVALID_WINDOW_ID, INVALID_WINDOW_ID, "Failed to create sub window.");
|
|
ERR_FAIL_COND_V_MSG(window_id == INVALID_WINDOW_ID, INVALID_WINDOW_ID, "Failed to create sub window.");
|
|
|
|
|
|
WindowData &wd = windows[window_id];
|
|
WindowData &wd = windows[window_id];
|
|
@@ -5326,7 +5326,7 @@ void DisplayServerWindows::_update_tablet_ctx(const String &p_old_driver, const
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
|
|
|
|
|
|
+DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect, bool p_exclusive, WindowID p_transient_parent) {
|
|
DWORD dwExStyle;
|
|
DWORD dwExStyle;
|
|
DWORD dwStyle;
|
|
DWORD dwStyle;
|
|
|
|
|
|
@@ -5376,6 +5376,18 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
|
|
|
|
|
WindowID id = window_id_counter;
|
|
WindowID id = window_id_counter;
|
|
{
|
|
{
|
|
|
|
+ WindowData *wd_transient_parent = nullptr;
|
|
|
|
+ HWND owner_hwnd = nullptr;
|
|
|
|
+ if (p_transient_parent != INVALID_WINDOW_ID && !windows.has(p_transient_parent)) {
|
|
|
|
+ ERR_PRINT("Condition \"!windows.has(p_transient_parent)\" is true.");
|
|
|
|
+ p_transient_parent = INVALID_WINDOW_ID;
|
|
|
|
+ } else {
|
|
|
|
+ wd_transient_parent = &windows[p_transient_parent];
|
|
|
|
+ if (p_exclusive) {
|
|
|
|
+ owner_hwnd = wd_transient_parent->hWnd;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
WindowData &wd = windows[id];
|
|
WindowData &wd = windows[id];
|
|
|
|
|
|
wd.hWnd = CreateWindowExW(
|
|
wd.hWnd = CreateWindowExW(
|
|
@@ -5386,7 +5398,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
|
WindowRect.top,
|
|
WindowRect.top,
|
|
WindowRect.right - WindowRect.left,
|
|
WindowRect.right - WindowRect.left,
|
|
WindowRect.bottom - WindowRect.top,
|
|
WindowRect.bottom - WindowRect.top,
|
|
- nullptr,
|
|
|
|
|
|
+ owner_hwnd,
|
|
nullptr,
|
|
nullptr,
|
|
hInstance,
|
|
hInstance,
|
|
// tunnel the WindowData we need to handle creation message
|
|
// tunnel the WindowData we need to handle creation message
|
|
@@ -5408,6 +5420,12 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
|
|
wd.pre_fs_valid = true;
|
|
wd.pre_fs_valid = true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ wd.exclusive = p_exclusive;
|
|
|
|
+ if (wd_transient_parent) {
|
|
|
|
+ wd.transient_parent = p_transient_parent;
|
|
|
|
+ wd_transient_parent->transient_children.insert(id);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (is_dark_mode_supported() && dark_title_available) {
|
|
if (is_dark_mode_supported() && dark_title_available) {
|
|
BOOL value = is_dark_mode();
|
|
BOOL value = is_dark_mode();
|
|
::DwmSetWindowAttribute(wd.hWnd, use_legacy_dark_mode_before_20H1 ? DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 : DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
::DwmSetWindowAttribute(wd.hWnd, use_legacy_dark_mode_before_20H1 ? DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 : DWMWA_USE_IMMERSIVE_DARK_MODE, &value, sizeof(value));
|
|
@@ -6036,7 +6054,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
|
|
window_position = scr_rect.position + (scr_rect.size - p_resolution) / 2;
|
|
window_position = scr_rect.position + (scr_rect.size - p_resolution) / 2;
|
|
}
|
|
}
|
|
|
|
|
|
- WindowID main_window = _create_window(p_mode, p_vsync_mode, p_flags, Rect2i(window_position, p_resolution));
|
|
|
|
|
|
+ WindowID main_window = _create_window(p_mode, p_vsync_mode, p_flags, Rect2i(window_position, p_resolution), false, INVALID_WINDOW_ID);
|
|
ERR_FAIL_COND_MSG(main_window == INVALID_WINDOW_ID, "Failed to create main window.");
|
|
ERR_FAIL_COND_MSG(main_window == INVALID_WINDOW_ID, "Failed to create main window.");
|
|
|
|
|
|
joypad = new JoypadWindows(&windows[MAIN_WINDOW_ID].hWnd);
|
|
joypad = new JoypadWindows(&windows[MAIN_WINDOW_ID].hWnd);
|