JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix move() and resize() for mouse input.
[spectrwm.git] / spectrwm.c
index 5025482..3dbfdaa 100644 (file)
@@ -1114,7 +1114,7 @@ void                      mappingnotify(xcb_mapping_notify_event_t *);
 void                   maprequest(xcb_map_request_event_t *);
 void                   propertynotify(xcb_property_notify_event_t *);
 void                   unmapnotify(xcb_unmap_notify_event_t *);
-void                   visibilitynotify(xcb_visibility_notify_event_t *);
+/*void                 visibilitynotify(xcb_visibility_notify_event_t *);*/
 void                   clientmessage(xcb_client_message_event_t *);
 void                   screenchange(xcb_randr_screen_change_notify_event_t *);
 
@@ -1836,7 +1836,7 @@ bar_setup(struct swm_region *r)
        int                     num_missing_charsets = 0;
        int                     i;
        xcb_screen_t            *screen = get_screen(r->s->idx);
-       uint32_t                wa[2];
+       uint32_t                wa[3];
 
        if (bar_fs) {
                XFreeFontSet(display, bar_fs);
@@ -1885,10 +1885,12 @@ bar_setup(struct swm_region *r)
        r->bar->id = xcb_generate_id(conn);
        wa[0] = r->s->c[SWM_S_COLOR_BAR].color;
        wa[1] = r->s->c[SWM_S_COLOR_BAR_BORDER].color;
+       wa[2] = XCB_EVENT_MASK_EXPOSURE;
        xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->bar->id, r->s->root,
            X(r->bar), Y(r->bar), WIDTH(r->bar), HEIGHT(r->bar),
            bar_border_width, XCB_WINDOW_CLASS_INPUT_OUTPUT,
-           XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
+           XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL
+           | XCB_CW_EVENT_MASK, wa);
 
        r->bar->buffer = xcb_generate_id(conn);
        xcb_create_pixmap(conn, screen->root_depth, r->bar->buffer, r->bar->id,
@@ -4165,7 +4167,7 @@ resize(struct ws_win *win, union arg *args)
        struct swm_region       *r = NULL;
        int                     resize_step = 0;
        struct swm_geometry     g;
-       int                     top = 0, left = 0, buttonrelease;
+       int                     top = 0, left = 0, resizing;
        int                     dx, dy;
        unsigned int            shape; /* cursor style */
        xcb_cursor_t            cursor;
@@ -4183,7 +4185,7 @@ resize(struct ws_win *win, union arg *args)
        if (win->ewmh_flags & EWMH_F_FULLSCREEN)
                return;
 
-       DNPRINTF(SWM_D_MOUSE, "resize: window: 0x%x, floating: %s, "
+       DNPRINTF(SWM_D_EVENT, "resize: window: 0x%x, floating: %s, "
            "transient: 0x%x\n", win->id, YESNO(win->floating),
            win->transient);
 
@@ -4266,15 +4268,17 @@ resize(struct ws_win *win, union arg *args)
                return;
        }
 
-       buttonrelease = 0;
-       while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
+       xcb_flush(conn);
+       resizing = 1;
+       while ((evt = xcb_wait_for_event(conn)) && resizing) {
                /*
                XMaskEvent(display, MOUSEMASK | ExposureMask |
                    SubstructureRedirectMask, &ev);
                */
                switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
                case XCB_BUTTON_RELEASE:
-                       buttonrelease = 1;
+                       DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n");
+                       resizing = 0;
                        break;
                case XCB_MOTION_NOTIFY:
                        mne = (xcb_motion_notify_event_t *)evt;
@@ -4348,6 +4352,7 @@ resize(struct ws_win *win, union arg *args)
        xcb_close_font(conn, cursor_font);
        free(gpr);
        free(xpr);
+       DNPRINTF(SWM_D_EVENT, "resize: done\n");
 }
 
 void
@@ -4369,7 +4374,7 @@ void
 move(struct ws_win *win, union arg *args)
 {
        xcb_timestamp_t         timestamp = 0;
-       int                     move_step = 0, buttonrelease;
+       int                     move_step = 0, moving;
        struct swm_region       *r = NULL;
        xcb_font_t                      cursor_font;
        xcb_cursor_t                    cursor;
@@ -4386,7 +4391,7 @@ move(struct ws_win *win, union arg *args)
        if (win->ewmh_flags & EWMH_F_FULLSCREEN)
                return;
 
-       DNPRINTF(SWM_D_MOUSE, "move: window: 0x%x, floating: %s, transient: "
+       DNPRINTF(SWM_D_EVENT, "move: window: 0x%x, floating: %s, transient: "
            "0x%x\n", win->id, YESNO(win->floating), win->transient);
 
        /* in max_stack mode should only move transients */
@@ -4459,15 +4464,13 @@ move(struct ws_win *win, union arg *args)
                return;
        }
 
-       buttonrelease = 0;
-       while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
-               /*
-               XMaskEvent(display, MOUSEMASK | ExposureMask |
-                   SubstructureRedirectMask, &ev);
-               */
+       xcb_flush(conn);
+       moving = 1;
+       while ((evt = xcb_wait_for_event(conn)) && moving) {
                switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
                case XCB_BUTTON_RELEASE:
-                       buttonrelease = 1;
+                       DNPRINTF(SWM_D_EVENT, "move: BUTTON_RELEASE\n");
+                       moving = 0;
                        break;
                case XCB_MOTION_NOTIFY:
                        mne = (xcb_motion_notify_event_t *)evt;
@@ -4498,6 +4501,7 @@ move(struct ws_win *win, union arg *args)
        xcb_free_cursor(conn, cursor);
        xcb_close_font(conn, cursor_font);
        xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
+       DNPRINTF(SWM_D_EVENT, "move: done\n");
 }
 
 void
@@ -6635,7 +6639,18 @@ focus_magic(struct ws_win *win)
 void
 expose(xcb_expose_event_t *e)
 {
+       int                     i, num_screens;
+       struct swm_region       *r;
+
        DNPRINTF(SWM_D_EVENT, "expose: window: 0x%x\n", e->window);
+
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       for (i = 0; i < num_screens; i++)
+               TAILQ_FOREACH(r, &screens[i].rl, entry)
+                       if (e->window == WINID(r->bar))
+                               bar_update();
+
+       xcb_flush(conn);
 }
 
 void
@@ -6667,7 +6682,8 @@ buttonpress(xcb_button_press_event_t *e)
        struct ws_win           *win;
        int                     i, action;
 
-       DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x\n", e->event);
+       DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x, detail: %u\n",
+           e->event, e->detail);
 
        if ((win = find_window(e->event)) == NULL)
                return;
@@ -7048,23 +7064,12 @@ unmapnotify(xcb_unmap_notify_event_t *e)
        }
 }
 
