JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
convert another XGetWindowAttributes to xcb
[spectrwm.git] / spectrwm.c
index fd5b119..dc418de 100644 (file)
@@ -390,7 +390,7 @@ struct ws_win {
        XSizeHints              sh;
        long                    sh_mask;
        XClassHint              ch;
-       XWMHints                *hints;
+       xcb_wm_hints_t          hints;
 };
 TAILQ_HEAD(ws_win_list, ws_win);
 
@@ -4274,8 +4274,9 @@ resize(struct ws_win *win, union arg *args)
        struct swm_geometry     g;
        int                     top = 0, left = 0;
        int                     dx, dy;
-       Cursor                  cursor;
        unsigned int            shape; /* cursor style */
+       xcb_cursor_t            cursor;
+       xcb_font_t              cursor_font;
        xcb_grab_pointer_reply_t        *gpr;
        xcb_query_pointer_reply_t       *xpr;
 
@@ -4354,7 +4355,12 @@ resize(struct ws_win *win, union arg *args)
        else
                shape = (left) ? XC_bottom_left_corner : XC_bottom_right_corner;
 
-       cursor = XCreateFontCursor(display, shape);
+       cursor_font = xcb_generate_id(conn);
+       xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+
+       cursor = xcb_generate_id(conn);
+       xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+               shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
 
        gpr = xcb_grab_pointer_reply(conn,
                xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
@@ -4362,7 +4368,8 @@ resize(struct ws_win *win, union arg *args)
                cursor, XCB_CURRENT_TIME),
                NULL);
        if (!gpr) {
-               XFreeCursor(display, cursor);
+               xcb_free_cursor(conn, cursor);
+               xcb_close_font(conn, cursor_font);
                free(xpr);
                return;
        }
@@ -4439,7 +4446,9 @@ resize(struct ws_win *win, union arg *args)
        store_float_geom(win,r);
 
        xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
-       XFreeCursor(display, cursor);
+       xcb_free_cursor(conn, cursor);
+       xcb_close_font(conn, cursor_font);
+       free(gpr);
        free(xpr);
 
        /* drain events */
@@ -4468,6 +4477,8 @@ move(struct ws_win *win, union arg *args)
        Time                    time = 0;
        int                     move_step = 0;
        struct swm_region       *r = NULL;
+       xcb_font_t                      cursor_font;
+       xcb_cursor_t                    cursor;
        xcb_grab_pointer_reply_t        *gpr;
        xcb_query_pointer_reply_t       *qpr;
 
@@ -4524,20 +4535,33 @@ move(struct ws_win *win, union arg *args)
                return;
        }
 
+       cursor_font = xcb_generate_id(conn);
+       xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+       
+       cursor = xcb_generate_id(conn);
+       xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+               XC_fleur, XC_fleur + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+
        gpr = xcb_grab_pointer_reply(conn,
                xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
                        XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC,
-                       XCB_WINDOW_NONE, XCreateFontCursor(display, XC_fleur),
-                       XCB_CURRENT_TIME),
+                       XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME),
                NULL);
-       if (!gpr)
-               return; 
+       if (!gpr) {
+               xcb_free_cursor(conn, cursor);
+               xcb_close_font(conn, cursor_font);
+               return;
+       }
 
        /* get cursor offset from window root */
        qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id),
                NULL);
-       if (!qpr)
+       if (!qpr) {
+               xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
+               xcb_free_cursor(conn, cursor);
+               xcb_close_font(conn, cursor_font);
                return;
+       }
        do {
                XMaskEvent(display, MOUSEMASK | ExposureMask |
                    SubstructureRedirectMask, &ev);
@@ -4567,8 +4591,10 @@ move(struct ws_win *win, union arg *args)
                update_window(win);
        }
        store_float_geom(win, r);
-       xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
        free(qpr);
+       xcb_free_cursor(conn, cursor);
+       xcb_close_font(conn, cursor_font);
+       xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
 
        /* drain events */
        drain_enter_notify();
@@ -6250,9 +6276,9 @@ void
 set_child_transient(struct ws_win *win, Window *trans)
 {
        struct ws_win           *parent, *w;
-       XWMHints                *wmh = NULL;
        struct swm_region       *r;
        struct workspace        *ws;
+       xcb_wm_hints_t          wmh;
 
        parent = find_window(win->transient);
        if (parent)
@@ -6261,24 +6287,18 @@ set_child_transient(struct ws_win *win, Window *trans)
                DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist"
                    " for 0x%x trans 0x%x\n", win->id, win->transient);
 
