tAdd move/resize by dragging borders - spkp - Stacking wayland compositor
 (HTM) git clone git://git.z3bra.org/spkp.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 99f831765709a109e30d4a5ef5343ed2e55ea3fc
 (DIR) parent 813ab37ef9e0a2606ec13c78c3abac5f5655fb56
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Thu, 12 Nov 2020 14:42:37 +0100
       
       Add move/resize by dragging borders
       
       Diffstat:
         M compositor.c                        |      38 ++++++++++++++++++++++---------
       
       1 file changed, 27 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/compositor.c b/compositor.c
       t@@ -32,6 +32,11 @@ enum {
                RESIZE,
        };
        
       +enum {
       +        CONTENT,
       +        BORDER,
       +};
       +
        /* Internal compositor state */
        struct state {
                struct wl_display *dpy;
       t@@ -92,6 +97,7 @@ struct window {
        
                struct wlr_surface *topmost;
                double sx, sy;
       +        int area;
        
                struct wl_listener map;
                struct wl_listener unmap;
       t@@ -658,10 +664,18 @@ cb_click(struct wl_listener *listener, void *data)
                kb = wlr_seat_get_keyboard(server->seat);
                ev = data;
        
       -        if (kb->modifiers.depressed & WLR_MODIFIER_LOGO
       +        w = underneath(server, server->cursor->x, server->cursor->y);
       +
       +        /* don't enter grab mode when there is no window under the pointer */
       +        if (!w) {
       +                wlr_seat_pointer_clear_focus(server->seat);
       +                server->grabmode = NORMAL;
       +                return;
       +        }
       +
       +        if ((w->area == BORDER || (kb->modifiers.depressed & WLR_MODIFIER_LOGO))
                 && ev->state == WLR_BUTTON_PRESSED
                 && server->grabmode == NORMAL) {
       -
                        switch (ev->button) {
                        case BTN_LEFT:
                                server->grabmode = MOVE;
       t@@ -683,13 +697,6 @@ cb_click(struct wl_listener *listener, void *data)
                        return;
                }
        
       -        /* don't enter grab mode when there is no window under the pointer */
       -        if (!(w = underneath(server, server->cursor->x, server->cursor->y))) {
       -                wlr_seat_pointer_clear_focus(server->seat);
       -                server->grabmode = NORMAL;
       -                return;
       -        }
       -
                /*
                 * Save which window was clicked, and the coordinates
                 * of the event on that surface.
       t@@ -818,7 +825,6 @@ render(struct wlr_surface *surface, int x, int y, void *data)
                }
        
                wlr_matrix_project_box(matrix, &box, transform, 0, output->transform_matrix);
       -
                wlr_render_texture_with_matrix(rdata->renderer, texture, matrix, 1);
                wlr_surface_send_frame_done(surface, &rdata->when);
        }
       t@@ -900,8 +906,18 @@ underneath(struct state *server, double x, double y)
                        w->topmost = wlr_xdg_surface_surface_at(w->toplevel,
                                x - w->x, y - w->y, &w->sx, &w->sy);
        
       -                if (w->topmost)
       +                if (w->topmost) {
       +                        w->area = CONTENT;
       +                        return w;
       +                }
       +
       +                if (server->cursor->x > w->x - bordersize
       +                 && server->cursor->y > w->y - bordersize
       +                 && server->cursor->x < w->x + w->toplevel->surface->current.width + bordersize
       +                 && server->cursor->y < w->y + w->toplevel->surface->current.height + bordersize) {
       +                        w->area = BORDER;
                                return w;
       +                }
                }
        
                return NULL;