JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
xcb_flush before polling for events
[spectrwm.git] / spectrwm.c
index 039411b..a4c7ee1 100644 (file)
@@ -156,8 +156,16 @@ static const char  *buildstr = SPECTRWM_VERSION;
 
 #define SWM_DEBUG
 #ifdef SWM_DEBUG
-#define DPRINTF(x...)          do { if (swm_debug) fprintf(stderr, x); } while (0)
-#define DNPRINTF(n,x...)       do { if (swm_debug & n) fprintf(stderr, x); } while (0)
+#define DPRINTF(x...) do {                                                     \
+       if (swm_debug)                                                          \
+               fprintf(stderr, x);                                             \
+} while (0)
+#define DNPRINTF(n,x...) do {                                                  \
+       if (swm_debug & n) {                                                    \
+               fprintf(stderr, "%ld ", (long)(time(NULL) - time_started));     \
+               fprintf(stderr, x);                                             \
+       }                                                                       \
+} while (0)
 #define SWM_D_MISC             0x0001
 #define SWM_D_EVENT            0x0002
 #define SWM_D_WS               0x0004
@@ -249,7 +257,7 @@ xcb_atom_t          a_swm_iconic;
 volatile sig_atomic_t   running = 1;
 volatile sig_atomic_t   restart_wm = 0;
 int                    outputs = 0;
-int                    last_focus_event = FocusOut;
+/*int                  last_focus_event = FocusOut;*/
 int                    (*xerrorxlib)(Display *, XErrorEvent *);
 int                    other_wm;
 int                    ss_enabled = 0;
@@ -343,6 +351,7 @@ int                 spawn_position = SWM_STACK_TOP;
 int                    disable_border = 0;
 int                    border_width = 1;
 int                    verbose_layout = 0;
+time_t                 time_started;
 pid_t                  bar_pid;
 XFontSet               bar_fs;
 XFontSetExtents                *bar_fs_extents;
@@ -1040,119 +1049,6 @@ ewmh_get_win_state(struct ws_win *win)
 
 /* events */
 #ifdef SWM_DEBUG
-char *
-geteventname(xcb_generic_event_t *e)
-{
-       char                    *name = NULL;
-
-       switch (XCB_EVENT_RESPONSE_TYPE(e)) {
-       case XCB_KEY_PRESS:
-               name = "KeyPress";
-               break;
-       case XCB_KEY_RELEASE:
-               name = "KeyRelease";
-               break;
-       case XCB_BUTTON_PRESS:
-               name = "ButtonPress";
-               break;
-       case XCB_BUTTON_RELEASE:
-               name = "ButtonRelease";
-               break;
-       case XCB_MOTION_NOTIFY:
-               name = "MotionNotify";
-               break;
-       case XCB_ENTER_NOTIFY:
-               name = "EnterNotify";
-               break;
-       case XCB_LEAVE_NOTIFY:
-               name = "LeaveNotify";
-               break;
-       case XCB_FOCUS_IN:
-               name = "FocusIn";
-               break;
-       case XCB_FOCUS_OUT:
-               name = "FocusOut";
-               break;
-       case XCB_KEYMAP_NOTIFY:
-               name = "KeymapNotify";
-               break;
-       case XCB_EXPOSE:
-               name = "Expose";
-               break;
-       case XCB_GRAPHICS_EXPOSURE:
-               name = "GraphicsExposure";
-               break;
-       case XCB_NO_EXPOSURE:
-               name = "NoExposure";
-               break;
-       case XCB_VISIBILITY_NOTIFY:
-               name = "VisibilityNotify";
-               break;
-       case XCB_CREATE_NOTIFY:
-               name = "CreateNotify";
-               break;
-       case XCB_DESTROY_NOTIFY:
-               name = "DestroyNotify";
-               break;
-       case XCB_UNMAP_NOTIFY:
-               name = "UnmapNotify";
-               break;
-       case XCB_MAP_NOTIFY:
-               name = "MapNotify";
-               break;
-       case XCB_MAP_REQUEST:
-               name = "MapRequest";
-               break;
-       case XCB_REPARENT_NOTIFY:
-               name = "ReparentNotify";
-               break;
-       case XCB_CONFIGURE_NOTIFY:
-               name = "ConfigureNotify";
-               break;
-       case XCB_CONFIGURE_REQUEST:
-               name = "ConfigureRequest";
-               break;
-       case XCB_GRAVITY_NOTIFY:
-               name = "GravityNotify";
-               break;
-       case XCB_RESIZE_REQUEST:
-               name = "ResizeRequest";
-               break;
-       case XCB_CIRCULATE_NOTIFY:
-               name = "CirculateNotify";
-               break;
-       case XCB_CIRCULATE_REQUEST:
-               name = "CirculateRequest";
-               break;
-       case XCB_PROPERTY_NOTIFY:
-               name = "PropertyNotify";
-               break;
-       case XCB_SELECTION_CLEAR:
-               name = "SelectionClear";
-               break;
-       case XCB_SELECTION_REQUEST:
-               name = "SelectionRequest";
-               break;
-       case XCB_SELECTION_NOTIFY:
-               name = "SelectionNotify";
-               break;
-       case XCB_COLORMAP_NOTIFY:
-               name = "ColormapNotify";
-               break;
-       case XCB_CLIENT_MESSAGE:
-               name = "ClientMessage";
-               break;
-       case XCB_MAPPING_NOTIFY:
-               name = "MappingNotify";
-               break;
-       default:
-               name = "Unknown";
-               break;
-       }
-
-       return (name);
-}
-
 void
 dumpwins(struct swm_region *r, union arg *args)
 {
@@ -2590,11 +2486,11 @@ focus_win(struct ws_win *win)
                unfocus_win(cfw);
        else {
                /* use larger hammer since the window was killed somehow */
-               TAILQ_FOREACH(cfw, &win->ws->winlist, entry)
+               /* TAILQ_FOREACH(cfw, &win->ws->winlist, entry)
                        if (cfw->ws && cfw->ws->r && cfw->ws->r->s)
                                xcb_change_window_attributes(conn, cfw->id,
                                    XCB_CW_BORDER_PIXEL,
-                                   &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
+                                   &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);*/
        }
 
        win->ws->focus = win;
@@ -4265,7 +4161,7 @@ update_window(struct ws_win *win)
 void
 resize(struct ws_win *win, union arg *args)
 {
-       xcb_timestamp_t         time = 0;
+       xcb_timestamp_t         timestamp = 0;
        struct swm_region       *r = NULL;
        int                     resize_step = 0;
        struct swm_geometry     g;
@@ -4370,6 +4266,7 @@ resize(struct ws_win *win, union arg *args)
                return;
        }
 
+       xcb_flush(conn);
        buttonrelease = 0;
        while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
                /*
@@ -4429,8 +4326,8 @@ resize(struct ws_win *win, union arg *args)
                        constrain_window(win, r, 1);
 
                        /* not free, don't sync more than 120 times / second */
-                       if ((mne->time - time) > (1000 / 120) ) {
-                               time = mne->time;
+                       if ((mne->time - timestamp) > (1000 / 120) ) {
+                               timestamp = mne->time;
                                do_sync();
                                update_window(win);
                        }
@@ -4441,7 +4338,7 @@ resize(struct ws_win *win, union arg *args)
                }
                free(evt);
        }