-               if (win->hints == NULL) {
-                       warnx("no hints for 0x%x", win->id);
-                       return;
-               }
-
                r = root_to_region(win->wa.root);
                ws = r->ws;
                /* parent doen't exist in our window list */
                TAILQ_FOREACH(w, &ws->winlist, entry) {
-                       if (wmh)
-                               XFree(wmh);
-
-                       if ((wmh = XGetWMHints(display, w->id)) == NULL) {
+                       if (xcb_icccm_get_wm_hints_reply(conn,
+                                       xcb_icccm_get_wm_hints(conn, w->id),
+                                       &wmh, NULL) != 1) {
                                warnx("can't get hints for 0x%x", w->id);
                                continue;
                        }
 
-                       if (win->hints->window_group != wmh->window_group)
+                       if (win->hints.window_group != wmh.window_group)
                                continue;
 
                        w->child_trans = win;
@@ -6289,9 +6309,6 @@ set_child_transient(struct ws_win *win, Window *trans)
                        break;
                }
        }
-
-       if (wmh)
-               XFree(wmh);
 }
 
 long
@@ -6404,7 +6421,9 @@ manage_window(xcb_window_t id)
        }
        XGetWindowAttributes(display, id, &win->wa);
        XGetWMNormalHints(display, id, &win->sh, &win->sh_mask);
-       win->hints = XGetWMHints(display, id);
+       xcb_icccm_get_wm_hints_reply(conn,
+               xcb_icccm_get_wm_hints(conn, id),
+               &win->hints, NULL);
        XGetTransientForHint(display, id, &trans);
        if (trans) {
                win->transient = trans;
@@ -6633,11 +6652,6 @@ unmanage_window(struct ws_win *win)
 
        focus_prev(win);
 
-       if (win->hints) {
-               XFree(win->hints);
-               win->hints = NULL;
-       }
-
        TAILQ_REMOVE(&win->ws->winlist, win, entry);
        TAILQ_INSERT_TAIL(&win->ws->unmanagedlist, win, entry);
 }
@@ -7018,20 +7032,27 @@ maprequest(XEvent *e)
 {
        struct ws_win           *win;
        struct swm_region       *r;
-       XWindowAttributes       wa;
        XMapRequestEvent        *ev = &e->xmaprequest;
+       xcb_get_window_attributes_reply_t *war;
 
        DNPRINTF(SWM_D_EVENT, "maprequest: window: 0x%lx\n",
            e->xmaprequest.window);
 
-       if (!XGetWindowAttributes(display, ev->window, &wa))
+       war = xcb_get_window_attributes_reply(conn,
+               xcb_get_window_attributes(conn, ev->window),
+               NULL);
+       if (!war)
                return;
-       if (wa.override_redirect)
+       if (war->override_redirect) {
+               free(war);
                return;
+       }       
+       free(war);
 
        win = manage_window(e->xmaprequest.window);
-       if (win == NULL)
+       if (win == NULL) {
                return; /* can't happen */
+       }
 
        stack();
 
@@ -7495,8 +7516,10 @@ setup_screens(void)
 {
        int                     i, j, k, num_screens;
        struct workspace        *ws;
-       uint32_t                gcv[1];
+       uint32_t                gcv[1], wa[1];
        const xcb_query_extension_reply_t *qep;
+       xcb_cursor_t                            cursor;
+       xcb_font_t                              cursor_font;
        xcb_randr_query_version_cookie_t        c;
        xcb_randr_query_version_reply_t         *r;
 
@@ -7518,6 +7541,14 @@ setup_screens(void)
        qep = xcb_get_extension_data(conn, &xcb_randr_id);
        xrandr_eventbase = qep->first_event;
 
+       cursor_font = xcb_generate_id(conn);
+       xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
+
+       cursor = xcb_generate_id(conn);
+       xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
+               XC_left_ptr, XC_left_ptr + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+       wa[0] = cursor;
+
        /* map physical screens */
        for (i = 0; i < num_screens; i++) {
                DNPRINTF(SWM_D_WS, "setup_screens: init screen: %d\n", i);
@@ -7540,8 +7571,8 @@ setup_screens(void)
                        XCB_GC_GRAPHICS_EXPOSURES, gcv);
 
                /* set default cursor */
-               XDefineCursor(display, screens[i].root,
-                   XCreateFontCursor(display, XC_left_ptr));
+               xcb_change_window_attributes(conn, screens[i].root,
+                       XCB_CW_CURSOR, wa);     
 
                /* init all workspaces */
                /* XXX these should be dynamically allocated too */
@@ -7569,6 +7600,8 @@ setup_screens(void)
                        xcb_randr_select_input(conn, screens[i].root,
                                XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE);
        }
+       xcb_free_cursor(conn, cursor);
+       xcb_close_font(conn, cursor_font);
 }
 
 void