X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=dc418dedf94f76b6e3914b5f42d78d319d6ad6f7;hb=2f2bd34ace8b99b40a06fac76f47a85384a903aa;hp=fd5b1190c61b94dda961e198348d76df72d0686b;hpb=d8971cd3d658a3057b4755a6e8b8ecd2f5e3a6ce;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index fd5b119..dc418de 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -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