@@ -270,17 +270,31 @@ void Viewport::_sub_window_update_order() {
270270 return ;
271271 }
272272
273- if (!gui.sub_windows [gui.sub_windows .size () - 1 ].window ->get_flag (Window::FLAG_ALWAYS_ON_TOP)) {
274- int index = gui.sub_windows .size () - 1 ;
275-
276- while (index > 0 && gui.sub_windows [index - 1 ].window ->get_flag (Window::FLAG_ALWAYS_ON_TOP)) {
277- --index;
273+ // Reorder 'always on top' windows.
274+ int last_index = gui.sub_windows .size () - 1 ;
275+ for (int index = last_index, insert_index = last_index; index >= 0 ; index--) {
276+ SubWindow sw = gui.sub_windows [index];
277+ Window *parent_window = sw.window ->get_parent_visible_window ();
278+ bool parent_is_always_on_top = (parent_window != nullptr ) && parent_window->get_flag (Window::FLAG_ALWAYS_ON_TOP);
279+ if (sw.window ->get_flag (Window::FLAG_ALWAYS_ON_TOP) || (parent_is_always_on_top && sw.window ->is_exclusive ())) {
280+ if (index != insert_index) {
281+ gui.sub_windows .remove_at (index);
282+ gui.sub_windows .insert (insert_index, sw);
283+ }
284+ insert_index--;
278285 }
286+ }
279287
280- if (index != (gui.sub_windows .size () - 1 )) {
281- SubWindow sw = gui.sub_windows [gui.sub_windows .size () - 1 ];
282- gui.sub_windows .remove_at (gui.sub_windows .size () - 1 );
283- gui.sub_windows .insert (index, sw);
288+ // Reorder exclusive children.
289+ for (int parent_index = 0 ; parent_index < gui.sub_windows .size (); parent_index++) {
290+ Window *exclusive_child = gui.sub_windows [parent_index].window ->get_exclusive_child ();
291+ if (exclusive_child != nullptr && exclusive_child->is_visible ()) {
292+ int child_index = _sub_window_find (exclusive_child);
293+ if (child_index < parent_index) {
294+ SubWindow sw = gui.sub_windows [child_index];
295+ gui.sub_windows .remove_at (child_index);
296+ gui.sub_windows .insert (parent_index, sw);
297+ }
284298 }
285299 }
286300
0 commit comments