JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
NoSymbol to XCB_NO_SYMBOL
[spectrwm.git] / spectrwm.c
index f75a35e..29849f5 100644 (file)
@@ -246,10 +246,10 @@ u_int32_t         swm_debug = 0
 #endif
 
 char                   **start_argv;
-xcb_atom_t             astate;
-xcb_atom_t             aprot;
-xcb_atom_t             adelete;
-xcb_atom_t             takefocus;
+xcb_atom_t             a_state;
+xcb_atom_t             a_prot;
+xcb_atom_t             a_delete;
+xcb_atom_t             a_takefocus;
 xcb_atom_t             a_wmname;
 xcb_atom_t             a_netwmname;
 xcb_atom_t             a_utf8_string;
@@ -1931,8 +1931,8 @@ set_win_state(struct ws_win *win, uint16_t state)
        if (win == NULL)
                return;
 
-       xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate,
-           astate, 32, 2, data);
+       xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, a_state,
+           a_state, 32, 2, data);
 }
 
 uint16_t
@@ -1942,7 +1942,7 @@ getstate(xcb_window_t w)
        xcb_get_property_cookie_t       c;
        xcb_get_property_reply_t        *r;
 
-       c = xcb_get_property(conn, False, w, astate, astate, 0L, 2L);
+       c = xcb_get_property(conn, False, w, a_state, a_state, 0L, 2L);
        r = xcb_get_property_reply(conn, c, NULL);
 
        if (r) {
@@ -1980,7 +1980,7 @@ client_msg(struct ws_win *win, xcb_atom_t a)
        bzero(&ev, sizeof ev);
        ev.response_type = XCB_CLIENT_MESSAGE;
        ev.window = win->id;
-       ev.type = aprot;
+       ev.type = a_prot;
        ev.format = 32;
        ev.data.data32[0] = a;
        ev.data.data32[1] = XCB_CURRENT_TIME;
@@ -2515,6 +2515,20 @@ focus_win(struct ws_win *win)
 }
 
 void
+event_drain(uint8_t rt)
+{
+       xcb_generic_event_t     *evt;
+
+       xcb_flush(conn);
+       while ((evt = xcb_poll_for_event(conn))) {
+               if (XCB_EVENT_RESPONSE_TYPE(evt) != rt)
+                       event_handle(evt);
+
+               free(evt);
+       }
+}
+
+void
 switchws(struct swm_region *r, union arg *args)
 {
        int                     wsid = args->id, unmap_old = 0;
@@ -2568,7 +2582,10 @@ switchws(struct swm_region *r, union arg *args)
                TAILQ_FOREACH(win, &old_ws->winlist, entry)
                        unmap_window(win);
 
-       xcb_flush(conn);
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
+       else
+               xcb_flush(conn);
 }
 
 void
@@ -2980,9 +2997,12 @@ cycle_layout(struct swm_region *r, union arg *args)
                ws->cur_layout = &layouts[0];
 
        stack();
+       bar_update();
 
-       a.id = SWM_ARG_ID_FOCUSCUR;
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
 
+       a.id = SWM_ARG_ID_FOCUSCUR;
        focus(r, &a);
 }
 
@@ -3040,6 +3060,9 @@ stack(void) {
        if (font_adjusted)
                font_adjusted--;
 
+       if (focus_mode == SWM_FOCUS_DEFAULT)
+               event_drain(XCB_ENTER_NOTIFY);
+
        DNPRINTF(SWM_D_STACK, "stack: end\n");
 }
 
@@ -4047,7 +4070,7 @@ wkill(struct swm_region *r, union arg *args)
                xcb_kill_client(conn, r->ws->focus->id);
        else
                if (r->ws->focus->can_delete)
-                       client_msg(r->ws->focus, adelete);
+                       client_msg(r->ws->focus, a_delete);
 
        xcb_flush(conn);
 }
@@ -4112,6 +4135,7 @@ floating_toggle(struct swm_region *r, union arg *args)
        }
 
        xcb_flush(conn);
+       event_drain(XCB_ENTER_NOTIFY);
 }
 
 void
@@ -5092,7 +5116,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks)
                return (1);
        }
        cp = keystr;
