JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
convert an #if 0'd XGetWMNormalHints to XCB
[spectrwm.git] / spectrwm.c
index d550374..259f246 100644 (file)
@@ -123,17 +123,32 @@ static const char *buildstr = SPECTRWM_VERSION;
 #endif
 
 #if defined(__OpenBSD__)
-#define xcb_icccm_wm_hints_t                   xcb_wm_hints_t
-#define xcb_icccm_get_wm_hints                 xcb_get_wm_hints
-#define xcb_icccm_get_wm_hints_reply           xcb_get_wm_hints_reply
+#define XCB_ICCCM_SIZE_HINT_P_MIN_SIZE         XCB_SIZE_HINT_P_MIN_SIZE
+#define XCB_ICCCM_SIZE_HINT_P_MAX_SIZE         XCB_SIZE_HINT_P_MAX_SIZE
+#define XCB_ICCCM_SIZE_HINT_P_RESIZE_INC       XCB_SIZE_HINT_P_RESIZE_INC
 #define XCB_ICCCM_WM_HINT_X_URGENCY            XCB_WM_HINT_X_URGENCY
 #define XCB_ICCCM_WM_STATE_ICONIC              XCB_WM_STATE_ICONIC
 #define XCB_ICCCM_WM_STATE_WITHDRAWN           XCB_WM_STATE_WITHDRAWN
 #define XCB_ICCCM_WM_STATE_NORMAL              XCB_WM_STATE_NORMAL
+#define xcb_icccm_get_text_property_reply_t    xcb_get_text_property_reply_t
+#define xcb_icccm_get_text_property_reply_wipe xcb_get_text_property_reply_wipe
+#define xcb_icccm_get_wm_class                 xcb_get_wm_class
+#define xcb_icccm_get_wm_class_reply           xcb_get_wm_class_reply
+#define xcb_icccm_get_wm_class_reply_t         xcb_get_wm_class_reply_t
+#define xcb_icccm_get_wm_class_reply_wipe      xcb_get_wm_class_reply_wipe
+#define xcb_icccm_get_wm_hints                 xcb_get_wm_hints
+#define xcb_icccm_get_wm_hints_reply           xcb_get_wm_hints_reply
 #define        xcb_icccm_get_wm_name                   xcb_get_wm_name
 #define xcb_icccm_get_wm_name_reply            xcb_get_wm_name_reply
+#define xcb_icccm_get_wm_normal_hints          xcb_get_wm_normal_hints
+#define xcb_icccm_get_wm_normal_hints_reply    xcb_get_wm_normal_hints_reply
+#define xcb_icccm_get_wm_protocols             xcb_get_wm_protocols
+#define xcb_icccm_get_wm_protocols_reply       xcb_get_wm_protocols_reply
+#define xcb_icccm_get_wm_protocols_reply_t     xcb_get_wm_protocols_reply_t
+#define xcb_icccm_get_wm_protocols_reply_wipe  xcb_get_wm_protocols_reply_wipe
 #define xcb_icccm_get_wm_transient_for         xcb_get_wm_transient_for
 #define xcb_icccm_get_wm_transient_for_reply   xcb_get_wm_transient_for_reply
+#define xcb_icccm_wm_hints_t                   xcb_wm_hints_t
 #endif
 
 /*#define SWM_DEBUG*/
@@ -194,13 +209,13 @@ u_int32_t         swm_debug = 0
 #define BORDER(w)              (w->bordered ? border_width : 0)
 #define MAX_X(r)               ((r)->g.x + (r)->g.w)
 #define MAX_Y(r)               ((r)->g.y + (r)->g.h)
-#define SH_MIN(w)              (w)->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE
+#define SH_MIN(w)              (w)->sh.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE
 #define SH_MIN_W(w)            (w)->sh.min_width
 #define SH_MIN_H(w)            (w)->sh.min_height
-#define SH_MAX(w)              (w)->sh.flags & XCB_SIZE_HINT_P_MAX_SIZE
+#define SH_MAX(w)              (w)->sh.flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE
 #define SH_MAX_W(w)            (w)->sh.max_width
 #define SH_MAX_H(w)            (w)->sh.max_height
-#define SH_INC(w)              (w)->sh.flags & XCB_SIZE_HINT_P_RESIZE_INC
+#define SH_INC(w)              (w)->sh.flags & XCB_ICCCM_SIZE_HINT_P_RESIZE_INC
 #define SH_INC_W(w)            (w)->sh.width_inc
 #define SH_INC_H(w)            (w)->sh.height_inc
 #define SWM_MAX_FONT_STEPS     (3)
