X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=ba61a537b5867b671b1e4fb94ba91a5f88130b99;hb=1a94af33a93c247570ce4fbc63261d7d00a49f2f;hp=0d8242e42dc6c15212fee0238b7b500753ebaf60;hpb=fb93824e11a6d7bf319c685fcfa7a6913c4d83d5;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 0d8242e..ba61a53 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -375,7 +375,7 @@ struct ws_win { int floatmaxed; /* whether maxed by max_stack */ int floating; int manual; - int iconic; + int32_t iconic; int bordered; unsigned int ewmh_flags; int font_size_boundary[SWM_MAX_FONT_STEPS]; @@ -387,10 +387,10 @@ struct ws_win { unsigned long quirks; struct workspace *ws; /* always valid */ struct swm_screen *s; /* always valid, never changes */ - XWindowAttributes wa; + xcb_get_geometry_reply_t *wa; XSizeHints sh; long sh_mask; - XClassHint ch; + xcb_get_wm_class_reply_t ch; xcb_wm_hints_t hints; }; TAILQ_HEAD(ws_win_list, ws_win); @@ -733,29 +733,28 @@ update_iconic(struct ws_win *win, int newv) xcb_delete_property(conn, win->id, iprop); } -int +int32_t get_iconic(struct ws_win *win) { - int32_t v = 0, *vtmp; + int32_t v = 0; xcb_atom_t iprop; - xcb_get_property_cookie_t pc; xcb_get_property_reply_t *pr = NULL; iprop = get_atom_from_string("_SWM_ICONIC"); if (iprop == XCB_ATOM_NONE) goto out; - pc = xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER, - 0, 1); - pr = xcb_get_property_reply(conn, pc, NULL); + pr = xcb_get_property_reply(conn, + xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER, + 0, 1), + NULL); if (!pr) goto out; if (pr->type != XCB_ATOM_INTEGER || pr->format != 32) goto out; - vtmp = xcb_get_property_value(pr); - v = *vtmp; + v = *((int32_t *)xcb_get_property_value(pr)); out: - if (pr != NULL) + if (pr) free(pr); return (v); } @@ -1016,10 +1015,10 @@ ewmh_get_win_state(struct ws_win *win) states = xcb_get_property_value(r); n = xcb_get_property_value_length(r); - free(r); - for (i = 0; i < n; i++) ewmh_update_win_state(win, states[i], _NET_WM_STATE_ADD); + + free(r); } /* events */ @@ -1519,8 +1518,8 @@ bar_class_name(char *s, size_t sz, struct swm_region *r) { if (r == NULL || r->ws == NULL || r->ws->focus == NULL) return; - if (r->ws->focus->ch.res_class != NULL) - strlcat(s, r->ws->focus->ch.res_class, sz); + if (r->ws->focus->ch.class_name != NULL) + strlcat(s, r->ws->focus->ch.class_name, sz); } void @@ -1528,8 +1527,8 @@ bar_title_name(char *s, size_t sz, struct swm_region *r) { if (r == NULL || r->ws == NULL || r->ws->focus == NULL) return; - if (r->ws->focus->ch.res_name != NULL) - strlcat(s, r->ws->focus->ch.res_name, sz); + if (r->ws->focus->ch.instance_name != NULL) + strlcat(s, r->ws->focus->ch.instance_name, sz); } void @@ -3786,10 +3785,10 @@ get_win_name(xcb_window_t win) } memcpy(name, r.name, r.name_len); name[r.name_len] = '\0'; + + xcb_get_text_property_reply_wipe(&r); } - xcb_get_text_property_reply_wipe(&r); - return (name); } @@ -6321,7 +6320,7 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans) DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist" " for 0x%x trans 0x%x\n", win->id, win->transient); - r = root_to_region(win->wa.root); + r = root_to_region(win->wa->root); ws = r->ws; /* parent doen't exist in our window list */ TAILQ_FOREACH(w, &ws->winlist, entry) { @@ -6392,16 +6391,16 @@ manage_window(xcb_window_t id) xcb_window_t trans = XCB_WINDOW_NONE; struct workspace *ws; struct ws_win *win, *ww; - int format, i, ws_idx, border_me = 0; - unsigned long nitems, bytes; - Atom ws_idx_atom = 0, type; - unsigned char ws_idx_str[SWM_PROPLEN], *prop = NULL; + int i, ws_idx, border_me = 0; + xcb_atom_t ws_idx_atom = XCB_ATOM_NONE; + 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_property_reply_t *gpr; xcb_get_wm_protocols_reply_t wpr; if ((win = find_window(id)) != NULL) @@ -6449,12 +6448,26 @@ manage_window(xcb_window_t id) p = find_pid(window_get_pid(id)); /* Get all the window data in one shot */ - ws_idx_atom = XInternAtom(display, "_SWM_WS", False); + ws_idx_atom = get_atom_from_string("_SWM_WS"); if (ws_idx_atom) { - XGetWindowProperty(display, id, ws_idx_atom, 0, SWM_PROPLEN, - False, XA_STRING, &type, &format, &nitems, &bytes, &prop); + gpr = xcb_get_property_reply(conn, + xcb_get_property(conn, False, id, ws_idx_atom, + XCB_ATOM_STRING, 0, SWM_PROPLEN), + NULL); + if (gpr) { + prop = malloc(xcb_get_property_value_length(gpr) + 1); + if (prop) { + memcpy(prop, xcb_get_property_value(gpr), + xcb_get_property_value_length(gpr)); + prop[xcb_get_property_value_length(gpr)] = '\0'; + } + free(gpr); + } + } - XGetWindowAttributes(display, id, &win->wa); + win->wa = xcb_get_geometry_reply(conn, + xcb_get_geometry(conn, id), + NULL); XGetWMNormalHints(display, id, &win->sh, &win->sh_mask); xcb_icccm_get_wm_hints_reply(conn, xcb_icccm_get_wm_hints(conn, id), @@ -6493,7 +6506,7 @@ manage_window(xcb_window_t id) * a workspace (either by spawn() or manually moving), and isn't * transient, * put it in the same workspace */ - r = root_to_region(win->wa.root); + r = root_to_region(win->wa->root); if (p) { ws = &r->s->ws[p->ws]; TAILQ_REMOVE(&pidlist, p, entry); @@ -6501,7 +6514,7 @@ manage_window(xcb_window_t id) p = NULL; } else if (prop && win->transient == 0) { DNPRINTF(SWM_D_PROP, "manage_window: get _SWM_WS: %s\n", prop); - ws_idx = strtonum((const char *)prop, 0, workspace_limit - 1, + ws_idx = strtonum(prop, 0, workspace_limit - 1, &errstr); if (errstr) { DNPRINTF(SWM_D_EVENT, "manage_window: window: #%s: %s", @@ -6547,10 +6560,10 @@ manage_window(xcb_window_t id) } /* ignore window border if there is one. */ - WIDTH(win) = win->wa.width; - HEIGHT(win) = win->wa.height; - X(win) = win->wa.x + win->wa.border_width; - Y(win) = win->wa.y + win->wa.border_width; + WIDTH(win) = win->wa->width; + HEIGHT(win) = win->wa->height; + X(win) = win->wa->x + win->wa->border_width; + Y(win) = win->wa->y + win->wa->border_width; win->bordered = 0; win->g_floatvalid = 0; win->floatmaxed = 0; @@ -6564,34 +6577,37 @@ manage_window(xcb_window_t id) /* Set window properties so we can remember this after reincarnation */ if (ws_idx_atom && prop == NULL && - snprintf((char *)ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < + snprintf(ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < SWM_PROPLEN) { DNPRINTF(SWM_D_PROP, "manage_window: set _SWM_WS: %s\n", ws_idx_str); - XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8, - PropModeReplace, ws_idx_str, strlen((char *)ws_idx_str)); + xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, + ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str), + ws_idx_str); } if (prop) - XFree(prop); + free(prop); ewmh_autoquirk(win); - if (XGetClassHint(display, win->id, &win->ch)) { + if (xcb_get_wm_class_reply(conn, + xcb_get_wm_class(conn, win->id), + &win->ch, NULL)) { DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n", - win->ch.res_class, win->ch.res_name); + win->ch.class, win->ch.instance_name); /* java is retarded so treat it special */ - if (strstr(win->ch.res_name, "sun-awt")) { + if (strstr(win->ch.instance_name, "sun-awt")) { win->java = 1; border_me = 1; } TAILQ_FOREACH(qp, &quirks, entry) { - if (!strcmp(win->ch.res_class, qp->class) && - !strcmp(win->ch.res_name, qp->name)) { + if (!strcmp(win->ch.class_name, qp->class) && + !strcmp(win->ch.instance_name, qp->name)) { DNPRINTF(SWM_D_CLASS, "manage_window: found: " - "class: %s, name: %s\n", win->ch.res_class, - win->ch.res_name); + "class: %s, name: %s\n", win->ch.class_name, + win->ch.instance_name); if (qp->quirk & SWM_Q_FLOAT) { win->floating = 1; border_me = 1; @@ -6657,10 +6673,10 @@ free_window(struct ws_win *win) TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry); - if (win->ch.res_class) - XFree(win->ch.res_class); - if (win->ch.res_name) - XFree(win->ch.res_name); + if (win->wa) + free(win->wa); + + xcb_get_wm_class_reply_wipe(&win->ch); kill_refs(win); @@ -7099,7 +7115,7 @@ maprequest(XEvent *e) stack(); /* make new win focused */ - r = root_to_region(win->wa.root); + r = root_to_region(win->wa->root); if (win->ws == r->ws) focus_magic(win); } @@ -7110,11 +7126,17 @@ propertynotify(XEvent *e) struct ws_win *win; XPropertyEvent *ev = &e->xproperty; #ifdef SWM_DEBUG - char *name; - name = XGetAtomName(display, ev->atom); - DNPRINTF(SWM_D_EVENT, "propertynotify: window: 0x%lx, atom: %s\n", - ev->window, name); - XFree(name); + xcb_get_atom_name_reply_t *r; + + r = xcb_get_atom_name_reply(conn, + xcb_get_atom_name(conn, ev->atom), + NULL); + if (r) { + DNPRINTF(SWM_D_EVENT, + "propertynotify: window: 0x%x, atom: %s\n", + ev->window, ); + free(r); + } #endif win = find_window(ev->window);