]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: Unify view_move()/view_move_resize()
authorJohn Lindgren <john@jlindgren.net>
Thu, 9 Feb 2023 06:07:07 +0000 (01:07 -0500)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Thu, 16 Feb 2023 04:21:47 +0000 (05:21 +0100)
view->impl->move() is a specific case of view->impl->configure().
To reduce code duplication, we can use view->impl->configure() for
pure moves (without resize) as well.

xwayland's move() function also possibly contained a race condition
when there was a pending resize, as it used the current surface
width/height rather than the pending width/height. This is fixed.

include/view.h
src/view.c
src/xdg.c
src/xwayland.c

index 3b6844a8d436e248d694eb21053ca43c483f3736..dc8a94c95957340d3ee2a7e3af21ffb468dbca65 100644 (file)
@@ -26,7 +26,6 @@ struct view_impl {
        void (*close)(struct view *view);
        const char *(*get_string_prop)(struct view *view, const char *prop);
        void (*map)(struct view *view);
-       void (*move)(struct view *view, int x, int y);
        void (*set_activated)(struct view *view, bool activated);
        void (*set_fullscreen)(struct view *view, bool fullscreen);
        void (*unmap)(struct view *view);
index 1bc0069e06da4326bd5f965f6c9f93d5c758e3dd..5966f5f9f5c927a98b1744c0908661be0ffefdae 100644 (file)
@@ -143,9 +143,11 @@ void
 view_move(struct view *view, int x, int y)
 {
        assert(view);
-       if (view->impl->move) {
-               view->impl->move(view, x, y);
-       }
+       view_move_resize(view, (struct wlr_box){
+               .x = x, .y = y,
+               .width = view->pending.width,
+               .height = view->pending.height
+       });
 }
 
 void
index 89b1f4c303b7336eb8cd722ca58781194b0edc96..0c793b942058c701d243524b451a06ccd4ba5ba0 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -200,46 +200,25 @@ handle_set_app_id(struct wl_listener *listener, void *data)
        view_update_app_id(view);
 }
 
-static void
-xdg_toplevel_view_move(struct view *view, int x, int y)
-{
-       /* override any previous pending move */
-       view->pending.x = x;
-       view->pending.y = y;
-
-       /* Syncs moves with resizes  */
-       if (view->pending_configure_serial > 0) {
-               return;
-       }
-
-       view->current.x = x;
-       view->current.y = y;
-       view_moved(view);
-}
-
 static void
 xdg_toplevel_view_configure(struct view *view, struct wlr_box geo)
 {
+       uint32_t serial = 0;
        view_adjust_size(view, &geo.width, &geo.height);
 
-       if (view->pending.width == geo.width && view->pending.height == geo.height) {
-               /*
-                * As wayland has no notion of a global position
-                * we are only updating the size. If a wayland
-                * client receives the same size it already has
-                * it might not respond to the configure request
-                * and thus we will never actually set the new
-                * position. To handle this case just call move
-                * directly.
-                */
-               xdg_toplevel_view_move(view, geo.x, geo.y);
-               return;
+       /*
+        * We do not need to send a configure request unless the size
+        * changed (wayland has no notion of a global position). If the
+        * size is the same (and there is no pending configure request)
+        * then we can just move the view directly.
+        */
+       if (geo.width != view->pending.width
+                       || geo.height != view->pending.height) {
+               serial = wlr_xdg_toplevel_set_size(xdg_toplevel_from_view(view),
+                       geo.width, geo.height);
        }
 
        view->pending = geo;
-       struct wlr_xdg_toplevel *xdg_toplevel = xdg_toplevel_from_view(view);
-       uint32_t serial = wlr_xdg_toplevel_set_size(xdg_toplevel,
-               (uint32_t)geo.width, (uint32_t)geo.height);
        if (serial > 0) {
                view->pending_configure_serial = serial;
        } else if (view->pending_configure_serial == 0) {
@@ -401,7 +380,6 @@ static const struct view_impl xdg_toplevel_view_impl = {
        .close = xdg_toplevel_view_close,
        .get_string_prop = xdg_toplevel_view_get_string_prop,
        .map = xdg_toplevel_view_map,
-       .move = xdg_toplevel_view_move,
        .set_activated = xdg_toplevel_view_set_activated,
        .set_fullscreen = xdg_toplevel_view_set_fullscreen,
        .unmap = xdg_toplevel_view_unmap,
index 09ca3cc11ae3bcdb9d7d81dcdf4b093288d0cc4a..8a27b79785b5fde47e88374f516dc93cb189236d 100644 (file)
@@ -386,22 +386,6 @@ handle_set_class(struct wl_listener *listener, void *data)
        view_update_app_id(view);
 }
 
-static void
-move(struct view *view, int x, int y)
-{
-       view->current.x = x;
-       view->current.y = y;
-
-       /* override any previous pending move */
-       view->pending.x = x;
-       view->pending.y = y;
-
-       struct wlr_xwayland_surface *s = xwayland_surface_from_view(view);
-       wlr_xwayland_surface_configure(s, (int16_t)x, (int16_t)y,
-               (uint16_t)s->width, (uint16_t)s->height);
-       view_moved(view);
-}
-
 static void
 _close(struct view *view)
 {
@@ -615,7 +599,6 @@ static const struct view_impl xwl_view_impl = {
        .close = _close,
        .get_string_prop = get_string_prop,
        .map = map,
-       .move = move,
        .set_activated = set_activated,
        .set_fullscreen = set_fullscreen,
        .unmap = unmap,