tRely on internal xdg_surface's mapped attribute for mapping - spkp - Stacking wayland compositor
 (HTM) git clone git://git.z3bra.org/spkp.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 4e6e6152bcb6a414feb264b303a4fe3fd942ef43
 (DIR) parent fc214f1bdbd96f8c8f6518120db23768668042ab
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Mon, 16 Nov 2020 18:09:15 +0100
       
       Rely on internal xdg_surface's mapped attribute for mapping
       
       Diffstat:
         M sp:kp.c                             |      39 +++++++++----------------------
       
       1 file changed, 11 insertions(+), 28 deletions(-)
       ---
 (DIR) diff --git a/sp:kp.c b/sp:kp.c
       t@@ -106,12 +106,9 @@ struct window {
                struct wlr_xdg_toplevel_decoration_v1 decoration;
                double x, y;
        
       -        int mapped;
       -
                double sx, sy;
        
                struct wl_listener map;
       -        struct wl_listener unmap;
                struct wl_listener destroy;
        
                /* pointer to the next client */
       t@@ -174,7 +171,6 @@ static void cb_new_decoration(struct wl_listener *, void *);
        static void cb_copy(struct wl_listener *, void *);
        
        static void cb_map_window(struct wl_listener *, void *);
       -static void cb_unmap_window(struct wl_listener *, void *);
        static void cb_destroy_window(struct wl_listener *, void *);
        static void cb_set_chrome(struct wl_listener *, void *);
        static void cb_destroy_chrome(struct wl_listener *, void *);
       t@@ -357,7 +353,7 @@ cb_frame_output(struct wl_listener *listener, void *data)
                rdata.renderer = renderer;
        
                wl_list_for_each_reverse(window, &output->server->windows, link) {
       -                if (!window->mapped)
       +                if (!window->xdg->mapped)
                                continue;
        
                        rdata.window = window;
       t@@ -403,10 +399,8 @@ cb_new_window(struct wl_listener *listener, void *data)
        
                window->x = -1;
                window->y = -1;
       -        window->mapped = 0;
        
                window->map.notify = cb_map_window;
       -        window->unmap.notify = cb_unmap_window;
                window->destroy.notify = cb_destroy_window;
        
                /* have the client consider itself "tiled", to constrain it */
       t@@ -415,7 +409,6 @@ cb_new_window(struct wl_listener *listener, void *data)
        
        
                wl_signal_add(&surface->events.map, &window->map);
       -        wl_signal_add(&surface->events.unmap, &window->unmap);
                wl_signal_add(&surface->events.destroy, &window->destroy);
        
                wl_list_insert(&server->windows, &window->link);
       t@@ -501,24 +494,9 @@ cb_map_window(struct wl_listener *listener, void *data)
        
                        w->x = layer->x + ow/2 - geom.width/2;
                        w->y = layer->y + oh/2 - geom.height/2;
       -        }
       -
       -        w->mapped = 1;
       -
       -        focus(w);
       -}
        
       -/*
       - * Request from a client to be unmapped on-screen.
       - */
       -void
       -cb_unmap_window(struct wl_listener *listener, void *data)
       -{
       -        (void)data;
       -        struct window *w;
       -
       -        w = wl_container_of(listener, w, map);
       -        w->mapped = 0;
       +                focus(w);
       +        }
        }
        
        /*
       t@@ -831,11 +809,16 @@ cb_scroll(struct wl_listener *listener, void *data)
                struct spkp *server;
                struct wlr_event_pointer_axis *ev;
        
       +
                server = wl_container_of(listener, server, scroll);
                ev = data;
        
       -        wlr_seat_pointer_notify_axis(server->seat, ev->time_msec, ev->orientation,
       -                ev->delta, ev->delta_discrete, ev->source);
       +        /* Ignore all scrolling events when a window is grabbed */
       +        if (server->grab.mode != NORMAL)
       +                return;
       +
       +        wlr_seat_pointer_notify_axis(server->seat, ev->time_msec,
       +                ev->orientation, ev->delta, ev->delta_discrete, ev->source);
        }
        
        /*
       t@@ -1186,7 +1169,7 @@ kb_desktop(struct spkp *server, union keyarg *arg)
        
                server->desktop = !server->desktop;
                wl_list_for_each(w, &server->windows, link)
       -                w->mapped = !server->desktop;
       +                w->xdg->mapped = !server->desktop;
        
        }