-       if (time) {
+       if (timestamp) {
                do_sync();
                update_window(win);
        }
@@ -4472,7 +4369,7 @@ resize_step(struct swm_region *r, union arg *args)
 void
 move(struct ws_win *win, union arg *args)
 {
-       xcb_timestamp_t         time = 0;
+       xcb_timestamp_t         timestamp = 0;
        int                     move_step = 0, buttonrelease;
        struct swm_region       *r = NULL;
        xcb_font_t                      cursor_font;
@@ -4563,6 +4460,7 @@ move(struct ws_win *win, union arg *args)
                return;
        }
 
+       xcb_flush(conn);
        buttonrelease = 0;
        while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
                /*
@@ -4581,8 +4479,8 @@ move(struct ws_win *win, union arg *args)
                        constrain_window(win, r, 0);
 
                        /* not free, don't sync more than 120 times / second */
-                       if ((mne->time - time) > (1000 / 120) ) {
-                               time = mne->time;
+                       if ((mne->time - timestamp) > (1000 / 120) ) {
+                               timestamp = mne->time;
                                do_sync();
                                update_window(win);
                        }
@@ -4593,7 +4491,7 @@ move(struct ws_win *win, union arg *args)
                }
                free(evt);
        }
-       if (time) {
+       if (timestamp) {
                do_sync();
                update_window(win);
        }
@@ -6654,9 +6552,6 @@ free_window(struct ws_win *win)
        if (win == NULL)
                return;
 
-       /* needed for restart wm */
-       set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN);
-
        TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
 
        if (win->wa)
@@ -6670,6 +6565,7 @@ free_window(struct ws_win *win)
        memset(win, 0xff, sizeof *win); /* XXX kill later */
 
        free(win);
+       DNPRINTF(SWM_D_MISC, "free_window: done\n");
 }
 
 void
