@@ -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