X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=ed9a201a75dccac1177a65a7bc22d7f682cfb061;hb=bf1f77e6be10b75637ec17bafcae79c650cf0721;hp=a4759cf58296186928b9642c0f3c2c58177b9575;hpb=b882ef093fb1092fcd52bd2604a1033238a87776;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index a4759cf..ed9a201 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include @@ -390,7 +391,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); @@ -6273,12 +6274,12 @@ out: } void -set_child_transient(struct ws_win *win, Window *trans) +set_child_transient(struct ws_win *win, xcb_window_t *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) @@ -6287,37 +6288,28 @@ 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; win->transient = w->id; *trans = w->id; - DNPRINTF(SWM_D_MISC, "set_child_transient: asjusting " + DNPRINTF(SWM_D_MISC, "set_child_transient: adjusting " "transient to 0x%x\n", win->transient); break; } } - - if (wmh) - XFree(wmh); } long @@ -6364,19 +6356,20 @@ tryharder: struct ws_win * manage_window(xcb_window_t id) { - Window trans = 0; + xcb_window_t trans = XCB_WINDOW_NONE; struct workspace *ws; struct ws_win *win, *ww; - int format, i, ws_idx, n, border_me = 0; + int format, i, ws_idx, border_me = 0; unsigned long nitems, bytes; Atom ws_idx_atom = 0, type; - Atom *prot = NULL, *pp; unsigned char ws_idx_str[SWM_PROPLEN], *prop = NULL; struct swm_region *r; const char *errstr; struct pid_e *p; struct quirk *qp; uint32_t event_mask; + xcb_atom_t prot; + xcb_get_wm_protocols_reply_t wpr; if ((win = find_window(id)) != NULL) return (win); /* already being managed */ @@ -6430,8 +6423,12 @@ manage_window(xcb_window_t id) } XGetWindowAttributes(display, id, &win->wa); XGetWMNormalHints(display, id, &win->sh, &win->sh_mask); - win->hints = XGetWMHints(display, id); - XGetTransientForHint(display, id, &trans); + 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), + &trans, NULL); if (trans) { win->transient = trans; set_child_transient(win, &trans); @@ -6439,16 +6436,21 @@ 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); /* get supported protocols */ - if (XGetWMProtocols(display, id, &prot, &n)) { - for (i = 0, pp = prot; i < n; i++, pp++) { - if (*pp == takefocus) + if (xcb_get_wm_protocols_reply(conn, + xcb_get_wm_protocols(conn, id, prot), + &wpr, NULL)) { + for (i = 0; i < wpr.atoms_len; i++) { + if (wpr.atoms[i] == takefocus) win->take_focus = 1; - if (*pp == adelete) + if (wpr.atoms[i] == adelete) win->can_delete = 1; } - if (prot) - XFree(prot); + xcb_get_wm_protocols_reply_wipe(&wpr); } win->iconic = get_iconic(win); @@ -6659,11 +6661,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); } @@ -7044,20 +7041,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();