JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
make setscreencolor use xcb
[spectrwm.git] / spectrwm.c
index 9faa4aa..2bfd087 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);
        }
 }
 
@@ -1248,13 +1265,16 @@ name_to_color(char *colorname)
 void
 setscreencolor(char *val, int i, int c)
 {
-       if (i > 0 && i <= ScreenCount(display)) {
+       int     num_screens;
+
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       if (i > 0 && i <= num_screens) {
                screens[i - 1].c[c].color = name_to_color(val);
                free(screens[i - 1].c[c].name);
                if ((screens[i - 1].c[c].name = strdup(val)) == NULL)
                        err(1, "strdup");
        } else if (i == -1) {
-               for (i = 0; i < ScreenCount(display); i++) {
+               for (i = 0; i < num_screens; i++) {
                        screens[i].c[c].color = name_to_color(val);
                        free(screens[i].c[c].name);
                        if ((screens[i].c[c].name = strdup(val)) == NULL)
@@ -1262,7 +1282,7 @@ setscreencolor(char *val, int i, int c)
                }
        } else
                errx(1, "invalid screen index: %d out of bounds (maximum %d)",
-                   i, ScreenCount(display));
+                   i, num_screens);
 }
 
 void
@@ -2159,6 +2179,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");
@@ -6211,9 +6232,10 @@ manage_window(Window id)
                        TAILQ_INSERT_AFTER(&win->ws->winlist, ww, win, entry);
                else if ((ww = win->ws->focus) &&
                    spawn_position == SWM_STACK_ABOVE)
-                       TAILQ_INSERT_AFTER(&win->ws->winlist, win->ws->focus, win, entry);
+                       TAILQ_INSERT_AFTER(&win->ws->winlist, win->ws->focus,
+                           win, entry);
                else if (ww && spawn_position == SWM_STACK_BELOW)
-                       TAILQ_INSERT_AFTER(&win->ws->winlist, win->ws->focus, win, entry);
+                       TAILQ_INSERT_BEFORE(win->ws->focus, win, entry);
                else switch (spawn_position) {
                default:
                case SWM_STACK_TOP:
@@ -6312,10 +6334,21 @@ manage_window(Window id)
        win->s = r->s;  /* this never changes */
        if (trans && (ww = find_window(trans)))
                TAILQ_INSERT_AFTER(&ws->winlist, ww, win, entry);
-       else if (spawn_position == SWM_STACK_ABOVE && win->ws->focus)
-               TAILQ_INSERT_AFTER(&win->ws->winlist, win->ws->focus, win, entry);
-       else
-               TAILQ_INSERT_TAIL(&ws->winlist, win, entry);
+       else if (win->ws->focus && spawn_position == SWM_STACK_ABOVE)
+               TAILQ_INSERT_AFTER(&win->ws->winlist, win->ws->focus, win,
+                   entry);
+       else if (win->ws->focus && spawn_position == SWM_STACK_BELOW)
+               TAILQ_INSERT_BEFORE(win->ws->focus, win, entry);
+       else switch (spawn_position) {
+       default:
+       case SWM_STACK_TOP:
+       case SWM_STACK_ABOVE:
+               TAILQ_INSERT_TAIL(&win->ws->winlist, win, entry);
+               break;
+       case SWM_STACK_BOTTOM:
+       case SWM_STACK_BELOW:
+               TAILQ_INSERT_HEAD(&win->ws->winlist, win, entry);
+       }
 
        /* ignore window border if there is one. */
        WIDTH(win) = win->wa.width;
@@ -6969,14 +7002,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);
@@ -7268,12 +7308,13 @@ grab_windows(void)
 void
 setup_screens(void)
 {
-       int                     i, j, k;
+       int                     i, j, k, num_screens;
        int                     errorbase, major, minor;
        struct workspace        *ws;
        XGCValues               gcv;
 
-       if ((screens = calloc(ScreenCount(display),
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       if ((screens = calloc(num_screens,
             sizeof(struct swm_screen))) == NULL)
                err(1, "setup_screens: calloc: failed to allocate memory for "
                    "screens");
@@ -7286,7 +7327,7 @@ setup_screens(void)
                        xrandr_support = 0;
 
        /* map physical screens */
-       for (i = 0; i < ScreenCount(display); i++) {
+       for (i = 0; i < num_screens; i++) {
                DNPRINTF(SWM_D_WS, "setup_screens: init screen: %d\n", i);
                screens[i].idx = i;
                TAILQ_INIT(&screens[i].rl);
@@ -7399,6 +7440,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");
 
@@ -7578,6 +7622,7 @@ done:
                        XFreeGC(display, screens[i].bar_gc);
 
        XFreeFontSet(display, bar_fs);
+       xcb_disconnect(conn);   
        XCloseDisplay(display);
 
        return (0);