desktop: move scene-tree node in move-to-back

view_minimize() does not need to call desktop_move_to_back() because the
stacking order is not changed and the windowSwitcher uses the scene-tree
nodes anyway.

Note: Movement of xwayland sub-views still relies on keeping server->views
in sync with z-order
This commit is contained in:
Johan Malm 2023-03-25 16:38:43 +00:00 committed by Johan Malm
parent e45fe0804d
commit a6896e6978
7 changed files with 36 additions and 6 deletions

View file

@ -10,6 +10,7 @@
struct view; struct view;
void view_impl_move_to_front(struct view *view); void view_impl_move_to_front(struct view *view);
void view_impl_move_to_back(struct view *view);
void view_impl_map(struct view *view); void view_impl_map(struct view *view);
/* /*

View file

@ -37,6 +37,7 @@ struct view_impl {
void (*unmap)(struct view *view); void (*unmap)(struct view *view);
void (*maximize)(struct view *view, bool maximize); void (*maximize)(struct view *view, bool maximize);
void (*move_to_front)(struct view *view); void (*move_to_front)(struct view *view);
void (*move_to_back)(struct view *view);
}; };
struct view { struct view {

View file

@ -30,8 +30,10 @@ desktop_move_to_back(struct view *view)
if (!view) { if (!view) {
return; return;
} }
wl_list_remove(&view->link); if (view->impl->move_to_back) {
wl_list_append(&view->server->views, &view->link); view->impl->move_to_back(view);
cursor_update_focus(view->server);
}
} }
void void

View file

@ -2,6 +2,7 @@
/* view-impl-common.c: common code for shell view->impl functions */ /* view-impl-common.c: common code for shell view->impl functions */
#include <stdio.h> #include <stdio.h>
#include <strings.h> #include <strings.h>
#include "common/list.h"
#include "labwc.h" #include "labwc.h"
#include "view.h" #include "view.h"
#include "view-impl-common.h" #include "view-impl-common.h"
@ -14,6 +15,14 @@ view_impl_move_to_front(struct view *view)
wlr_scene_node_raise_to_top(&view->scene_tree->node); wlr_scene_node_raise_to_top(&view->scene_tree->node);
} }
void
view_impl_move_to_back(struct view *view)
{
wl_list_remove(&view->link);
wl_list_append(&view->server->views, &view->link);
wlr_scene_node_lower_to_bottom(&view->scene_tree->node);
}
void void
view_impl_map(struct view *view) view_impl_map(struct view *view)
{ {

View file

@ -232,7 +232,6 @@ view_minimize(struct view *view, bool minimized)
view->minimized = minimized; view->minimized = minimized;
if (minimized) { if (minimized) {
view->impl->unmap(view); view->impl->unmap(view);
desktop_move_to_back(view);
_view_set_activated(view, false); _view_set_activated(view, false);
if (view == view->server->focused_view) { if (view == view->server->focused_view) {
/* /*

View file

@ -455,6 +455,7 @@ static const struct view_impl xdg_toplevel_view_impl = {
.unmap = xdg_toplevel_view_unmap, .unmap = xdg_toplevel_view_unmap,
.maximize = xdg_toplevel_view_maximize, .maximize = xdg_toplevel_view_maximize,
.move_to_front = view_impl_move_to_front, .move_to_front = view_impl_move_to_front,
.move_to_back = view_impl_move_to_back,
}; };
void void

View file

@ -497,8 +497,13 @@ xwayland_view_maximize(struct view *view, bool maximized)
maximized); maximized);
} }
enum z_direction {
LAB_TO_FRONT,
LAB_TO_BACK,
};
static void static void
move_sub_views_to_front(struct view *parent) move_sub_views(struct view *parent, enum z_direction z_direction)
{ {
assert(parent); assert(parent);
@ -524,7 +529,11 @@ move_sub_views_to_front(struct view *parent)
if (top_parent_of(view) != parent_xwayland_surface) { if (top_parent_of(view) != parent_xwayland_surface) {
continue; continue;
} }
if (z_direction == LAB_TO_FRONT) {
view_impl_move_to_front(view); view_impl_move_to_front(view);
} else if (z_direction == LAB_TO_BACK) {
view_impl_move_to_back(view);
}
} }
} }
@ -532,7 +541,14 @@ static void
xwayland_view_move_to_front(struct view *view) xwayland_view_move_to_front(struct view *view)
{ {
view_impl_move_to_front(view); view_impl_move_to_front(view);
move_sub_views_to_front(view); move_sub_views(view, LAB_TO_FRONT);
}
static void
xwayland_view_move_to_back(struct view *view)
{
view_impl_move_to_back(view);
move_sub_views(view, LAB_TO_BACK);
} }
static void static void
@ -576,6 +592,7 @@ static const struct view_impl xwayland_view_impl = {
.unmap = xwayland_view_unmap, .unmap = xwayland_view_unmap,
.maximize = xwayland_view_maximize, .maximize = xwayland_view_maximize,
.move_to_front = xwayland_view_move_to_front, .move_to_front = xwayland_view_move_to_front,
.move_to_back = xwayland_view_move_to_back,
}; };
static void static void