From: Johan Malm Date: Sun, 5 Feb 2023 19:29:24 +0000 (+0000) Subject: view: add move_to_front to `struct view_impl` X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=b8ec5a3e2eeed62c3ab3c456190564b6c699ab0a;p=proto%2Flabwc.git view: add move_to_front to `struct view_impl` ...to increase xwayland and xdg-shell encapsulation and to avoid passing a function pointer as an argument in `xwayland_move_sub_views_to_front()` which is inconsistent with labwc design patterns. Rename view-impl.c to view-impl-common.c Move function declarations that are common to view-implementations from view.h into view-impl-common.h --- diff --git a/include/labwc.h b/include/labwc.h index cc7806a2..d038963f 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -365,7 +365,6 @@ void foreign_toplevel_update_outputs(struct view *view); * cannot assume this means that the window actually has keyboard * or pointer focus, in this compositor are they called together. */ - void desktop_move_to_front(struct view *view); void desktop_move_to_back(struct view *view); void desktop_focus_and_activate_view(struct seat *seat, struct view *view); diff --git a/include/view-impl-common.h b/include/view-impl-common.h new file mode 100644 index 00000000..73f428b8 --- /dev/null +++ b/include/view-impl-common.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __LABWC_VIEW_IMPL_COMMON_H +#define __LABWC_VIEW_IMPL_COMMON_H +/* + * Common code for view->impl functions + * + * Please note: only xdg-shell-toplevel-view and xwayland-view view_impl + * functions should call these functions. + */ + +void view_impl_move_to_front(struct view *view); +void view_impl_map(struct view *view); + +#endif /* __LABWC_VIEW_IMPL_COMMON_H */ diff --git a/include/view.h b/include/view.h index ead6d6cf..701ec177 100644 --- a/include/view.h +++ b/include/view.h @@ -30,6 +30,7 @@ struct view_impl { void (*set_fullscreen)(struct view *view, bool fullscreen); void (*unmap)(struct view *view); void (*maximize)(struct view *view, bool maximize); + void (*move_to_front)(struct view *view); }; struct view { @@ -162,7 +163,6 @@ void view_update_title(struct view *view); void view_update_app_id(struct view *view); void view_reload_ssd(struct view *view); -void view_impl_map(struct view *view); void view_adjust_size(struct view *view, int *w, int *h); void view_evacuate_region(struct view *view); diff --git a/include/xwayland.h b/include/xwayland.h index 584e6e71..8692085d 100644 --- a/include/xwayland.h +++ b/include/xwayland.h @@ -45,8 +45,6 @@ void xwayland_unmanaged_create(struct server *server, struct wlr_xwayland_surface *xwayland_surface_from_view(struct view *view); bool xwayland_apply_size_hints(struct view *view, int *w, int *h); -void xwayland_move_sub_views_to_front(struct view *parent, - void (*move_to_front)(struct view *view)); void xwayland_server_init(struct server *server, struct wlr_compositor *compositor); diff --git a/src/desktop.c b/src/desktop.c index 56d4a393..5c7151fc 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -12,25 +12,16 @@ #include "workspaces.h" #include "xwayland.h" -static void -move_to_front(struct view *view) -{ - wl_list_remove(&view->link); - wl_list_insert(&view->server->views, &view->link); - wlr_scene_node_raise_to_top(&view->scene_tree->node); -} - void desktop_move_to_front(struct view *view) { if (!view) { return; } - move_to_front(view); -#if HAVE_XWAYLAND - xwayland_move_sub_views_to_front(view, move_to_front); -#endif - cursor_update_focus(view->server); + if (view->impl->move_to_front) { + view->impl->move_to_front(view); + cursor_update_focus(view->server); + } } void diff --git a/src/keyboard.c b/src/keyboard.c index 894ae639..6a6dd2f7 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -6,6 +6,7 @@ #include "key-state.h" #include "labwc.h" #include "regions.h" +#include "view.h" #include "workspaces.h" static bool should_cancel_cycling_on_next_key_release; diff --git a/src/meson.build b/src/meson.build index d303ac4c..da040d12 100644 --- a/src/meson.build +++ b/src/meson.build @@ -21,7 +21,7 @@ labwc_sources = files( 'touch.c', 'theme.c', 'view.c', - 'view-impl.c', + 'view-impl-common.c', 'workspaces.c', 'xdg.c', 'xdg-deco.c', diff --git a/src/view-impl.c b/src/view-impl-common.c similarity index 51% rename from src/view-impl.c rename to src/view-impl-common.c index 5402a388..9dee49b4 100644 --- a/src/view-impl.c +++ b/src/view-impl-common.c @@ -1,16 +1,24 @@ // SPDX-License-Identifier: GPL-2.0-only -/* view-impl.c: common code for shell view->impl functions */ +/* view-impl-common.c: common code for shell view->impl functions */ #include #include #include "labwc.h" #include "view.h" +#include "view-impl-common.h" + +void +view_impl_move_to_front(struct view *view) +{ + wl_list_remove(&view->link); + wl_list_insert(&view->server->views, &view->link); + wlr_scene_node_raise_to_top(&view->scene_tree->node); +} void view_impl_map(struct view *view) { desktop_focus_and_activate_view(&view->server->seat, view); desktop_move_to_front(view); - view_update_title(view); view_update_app_id(view); } diff --git a/src/xdg.c b/src/xdg.c index dea39e02..9d806504 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -4,6 +4,7 @@ #include "labwc.h" #include "node.h" #include "view.h" +#include "view-impl-common.h" #include "workspaces.h" struct wlr_xdg_surface * @@ -389,6 +390,7 @@ static const struct view_impl xdg_toplevel_view_impl = { .set_fullscreen = xdg_toplevel_view_set_fullscreen, .unmap = xdg_toplevel_view_unmap, .maximize = xdg_toplevel_view_maximize, + .move_to_front = view_impl_move_to_front, }; void diff --git a/src/xwayland.c b/src/xwayland.c index 9ef487df..d66df0a3 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -8,6 +8,7 @@ #include "node.h" #include "ssd.h" #include "view.h" +#include "view-impl-common.h" #include "workspaces.h" #include "xwayland.h" @@ -57,40 +58,6 @@ top_parent_of(struct view *view) return s; } -void -xwayland_move_sub_views_to_front(struct view *parent, - void (*move_to_front)(struct view *view)) -{ - assert(parent); - assert(move_to_front); - - if (parent->type != LAB_XWAYLAND_VIEW) { - return; - } - - struct wlr_xwayland_surface *parent_xwayland_surface = - xwayland_surface_from_view(parent); - struct view *view, *next; - wl_list_for_each_reverse_safe(view, next, &parent->server->views, link) - { - /* need to stop here, otherwise loops keeps going forever */ - if (view == parent) { - break; - } - if (view->type != LAB_XWAYLAND_VIEW) { - continue; - } - if (!view->mapped && !view->minimized) { - continue; - } - if (top_parent_of(view) != parent_xwayland_surface) { - continue; - } - move_to_front(view); - /* TODO: we should probably focus on these too here */ - } -} - static struct xwayland_view * xwayland_view_from_view(struct view *view) { @@ -545,6 +512,44 @@ maximize(struct view *view, bool maximized) maximized); } +static void +move_sub_views_to_front(struct view *parent) +{ + assert(parent); + + if (parent->type != LAB_XWAYLAND_VIEW) { + return; + } + + struct wlr_xwayland_surface *parent_xwayland_surface = + xwayland_surface_from_view(parent); + struct view *view, *next; + wl_list_for_each_reverse_safe(view, next, &parent->server->views, link) + { + /* need to stop here, otherwise loops keeps going forever */ + if (view == parent) { + break; + } + if (view->type != LAB_XWAYLAND_VIEW) { + continue; + } + if (!view->mapped && !view->minimized) { + continue; + } + if (top_parent_of(view) != parent_xwayland_surface) { + continue; + } + view_impl_move_to_front(view); + } +} + +static void +move_to_front(struct view *view) +{ + view_impl_move_to_front(view); + move_sub_views_to_front(view); +} + static void set_activated(struct view *view, bool activated) { @@ -584,7 +589,8 @@ static const struct view_impl xwl_view_impl = { .set_activated = set_activated, .set_fullscreen = set_fullscreen, .unmap = unmap, - .maximize = maximize + .maximize = maximize, + .move_to_front = move_to_front, }; static void