Skip to content

Commit 13c6c0c

Browse files
committed
Merge pull request #94706 from alvinhochun/window-set-transient-parent-on-create
Pass window exclusive and transient properties for subwindow creation
2 parents 6a1ac99 + 24e02d5 commit 13c6c0c

File tree

10 files changed

+44
-25
lines changed

10 files changed

+44
-25
lines changed

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1735,7 +1735,7 @@ Vector<DisplayServer::WindowID> DisplayServerX11::get_window_list() const {
17351735
return ret;
17361736
}
17371737

1738-
DisplayServer::WindowID DisplayServerX11::create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
1738+
DisplayServer::WindowID DisplayServerX11::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) {
17391739
_THREAD_SAFE_METHOD_
17401740

17411741
WindowID id = _create_window(p_mode, p_vsync_mode, p_flags, p_rect);
@@ -1749,6 +1749,11 @@ DisplayServer::WindowID DisplayServerX11::create_sub_window(WindowMode p_mode, V
17491749
rendering_device->screen_create(id);
17501750
}
17511751
#endif
1752+
1753+
if (p_transient_parent != INVALID_WINDOW_ID) {
1754+
window_set_transient(id, p_transient_parent);
1755+
}
1756+
17521757
return id;
17531758
}
17541759

platform/linuxbsd/x11/display_server_x11.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ class DisplayServerX11 : public DisplayServer {
438438

439439
virtual Vector<DisplayServer::WindowID> get_window_list() const override;
440440

441-
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i()) override;
441+
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i(), bool p_exclusive = false, WindowID p_transient_parent = INVALID_WINDOW_ID) override;
442442
virtual void show_window(WindowID p_id) override;
443443
virtual void delete_sub_window(WindowID p_id) override;
444444

platform/macos/display_server_macos.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ class DisplayServerMacOS : public DisplayServer {
326326

327327
virtual Vector<int> get_window_list() const override;
328328

329-
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i()) override;
329+
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i(), bool p_exclusive = false, WindowID p_transient_parent = INVALID_WINDOW_ID) override;
330330
virtual void show_window(WindowID p_id) override;
331331
virtual void delete_sub_window(WindowID p_id) override;
332332

platform/macos/display_server_macos.mm

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1714,7 +1714,7 @@
17141714
return ret;
17151715
}
17161716

1717-
DisplayServer::WindowID DisplayServerMacOS::create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
1717+
DisplayServer::WindowID DisplayServerMacOS::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) {
17181718
_THREAD_SAFE_METHOD_
17191719

17201720
WindowID id = _create_window(p_mode, p_vsync_mode, p_rect);
@@ -1728,6 +1728,12 @@
17281728
rendering_device->screen_create(id);
17291729
}
17301730
#endif
1731+
1732+
window_set_exclusive(id, p_exclusive);
1733+
if (p_transient_parent != INVALID_WINDOW_ID) {
1734+
window_set_transient(id, p_transient_parent);
1735+
}
1736+
17311737
return id;
17321738
}
17331739

platform/windows/display_server_windows.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

platform/windows/display_server_windows.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ class DisplayServerWindows : public DisplayServer {
517517
uint64_t time_since_popup = 0;
518518
Ref<Image> icon;
519519

520-
WindowID _create_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect);
520+
WindowID _create_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect, bool p_exclusive, WindowID p_transient_parent);
521521
WindowID window_id_counter = MAIN_WINDOW_ID;
522522
RBMap<WindowID, WindowData> windows;
523523

@@ -652,7 +652,7 @@ class DisplayServerWindows : public DisplayServer {
652652

653653
virtual Vector<DisplayServer::WindowID> get_window_list() const override;
654654

655-
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i()) override;
655+
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i(), bool p_exclusive = false, WindowID p_transient_parent = INVALID_WINDOW_ID) override;
656656
virtual void show_window(WindowID p_window) override;
657657
virtual void delete_sub_window(WindowID p_window) override;
658658

scene/main/window.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -631,26 +631,16 @@ void Window::_make_window() {
631631
window_rect = Rect2i(DisplayServer::get_singleton()->screen_get_position(DisplayServer::SCREEN_WITH_KEYBOARD_FOCUS) + (DisplayServer::get_singleton()->screen_get_size(DisplayServer::SCREEN_WITH_KEYBOARD_FOCUS) - size) / 2, size);
632632
}
633633

634-
window_id = DisplayServer::get_singleton()->create_sub_window(DisplayServer::WindowMode(mode), vsync_mode, f, window_rect);
634+
window_id = DisplayServer::get_singleton()->create_sub_window(DisplayServer::WindowMode(mode), vsync_mode, f, window_rect, is_in_edited_scene_root() ? false : exclusive, transient_parent ? transient_parent->window_id : DisplayServer::INVALID_WINDOW_ID);
635635
ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID);
636636
DisplayServer::get_singleton()->window_set_max_size(Size2i(), window_id);
637637
DisplayServer::get_singleton()->window_set_min_size(Size2i(), window_id);
638638
DisplayServer::get_singleton()->window_set_mouse_passthrough(mpath, window_id);
639639
DisplayServer::get_singleton()->window_set_title(tr_title, window_id);
640640
DisplayServer::get_singleton()->window_attach_instance_id(get_instance_id(), window_id);
641641

642-
if (is_in_edited_scene_root()) {
643-
DisplayServer::get_singleton()->window_set_exclusive(window_id, false);
644-
} else {
645-
DisplayServer::get_singleton()->window_set_exclusive(window_id, exclusive);
646-
}
647-
648642
_update_window_size();
649643

650-
if (transient_parent && transient_parent->window_id != DisplayServer::INVALID_WINDOW_ID) {
651-
DisplayServer::get_singleton()->window_set_transient(window_id, transient_parent->window_id);
652-
}
653-
654644
if (transient_parent) {
655645
for (const Window *E : transient_children) {
656646
if (E->window_id != DisplayServer::INVALID_WINDOW_ID) {

servers/display_server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ int DisplayServer::get_screen_from_rect(const Rect2 &p_rect) const {
570570
return pos_screen;
571571
}
572572

573-
DisplayServer::WindowID DisplayServer::create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect) {
573+
DisplayServer::WindowID DisplayServer::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) {
574574
ERR_FAIL_V_MSG(INVALID_WINDOW_ID, "Sub-windows not supported by this display server.");
575575
}
576576

servers/display_server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ class DisplayServer : public Object {
396396
WINDOW_FLAG_MOUSE_PASSTHROUGH_BIT = (1 << WINDOW_FLAG_MOUSE_PASSTHROUGH),
397397
};
398398

399-
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i());
399+
virtual WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i(), bool p_exclusive = false, WindowID p_transient_parent = INVALID_WINDOW_ID);
400400
virtual void show_window(WindowID p_id);
401401
virtual void delete_sub_window(WindowID p_id);
402402

servers/display_server_headless.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class DisplayServerHeadless : public DisplayServer {
8585

8686
Vector<DisplayServer::WindowID> get_window_list() const override { return Vector<DisplayServer::WindowID>(); }
8787

88-
WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i()) override { return 0; }
88+
WindowID create_sub_window(WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Rect2i &p_rect = Rect2i(), bool p_exclusive = false, WindowID p_transient_parent = INVALID_WINDOW_ID) override { return 0; }
8989
void show_window(WindowID p_id) override {}
9090
void delete_sub_window(WindowID p_id) override {}
9191

0 commit comments

Comments
 (0)