Skip to content

Commit b0c1084

Browse files
committed
Merge pull request godotengine#117748 from bruvzg/win_tr
[Windows] Fix invalid transient window getting stuck in infinite loop.
2 parents c3169e0 + 0221952 commit b0c1084

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

platform/windows/display_server_windows.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,7 +1921,15 @@ void DisplayServerWindows::delete_sub_window(DisplayServerEnums::WindowID p_wind
19211921
WindowData &wd = windows[p_window];
19221922

19231923
while (wd.transient_children.size()) {
1924-
window_set_transient(*wd.transient_children.begin(), DisplayServerEnums::INVALID_WINDOW_ID);
1924+
DisplayServerEnums::WindowID wid = *wd.transient_children.begin();
1925+
if (windows.has(wid)) {
1926+
WindowData &wd_window = windows[wid];
1927+
wd_window.transient_parent = DisplayServerEnums::INVALID_WINDOW_ID;
1928+
if (wd_window.exclusive) {
1929+
SetWindowLongPtr(wd_window.hWnd, GWLP_HWNDPARENT, (LONG_PTR) nullptr);
1930+
}
1931+
}
1932+
wd.transient_children.erase(wid);
19251933
}
19261934

19271935
if (wd.transient_parent != DisplayServerEnums::INVALID_WINDOW_ID) {
@@ -6949,9 +6957,14 @@ Error DisplayServerWindows::_create_window(DisplayServerEnums::WindowID p_window
69496957
}
69506958

69516959
wd.exclusive = p_exclusive;
6960+
bool on_top = (p_flags & DisplayServerEnums::WINDOW_FLAG_ALWAYS_ON_TOP_BIT && p_mode != DisplayServerEnums::WINDOW_MODE_FULLSCREEN && p_mode != DisplayServerEnums::WINDOW_MODE_EXCLUSIVE_FULLSCREEN);
69526961
if (wd_transient_parent) {
6953-
wd.transient_parent = p_transient_parent;
6954-
wd_transient_parent->transient_children.insert(id);
6962+
if (on_top) {
6963+
ERR_PRINT("Windows with the 'on top' can't become transient.");
6964+
} else {
6965+
wd.transient_parent = p_transient_parent;
6966+
wd_transient_parent->transient_children.insert(id);
6967+
}
69556968
}
69566969

69576970
wd.sharp_corners = p_flags & DisplayServerEnums::WINDOW_FLAG_SHARP_CORNERS_BIT;

0 commit comments

Comments
 (0)