JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
XGetWMProtocols to XCB
[spectrwm.git] / spectrwm.c
index a4759cf..1b8b74a 100644 (file)
@@ -92,6 +92,7 @@
 #include <X11/Xatom.h>
 #include <X11/Xlib-xcb.h>
 #include <xcb/randr.h>
+#include <xcb/xcb_atom.h>
 #include <xcb/xcb_icccm.h>
 #include <xcb/xcb_keysyms.h>
 #include <X11/Xproto.h>
@@ -390,7 +391,7 @@ struct ws_win {
        XSizeHints              sh;
        long                    sh_mask;
        XClassHint              ch;
-       XWMHints                *hints;
+       xcb_wm_hints_t          hints;
 };
 TAILQ_HEAD(ws_win_list, ws_win);
 
@@ -6276,9 +6277,9 @@ void
 set_child_transient(struct ws_win *win, Window *trans)
 {
        struct ws_win           *parent, *w;
-       XWMHints                *wmh = NULL;
        struct swm_region       *r;
        struct workspace        *ws;
+       xcb_wm_hints_t          wmh;
 
        parent = find_window(win->transient);
        if (parent)
@@ -6287,24 +6288,18 @@ set_child_transient(struct ws_win *win, Window *trans)
                DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist"
                    " for 0x%x trans 0x%x\n", win->id, win->transient);
 
-               if (win->hints == NULL) {
-                       warnx("no hints for 0x%x", win->id);
-                       return;
-               }
-
                r = root_to_region(win->wa.root);
                ws = r->ws;
                /* parent doen't exist in our window list */
                TAILQ_FOREACH(w, &ws->winlist, entry) {
-                       if (wmh)
-                               XFree(wmh);
-
-                       if ((wmh = XGetWMHints(display, w->id)) == NULL) {
+                       if (xcb_icccm_get_wm_hints_reply(conn,
+                                       xcb_icccm_get_wm_hints(conn, w->id),
+                                       &wmh, NULL) != 1) {
                                warnx("can't get hints for 0x%x", w->id);
                                continue;
                        }
 
-                       if (win->hints->window_group != wmh->window_group)
+                       if (win->hints.window_group != wmh.window_group)
                                continue;
 
                        w->child_trans = win;
@@ -6315,9 +6310,6 @@ set_child_transient(struct ws_win *win, Window *trans)
                        break;
                }
        }
-
-       if (wmh)
-               XFree(wmh);
 }
 
 long
@@ -6367,16 +6359,17 @@ manage_window(xcb_window_t id)
        Window                  trans = 0;
        struct workspace        *ws;
        struct ws_win           *win, *ww;
-       int                     format, i, ws_idx, n, border_me = 0;
+       int                     format, i, ws_idx, border_me = 0;
        unsigned long           nitems, bytes;
        Atom                    ws_idx_atom = 0, type;
-       Atom                    *prot = NULL, *pp;
        unsigned char           ws_idx_str[SWM_PROPLEN], *prop = NULL;
        struct swm_region       *r;
        const char              *errstr;
        struct pid_e            *p;
        struct quirk            *qp;
        uint32_t                event_mask;
+       xcb_atom_t              prot;
+       xcb_get_wm_protocols_reply_t    wpr;
 
        if ((win = find_window(id)) != NULL)
                return (win);   /* already being managed */
@@ -6430,7 +6423,9 @@ manage_window(xcb_window_t id)
        }
        XGetWindowAttributes(display, id, &win->wa);
        XGetWMNormalHints(display, id, &win->sh, &win->sh_mask);
-       win->hints = XGetWMHints(display, id);
+       xcb_icccm_get_wm_hints_reply(conn,
+               xcb_icccm_get_wm_hints(conn, id),
+               &win->hints, NULL);
        XGetTransientForHint(display, id, &trans);
        if (trans) {
                win->transient = trans;
@@ -6439,16 +6434,21 @@ manage_window(xcb_window_t id)
                    "transient: 0x%x\n", win->id, win->transient);
        }
 
+       prot = xcb_atom_get_fast_reply(conn,
+               xcb_atom_get_fast(conn, False, strlen("WM_PROTOCOLS"),
+                       "WM_PROTOCOLS"),
+               NULL);
        /* get supported protocols */
-       if (XGetWMProtocols(display, id, &prot, &n)) {
-               for (i = 0, pp = prot; i < n; i++, pp++) {
-                       if (*pp == takefocus)
+       if (xcb_get_wm_protocols_reply(conn,
+                       xcb_get_wm_protocols(conn, id, prot),
+                       &wpr, NULL)) {
+               for (i = 0; i < wpr.atoms_len; i++) {
+                       if (wpr.atoms[i] == takefocus)
                                win->take_focus = 1;
-                       if (*pp == adelete)
+                       if (wpr.atoms[i] == adelete)
                                win->can_delete = 1;
                }
-               if (prot)
-                       XFree(prot);
+               xcb_get_wm_protocols_reply_wipe(&wpr);
        }
 
        win->iconic = get_iconic(win);
@@ -6659,11 +6659,6 @@ unmanage_window(struct ws_win *win)
 
        focus_prev(win);
 
-       if (win->hints) {
-               XFree(win->hints);
-               win->hints = NULL;
-       }
-
        TAILQ_REMOVE(&win->ws->winlist, win, entry);
        TAILQ_INSERT_TAIL(&win->ws->unmanagedlist, win, entry);
 }
@@ -7044,20 +7039,27 @@ maprequest(XEvent *e)
 {
        struct ws_win           *win;
        struct swm_region       *r;
-       XWindowAttributes       wa;
        XMapRequestEvent        *ev = &e->xmaprequest;
+       xcb_get_window_attributes_reply_t *war;
 
        DNPRINTF(SWM_D_EVENT, "maprequest: window: 0x%lx\n",
            e->xmaprequest.window);
 
-       if (!XGetWindowAttributes(display, ev->window, &wa))
+       war = xcb_get_window_attributes_reply(conn,
+               xcb_get_window_attributes(conn, ev->window),
+               NULL);
+       if (!war)
                return;
-       if (wa.override_redirect)
+       if (war->override_redirect) {
+               free(war);
                return;
+       }       
+       free(war);
 
        win = manage_window(e->xmaprequest.window);
-       if (win == NULL)
+       if (win == NULL) {
                return; /* can't happen */
+       }
 
        stack();