X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=259f24651e73d143f6627f1e844385ce92251ab9;hb=7fa017b181fcbbae699cd51e61149bc31ea04b03;hp=9e356325ac36ea2f89e6acb5732f5aaada3c99dd;hpb=7f2718bf2a6c814e138f4f70d5b04ef20a46eb8a;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 9e35632..259f246 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -123,17 +123,32 @@ static const char *buildstr = SPECTRWM_VERSION; #endif #if defined(__OpenBSD__) -#define xcb_icccm_wm_hints_t xcb_wm_hints_t -#define xcb_icccm_get_wm_hints xcb_get_wm_hints -#define xcb_icccm_get_wm_hints_reply xcb_get_wm_hints_reply +#define XCB_ICCCM_SIZE_HINT_P_MIN_SIZE XCB_SIZE_HINT_P_MIN_SIZE +#define XCB_ICCCM_SIZE_HINT_P_MAX_SIZE XCB_SIZE_HINT_P_MAX_SIZE +#define XCB_ICCCM_SIZE_HINT_P_RESIZE_INC XCB_SIZE_HINT_P_RESIZE_INC #define XCB_ICCCM_WM_HINT_X_URGENCY XCB_WM_HINT_X_URGENCY #define XCB_ICCCM_WM_STATE_ICONIC XCB_WM_STATE_ICONIC #define XCB_ICCCM_WM_STATE_WITHDRAWN XCB_WM_STATE_WITHDRAWN #define XCB_ICCCM_WM_STATE_NORMAL XCB_WM_STATE_NORMAL +#define xcb_icccm_get_text_property_reply_t xcb_get_text_property_reply_t +#define xcb_icccm_get_text_property_reply_wipe xcb_get_text_property_reply_wipe +#define xcb_icccm_get_wm_class xcb_get_wm_class +#define xcb_icccm_get_wm_class_reply xcb_get_wm_class_reply +#define xcb_icccm_get_wm_class_reply_t xcb_get_wm_class_reply_t +#define xcb_icccm_get_wm_class_reply_wipe xcb_get_wm_class_reply_wipe +#define xcb_icccm_get_wm_hints xcb_get_wm_hints +#define xcb_icccm_get_wm_hints_reply xcb_get_wm_hints_reply #define xcb_icccm_get_wm_name xcb_get_wm_name #define xcb_icccm_get_wm_name_reply xcb_get_wm_name_reply +#define xcb_icccm_get_wm_normal_hints xcb_get_wm_normal_hints +#define xcb_icccm_get_wm_normal_hints_reply xcb_get_wm_normal_hints_reply +#define xcb_icccm_get_wm_protocols xcb_get_wm_protocols +#define xcb_icccm_get_wm_protocols_reply xcb_get_wm_protocols_reply +#define xcb_icccm_get_wm_protocols_reply_t xcb_get_wm_protocols_reply_t +#define xcb_icccm_get_wm_protocols_reply_wipe xcb_get_wm_protocols_reply_wipe #define xcb_icccm_get_wm_transient_for xcb_get_wm_transient_for #define xcb_icccm_get_wm_transient_for_reply xcb_get_wm_transient_for_reply +#define xcb_icccm_wm_hints_t xcb_wm_hints_t #endif /*#define SWM_DEBUG*/ @@ -194,13 +209,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.flags & XCB_SIZE_HINT_P_MIN_SIZE +#define SH_MIN(w) (w)->sh.flags & XCB_ICCCM_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.flags & XCB_SIZE_HINT_P_MAX_SIZE +#define SH_MAX(w) (w)->sh.flags & XCB_ICCCM_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.flags & XCB_SIZE_HINT_P_RESIZE_INC +#define SH_INC(w) (w)->sh.flags & XCB_ICCCM_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) @@ -240,6 +255,7 @@ int xrandr_eventbase; unsigned int numlockmask = 0; Display *display; xcb_connection_t *conn; +xcb_key_symbols_t *syms; int cycle_empty = 0; int cycle_visible = 0; @@ -389,8 +405,8 @@ struct ws_win { struct swm_screen *s; /* always valid, never changes */ xcb_get_geometry_reply_t *wa; xcb_size_hints_t sh; - xcb_get_wm_class_reply_t ch; - xcb_wm_hints_t hints; + xcb_icccm_get_wm_class_reply_t ch; + xcb_icccm_wm_hints_t hints; }; TAILQ_HEAD(ws_win_list, ws_win); @@ -1486,6 +1502,8 @@ bar_print(struct swm_region *r, const char *s) sizeof(rect), &rect); /* draw back buffer */ + gcv[0] = r->s->c[SWM_S_COLOR_BAR].color; + xcb_change_gc(conn, r->s->bar_gc, XCB_GC_BACKGROUND, gcv); gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x, @@ -2259,13 +2277,11 @@ void fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers) { xcb_key_press_event_t event; - xcb_key_symbols_t *syms; xcb_keycode_t *keycode; if (win == NULL) return; - syms = xcb_key_symbols_alloc(conn); keycode = xcb_key_symbols_get_keycode(syms, keysym); event.event = win->id; @@ -2288,8 +2304,6 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers) xcb_send_event(conn, True, win->id, XCB_EVENT_MASK_KEY_RELEASE, (char *)&event); xcb_flush(conn); - - xcb_key_symbols_free(syms); } void @@ -2305,7 +2319,11 @@ restart(struct swm_region *r, union arg *args) bar_extra_stop(); bar_extra = 1; unmap_all(); - XCloseDisplay(display); + + xcb_key_symbols_free(syms); + xcb_flush(conn); + xcb_disconnect(conn); + execvp(start_argv[0], start_argv); warn("execvp failed"); quit(NULL, NULL); @@ -3779,20 +3797,20 @@ get_win_name(xcb_window_t win) { char *name = NULL; xcb_get_property_cookie_t c; - xcb_get_text_property_reply_t r; + xcb_icccm_get_text_property_reply_t r; c = xcb_icccm_get_wm_name(conn, win); if (xcb_icccm_get_wm_name_reply(conn, c, &r, NULL)) { if (r.name_len > 0) { name = malloc(r.name_len + 1); if (!name) { - xcb_get_text_property_reply_wipe(&r); + xcb_icccm_get_text_property_reply_wipe(&r); return (NULL); } memcpy(name, r.name, r.name_len); name[r.name_len] = '\0'; } - xcb_get_text_property_reply_wipe(&r); + xcb_icccm_get_text_property_reply_wipe(&r); } return (name); @@ -5530,15 +5548,10 @@ updatenumlockmask(void) unsigned int i, j; xcb_get_modifier_mapping_reply_t *modmap_r; xcb_keycode_t *modmap, kc; - xcb_key_symbols_t *syms; DNPRINTF(SWM_D_MISC, "updatenumlockmask\n"); numlockmask = 0; - syms = xcb_key_symbols_alloc(conn); - if (!syms) - return; - modmap_r = xcb_get_modifier_mapping_reply(conn, xcb_get_modifier_mapping(conn), NULL); @@ -5556,7 +5569,6 @@ updatenumlockmask(void) } free(modmap_r); } - xcb_key_symbols_free(syms); } void @@ -5564,7 +5576,7 @@ grabkeys(void) { int num_screens; unsigned int j, k; - KeyCode code; + xcb_keycode_t *code; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask | LockMask }; struct key *kp; @@ -5579,12 +5591,14 @@ grabkeys(void) xcb_ungrab_key(conn, XCB_GRAB_ANY, screens[k].root, XCB_MOD_MASK_ANY); RB_FOREACH(kp, key_tree, &keys) { - if ((code = XKeysymToKeycode(display, kp->keysym))) + if ((code = xcb_key_symbols_get_keycode(syms, + kp->keysym))) for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(display, code, + xcb_grab_key(conn, True, + screens[k].root, kp->mod | modifiers[j], - screens[k].root, True, - GrabModeAsync, GrabModeAsync); + *code, XCB_GRAB_MODE_ASYNC, + XCB_GRAB_MODE_ASYNC); } } } @@ -6334,7 +6348,7 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans) struct ws_win *parent, *w; struct swm_region *r; struct workspace *ws; - xcb_wm_hints_t wmh; + xcb_icccm_wm_hints_t wmh; parent = find_window(win->transient); if (parent) @@ -6425,7 +6439,7 @@ manage_window(xcb_window_t id) uint32_t event_mask; xcb_atom_t prot; xcb_get_property_reply_t *gpr; - xcb_get_wm_protocols_reply_t wpr; + xcb_icccm_get_wm_protocols_reply_t wpr; if ((win = find_window(id)) != NULL) return (win); /* already being managed */ @@ -6473,7 +6487,6 @@ 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, @@ -6496,14 +6509,14 @@ manage_window(xcb_window_t id) win->wa = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, id), NULL); - xcb_get_wm_normal_hints_reply(conn, - xcb_get_wm_normal_hints(conn, id), + xcb_icccm_get_wm_normal_hints_reply(conn, + xcb_icccm_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); - xcb_get_wm_transient_for_reply(conn, - xcb_get_wm_transient_for(conn, id), + xcb_icccm_get_wm_transient_for_reply(conn, + xcb_icccm_get_wm_transient_for(conn, id), &trans, NULL); if (trans) { win->transient = trans; @@ -6512,13 +6525,11 @@ 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); + prot = get_atom_from_string("WM_PROTOCOLS"); + /* get supported protocols */ - if (xcb_get_wm_protocols_reply(conn, - xcb_get_wm_protocols(conn, id, prot), + if (xcb_icccm_get_wm_protocols_reply(conn, + xcb_icccm_get_wm_protocols(conn, id, prot), &wpr, NULL)) { for (i = 0; i < wpr.atoms_len; i++) { if (wpr.atoms[i] == takefocus) @@ -6526,7 +6537,7 @@ manage_window(xcb_window_t id) if (wpr.atoms[i] == adelete) win->can_delete = 1; } - xcb_get_wm_protocols_reply_wipe(&wpr); + xcb_icccm_get_wm_protocols_reply_wipe(&wpr); } win->iconic = get_iconic(win); @@ -6620,8 +6631,8 @@ manage_window(xcb_window_t id) ewmh_autoquirk(win); - if (xcb_get_wm_class_reply(conn, - xcb_get_wm_class(conn, win->id), + if (xcb_icccm_get_wm_class_reply(conn, + xcb_icccm_get_wm_class(conn, win->id), &win->ch, NULL)) { DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n", win->ch.class_name, win->ch.instance_name); @@ -6706,7 +6717,7 @@ free_window(struct ws_win *win) if (win->wa) free(win->wa); - xcb_get_wm_class_reply_wipe(&win->ch); + xcb_icccm_get_wm_class_reply_wipe(&win->ch); kill_refs(win); @@ -6834,28 +6845,49 @@ configurerequest(XEvent *e) { XConfigureRequestEvent *ev = &e->xconfigurerequest; struct ws_win *win; - int new = 0; - XWindowChanges wc; + int new = 0, i = 0; + uint16_t mask = 0; + uint32_t wc[7]; if ((win = find_window(ev->window)) == NULL) if ((win = find_unmanaged_window(ev->window)) == NULL) new = 1; if (new) { - bzero(&wc, sizeof wc); - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; + if (ev->value_mask & XCB_CONFIG_WINDOW_X) { + mask |= XCB_CONFIG_WINDOW_X; + wc[i++] = ev->x; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_Y) { + mask |= XCB_CONFIG_WINDOW_Y; + wc[i++] = ev->y; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_WIDTH) { + mask |= XCB_CONFIG_WINDOW_WIDTH; + wc[i++] = ev->width; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_HEIGHT) { + mask |= XCB_CONFIG_WINDOW_HEIGHT; + wc[i++] = ev->height; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) { + mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH; + wc[i++] = ev->border_width; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_SIBLING) { + mask |= XCB_CONFIG_WINDOW_SIBLING; + wc[i++] = ev->above; + } + if (ev->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) { + mask |= XCB_CONFIG_WINDOW_STACK_MODE; + wc[i++] = ev->detail; + } DNPRINTF(SWM_D_EVENT, "configurerequest: new window: 0x%lx, " "new: %s, (x,y) w x h: (%d,%d) %d x %d\n", ev->window, - YESNO(new), wc.x, wc.y, wc.width, wc.height); + YESNO(new), wc[0], wc[1], wc[2], wc[3]); - XConfigureWindow(display, ev->window, ev->value_mask, &wc); + xcb_configure_window(conn, ev->window, mask, wc); } else if ((!win->manual || win->quirks & SWM_Q_ANYWHERE) && !(win->ewmh_flags & EWMH_F_FULLSCREEN)) { win->g_float.x = ev->x - X(win->ws->r); @@ -6887,8 +6919,8 @@ configurenotify(XEvent *e) win = find_window(e->xconfigure.window); if (win) { - xcb_get_wm_normal_hints_reply(conn, - xcb_get_wm_normal_hints(conn, win->id), + xcb_icccm_get_wm_normal_hints_reply(conn, + xcb_icccm_get_wm_normal_hints(conn, win->id), &win->sh, NULL); adjust_font(win); if (font_adjusted) @@ -7198,9 +7230,10 @@ propertynotify(XEvent *e) switch (ev->atom) { #if 0 - case XA_WM_NORMAL_HINTS: - long mask; - XGetWMNormalHints(display, win->id, &win->sh, &mask); + case XCB_ATOM_WM_NORMAL_HINTS: + xcb_icccm_get_wm_normal_hints(conn, + xcb_iccom_get_wm_normal_hints(conn, win->id), + &win->sh, NULL); warnx("normal hints: flag 0x%x", win->sh.flags); if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) { WIDTH(win) = win->sh.min_width; @@ -7820,6 +7853,10 @@ main(int argc, char *argv[]) if (pwd == NULL) errx(1, "invalid user: %d", getuid()); + syms = xcb_key_symbols_alloc(conn); + if (syms == NULL) + errx(1, "unable to allocate key symbols"); + setup_globals(); setup_screens(); setup_keys(); @@ -7967,8 +8004,9 @@ done: if (screens[i].bar_gc != 0) xcb_free_gc(conn, screens[i].bar_gc); XFreeFontSet(display, bar_fs); + + xcb_key_symbols_free(syms); xcb_disconnect(conn); - XCloseDisplay(display); return (0); }