JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
make setup_ewmh() use xcb
[spectrwm.git] / spectrwm.c
index 2ff50af..e70be92 100644 (file)
@@ -90,7 +90,7 @@
 #include <X11/keysym.h>
 #include <X11/XKBlib.h>
 #include <X11/Xatom.h>
-#include <X11/Xlib.h>
+#include <X11/Xlib-xcb.h>
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/Xrandr.h>
@@ -221,6 +221,7 @@ int                 xrandr_support;
 int                    xrandr_eventbase;
 unsigned int           numlockmask = 0;
 Display                        *display;
+xcb_connection_t       *conn;
 
 int                    cycle_empty = 0;
 int                    cycle_visible = 0;
@@ -695,23 +696,39 @@ out:
 void
 setup_ewmh(void)
 {
-       int                     i,j;
-       Atom                    sup_list;
-
-       sup_list = XInternAtom(display, "_NET_SUPPORTED", False);
-
-       for (i = 0; i < LENGTH(ewmh); i++)
-               ewmh[i].atom = XInternAtom(display, ewmh[i].name, False);
+       xcb_atom_t                      sup_list;
+       xcb_intern_atom_cookie_t        c;
+       xcb_intern_atom_reply_t         *r;
+       int                             i, j, num_screens;
+
+       c = xcb_intern_atom(conn, False, strlen("_NET_SUPPORTED"),
+               "_NET_SUPPORTED");
+       r = xcb_intern_atom_reply(conn, c, NULL);
+       if (r) {
+               sup_list = r->atom;
+               free(r);
+       }
+       
+       for (i = 0; i < LENGTH(ewmh); i++) {
+               c = xcb_intern_atom(conn, False, strlen(ewmh[i].name),
+                       ewmh[i].name);
+               r = xcb_intern_atom_reply(conn, c, NULL);
+               if (r) {
+                       ewmh[i].atom = r->atom;
+                       free(r);
+               }
+       }
 
-       for (i = 0; i < ScreenCount(display); i++) {
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       for (i = 0; i < num_screens; i++) {
                /* Support check window will be created by workaround(). */
 
                /* Report supported atoms */
-               XDeleteProperty(display, screens[i].root, sup_list);
+               xcb_delete_property(conn, screens[i].root, sup_list);
                for (j = 0; j < LENGTH(ewmh); j++)
-                       XChangeProperty(display, screens[i].root,
-                           sup_list, XA_ATOM, 32,
-                           PropModeAppend, (unsigned char *)&ewmh[j].atom, 1);
+                       xcb_change_property(conn, XCB_PROP_MODE_APPEND,
+                               screens[i].root, sup_list, XCB_ATOM_ATOM, 32, 1,
+                               &ewmh[j].atom);
        }
 }
 
@@ -2159,6 +2176,7 @@ restart(struct swm_region *r, union arg *args)
        bar_extra_stop();
        bar_extra = 1;
        unmap_all();
+       xcb_disconnect(conn);
        XCloseDisplay(display);
        execvp(start_argv[0], start_argv);
        warn("execvp failed");
@@ -6981,14 +6999,21 @@ visibilitynotify(XEvent *e)
 void
 clientmessage(XEvent *e)
 {
-       XClientMessageEvent *ev;
-       struct ws_win *win;
+       XClientMessageEvent     *ev;
+       struct ws_win           *win;
 
        ev = &e->xclient;
 
        win = find_window(ev->window);
-       if (win == NULL)
+       if (win == NULL) {
+               if (ev->message_type == ewmh[_NET_ACTIVE_WINDOW].atom) {
+                       DNPRINTF(SWM_D_EVENT, "clientmessage: request focus on "
+                           "unmanaged window.\n");
+                       e->xmaprequest.window = ev->window;
+                       maprequest(e);
+               }
                return;
+       }
 
        DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%lx, type: %ld\n",
            ev->window, ev->message_type);
@@ -7411,6 +7436,9 @@ main(int argc, char *argv[])
        if (!(display = XOpenDisplay(0)))
                errx(1, "can not open display");
 
+       if (!(conn = XGetXCBConnection(display)))
+               errx(1, "can not get XCB connection");
+
        if (active_wm())
                errx(1, "other wm running");
 
@@ -7590,6 +7618,7 @@ done:
                        XFreeGC(display, screens[i].bar_gc);
 
        XFreeFontSet(display, bar_fs);
+       xcb_disconnect(conn);   
        XCloseDisplay(display);
 
        return (0);