]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: add move_to_front to `struct view_impl`
authorJohan Malm <jgm323@gmail.com>
Sun, 5 Feb 2023 19:29:24 +0000 (19:29 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Fri, 24 Feb 2023 20:42:01 +0000 (20:42 +0000)
...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

include/labwc.h
include/view-impl-common.h [new file with mode: 0644]
include/view.h
include/xwayland.h
src/desktop.c
src/keyboard.c
src/meson.build
src/view-impl-common.c [moved from src/view-impl.c with 51% similarity]
src/xdg.c
src/xwayland.c

index cc7806a2677464872822ca22e9180d873c725194..d038963f7509901acb66c81440f9685930c2a5eb 100644 (file)
@@ -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 (file)
index 0000000..73f428b
--- /dev/null
@@ -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 */
index ead6d6cfc39ccdc4fd85e031c5331635d117d226..701ec177e2669ef301b3eada1f5953e9311bbbf3 100644 (file)
@@ -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);
index 584e6e71003080495071748231eb0d51bd04f9e3..8692085d8c33e3c01d8cc1aebfc38fa8cebe29b0 100644 (file)
@@ -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);
index 56d4a393edb999221e5e59014e984d397a21e841..5c7151fc8312ad51a9ae6cd0a5ff6e250e3a4c17 100644 (file)
 #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
index 894ae639860027891b9385d721d361f29f21755a..6a6dd2f7149ef3828f8342f721f1eaca40bf5f1a 100644 (file)
@@ -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;
index d303ac4c4881cb3909160042a50bb03c0ddb4574..da040d12f970f9ba6a55fc9ed75055aca37be3ad 100644 (file)
@@ -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',
similarity index 51%
rename from src/view-impl.c
rename to src/view-impl-common.c
index 5402a388bb131200892dca596c61cd5a0315e3eb..9dee49b43b92249cd23efc73453e74a57ea8b30c 100644 (file)
@@ -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 <stdio.h>
 #include <strings.h>
 #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);
 }
index dea39e0287775417fe1d0da6e1ff2ce30404c65c..9d8065044ecaae1aec5de6c7a58bd93d08ceff16 100644 (file)
--- 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
index 9ef487df38fcaf4699a54d0620cd26e6f5a335cd..d66df0a3244404c801e199a1ab4d8709a642d4f5 100644 (file)
@@ -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