X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=53aaba27ab2b46ab3f43fb6e5807eedec65dec74;hb=59e91c45a7dd7ca913323f8391d8bce0d9f0769d;hp=ba61a537b5867b671b1e4fb94ba91a5f88130b99;hpb=1a94af33a93c247570ce4fbc63261d7d00a49f2f;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index ba61a53..53aaba2 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -136,7 +136,7 @@ static const char *buildstr = SPECTRWM_VERSION; #define xcb_icccm_get_wm_transient_for_reply xcb_get_wm_transient_for_reply #endif -/*#define SWM_DEBUG*/ +#define SWM_DEBUG #ifdef SWM_DEBUG #define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0) #define DNPRINTF(n,x...) do { if (swm_debug & n) fprintf(stderr, x); } while (0) @@ -194,13 +194,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_mask & PMinSize +#define SH_MIN(w) (w)->sh.flags & XCB_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_mask & PMaxSize +#define SH_MAX(w) (w)->sh.flags & XCB_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_mask & PResizeInc +#define SH_INC(w) (w)->sh.flags & XCB_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) @@ -388,8 +388,7 @@ struct ws_win { struct workspace *ws; /* always valid */ struct swm_screen *s; /* always valid, never changes */ xcb_get_geometry_reply_t *wa; - XSizeHints sh; - long sh_mask; + xcb_size_hints_t sh; xcb_get_wm_class_reply_t ch; xcb_wm_hints_t hints; }; @@ -2147,10 +2146,10 @@ config_win(struct ws_win *win, XConfigureRequestEvent *ev) ce.window = ev->window; /* make response appear more WM_SIZE_HINTS-compliant */ - if (win->sh_mask) + if (win->sh.flags) DNPRINTF(SWM_D_MISC, "config_win: hints: window: 0x%x," - " sh_mask: %ld, min: %d x %d, max: %d x %d, inc: " - "%d x %d\n", win->id, win->sh_mask, SH_MIN_W(win), + " sh.flags: %u, min: %d x %d, max: %d x %d, inc: " + "%d x %d\n", win->id, win->sh.flags, SH_MIN_W(win), SH_MIN_H(win), SH_MAX_W(win), SH_MAX_H(win), SH_INC_W(win), SH_INC_H(win)); @@ -3778,14 +3777,15 @@ get_win_name(xcb_window_t win) c = xcb_icccm_get_wm_name(conn, win); if (xcb_icccm_get_wm_name_reply(conn, c, &r, NULL)) { - name = malloc(r.name_len + 1); - if (!name) { - xcb_get_text_property_reply_wipe(&r); - return (NULL); + if (r.name_len > 0) { + name = malloc(r.name_len + 1); + if (!name) { + xcb_get_text_property_reply_wipe(&r); + return (NULL); + } + memcpy(name, r.name, r.name_len); + name[r.name_len] = '\0'; } - memcpy(name, r.name, r.name_len); - name[r.name_len] = '\0'; - xcb_get_text_property_reply_wipe(&r); } @@ -6394,6 +6394,7 @@ manage_window(xcb_window_t id) int i, ws_idx, border_me = 0; xcb_atom_t ws_idx_atom = XCB_ATOM_NONE; char ws_idx_str[SWM_PROPLEN], *prop = NULL; + size_t proplen; struct swm_region *r; const char *errstr; struct pid_e *p; @@ -6449,26 +6450,32 @@ manage_window(xcb_window_t id) /* Get all the window data in one shot */ ws_idx_atom = get_atom_from_string("_SWM_WS"); + fprintf(stderr, "ws_idx_atom: %d\n", ws_idx_atom); if (ws_idx_atom) { 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'; + proplen = xcb_get_property_value_length(gpr); + if (proplen > 0) { + prop = malloc(proplen + 1); + if (prop) { + memcpy(prop, + xcb_get_property_value(gpr), + proplen); + prop[proplen] = '\0'; + } } free(gpr); } - } win->wa = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, id), NULL); - XGetWMNormalHints(display, id, &win->sh, &win->sh_mask); + xcb_get_wm_normal_hints_reply(conn, + xcb_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); @@ -6594,7 +6601,7 @@ manage_window(xcb_window_t id) xcb_get_wm_class(conn, win->id), &win->ch, NULL)) { DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n", - win->ch.class, win->ch.instance_name); + win->ch.class_name, win->ch.instance_name); /* java is retarded so treat it special */ if (strstr(win->ch.instance_name, "sun-awt")) { @@ -6827,7 +6834,7 @@ configurerequest(XEvent *e) XConfigureWindow(display, ev->window, ev->value_mask, &wc); } else if ((!win->manual || win->quirks & SWM_Q_ANYWHERE) && - !(win->sh_mask & EWMH_F_FULLSCREEN)) { + !(win->ewmh_flags & EWMH_F_FULLSCREEN)) { win->g_float.x = ev->x - X(win->ws->r); win->g_float.y = ev->y - Y(win->ws->r); win->g_float.w = ev->width; @@ -6857,7 +6864,9 @@ configurenotify(XEvent *e) win = find_window(e->xconfigure.window); if (win) { - XGetWMNormalHints(display, win->id, &win->sh, &win->sh_mask); + xcb_get_wm_normal_hints_reply(conn, + xcb_get_wm_normal_hints(conn, win->id), + &win->sh, NULL); adjust_font(win); if (font_adjusted) stack(); @@ -7126,15 +7135,28 @@ propertynotify(XEvent *e) struct ws_win *win; XPropertyEvent *ev = &e->xproperty; #ifdef SWM_DEBUG - xcb_get_atom_name_reply_t *r; + char *name; + size_t len; + 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, ); + len = xcb_get_atom_name_name_length(r); + if (len > 0) { + name = malloc(len + 1); + if (name) { + memcpy(name, xcb_get_atom_name_name(r), len); + name[len] = '\0'; + + DNPRINTF(SWM_D_EVENT, + "propertynotify: window: 0x%lx, " + "atom: %s\n", + ev->window, name); + free(name); + } + } free(r); } #endif @@ -7157,7 +7179,7 @@ propertynotify(XEvent *e) long mask; XGetWMNormalHints(display, win->id, &win->sh, &mask); warnx("normal hints: flag 0x%x", win->sh.flags); - if (win->sh.flags & PMinSize) { + if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) { WIDTH(win) = win->sh.min_width; HEIGHT(win) = win->sh.min_height; warnx("min %d %d", WIDTH(win), HEIGHT(win));