JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
XGetClassHint converted to XCB
[spectrwm.git] / spectrwm.c
index 0df1a4c..ba61a53 100644 (file)
@@ -387,10 +387,10 @@ struct ws_win {
        unsigned long           quirks;
        struct workspace        *ws;    /* always valid */
        struct swm_screen       *s;     /* always valid, never changes */
-       XWindowAttributes       wa;
+       xcb_get_geometry_reply_t        *wa;
        XSizeHints              sh;
        long                    sh_mask;
-       XClassHint              ch;
+       xcb_get_wm_class_reply_t        ch;
        xcb_wm_hints_t          hints;
 };
 TAILQ_HEAD(ws_win_list, ws_win);
@@ -1518,8 +1518,8 @@ bar_class_name(char *s, size_t sz, struct swm_region *r)
 {
        if (r == NULL || r->ws == NULL || r->ws->focus == NULL)
                return;
-       if (r->ws->focus->ch.res_class != NULL)
-               strlcat(s, r->ws->focus->ch.res_class, sz);
+       if (r->ws->focus->ch.class_name != NULL)
+               strlcat(s, r->ws->focus->ch.class_name, sz);
 }
 
 void
@@ -1527,8 +1527,8 @@ bar_title_name(char *s, size_t sz, struct swm_region *r)
 {
        if (r == NULL || r->ws == NULL || r->ws->focus == NULL)
                return;
-       if (r->ws->focus->ch.res_name != NULL)
-               strlcat(s, r->ws->focus->ch.res_name, sz);
+       if (r->ws->focus->ch.instance_name != NULL)
+               strlcat(s, r->ws->focus->ch.instance_name, sz);
 }
 
 void
@@ -6320,7 +6320,7 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans)
                DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist"
                    " for 0x%x trans 0x%x\n", win->id, win->transient);
 
-               r = root_to_region(win->wa.root);
+               r = root_to_region(win->wa->root);
                ws = r->ws;
                /* parent doen't exist in our window list */
                TAILQ_FOREACH(w, &ws->winlist, entry) {
@@ -6465,7 +6465,9 @@ manage_window(xcb_window_t id)
                }
                
        }
-       XGetWindowAttributes(display, id, &win->wa);
+       win->wa = xcb_get_geometry_reply(conn,
+               xcb_get_geometry(conn, id),
+               NULL);  
        XGetWMNormalHints(display, id, &win->sh, &win->sh_mask);
        xcb_icccm_get_wm_hints_reply(conn,
                xcb_icccm_get_wm_hints(conn, id),
@@ -6504,7 +6506,7 @@ manage_window(xcb_window_t id)
         * a workspace (either by spawn() or manually moving), and isn't
         * transient, * put it in the same workspace
         */
-       r = root_to_region(win->wa.root);
+       r = root_to_region(win->wa->root);
        if (p) {
                ws = &r->s->ws[p->ws];
                TAILQ_REMOVE(&pidlist, p, entry);
@@ -6558,10 +6560,10 @@ manage_window(xcb_window_t id)
        }
 
        /* ignore window border if there is one. */
-       WIDTH(win) = win->wa.width;
-       HEIGHT(win) = win->wa.height;
-       X(win) = win->wa.x + win->wa.border_width;
-       Y(win) = win->wa.y + win->wa.border_width;
+       WIDTH(win) = win->wa->width;
+       HEIGHT(win) = win->wa->height;
+       X(win) = win->wa->x + win->wa->border_width;
+       Y(win) = win->wa->y + win->wa->border_width;
        win->bordered = 0;
        win->g_floatvalid = 0;
        win->floatmaxed = 0;
@@ -6588,22 +6590,24 @@ manage_window(xcb_window_t id)
 
        ewmh_autoquirk(win);
 
-       if (XGetClassHint(display, win->id, &win->ch)) {
+       if (xcb_get_wm_class_reply(conn,
+                       xcb_get_wm_class(conn, win->id),
+                       &win->ch, NULL)) {
                DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n",
-                   win->ch.res_class, win->ch.res_name);
+                   win->ch.class, win->ch.instance_name);
 
                /* java is retarded so treat it special */
-               if (strstr(win->ch.res_name, "sun-awt")) {
+               if (strstr(win->ch.instance_name, "sun-awt")) {
                        win->java = 1;
                        border_me = 1;
                }
 
                TAILQ_FOREACH(qp, &quirks, entry) {
-                       if (!strcmp(win->ch.res_class, qp->class) &&
-                           !strcmp(win->ch.res_name, qp->name)) {
+                       if (!strcmp(win->ch.class_name, qp->class) &&
+                           !strcmp(win->ch.instance_name, qp->name)) {
                                DNPRINTF(SWM_D_CLASS, "manage_window: found: "
-                                   "class: %s, name: %s\n", win->ch.res_class,
-                                   win->ch.res_name);
+                                   "class: %s, name: %s\n", win->ch.class_name,
+                                   win->ch.instance_name);
                                if (qp->quirk & SWM_Q_FLOAT) {
                                        win->floating = 1;
                                        border_me = 1;
@@ -6669,10 +6673,10 @@ free_window(struct ws_win *win)
 
        TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
 
-       if (win->ch.res_class)
-               XFree(win->ch.res_class);
-       if (win->ch.res_name)
-               XFree(win->ch.res_name);
+       if (win->wa)
+               free(win->wa);
+       
+       xcb_get_wm_class_reply_wipe(&win->ch);
 
        kill_refs(win);
 
@@ -7111,7 +7115,7 @@ maprequest(XEvent *e)
        stack();
 
        /* make new win focused */
-       r = root_to_region(win->wa.root);
+       r = root_to_region(win->wa->root);
        if (win->ws == r->ws)
                focus_magic(win);
 }