@@ -7651,73 +7547,11 @@ workaround(void)
 void
 event_error(xcb_generic_error_t *e)
 {
-       const char *estr;
-
-       switch (e->error_code) {
-       case 0:
-               estr = "Success";
-               break;
-       case XCB_REQUEST:
-               estr = "BadRequest";
-               break;
-       case XCB_VALUE:
-               estr = "BadValue";
-               break;
-       case XCB_WINDOW:
-               estr = "BadWindow";
-               break;
-       case XCB_PIXMAP:
-               estr = "BadPixmap";
-               break;
-       case XCB_ATOM:
-               estr = "BadAtom";
-               break;
-       case XCB_CURSOR:
-               estr = "BadCursor";
-               break;
-       case XCB_FONT:
-               estr = "BadFont";
-               break;
-       case XCB_MATCH:
-               estr = "BadMatch";
-               break;
-       case XCB_DRAWABLE:
-               estr = "BadDrawable";
-               break;
-       case XCB_ACCESS:
-               estr = "BadAccess";
-               break;
-       case XCB_ALLOC:
-               estr = "BadAlloc";
-               break;
-       case XCB_COLORMAP:
-               estr = "BadColor";
-               break;
-       case XCB_G_CONTEXT:
-               estr = "BadGC";
-               break;
-       case XCB_ID_CHOICE:
-               estr = "BadIdChoice";
-               break;
-       case XCB_NAME:
-               estr = "BadName";
-               break;
-       case XCB_LENGTH:
-               estr = "BadLength";
-               break;
-       case XCB_IMPLEMENTATION:
-               estr = "BadImplementation";
-               break;
-       default:
-               estr = "Unknown";
-               break;
-       }
-
-       DNPRINTF(SWM_D_EVENT, "event_error: %s: response_type:%u error_code:%u "
-           "sequence:%u resource_id:%u minor_code:%u major_code:%u\n", estr,
-           e->response_type, e->error_code, e->sequence, e->resource_id,
-           e->minor_code, e->major_code
-       );
+       DNPRINTF(SWM_D_EVENT, "event_error: %s(%u) from %s(%u), sequence: %u, "
+           "resource_id: %u, minor_code: %u\n",
+           xcb_event_get_error_label(e->error_code), e->error_code,
+           xcb_event_get_request_label(e->major_code), e->major_code,
+           e->sequence, e->resource_id, e->minor_code);
 }
 
 void
@@ -7729,18 +7563,35 @@ event_handle(xcb_generic_event_t *evt)
        EVENT(0, event_error);
        EVENT(XCB_BUTTON_PRESS, buttonpress);
        /*EVENT(XCB_BUTTON_RELEASE, buttonpress);*/
+       /*EVENT(XCB_CIRCULATE_NOTIFY, );*/
+       /*EVENT(XCB_CIRCULATE_REQUEST, );*/
        EVENT(XCB_CLIENT_MESSAGE, clientmessage);
+       /*EVENT(XCB_COLORMAP_NOTIFY, );*/
        EVENT(XCB_CONFIGURE_NOTIFY, configurenotify);
        EVENT(XCB_CONFIGURE_REQUEST, configurerequest);
+       /*EVENT(XCB_CREATE_NOTIFY, );*/
        EVENT(XCB_DESTROY_NOTIFY, destroynotify);
        EVENT(XCB_ENTER_NOTIFY, enternotify);
        EVENT(XCB_EXPOSE, expose);
+       /*EVENT(XCB_FOCUS_IN, );*/
+       /*EVENT(XCB_FOCUS_OUT, );*/
+       /*EVENT(XCB_GRAPHICS_EXPOSURE, );*/
+       /*EVENT(XCB_GRAVITY_NOTIFY, );*/
        EVENT(XCB_KEY_PRESS, keypress);
        /*EVENT(XCB_KEY_RELEASE, keypress);*/
+       /*EVENT(XCB_KEYMAP_NOTIFY, );*/
+       /*EVENT(XCB_LEAVE_NOTIFY, );*/
        EVENT(XCB_MAP_NOTIFY, mapnotify);
        EVENT(XCB_MAP_REQUEST, maprequest);
        EVENT(XCB_MAPPING_NOTIFY, mappingnotify);
+       /*EVENT(XCB_MOTION_NOTIFY, );*/
+       /*EVENT(XCB_NO_EXPOSURE, );*/
        EVENT(XCB_PROPERTY_NOTIFY, propertynotify);
+       /*EVENT(XCB_REPARENT_NOTIFY, );*/
+       /*EVENT(XCB_RESIZE_REQUEST, );*/
+       /*EVENT(XCB_SELECTION_CLEAR, );*/
+       /*EVENT(XCB_SELECTION_NOTIFY, );*/
+       /*EVENT(XCB_SELECTION_REQUEST, );*/
        EVENT(XCB_UNMAP_NOTIFY, unmapnotify);
        EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);
 #undef EVENT
@@ -7763,6 +7614,8 @@ main(int argc, char *argv[])
        struct sigaction        sact;
        xcb_generic_event_t     *evt;
 
+       time_started = time(NULL);
+
        start_argv = argv;
        warnx("Welcome to spectrwm V%s Build: %s", SPECTRWM_VERSION, buildstr);
        if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "") ||
@@ -7903,8 +7756,9 @@ noconfig:
 
        while (running) {
                while ((evt = xcb_poll_for_event(conn))) {
-                       DNPRINTF(SWM_D_EVENT, "XCB Event: %s\n",
-                           geteventname(evt));
+                       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);