@@ -240,6 +255,7 @@ int                 xrandr_eventbase;
 unsigned int           numlockmask = 0;
 Display                        *display;
 xcb_connection_t       *conn;
+xcb_key_symbols_t      *syms;
 
 int                    cycle_empty = 0;
 int                    cycle_visible = 0;
@@ -389,8 +405,8 @@ struct ws_win {
        struct swm_screen       *s;     /* always valid, never changes */
        xcb_get_geometry_reply_t        *wa;
        xcb_size_hints_t        sh;
-       xcb_get_wm_class_reply_t        ch;
-       xcb_wm_hints_t          hints;
+       xcb_icccm_get_wm_class_reply_t  ch;
+       xcb_icccm_wm_hints_t    hints;
 };
 TAILQ_HEAD(ws_win_list, ws_win);
 
@@ -1486,6 +1502,8 @@ bar_print(struct swm_region *r, const char *s)
                sizeof(rect), &rect);
 
        /* draw back buffer */
+       gcv[0] = r->s->c[SWM_S_COLOR_BAR].color;
+       xcb_change_gc(conn, r->s->bar_gc, XCB_GC_BACKGROUND, gcv);
        gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color;
        xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv);
        xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x,
@@ -2259,13 +2277,11 @@ void
 fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers)
 {
        xcb_key_press_event_t   event;
-       xcb_key_symbols_t       *syms;
        xcb_keycode_t           *keycode;
 
        if (win == NULL)
                return;
 
-       syms = xcb_key_symbols_alloc(conn);
        keycode = xcb_key_symbols_get_keycode(syms, keysym);
 
        event.event = win->id;
@@ -2288,8 +2304,6 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers)
        xcb_send_event(conn, True, win->id,
                XCB_EVENT_MASK_KEY_RELEASE, (char *)&event);
        xcb_flush(conn);
-
-       xcb_key_symbols_free(syms);
 }
 
 void
@@ -2305,7 +2319,10 @@ restart(struct swm_region *r, union arg *args)
        bar_extra_stop();
        bar_extra = 1;
        unmap_all();
+
+       xcb_key_symbols_free(syms);
        xcb_flush(conn);
+       xcb_disconnect(conn);
 
        execvp(start_argv[0], start_argv);
        warn("execvp failed");
@@ -3780,20 +3797,20 @@ get_win_name(xcb_window_t win)
 {
        char                            *name = NULL;
        xcb_get_property_cookie_t       c;
-       xcb_get_text_property_reply_t   r;
+       xcb_icccm_get_text_property_reply_t     r;
 
        c = xcb_icccm_get_wm_name(conn, win);
        if (xcb_icccm_get_wm_name_reply(conn, c, &r, NULL)) {
                if (r.name_len > 0) {
                        name = malloc(r.name_len + 1);
                        if (!name) {
-                               xcb_get_text_property_reply_wipe(&r);
+                               xcb_icccm_get_text_property_reply_wipe(&r);
                                return (NULL);
                        }
                        memcpy(name, r.name, r.name_len);
                        name[r.name_len] = '\0';
                }
-               xcb_get_text_property_reply_wipe(&r);
+               xcb_icccm_get_text_property_reply_wipe(&r);
        }
 
        return (name);
@@ -5531,15 +5548,10 @@ updatenumlockmask(void)
        unsigned int                            i, j;
        xcb_get_modifier_mapping_reply_t        *modmap_r;
        xcb_keycode_t                           *modmap, kc;
-       xcb_key_symbols_t                       *syms;
 
        DNPRINTF(SWM_D_MISC, "updatenumlockmask\n");
        numlockmask = 0;
 
-       syms = xcb_key_symbols_alloc(conn);
-       if (!syms)
-               return;
-       
        modmap_r = xcb_get_modifier_mapping_reply(conn,
                xcb_get_modifier_mapping(conn),
                NULL);
@@ -5557,7 +5569,6 @@ updatenumlockmask(void)
                }
                free(modmap_r);
        }
-       xcb_key_symbols_free(syms);
 }
 
 void