-void
+/*void
 visibilitynotify(xcb_visibility_notify_event_t *e)
 {
-       int                     i, num_screens;
-       struct swm_region       *r;
-
        DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%x\n",
            e->window);
-
-       if (e->state == XCB_VISIBILITY_UNOBSCURED) {
-               num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
-               for (i = 0; i < num_screens; i++)
-                       TAILQ_FOREACH(r, &screens[i].rl, entry)
-                               if (e->window == WINID(r->bar))
-                                       bar_update();
-       }
-}
+}*/
 
 void
 clientmessage(xcb_client_message_event_t *e)
@@ -7077,20 +7082,20 @@ clientmessage(xcb_client_message_event_t *e)
        }
 
        DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%x, type: %u\n",
-           e->window, e->response_type);
+           e->window, e->type);
 
-       if (e->response_type == ewmh[_NET_ACTIVE_WINDOW].atom) {
+       if (e->type == ewmh[_NET_ACTIVE_WINDOW].atom) {
                DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_ACTIVE_WINDOW\n");
                focus_win(win);
        }
-       if (e->response_type == ewmh[_NET_CLOSE_WINDOW].atom) {
+       if (e->type == ewmh[_NET_CLOSE_WINDOW].atom) {
                DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_CLOSE_WINDOW\n");
                if (win->can_delete)
                        client_msg(win, adelete);
                else
                        xcb_kill_client(conn, win->id);
        }
-       if (e->response_type == ewmh[_NET_MOVERESIZE_WINDOW].atom) {
+       if (e->type == ewmh[_NET_MOVERESIZE_WINDOW].atom) {
                DNPRINTF(SWM_D_EVENT,
                    "clientmessage: _NET_MOVERESIZE_WINDOW\n");
                if (win->floating) {
@@ -7111,7 +7116,7 @@ clientmessage(xcb_client_message_event_t *e)
                        config_win(win, NULL);
                }
        }
-       if (e->response_type == ewmh[_NET_WM_STATE].atom) {
+       if (e->type == ewmh[_NET_WM_STATE].atom) {
                DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_WM_STATE\n");
                ewmh_update_win_state(win, e->data.data32[1], e->data.data32[0]);
                if (e->data.data32[2])
@@ -7556,6 +7561,11 @@ void
 event_handle(xcb_generic_event_t *evt)
 {
        uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt);
+
+       DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n",
+           xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)),
+           XCB_EVENT_RESPONSE_TYPE(evt));
+
        switch (type) {
 #define EVENT(type, callback) case type: callback((void *)evt); return
        EVENT(0, event_error);
@@ -7591,7 +7601,7 @@ event_handle(xcb_generic_event_t *evt)
        /*EVENT(XCB_SELECTION_NOTIFY, );*/
        /*EVENT(XCB_SELECTION_REQUEST, );*/
        EVENT(XCB_UNMAP_NOTIFY, unmapnotify);
-       EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);
+       /*EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);*/
 #undef EVENT
        }
        if (type - xrandr_eventbase == XCB_RANDR_SCREEN_CHANGE_NOTIFY)
@@ -7603,14 +7613,16 @@ main(int argc, char *argv[])
 {
        struct swm_region       *r, *rr;
        struct ws_win           *winfocus = NULL;
-       struct timeval          tv;
        union arg               a;
        char                    conf[PATH_MAX], *cfile = NULL;
        struct stat             sb;
        int                     xfd, i, num_screens;
-       fd_set                  rd;
        struct sigaction        sact;
        xcb_generic_event_t     *evt;
+#if 0
+       struct timeval          tv;
+       fd_set                  rd;
+#endif
 
        time_started = time(NULL);
 
@@ -7669,8 +7681,7 @@ main(int argc, char *argv[])
 
        /* flush all events */
        while ((evt = xcb_poll_for_event(conn))) {
-               uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt);
-               if (type == 0)
+               if (XCB_EVENT_RESPONSE_TYPE(evt) == 0)
                        event_handle(evt);
                free(evt);
        }
@@ -7754,9 +7765,6 @@ noconfig:
 
        while (running) {
                while ((evt = xcb_poll_for_event(conn))) {
-                       DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n",
-                           xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)),
-                           XCB_EVENT_RESPONSE_TYPE(evt));
                        if (running == 0)
                                goto done;
                        event_handle(evt);
@@ -7783,6 +7791,7 @@ noconfig:
                        continue;
                }
 
+#if 0
                FD_ZERO(&rd);
                FD_SET(xfd, &rd);
                tv.tv_sec = 1;
@@ -7790,6 +7799,7 @@ noconfig:
                if (select(xfd + 1, &rd, NULL, NULL, &tv) == -1)
                        if (errno != EINTR)
                                DNPRINTF(SWM_D_MISC, "select failed");
+#endif
                if (restart_wm == 1)
                        restart(NULL, NULL);
                if (search_resp == 1)