-       *ks = NoSymbol;
+       *ks = XCB_NO_SYMBOL;
        *mod = 0;
        while ((name = strsep(&cp, SWM_KEY_WS)) != NULL) {
                DNPRINTF(SWM_D_KEY, "parsekeys: key [%s]\n", name);
@@ -5115,7 +5139,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks)
                else {
                        *ks = XStringToKeysym(name);
                        XConvertCase(*ks, ks, &uks);
-                       if (ks == NoSymbol) {
+                       if (ks == XCB_NO_SYMBOL) {
                                DNPRINTF(SWM_D_KEY,
                                    "parsekeys: invalid key %s\n",
                                    name);
@@ -6394,9 +6418,9 @@ manage_window(xcb_window_t id)
            xcb_icccm_get_wm_protocols(conn, id, prot),
            &wpr, NULL)) {
                for (i = 0; i < wpr.atoms_len; i++) {
-                       if (wpr.atoms[i] == takefocus)
+                       if (wpr.atoms[i] == a_takefocus)
                                win->take_focus = 1;
-                       if (wpr.atoms[i] == adelete)
+                       if (wpr.atoms[i] == a_delete)
                                win->can_delete = 1;
                }
                xcb_icccm_get_wm_protocols_reply_wipe(&wpr);
@@ -6630,25 +6654,26 @@ focus_magic(struct ws_win *win)
                if (win->java) {
                        focus_win(win->child_trans);
                        if (win->child_trans->take_focus)
-                               client_msg(win, takefocus);
+                               client_msg(win, a_takefocus);
                } else {
                        /* make sure transient hasn't disappeared */
                        if (validate_win(win->child_trans) == 0) {
                                focus_win(win->child_trans);
                                if (win->child_trans->take_focus)
-                                       client_msg(win->child_trans, takefocus);
+                                       client_msg(win->child_trans,
+                                           a_takefocus);
                        } else {
                                win->child_trans = NULL;
                                focus_win(win);
                                if (win->take_focus)
-                                       client_msg(win, takefocus);
+                                       client_msg(win, a_takefocus);
                        }
                }
        } else {
                /* regular focus */
                focus_win(win);
                if (win->take_focus)
-                       client_msg(win, takefocus);
+                       client_msg(win, a_takefocus);
        }
 }
 
@@ -7025,7 +7050,7 @@ clientmessage(xcb_client_message_event_t *e)
        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);
+                       client_msg(win, a_delete);
                else
                        xcb_kill_client(conn, win->id);
        }
@@ -7391,7 +7416,7 @@ setup_screens(void)
                screens[i].idx = i;
                TAILQ_INIT(&screens[i].rl);
                TAILQ_INIT(&screens[i].orl);
-               screens[i].root = RootWindow(display, i);
+               screens[i].root = get_screen(i)->root;
 
                /* set default colors */
                setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS);
@@ -7448,6 +7473,19 @@ setup_globals(void)
 
        if ((clock_format = strdup("%a %b %d %R %Z %Y")) == NULL)
                err(1, "setup_globals: strdup: failed to allocate memory.");
+
+       if ((syms = xcb_key_symbols_alloc(conn)) == NULL)
+               errx(1, "unable to allocate key symbols");
+
+       a_state = get_atom_from_string("WM_STATE");
+       a_prot = get_atom_from_string("WM_PROTOCOLS");
+       a_delete = get_atom_from_string("WM_DELETE_WINDOW");
+       a_takefocus = get_atom_from_string("WM_TAKE_FOCUS");
+       a_wmname = get_atom_from_string("WM_NAME");
+       a_netwmname = get_atom_from_string("_NET_WM_NAME");
+       a_utf8_string = get_atom_from_string("UTF8_STRING");
+       a_string = get_atom_from_string("STRING");
+       a_swm_iconic = get_atom_from_string("_SWM_ICONIC");
 }
 
 void
@@ -7591,19 +7629,6 @@ main(int argc, char *argv[])
                errx(1, "can not get XCB connection");
 
        xfd = xcb_get_file_descriptor(conn);
-       syms = xcb_key_symbols_alloc(conn);
-       if (!syms)
-               errx(1, "unable to allocate key symbols");
-
-       astate = get_atom_from_string("WM_STATE");
-       aprot = get_atom_from_string("WM_PROTOCOLS");
-       adelete = get_atom_from_string("WM_DELETE_WINDOW");
-       takefocus = get_atom_from_string("WM_TAKE_FOCUS");
-       a_wmname = get_atom_from_string("WM_NAME");
-       a_netwmname = get_atom_from_string("_NET_WM_NAME");
-       a_utf8_string = get_atom_from_string("UTF8_STRING");
-       a_string = get_atom_from_string("STRING");
-       a_swm_iconic = get_atom_from_string("_SWM_ICONIC");
 
        /* look for local and global conf file */
        pwd = getpwuid(getuid());