JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
make ewmh_update_actions() use XCB. Also convert ewmh_hint
[spectrwm.git] / spectrwm.c
index 2bfd087..e03acbc 100644 (file)
@@ -336,8 +336,8 @@ struct swm_screen;
 struct workspace;
 
 struct swm_bar {
-       Window                  id;
-       Pixmap                  buffer;
+       xcb_window_t            id;
+       xcb_pixmap_t            buffer;
        struct swm_geometry     g;
 };
 
@@ -587,34 +587,34 @@ enum {
 };
 
 struct ewmh_hint {
-       char    *name;
-       Atom     atom;
+       char            *name;
+       xcb_atom_t      atom;
 } ewmh[SWM_EWMH_HINT_MAX] =    {
     /* must be in same order as in the enum */
-    {"_NET_ACTIVE_WINDOW", None},
-    {"_NET_CLOSE_WINDOW", None},
-    {"_NET_MOVERESIZE_WINDOW", None},
-    {"_NET_WM_ACTION_CLOSE", None},
-    {"_NET_WM_ACTION_FULLSCREEN", None},
-    {"_NET_WM_ACTION_MOVE", None},
-    {"_NET_WM_ACTION_RESIZE", None},
-    {"_NET_WM_ALLOWED_ACTIONS", None},
-    {"_NET_WM_STATE", None},
-    {"_NET_WM_STATE_ABOVE", None},
-    {"_NET_WM_STATE_FULLSCREEN", None},
-    {"_NET_WM_STATE_HIDDEN", None},
-    {"_NET_WM_STATE_MAXIMIZED_HORZ", None},
-    {"_NET_WM_STATE_MAXIMIZED_VERT", None},
-    {"_NET_WM_STATE_SKIP_PAGER", None},
-    {"_NET_WM_STATE_SKIP_TASKBAR", None},
-    {"_NET_WM_WINDOW_TYPE", None},
-    {"_NET_WM_WINDOW_TYPE_DIALOG", None},
-    {"_NET_WM_WINDOW_TYPE_DOCK", None},
-    {"_NET_WM_WINDOW_TYPE_NORMAL", None},
-    {"_NET_WM_WINDOW_TYPE_SPLASH", None},
-    {"_NET_WM_WINDOW_TYPE_TOOLBAR", None},
-    {"_NET_WM_WINDOW_TYPE_UTILITY", None},
-    {"_SWM_WM_STATE_MANUAL", None},
+    {"_NET_ACTIVE_WINDOW", XCB_ATOM_NONE},
+    {"_NET_CLOSE_WINDOW", XCB_ATOM_NONE},
+    {"_NET_MOVERESIZE_WINDOW", XCB_ATOM_NONE},
+    {"_NET_WM_ACTION_CLOSE", XCB_ATOM_NONE},
+    {"_NET_WM_ACTION_FULLSCREEN", XCB_ATOM_NONE},
+    {"_NET_WM_ACTION_MOVE", XCB_ATOM_NONE},
+    {"_NET_WM_ACTION_RESIZE", XCB_ATOM_NONE},
+    {"_NET_WM_ALLOWED_ACTIONS", XCB_ATOM_NONE},
+    {"_NET_WM_STATE", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_ABOVE", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_FULLSCREEN", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_HIDDEN", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_MAXIMIZED_HORZ", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_MAXIMIZED_VERT", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_SKIP_PAGER", XCB_ATOM_NONE},
+    {"_NET_WM_STATE_SKIP_TASKBAR", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_DIALOG", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_DOCK", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_NORMAL", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_SPLASH", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_TOOLBAR", XCB_ATOM_NONE},
+    {"_NET_WM_WINDOW_TYPE_UTILITY", XCB_ATOM_NONE},
+    {"_SWM_WM_STATE_MANUAL", XCB_ATOM_NONE},
 };
 
 void            store_float_geom(struct ws_win *, struct swm_region *);
@@ -650,46 +650,58 @@ get_property(Window id, Atom atom, long count, Atom type, unsigned long *nitems,
 void
 update_iconic(struct ws_win *win, int newv)
 {
-       int32_t v = newv;
-       Atom iprop;
+       int32_t                         v = newv;
+       xcb_atom_t                      iprop;
+       xcb_intern_atom_cookie_t        c;
+       xcb_intern_atom_reply_t         *r;
 
        win->iconic = newv;
 
-       iprop = XInternAtom(display, "_SWM_ICONIC", False);
-       if (!iprop)
+       c = xcb_intern_atom(conn, False, strlen("_SWM_ICONIC"), "_SWM_ICONIC");
+       r = xcb_intern_atom_reply(conn, c, NULL);
+       if (r) {
+               iprop = r->atom;
+               free(r);
+       } else
                return;
+               
        if (newv)
-               XChangeProperty(display, win->id, iprop, XA_INTEGER, 32,
-                   PropModeReplace, (unsigned char *)&v, 1);
+               xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
+                       iprop, XCB_ATOM_INTEGER, 32, 1, &v);
        else
-               XDeleteProperty(display, win->id, iprop);
+               xcb_delete_property(conn, win->id, iprop);
 }
 
 int
 get_iconic(struct ws_win *win)
 {
-       int32_t v = 0;
-       int retfmt, status;
-       Atom iprop, rettype;
-       unsigned long nitems, extra;
-       unsigned char *prop = NULL;
+       int32_t v = 0, *vtmp;
+       xcb_atom_t                      iprop;
+       xcb_intern_atom_cookie_t        c;
+       xcb_intern_atom_reply_t         *r;
+       xcb_get_property_cookie_t       pc;
+       xcb_get_property_reply_t        *pr;
 
-       iprop = XInternAtom(display, "_SWM_ICONIC", False);
-       if (!iprop)
-               goto out;
-       status = XGetWindowProperty(display, win->id, iprop, 0L, 1L,
-           False, XA_INTEGER, &rettype, &retfmt, &nitems, &extra, &prop);
-       if (status != Success)
-               goto out;
-       if (rettype != XA_INTEGER || retfmt != 32)
-               goto out;
-       if (nitems != 1)
+       c = xcb_intern_atom(conn, False, strlen("_SWM_ICONIC"), "_SWM_ICONIC");
+       r = xcb_intern_atom_reply(conn, c, NULL);
+       if (r) {
+               iprop = r->atom;
+               free(r);
+       } else
                goto out;
-       v = *((int32_t *)prop);
 
+       pc = xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER,
+                       0, 1);
+       pr = xcb_get_property_reply(conn, pc, NULL);
+       if (!pr)
+               goto out;       
+       if (pr->type != XCB_ATOM_INTEGER || pr->format != 32)
+               goto out;
+       vtmp = xcb_get_property_value(pr);
+       v = *vtmp;
 out:
-       if (prop != NULL)
-               XFree(prop);
+       if (pr != NULL)
+               free(pr);
        return (v);
 }
 
