#include <X11/Xatom.h>
#include <X11/Xlib-xcb.h>
#include <xcb/randr.h>
+#include <xcb/xcb_atom.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_keysyms.h>
#include <X11/Xproto.h>
#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*/
#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_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_mask & PMaxSize
+#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_mask & PResizeInc
+#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)
unsigned int numlockmask = 0;
Display *display;
xcb_connection_t *conn;
+xcb_key_symbols_t *syms;
int cycle_empty = 0;
int cycle_visible = 0;
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];
unsigned long quirks;
struct workspace *ws; /* always valid */
struct swm_screen *s; /* always valid, never changes */
- XWindowAttributes wa;
- XSizeHints sh;
- long sh_mask;
- XClassHint ch;
- XWMHints *hints;
+ xcb_get_geometry_reply_t *wa;
+ xcb_size_hints_t sh;
+ xcb_icccm_get_wm_class_reply_t ch;
+ xcb_icccm_wm_hints_t hints;
};
TAILQ_HEAD(ws_win_list, ws_win);
void map_window_raised(xcb_window_t);
void do_sync(void);
xcb_screen_t *get_screen(int);
+int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *);
+
+int
+parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb)
+{
+ unsigned int tmpr, tmpg, tmpb;
+
+ if (sscanf(rgb, "rgb:%x/%x/%x", &tmpr, &tmpg, &tmpb) != 3)
+ return (-1);
+
+ *rr = tmpr << 8;
+ *gg = tmpg << 8;
+ *bb = tmpb << 8;
+
+ return (0);
+}
xcb_screen_t *
get_screen(int screen)
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);
}
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 */
char cname[32] = "#";
xcb_screen_t *screen;
xcb_colormap_t cmap;
- xcb_alloc_named_color_cookie_t c;
- xcb_alloc_named_color_reply_t *r;
+ xcb_alloc_color_reply_t *cr;
+ xcb_alloc_named_color_reply_t *nr;
+ uint16_t rr, gg, bb;
- /* XXX - does not support rgb:/RR/GG/BB
- * will need to use xcb_alloc_color
- */
screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
cmap = screen->default_colormap;
- c = xcb_alloc_named_color(conn, cmap, strlen(colorname), colorname);
- r = xcb_alloc_named_color_reply(conn, c, NULL);
- if (!r) {
- strlcat(cname, colorname + 2, sizeof cname - 1);
- c = xcb_alloc_named_color(conn, cmap, strlen(cname),
- cname);
- r = xcb_alloc_named_color_reply(conn, c, NULL);
+ /* color is in format rgb://rr/gg/bb */
+ if (strncmp(colorname, "rgb:", 4) == 0) {
+ if (parse_rgb(colorname, &rr, &gg, &bb) == -1)
+ warnx("could not parse rgb %s", colorname);
+ else {
+ cr = xcb_alloc_color_reply(conn,
+ xcb_alloc_color(conn, cmap, rr, gg, bb),
+ NULL);
+ if (cr) {
+ result = cr->pixel;
+ free(cr);
+ } else
+ warnx("color '%s' not found", colorname);
+ }
+ } else {
+ nr = xcb_alloc_named_color_reply(conn,
+ xcb_alloc_named_color(conn, cmap, strlen(colorname),
+ colorname),
+ NULL);
+ if (!nr) {
+ strlcat(cname, colorname + 2, sizeof cname - 1);
+ nr = xcb_alloc_named_color_reply(conn,
+ xcb_alloc_named_color(conn, cmap, strlen(cname),
+ cname),
+ NULL);
+ }
+ if (nr) {
+ result = nr->pixel;
+ free(nr);
+ } else
+ warnx("color '%s' not found", colorname);
}
- if (r) {
- result = r->pixel;
- free(r);
- } else
- warnx("color '%s' not found", colorname);
return (result);
}
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,
{
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
{
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
drain_enter_notify(void)
{
int i = 0;
+ XEvent cne;
- while (xcb_poll_for_event(conn))
+ while (XCheckMaskEvent(display, EnterWindowMask, &cne))
i++;
DNPRINTF(SWM_D_EVENT, "drain_enter_notify: drained: %d\n", i);
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));
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;
xcb_send_event(conn, True, win->id,
XCB_EVENT_MASK_KEY_RELEASE, (char *)&event);
xcb_flush(conn);
-
- xcb_key_symbols_free(syms);
}
void
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);
void
stack_master(struct workspace *ws, struct swm_geometry *g, int rot, int flip)
{
- XWindowAttributes wa;
struct swm_geometry win_g, r_g = *g;
struct ws_win *win, *fs_win = NULL;
int i, j, s, stacks;
int split, colno, winno, mwin, msize, mscale;
int remain, missing, v_slice, reconfigure;
int bordered = 1;
+ xcb_get_window_attributes_reply_t *war;
DNPRINTF(SWM_D_STACK, "stack_master: workspace: %d, rot: %s, "
"flip: %s\n", ws->idx, YESNO(rot), YESNO(flip));
update_window(win);
}
- if (XGetWindowAttributes(display, win->id, &wa))
- if (wa.map_state == IsUnmapped)
+ war = xcb_get_window_attributes_reply(conn,
+ xcb_get_window_attributes(conn, win->id),
+ NULL);
+ if (war) {
+ if (war->map_state == XCB_MAP_STATE_UNMAPPED)
map_window_raised(win->id);
+ free(war);
+ }
last_h = win_g.h;
i++;
{
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)) {
- 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_icccm_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_icccm_get_text_property_reply_wipe(&r);
}
- xcb_get_text_property_reply_wipe(&r);
-
return (name);
}
void
updatenumlockmask(void)
{
- unsigned int i, j;
- XModifierKeymap *modmap;
+ unsigned int i, j;
+ xcb_get_modifier_mapping_reply_t *modmap_r;
+ xcb_keycode_t *modmap, kc;
DNPRINTF(SWM_D_MISC, "updatenumlockmask\n");
numlockmask = 0;
- modmap = XGetModifierMapping(display);
- for (i = 0; i < 8; i++)
- for (j = 0; j < modmap->max_keypermod; j++)
- if (modmap->modifiermap[i * modmap->max_keypermod + j]
- == XKeysymToKeycode(display, XK_Num_Lock))
- numlockmask = (1 << i);
- XFreeModifiermap(modmap);
+ modmap_r = xcb_get_modifier_mapping_reply(conn,
+ xcb_get_modifier_mapping(conn),
+ NULL);
+ if (modmap_r) {
+ modmap = xcb_get_modifier_mapping_keycodes(modmap_r);
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < modmap_r->keycodes_per_modifier; j++) {
+ kc = modmap[i * modmap_r->keycodes_per_modifier
+ + j];
+
+ if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms,
+ XK_Num_Lock)))
+ numlockmask = (1 << i);
+ }
+ }
+ free(modmap_r);
+ }
}
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;
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);
}
}
}
}
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_icccm_wm_hints_t wmh;
parent = find_window(win->transient);
if (parent)
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);
+ 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
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;
- unsigned long nitems, bytes;
- Atom ws_idx_atom = 0, type;
- Atom *prot = NULL, *pp;
- 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;
+ size_t proplen;
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_icccm_get_wm_protocols_reply_t wpr;
if ((win = find_window(id)) != NULL)
return (win); /* already being managed */
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) {
+ 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);
+ }
}
- XGetWindowAttributes(display, id, &win->wa);
- XGetWMNormalHints(display, id, &win->sh, &win->sh_mask);
- win->hints = XGetWMHints(display, id);
- XGetTransientForHint(display, id, &trans);
+ win->wa = xcb_get_geometry_reply(conn,
+ xcb_get_geometry(conn, id),
+ NULL);
+ 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_icccm_get_wm_transient_for_reply(conn,
+ xcb_icccm_get_wm_transient_for(conn, id),
+ &trans, NULL);
if (trans) {
win->transient = trans;
set_child_transient(win, &trans);
"transient: 0x%x\n", win->id, win->transient);
}
+ prot = get_atom_from_string("WM_PROTOCOLS");
+
/* get supported protocols */
- if (XGetWMProtocols(display, id, &prot, &n)) {
- for (i = 0, pp = prot; i < n; i++, pp++) {
- if (*pp == takefocus)
+ 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)
win->take_focus = 1;
- if (*pp == adelete)
+ if (wpr.atoms[i] == adelete)
win->can_delete = 1;
}
- if (prot)
- XFree(prot);
+ xcb_icccm_get_wm_protocols_reply_wipe(&wpr);
}
win->iconic = get_iconic(win);
* 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);
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",
}
/* 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;
/* 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_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.res_class, win->ch.res_name);
+ win->ch.class_name, 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;
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_icccm_get_wm_class_reply_wipe(&win->ch);
kill_refs(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);
}
{
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->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;
win = find_window(e->xconfigure.window);
if (win) {
- XGetWMNormalHints(display, win->id, &win->sh, &win->sh_mask);
+ 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)
stack();
{
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();
/* 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);
}
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);
+ 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) {
+ 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
win = find_window(ev->window);
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 & 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));
XMoveResizeWindow(display, win->id,
X(win), Y(win), WIDTH(win), HEIGHT(win));
#endif
- case XA_WM_CLASS:
- case XA_WM_NAME:
+ case XCB_ATOM_WM_CLASS:
+ case XCB_ATOM_WM_NAME:
bar_update();
break;
default:
SubstructureNotifyMask, &cne))
;
/* resend unmap because we ated it */
- XUnmapWindow(display, e->xunmap.window);
+ xcb_unmap_window(conn, e->xunmap.window);
}
if (focus_mode == SWM_FOCUS_DEFAULT)
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();
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);
}