@@ -1306,10 +1306,10 @@ DisplayServer::WindowID DisplayServerWindows::get_window_at_screen_position(cons
13061306 return INVALID_WINDOW_ID;
13071307}
13081308
1309- DisplayServer::WindowID DisplayServerWindows::create_sub_window (WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
1309+ 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 ) {
13101310 _THREAD_SAFE_METHOD_
13111311
1312- WindowID window_id = _create_window (p_mode, p_vsync_mode, p_flags, p_rect);
1312+ WindowID window_id = _create_window (p_mode, p_vsync_mode, p_flags, p_rect, p_exclusive, p_transient_parent );
13131313 ERR_FAIL_COND_V_MSG (window_id == INVALID_WINDOW_ID, INVALID_WINDOW_ID, " Failed to create sub window." );
13141314
13151315 WindowData &wd = windows[window_id];
@@ -5326,7 +5326,7 @@ void DisplayServerWindows::_update_tablet_ctx(const String &p_old_driver, const
53265326 }
53275327}
53285328
5329- DisplayServer::WindowID DisplayServerWindows::_create_window (WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
5329+ 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 ) {
53305330 DWORD dwExStyle;
53315331 DWORD dwStyle;
53325332
@@ -5376,6 +5376,18 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
53765376
53775377 WindowID id = window_id_counter;
53785378 {
5379+ WindowData *wd_transient_parent = nullptr ;
5380+ HWND owner_hwnd = nullptr ;
5381+ if (p_transient_parent != INVALID_WINDOW_ID && !windows.has (p_transient_parent)) {
5382+ ERR_PRINT (" Condition \" !windows.has(p_transient_parent)\" is true." );
5383+ p_transient_parent = INVALID_WINDOW_ID;
5384+ } else {
5385+ wd_transient_parent = &windows[p_transient_parent];
5386+ if (p_exclusive) {
5387+ owner_hwnd = wd_transient_parent->hWnd ;
5388+ }
5389+ }
5390+
53795391 WindowData &wd = windows[id];
53805392
53815393 wd.hWnd = CreateWindowExW (
@@ -5386,7 +5398,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
53865398 WindowRect.top ,
53875399 WindowRect.right - WindowRect.left ,
53885400 WindowRect.bottom - WindowRect.top ,
5389- nullptr ,
5401+ owner_hwnd ,
53905402 nullptr ,
53915403 hInstance,
53925404 // tunnel the WindowData we need to handle creation message
@@ -5408,6 +5420,12 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,
54085420 wd.pre_fs_valid = true ;
54095421 }
54105422
5423+ wd.exclusive = p_exclusive;
5424+ if (wd_transient_parent) {
5425+ wd.transient_parent = p_transient_parent;
5426+ wd_transient_parent->transient_children .insert (id);
5427+ }
5428+
54115429 if (is_dark_mode_supported () && dark_title_available) {
54125430 BOOL value = is_dark_mode ();
54135431 ::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
60366054 window_position = scr_rect.position + (scr_rect.size - p_resolution) / 2 ;
60376055 }
60386056
6039- WindowID main_window = _create_window (p_mode, p_vsync_mode, p_flags, Rect2i (window_position, p_resolution));
6057+ WindowID main_window = _create_window (p_mode, p_vsync_mode, p_flags, Rect2i (window_position, p_resolution), false , INVALID_WINDOW_ID );
60406058 ERR_FAIL_COND_MSG (main_window == INVALID_WINDOW_ID, " Failed to create main window." );
60416059
60426060 joypad = new JoypadWindows (&windows[MAIN_WINDOW_ID].hWnd );
0 commit comments