@@ -838,7 +850,7 @@ ewmh_set_win_fullscreen(struct ws_win *win, int fs)
 void
 ewmh_update_actions(struct ws_win *win)
 {
-       Atom                    actions[SWM_EWMH_ACTION_COUNT_MAX];
+       xcb_atom_t              actions[SWM_EWMH_ACTION_COUNT_MAX];
        int                     n = 0;
 
        if (win == NULL)
@@ -851,8 +863,9 @@ ewmh_update_actions(struct ws_win *win)
                actions[n++] = ewmh[_NET_WM_ACTION_RESIZE].atom;
        }
 
-       XChangeProperty(display, win->id, ewmh[_NET_WM_ALLOWED_ACTIONS].atom,
-           XA_ATOM, 32, PropModeReplace, (unsigned char *)actions, n);
+       xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
+               ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1,
+               actions);
 }
 
 #define _NET_WM_STATE_REMOVE   0    /* remove/unset property */
@@ -1315,13 +1328,15 @@ void
 custom_region(char *val)
 {
        unsigned int                    sidx, x, y, w, h;
+       int                             num_screens;
 
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));      
        if (sscanf(val, "screen[%u]:%ux%u+%u+%u", &sidx, &w, &h, &x, &y) != 5)
                errx(1, "invalid custom region, "
                    "should be 'screen[<n>]:<n>x<n>+<n>+<n>");