@@ -5565,7 +5576,7 @@ grabkeys(void)
 {
        int                     num_screens;
        unsigned int            j, k;
-       KeyCode                 code;
+       xcb_keycode_t           *code;
        unsigned int            modifiers[] =
            { 0, LockMask, numlockmask, numlockmask | LockMask };
        struct key              *kp;
@@ -5580,12 +5591,14 @@ grabkeys(void)
                xcb_ungrab_key(conn, XCB_GRAB_ANY, screens[k].root,
                        XCB_MOD_MASK_ANY);
                RB_FOREACH(kp, key_tree, &keys) {
-                       if ((code = XKeysymToKeycode(display, kp->keysym)))
+                       if ((code = xcb_key_symbols_get_keycode(syms,
+                                       kp->keysym)))
                                for (j = 0; j < LENGTH(modifiers); j++)
-                                       XGrabKey(display, code,
+                                       xcb_grab_key(conn, True,
+                                           screens[k].root,
                                            kp->mod | modifiers[j],
-                                           screens[k].root, True,
-                                           GrabModeAsync, GrabModeAsync);
+                                           *code, XCB_GRAB_MODE_ASYNC,
+                                           XCB_GRAB_MODE_ASYNC);
                }
        }
 }
@@ -6335,7 +6348,7 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans)
        struct ws_win           *parent, *w;
        struct swm_region       *r;
        struct workspace        *ws;
-       xcb_wm_hints_t          wmh;
+       xcb_icccm_wm_hints_t    wmh;
 
        parent = find_window(win->transient);
        if (parent)
@@ -6426,7 +6439,7 @@ manage_window(xcb_window_t id)
        uint32_t                event_mask;
        xcb_atom_t              prot;
        xcb_get_property_reply_t        *gpr;
-       xcb_get_wm_protocols_reply_t    wpr;
+       xcb_icccm_get_wm_protocols_reply_t      wpr;
 
        if ((win = find_window(id)) != NULL)
                return (win);   /* already being managed */
@@ -6496,14 +6509,14 @@ manage_window(xcb_window_t id)
        win->wa = xcb_get_geometry_reply(conn,
                xcb_get_geometry(conn, id),
                NULL);  
