URI: 
       tUse cb_default() for all unknown events - glazier - window management experiments
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit 58696186554c09e2c39f038f05b1be7148aa67e8
   DIR parent e45c992e966f5eada691cc14f620a8864c9dca5f
  HTML Author: Willy Goiffon <dev@z3bra.org>
       Date:   Tue, 22 Oct 2019 13:32:11 +0200
       
       Use cb_default() for all unknown events
       
       Diffstat:
         M glazier.c                           |      68 +++++++++++++++++--------------
       
       1 file changed, 37 insertions(+), 31 deletions(-)
       ---
   DIR diff --git a/glazier.c b/glazier.c
       t@@ -23,7 +23,7 @@ static int ev_callback(xcb_generic_event_t *);
        
        /* XCB events callbacks */
        static int cb_default(xcb_generic_event_t *);
       -static int cb_map(xcb_generic_event_t *);
       +static int cb_mapreq(xcb_generic_event_t *);
        static int cb_destroy(xcb_generic_event_t *);
        static int cb_mouse_press(xcb_generic_event_t *);
        static int cb_mouse_release(xcb_generic_event_t *);
       t@@ -71,7 +71,7 @@ static const char *evname[] = {
        
        static const struct ev_callback_t cb[] = {
                /* event,             function */
       -        { XCB_MAP_NOTIFY,  cb_map },
       +        { XCB_MAP_REQUEST,    cb_mapreq },
                { XCB_DESTROY_NOTIFY, cb_destroy },
                { XCB_BUTTON_PRESS,   cb_mouse_press },
                { XCB_BUTTON_RELEASE, cb_mouse_release },
       t@@ -168,33 +168,31 @@ cb_default(xcb_generic_event_t *ev)
        }
        
        static int
       -cb_map(xcb_generic_event_t *ev)
       +cb_mapreq(xcb_generic_event_t *ev)
        {
                int x, y, w, h;
                static xcb_window_t frame;
       -        static int i = 0;
       -        xcb_map_notify_event_t *e;
       +        xcb_map_request_event_t *e;
        
                i++;
        
       -        e = (xcb_map_notify_event_t *)ev;
       -        if (e->override_redirect)
       -                return 0;
       +        e = (xcb_map_request_event_t *)ev;
        
                /* avoid infinite loops when creating frame window */
       -        if (frame == e->window || get_frame(e->window) != scrn->root) {
       +        if (frame == e->window || get_frame(e->window) != scrn->root)
                        return 0;
       -        }
        
                if (verbose)
                        fprintf(stderr, "map: 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_get_cursor(0, scrn->root, &x, &y);
       +
                wm_move(frame, ABSOLUTE, x - w/2, y - h/2);
       +        xcb_map_window(conn, e->window);
                wm_set_focus(e->window);
        
                return 0;
       t@@ -228,40 +226,41 @@ cb_mouse_press(xcb_generic_event_t *ev)
                if (verbose)
                        fprintf(stderr, "mouse_press: 0x%08x\n", e->event);
        
       -        /* set window id globally for move/reshape */
       -        curwid = e->event;
       -
                if (xcb_cursor_context_new(conn, scrn, &cx) < 0) {
                        fprintf(stderr, "cannot instantiate cursor\n");
                        exit(1);
                }
        
       -        wm_restack(curwid, XCB_STACK_MODE_ABOVE);
       +        wm_restack(e->event, XCB_STACK_MODE_ABOVE);
        
       -        cursor.x = e->root_x - wm_get_attribute(curwid, ATTR_X);
       -        cursor.y = e->root_y - wm_get_attribute(curwid, ATTR_Y);
       +        cursor.x = e->root_x - wm_get_attribute(e->event, ATTR_X);
       +        cursor.y = e->root_y - wm_get_attribute(e->event, ATTR_Y);
                cursor.b = e->detail;
        
                switch(e->detail) {
                case 1:
       +                curwid = e->event;
                        p = xcb_cursor_load_cursor(cx, XHAIR_MOVE);
                        break;
                case 3:
       +                curwid = e->event;
                        p = xcb_cursor_load_cursor(cx, XHAIR_SIZE);
                        break;
                case 4:
       -                x = wm_get_attribute(curwid, ATTR_X) - move_step/2;
       -                y = wm_get_attribute(curwid, ATTR_Y) - move_step/2;
       -                w = wm_get_attribute(curwid, ATTR_W) + move_step;
       -                h = wm_get_attribute(curwid, ATTR_H) + move_step;
       -                wm_teleport(curwid, x, y, w, h);
       +                x = wm_get_attribute(e->event, ATTR_X) - move_step/2;
       +                y = wm_get_attribute(e->event, ATTR_Y);
       +                w = wm_get_attribute(e->event, ATTR_W) + move_step;
       +                h = wm_get_attribute(e->event, ATTR_H) + move_step;
       +                wm_teleport(e->event, x, y, w, h);
       +                wm_teleport(get_child(e->event), 0, titlebar, w, h - titlebar);
                        break;
                case 5:
       -                x = wm_get_attribute(curwid, ATTR_X) + move_step/2;
       -                y = wm_get_attribute(curwid, ATTR_Y) + move_step/2;
       -                w = wm_get_attribute(curwid, ATTR_W) - move_step;
       -                h = wm_get_attribute(curwid, ATTR_H) - move_step;
       -                wm_teleport(curwid, x, y, w, h);
       +                x = wm_get_attribute(e->event, ATTR_X) + move_step/2;
       +                y = wm_get_attribute(e->event, ATTR_Y);
       +                w = wm_get_attribute(e->event, ATTR_W) - move_step;
       +                h = wm_get_attribute(e->event, ATTR_H) - move_step;
       +                wm_teleport(e->event, x, y, w, h);
       +                wm_teleport(get_child(e->event), 0, titlebar, w, h - titlebar);
                        break;
                default:
                        return 1;
       t@@ -343,8 +342,10 @@ cb_motion(xcb_generic_event_t *ev)
                        wm_move(curwid, ABSOLUTE, x, y);
                        break;
                case 3:
       -                wm_resize(get_child(curwid), ABSOLUTE, x, y - titlebar);
                        wm_resize(curwid, ABSOLUTE, x, y);
       +                x = wm_get_attribute(curwid, ATTR_W);
       +                y = wm_get_attribute(curwid, ATTR_H);
       +                wm_resize(get_child(curwid), ABSOLUTE, x, y);
                        break;
                }
        
       t@@ -385,6 +386,8 @@ cb_configure(xcb_generic_event_t *ev)
                        return 0;
        
                frame = get_frame(e->window);
       +        if (frame == scrn->root)
       +                return 0;
        
                if (verbose)
                        fprintf(stderr, "configure: 0x%08x (0x%08x: %dx%d+%d+%d)\n",
       t@@ -395,7 +398,7 @@ cb_configure(xcb_generic_event_t *ev)
                x = wm_get_attribute(frame, ATTR_X);
                y = wm_get_attribute(frame, ATTR_Y);
                wm_teleport(e->window, 0, titlebar, e->width, e->height);
       -        wm_teleport(get_frame(e->window), x + e->x, y + e->y + titlebar, e->width, e->height + titlebar);
       +        wm_teleport(get_frame(e->window), x + e->x, y + e->y - titlebar, e->width, e->height + titlebar);
        
                return 0;
        }
       t@@ -406,12 +409,15 @@ ev_callback(xcb_generic_event_t *ev)
                uint8_t i;
                uint32_t type;
        
       +        if (!ev)
       +                return -1;
       +
                type = ev->response_type & ~0x80;
                for (i=0; i<LEN(cb); i++)
                        if (type == cb[i].type)
                                return cb[i].handle(ev);
        
       -        return 1;
       +        return cb_default(ev);
        }
        
        int
       t@@ -425,7 +431,7 @@ main (int argc, char *argv[])
                curwid = scrn->root;
        
                /* needed to get notified of windows creation */
       -        wm_reg_event(scrn->root, XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
       +        wm_reg_event(scrn->root, XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT);
                xcb_flush(conn);
        
                for (;;) {