-       if (sidx < 1 || sidx > ScreenCount(display))
+       if (sidx < 1 || sidx > num_screens)
                errx(1, "invalid screen index: %d out of bounds (maximum %d)",
-                   sidx, ScreenCount(display));
+                   sidx, num_screens);
        sidx--;
 
        if (w < 1 || h < 1)
@@ -1922,8 +1937,8 @@ bar_cleanup(struct swm_region *r)
 {
        if (r->bar == NULL)
                return;
-       XDestroyWindow(display, r->bar->id);
-       XFreePixmap(display, r->bar->buffer);
+       xcb_destroy_window(conn, r->bar->id);
+       xcb_free_pixmap(conn, r->bar->buffer);
        free(r->bar);
        r->bar = NULL;
 }
@@ -6158,45 +6173,51 @@ set_child_transient(struct ws_win *win, Window *trans)
 long
 window_get_pid(Window win)
 {
-       Atom                    actual_type_return;
-       int                     actual_format_return = 0;
-       unsigned long           nitems_return = 0;
-       unsigned long           bytes_after_return = 0;
-       long                    *pid = NULL;
-       long                    ret = 0;
-       const char              *errstr;
-       unsigned char           *prop = NULL;
+       long                            ret = 0;
+       const char                      *errstr;
+       xcb_atom_t                      apid;
+       xcb_intern_atom_cookie_t        c;
+       xcb_intern_atom_reply_t         *r;
+       xcb_get_property_cookie_t       pc;
+       xcb_get_property_reply_t        *pr;    
 
-       if (XGetWindowProperty(display, win,
-           XInternAtom(display, "_NET_WM_PID", False), 0, 1, False,
-           XA_CARDINAL, &actual_type_return, &actual_format_return,
-           &nitems_return, &bytes_after_return,
-           (unsigned char**)(void*)&pid) != Success)
+       c = xcb_intern_atom(conn, False, strlen("_NET_WM_PID"), "_NET_WM_PID");
+       r = xcb_intern_atom_reply(conn, c, NULL);
+       if (r) {
+               apid = r->atom;
+               free(r);
+       } else
                goto tryharder;
-       if (actual_type_return != XA_CARDINAL)
+
+       pc = xcb_get_property(conn, False, win, apid, XCB_ATOM_CARDINAL, 0, 1);
+       pr = xcb_get_property_reply(conn, pc, NULL);
+       if (!pr)
                goto tryharder;
-       if (pid == NULL)
+       if (pr->type != XCB_ATOM_CARDINAL)
                goto tryharder;
 
-       ret = *pid;
-       XFree(pid);
+       ret = *(long *)xcb_get_property_value(pr);
+       free(pr);
 
        return (ret);
 
 tryharder:
-       if (XGetWindowProperty(display, win,
-           XInternAtom(display, "_SWM_PID", False), 0, SWM_PROPLEN, False,
-           XA_STRING, &actual_type_return, &actual_format_return,
-           &nitems_return, &bytes_after_return, &prop) != Success)
-               return (0);
-       if (actual_type_return != XA_STRING)
+       c = xcb_intern_atom(conn, False, strlen("_SWM_PID"), "_SWM_PID");
+       r = xcb_intern_atom_reply(conn, c, NULL);
+       if (r) {
+               apid = r->atom;
+               free(r);
+       }
+       pc = xcb_get_property(conn, False, win, apid, XCB_ATOM_STRING,
+               0, SWM_PROPLEN);
+       pr = xcb_get_property_reply(conn, pc, NULL);
+       if (!pr)
                return (0);
-       if (prop == NULL)
+       if (pr->type != XCB_ATOM_STRING)
+               free(pr);
                return (0);
-
-       ret = strtonum((const char *)prop, 0, UINT_MAX, &errstr);
-       /* ignore error because strtonum returns 0 anyway */
-       XFree(prop);
+       ret = strtonum(xcb_get_property_value(pr), 0, UINT_MAX, &errstr);
+       free(pr);
 
        return (ret);
 }