tMake cb_create more robust - glazier - window management experiments
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 4ff647b4cf2634c47bef4581ab8f1a4ab753d736
 (DIR) parent 7871aacdb21b40503f548e77e623c4ed1d19cc8b
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Tue, 22 Oct 2019 08:17:34 +0200
       
       Make cb_create more robust
       
       When a new window is created, we won't decorate it if it is a frame
       window, or if the overrid_redirect bit is set.
       We also need to move it somewhere near the cursor to avoid them popping
       at the top left, with the decoration outside the screen (which makes it
       impossible to drag).
       
       Diffstat:
         M glazier.c                           |      22 ++++++++++++++++------
       
       1 file changed, 16 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/glazier.c b/glazier.c
       t@@ -136,20 +136,30 @@ cb_default(xcb_generic_event_t *ev)
        static int
        cb_create(xcb_generic_event_t *ev)
        {
       +        int x, y, w, h;
       +        static xcb_window_t frame;
                xcb_create_notify_event_t *e;
        
                e = (xcb_create_notify_event_t *)ev;
       -        if (verbose)
       -                fprintf(stderr, "create: 0x%08x\n", e->window);
       +        if (e->override_redirect) {
       +                return 0;
       +        }
        
                /* avoid infinite loops when creating frame window */
       -        if (wid == e->window)
       +        if (frame == e->window)
                        return 0;
        
       -        wid = frame_window(e->window);
       -        wm_set_focus(wid);
       -        wm_reg_event(e->window, XCB_EVENT_MASK_STRUCTURE_NOTIFY);
       +        if (verbose)
       +                fprintf(stderr, "create: 0x%08x\n", e->window);
        
       +        frame = frame_window(e->window);
       +
       +        wm_get_cursor(0, scrn->root, &x, &y);
       +        w = wm_get_attribute(frame, ATTR_W);
       +        h = wm_get_attribute(frame, ATTR_H);
       +        wm_move(frame, ABSOLUTE, x - w/2, y - h/2);
       +        wm_reg_event(e->window, XCB_EVENT_MASK_STRUCTURE_NOTIFY);
       +        wm_set_focus(e->window);
        
                return 0;
        }