tRefactor move/resize mouse operations - spkp - Stacking wayland compositor
 (HTM) git clone git://git.z3bra.org/spkp.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 948970631cb014fc86a1e0433accd01c612b5fc0
 (DIR) parent 685f7e2b3c1c5c18db7b5efdc1d0a69c3640ccee
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Tue, 10 Nov 2020 11:51:55 +0100
       
       Refactor move/resize mouse operations
       
       Diffstat:
         M compositor.c                        |      51 ++++++++++++++++++-------------
       
       1 file changed, 30 insertions(+), 21 deletions(-)
       ---
 (DIR) diff --git a/compositor.c b/compositor.c
       t@@ -44,6 +44,7 @@ struct state {
                struct wlr_seat *seat;
        
                int grabmode;
       +        double gx, gy;
                struct window *grabbed;
        
                struct wlr_cursor *cursor;
       t@@ -498,8 +499,8 @@ cb_motion(struct state *server, uint32_t time)
                switch(server->grabmode) {
                case MOVE:
                        wlr_xdg_surface_get_geometry(w->toplevel, &geom);
       -                w->x = server->cursor->x - geom.width/2;
       -                w->y = server->cursor->y - geom.height/2;
       +                w->x = server->cursor->x - server->gx;
       +                w->y = server->cursor->y - server->gy;
                        return; /* NOTREACHED */;
                        break;
                case RESIZE:
       t@@ -584,38 +585,46 @@ cb_click(struct wl_listener *listener, void *data)
                kb = wlr_seat_get_keyboard(server->seat);
                ev = data;
        
       -        w = underneath(server, server->cursor->x, server->cursor->y);
       -        if (kb->modifiers.depressed & WLR_MODIFIER_LOGO && ev->state == WLR_BUTTON_PRESSED) {
       -                switch (ev->button) {
       -                case BTN_LEFT:
       -                        server->grabbed = w;
       -                        server->grabmode = MOVE;
       -                        break;
       -                case BTN_RIGHT:
       -                        server->grabbed = w;
       -                        server->grabmode = RESIZE;
       -                        break;
       -                }
       -        }
       -
       -        wlr_seat_pointer_notify_button(server->seat, ev->time_msec, ev->button, ev->state);
       +        if (server->grabmode == NORMAL)
       +                wlr_seat_pointer_notify_button(server->seat,
       +                        ev->time_msec, ev->button, ev->state);
        
                if (ev->state == WLR_BUTTON_RELEASED) {
                        server->grabmode = NORMAL;
                        return;
                }
        
       -        if (!w) {
       +        if (!(w = underneath(server, server->cursor->x, server->cursor->y))) {
                        wlr_seat_pointer_clear_focus(server->seat);
                        return;
                }
        
       -        /* reinsert window on top of the stack */
       +        if (kb->modifiers.depressed & WLR_MODIFIER_LOGO
       +         && ev->state == WLR_BUTTON_PRESSED
       +         && server->grabmode == NORMAL) {
       +
       +                /*
       +                 * Save which window was clicked, and the coordinates
       +                 * of the event on that surface.
       +                 */
       +                server->grabbed = w;
       +                server->gx = w->sx;
       +                server->gy = w->sy;
       +
       +                switch (ev->button) {
       +                case BTN_LEFT:
       +                        server->grabmode = MOVE;
       +                        break;
       +                case BTN_RIGHT:
       +                        server->grabmode = RESIZE;
       +                        break;
       +                }
       +        }
       +
       +        /* bring window to the front */
                wl_list_remove(&w->link);
                wl_list_insert(&server->windows, &w->link);
        
       -        wlr_seat_pointer_notify_enter(server->seat, w->topmost, w->sx, w->sy);
       -
                focus(w);
        }