-       xcb_get_wm_normal_hints_reply(conn,
-               xcb_get_wm_normal_hints(conn, id),
+       xcb_icccm_get_wm_normal_hints_reply(conn,
+               xcb_icccm_get_wm_normal_hints(conn, id),
                &win->sh, NULL);
        xcb_icccm_get_wm_hints_reply(conn,
                xcb_icccm_get_wm_hints(conn, id),
                &win->hints, NULL);
-       xcb_get_wm_transient_for_reply(conn,
-               xcb_get_wm_transient_for(conn, id),
+       xcb_icccm_get_wm_transient_for_reply(conn,
+               xcb_icccm_get_wm_transient_for(conn, id),
                &trans, NULL);
        if (trans) {
                win->transient = trans;
@@ -6512,13 +6525,11 @@ 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);
+       prot = get_atom_from_string("WM_PROTOCOLS");
+
        /* get supported protocols */
-       if (xcb_get_wm_protocols_reply(conn,
-                       xcb_get_wm_protocols(conn, id, prot),
+       if (xcb_icccm_get_wm_protocols_reply(conn,
+                       xcb_icccm_get_wm_protocols(conn, id, prot),
                        &wpr, NULL)) {
                for (i = 0; i < wpr.atoms_len; i++) {
                        if (wpr.atoms[i] == takefocus)
@@ -6526,7 +6537,7 @@ manage_window(xcb_window_t id)
                        if (wpr.atoms[i] == adelete)
                                win->can_delete = 1;
                }
-               xcb_get_wm_protocols_reply_wipe(&wpr);
+               xcb_icccm_get_wm_protocols_reply_wipe(&wpr);
        }
 
        win->iconic = get_iconic(win);
@@ -6620,8 +6631,8 @@ manage_window(xcb_window_t id)
 
        ewmh_autoquirk(win);
 
-       if (xcb_get_wm_class_reply(conn,
-                       xcb_get_wm_class(conn, win->id),
+       if (xcb_icccm_get_wm_class_reply(conn,
+                       xcb_icccm_get_wm_class(conn, win->id),
                        &win->ch, NULL)) {
                DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n",
                    win->ch.class_name, win->ch.instance_name);
@@ -6706,7 +6717,7 @@ free_window(struct ws_win *win)
        if (win->wa)
                free(win->wa);
        
-       xcb_get_wm_class_reply_wipe(&win->ch);
+       xcb_icccm_get_wm_class_reply_wipe(&win->ch);
 
        kill_refs(win);
 
@@ -6834,28 +6845,49 @@ configurerequest(XEvent *e)
 {
        XConfigureRequestEvent  *ev = &e->xconfigurerequest;
        struct ws_win           *win;
-       int                     new = 0;
-       XWindowChanges          wc;
+       int                     new = 0, i = 0;
+       uint16_t                mask = 0;       
+       uint32_t                wc[7];
 
        if ((win = find_window(ev->window)) == NULL)
                if ((win = find_unmanaged_window(ev->window)) == NULL)
                        new = 1;
 
        if (new) {
-               bzero(&wc, sizeof wc);
-               wc.x = ev->x;
-               wc.y = ev->y;
-               wc.width = ev->width;
-               wc.height = ev->height;
-               wc.border_width = ev->border_width;
-               wc.sibling = ev->above;
-               wc.stack_mode = ev->detail;
+               if (ev->value_mask & XCB_CONFIG_WINDOW_X) {
+                       mask |= XCB_CONFIG_WINDOW_X;
+                       wc[i++] = ev->x;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_Y) {
+                       mask |= XCB_CONFIG_WINDOW_Y;
+                       wc[i++] = ev->y;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
+                       mask |= XCB_CONFIG_WINDOW_WIDTH;
+                       wc[i++] = ev->width;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+                       mask |= XCB_CONFIG_WINDOW_HEIGHT;
+                       wc[i++] = ev->height;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) {
+                       mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
+                       wc[i++] = ev->border_width;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_SIBLING) {
+                       mask |= XCB_CONFIG_WINDOW_SIBLING;
+                       wc[i++] = ev->above;
+               }
+               if (ev->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) {
+                       mask |= XCB_CONFIG_WINDOW_STACK_MODE;
+                       wc[i++] = ev->detail;
+               }
 
                DNPRINTF(SWM_D_EVENT, "configurerequest: new window: 0x%lx, "
                    "new: %s, (x,y) w x h: (%d,%d) %d x %d\n", ev->window,
-                   YESNO(new), wc.x, wc.y, wc.width, wc.height);
+                   YESNO(new), wc[0], wc[1], wc[2], wc[3]);
 
-               XConfigureWindow(display, ev->window, ev->value_mask, &wc);
+               xcb_configure_window(conn, ev->window, mask, wc);
        } else if ((!win->manual || win->quirks & SWM_Q_ANYWHERE) &&
            !(win->ewmh_flags & EWMH_F_FULLSCREEN)) {
                win->g_float.x = ev->x - X(win->ws->r);
@@ -6887,8 +6919,8 @@ configurenotify(XEvent *e)
 
        win = find_window(e->xconfigure.window);
        if (win) {
-               xcb_get_wm_normal_hints_reply(conn,
-                       xcb_get_wm_normal_hints(conn, win->id),
+               xcb_icccm_get_wm_normal_hints_reply(conn,
+                       xcb_icccm_get_wm_normal_hints(conn, win->id),
                        &win->sh, NULL);
                adjust_font(win);
                if (font_adjusted)
@@ -7198,9 +7230,10 @@ propertynotify(XEvent *e)
 
        switch (ev->atom) {
 #if 0
-       case XA_WM_NORMAL_HINTS:
-               long            mask;
-               XGetWMNormalHints(display, win->id, &win->sh, &mask);
+       case XCB_ATOM_WM_NORMAL_HINTS:
+               xcb_icccm_get_wm_normal_hints(conn,
+                       xcb_iccom_get_wm_normal_hints(conn, win->id),
+                       &win->sh, NULL);
                warnx("normal hints: flag 0x%x", win->sh.flags);
                if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) {
                        WIDTH(win) = win->sh.min_width;
@@ -7820,6 +7853,10 @@ main(int argc, char *argv[])
        if (pwd == NULL)
                errx(1, "invalid user: %d", getuid());
 
+       syms = xcb_key_symbols_alloc(conn);
+       if (syms == NULL)
+               errx(1, "unable to allocate key symbols");
+
        setup_globals();
        setup_screens();
        setup_keys();
@@ -7967,6 +8004,8 @@ done:
                if (screens[i].bar_gc != 0)
                        xcb_free_gc(conn, screens[i].bar_gc);
        XFreeFontSet(display, bar_fs);
+       
+       xcb_key_symbols_free(syms);
        xcb_disconnect(conn);
 
        return (0);