#define SWM_Q_XTERM_FONTADJ (1<<3) /* adjust xterm fonts when resizing */
#define SWM_Q_FULLSCREEN (1<<4) /* remove border */
#define SWM_Q_FOCUSPREV (1<<5) /* focus on caller */
+#define SWM_Q_NOFOCUSONMAP (1<<6) /* Don't focus on window when mapped. */
+#define SWM_Q_FOCUSONMAP_SINGLE (1<<7) /* Only focus if single win of type. */
};
TAILQ_HEAD(quirk_list, quirk);
struct quirk_list quirks = TAILQ_HEAD_INITIALIZER(quirks);
{"top_right_corner", XC_top_right_corner, XCB_CURSOR_NONE},
};
+#define SWM_SPAWN_OPTIONAL 0x1
+
/* spawn */
struct spawn_prog {
TAILQ_ENTRY(spawn_prog) entry;
char *name;
int argc;
char **argv;
+ int flags;
};
TAILQ_HEAD(spawn_list, spawn_prog);
struct spawn_list spawns = TAILQ_HEAD_INITIALIZER(spawns);
void bar_print_legacy(struct swm_region *, const char *);
void bar_replace(char *, char *, struct swm_region *, size_t);
void bar_replace_pad(char *, int *, size_t);
-char * bar_replace_seq(char *, char *, struct swm_region *, size_t *,
- size_t);
+char *bar_replace_seq(char *, char *, struct swm_region *, size_t *, size_t);
void bar_setup(struct swm_region *);
void bar_title_name(char *, size_t, struct swm_region *);
void bar_toggle(struct swm_region *, union arg *);
struct ws_win *get_region_focus(struct swm_region *);
int get_region_index(struct swm_region *);
xcb_screen_t *get_screen(int);
+int get_screen_count(void);
#ifdef SWM_DEBUG
char *get_stack_mode_name(uint8_t);
#endif
void motionnotify(xcb_motion_notify_event_t *);
void move(struct ws_win *, union arg *);
void move_step(struct swm_region *, union arg *);
-uint32_t name_to_pixel(const char *);
+uint32_t name_to_pixel(int, const char *);
void name_workspace(struct swm_region *, union arg *);
void new_region(struct swm_screen *, int, int, int, int);
int parsekeys(char *, unsigned int, unsigned int *, KeySym *);
int setlayout(char *, char *, int);
void setquirk(const char *, const char *, unsigned long);
void setscreencolor(char *, int, int);
-void setspawn(const char *, const char *);
+void setspawn(const char *, const char *, int);
void setup_ewmh(void);
void setup_globals(void);
void setup_keys(void);
void spawn(int, union arg *, int);
void spawn_custom(struct swm_region *, union arg *, const char *);
int spawn_expand(struct swm_region *, union arg *, const char *, char ***);
-void spawn_insert(const char *, const char *);
+void spawn_insert(const char *, const char *, int);
void spawn_remove(struct spawn_prog *);
-void spawn_replace(struct spawn_prog *, const char *, const char *);
+void spawn_replace(struct spawn_prog *, const char *, const char *, int);
void spawn_select(struct swm_region *, union arg *, const char *, int *);
void stack_config(struct swm_region *, union arg *);
void stack_floater(struct ws_win *, struct swm_region *);
void stack_master(struct workspace *, struct swm_geometry *, int, int);
void store_float_geom(struct ws_win *, struct swm_region *);
-char * strdupsafe(const char *);
+char *strdupsafe(const char *);
void swapwin(struct swm_region *, union arg *);
void switchws(struct swm_region *, union arg *);
void teardown_ewmh(void);
void updatenumlockmask(void);
void update_modkey(unsigned int);
void update_window(struct ws_win *);
+void validate_spawns(void);
int validate_win(struct ws_win *);
int validate_ws(struct workspace *);
/*void visibilitynotify(xcb_visibility_notify_event_t *);*/
}
int
+get_screen_count(void)
+{
+ const xcb_setup_t *r;
+
+ if ((r = xcb_get_setup(conn)) == NULL) {
+ DNPRINTF(SWM_D_MISC, "get_screen_count: xcb_get_setup\n");
+ check_conn();
+ }
+
+ return xcb_setup_roots_length(r);
+}
+
+int
get_region_index(struct swm_region *r)
{
struct swm_region *rr;
for (i = 0; i < LENGTH(ewmh); i++)
ewmh[i].atom = get_atom_from_string(ewmh[i].name);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
/* Support check window will be created by workaround(). */
sup_check = get_atom_from_string("_NET_SUPPORTING_WM_CHECK");
sup_list = get_atom_from_string("_NET_SUPPORTED");
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
/* Get the support check window and destroy it */
}
uint32_t
-name_to_pixel(const char *colorname)
+name_to_pixel(int sidx, const char *colorname)
{
uint32_t result = 0;
char cname[32] = "#";
xcb_alloc_named_color_reply_t *nr;
uint16_t rr, gg, bb;
- screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
+ screen = get_screen(sidx);
cmap = screen->default_colormap;
/* color is in format rgb://rr/gg/bb */
{
int num_screens;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
if (i > 0 && i <= num_screens) {
- screens[i - 1].c[c].pixel = name_to_pixel(val);
+ screens[i - 1].c[c].pixel = name_to_pixel(i - 1, val);
free(screens[i - 1].c[c].name);
if ((screens[i - 1].c[c].name = strdup(val)) == NULL)
err(1, "strdup");
} else if (i == -1) {
for (i = 0; i < num_screens; i++) {
- screens[i].c[c].pixel = name_to_pixel(val);
+ screens[i].c[c].pixel = name_to_pixel(0, val);
free(screens[i].c[c].name);
if ((screens[i].c[c].name = strdup(val)) == NULL)
err(1, "strdup");
int sidx, num_screens;
xcb_screen_t *screen;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
if (sscanf(val, "screen[%d]:%ux%u+%u+%u", &sidx, &w, &h, &x, &y) != 5)
errx(1, "invalid custom region, "
"should be 'screen[<n>]:<n>x<n>+<n>+<n>");
for (i = 0; i < workspace_limit; i++)
urgent[i] = 0;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
for (j = 0; j < workspace_limit; j++)
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) {
/* expand the format by first passing it through strftime(3) */
bar_fmt_expand(fmtexp, sizeof fmtexp);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
TAILQ_FOREACH(r, &screens[i].rl, entry) {
if (r->bar == NULL)
}
/* update bars as necessary */
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(tmpr, &screens[i].rl, entry)
if (tmpr->bar) {
struct ws_win *win;
int i, j, num_screens;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
for (j = 0; j < workspace_limit; j++)
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry)
DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
if (screens[i].root == root)
break;
struct ws_win *win;
int i, j, num_screens;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
for (j = 0; j < workspace_limit; j++)
TAILQ_FOREACH(win, &screens[i].ws[j].unmanagedlist,
int i, j, num_screens;
xcb_query_tree_reply_t *r;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
for (j = 0; j < workspace_limit; j++)
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry)
if (win == NULL)
return;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(r, &screens[i].rl, entry)
for (x = 0; x < workspace_limit; x++) {
if (testwin == NULL)
return (0);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(r, &screens[i].rl, entry)
for (x = 0; x < workspace_limit; x++) {
int i, x, num_screens;
/* validate all ws */
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(r, &screens[i].rl, entry)
for (x = 0; x < workspace_limit; x++) {
int ridx = args->id, i, num_screens;
struct swm_region *rr = NULL;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
/* do nothing if we don't have more than one screen */
if (!(num_screens > 1 || outputs > 1))
return;
struct swm_region *rr = NULL;
int i, num_screens;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
/* do nothing if we don't have more than one screen */
if (!(num_screens > 1 || outputs > 1))
return;
DNPRINTF(SWM_D_STACK, "stack: begin\n");
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
#ifdef SWM_DEBUG
j = 0;
struct swm_region *rr = NULL;
union arg a;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
/* do nothing if we don't have more than one screen */
if (!(num_screens > 1 || outputs > 1))
return;
focus_flush();
+ /* It's possible for win to have been freed during focus_flush(). */
+ if (validate_win(win)) {
+ DNPRINTF(SWM_D_EVENT, "move: invalid win.\n");
+ goto out;
+ }
+
switch (args->id) {
case SWM_ARG_ID_WIDTHSHRINK:
WIDTH(win) -= SWM_RESIZE_STEPS;
xcb_flush(conn);
resizing = 1;
- while ((evt = xcb_wait_for_event(conn)) && resizing) {
+ while (resizing && (evt = xcb_wait_for_event(conn))) {
switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
case XCB_BUTTON_RELEASE:
DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n");
break;
default:
event_handle(evt);
+
+ /* It's possible for win to have been freed above. */
+ if (validate_win(win)) {
+ DNPRINTF(SWM_D_EVENT, "move: invalid win.\n");
+ goto out;
+ }
break;
}
free(evt);
xcb_flush(conn);
}
store_float_geom(win,r);
-
+out:
xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
free(xpr);
DNPRINTF(SWM_D_EVENT, "resize: done.\n");
focus_flush();
+ /* It's possible for win to have been freed during focus_flush(). */
+ if (validate_win(win)) {
+ DNPRINTF(SWM_D_EVENT, "move: invalid win.\n");
+ goto out;
+ }
+
move_stp = 0;
switch (args->id) {
case SWM_ARG_ID_MOVELEFT:
xcb_flush(conn);
moving = 1;
- while ((evt = xcb_wait_for_event(conn)) && moving) {
+ while (moving && (evt = xcb_wait_for_event(conn))) {
switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
case XCB_BUTTON_RELEASE:
DNPRINTF(SWM_D_EVENT, "move: BUTTON_RELEASE\n");
break;
default:
event_handle(evt);
+
+ /* It's possible for win to have been freed above. */
+ if (validate_win(win)) {
+ DNPRINTF(SWM_D_EVENT, "move: invalid win.\n");
+ goto out;
+ }
break;
}
free(evt);
xcb_flush(conn);
}
store_float_geom(win, r);
+out:
free(qpr);
xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
DNPRINTF(SWM_D_EVENT, "move: done.\n");
}
void
-spawn_insert(const char *name, const char *args)
+spawn_insert(const char *name, const char *args, int flags)
{
char *arg, *cp, *ptr;
struct spawn_prog *sp;
}
free(cp);
+ sp->flags = flags;
+
TAILQ_INSERT_TAIL(&spawns, sp, entry);
DNPRINTF(SWM_D_SPAWN, "spawn_insert: leave\n");
}
}
void
-spawn_replace(struct spawn_prog *sp, const char *name, const char *args)
-{
- DNPRINTF(SWM_D_SPAWN, "spawn_replace: %s [%s]\n", sp->name, name);
-
- spawn_remove(sp);
- spawn_insert(name, args);
-
- DNPRINTF(SWM_D_SPAWN, "spawn_replace: leave\n");
-}
-
-void
-setspawn(const char *name, const char *args)
+setspawn(const char *name, const char *args, int flags)
{
struct spawn_prog *sp;
if (name == NULL)
return;
- TAILQ_FOREACH(sp, &spawns, entry) {
+ /* Remove any old spawn under the same name. */
+ TAILQ_FOREACH(sp, &spawns, entry)
if (!strcmp(sp->name, name)) {
- if (*args == '\0')
- spawn_remove(sp);
- else
- spawn_replace(sp, name, args);
- DNPRINTF(SWM_D_SPAWN, "setspawn: leave\n");
- return;
+ spawn_remove(sp);
+ break;
}
- }
- if (*args == '\0') {
+
+ if (*args != '\0')
+ spawn_insert(name, args, flags);
+ else
warnx("error: setspawn: cannot find program: %s", name);
- return;
- }
- spawn_insert(name, args);
DNPRINTF(SWM_D_SPAWN, "setspawn: leave\n");
}
setconfspawn(char *selector, char *value, int flags)
{
char *args;
- char which[PATH_MAX];
- size_t i;
args = expand_tilde(value);
DNPRINTF(SWM_D_SPAWN, "setconfspawn: [%s] [%s]\n", selector, args);
- /* verify we have the goods */
- snprintf(which, sizeof which, "which %s", value);
- for (i = strlen("which "); i < strlen(which); i++)
- if (which[i] == ' ') {
- which[i] = '\0';
- break;
- }
- if (flags == 0 && system(which) != 0)
- add_startup_exception("could not find %s",
- &which[strlen("which ")]);
-
- setspawn(selector, args);
+ setspawn(selector, args, flags);
free(args);
DNPRINTF(SWM_D_SPAWN, "setconfspawn: done.\n");
}
void
+validate_spawns(void)
+{
+ struct spawn_prog *sp;
+ char which[PATH_MAX];
+ size_t i;
+
+ struct key *kp;
+
+ RB_FOREACH(kp, key_tree, &keys) {
+ if (kp->funcid != KF_SPAWN_CUSTOM)
+ continue;
+
+ /* find program */
+ TAILQ_FOREACH(sp, &spawns, entry) {
+ if (!strcasecmp(kp->spawn_name, sp->name))
+ break;
+ }
+
+ if (sp == NULL || sp->flags & SWM_SPAWN_OPTIONAL)
+ continue;
+
+ /* verify we have the goods */
+ snprintf(which, sizeof which, "which %s", sp->argv[0]);
+ DNPRINTF(SWM_D_CONF, "validate_spawns: which %s\n",
+ sp->argv[0]);
+ for (i = strlen("which "); i < strlen(which); i++)
+ if (which[i] == ' ') {
+ which[i] = '\0';
+ break;
+ }
+ if (system(which) != 0)
+ add_startup_exception("could not find %s",
+ &which[strlen("which ")]);
+ }
+}
+
+void
setup_spawn(void)
{
+ setconfspawn("lock", "xlock", 0);
+
setconfspawn("term", "xterm", 0);
setconfspawn("spawn_term", "xterm", 0);
+
setconfspawn("menu", "dmenu_run"
" -fn $bar_font"
" -nb $bar_color"
" -nf $bar_font_color"
" -sb $bar_border"
" -sf $bar_color", 0);
+
setconfspawn("search", "dmenu"
" -i"
" -fn $bar_font"
" -nf $bar_font_color"
" -sb $bar_border"
" -sf $bar_color", 0);
+
setconfspawn("name_workspace", "dmenu"
" -p Workspace"
" -fn $bar_font"
" -sb $bar_border"
" -sf $bar_color", 0);
- /* these are not verified for existence */
- setconfspawn("lock", "xlock", 1);
- setconfspawn("screenshot_all", "screenshot.sh full", 1);
- setconfspawn("screenshot_wind", "screenshot.sh window", 1);
- setconfspawn("initscr", "initscreen.sh", 1);
+ /* These are not verified for existence, even with a binding set. */
+ setconfspawn("screenshot_all", "screenshot.sh full", SWM_SPAWN_OPTIONAL);
+ setconfspawn("screenshot_wind", "screenshot.sh window", SWM_SPAWN_OPTIONAL);
+ setconfspawn("initscr", "initscreen.sh", SWM_SPAWN_OPTIONAL);
}
/* key bindings */
for (kfid = 0; kfid < KF_INVALID; (kfid)++) {
if (strncasecmp(selector, keyfuncs[kfid].name,
SWM_FUNCNAME_LEN) == 0) {
- DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match\n",
- selector);
+ DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match "
+ "keyfunc\n", selector);
if (parsekeys(value, mod_key, &mod, &ks) == 0) {
setkeybinding(mod, ks, kfid, NULL);
return (0);
/* search by custom spawn name */
TAILQ_FOREACH(sp, &spawns, entry) {
if (strcasecmp(selector, sp->name) == 0) {
- DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match\n",
- selector);
+ DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match "
+ "spawn\n", selector);
if (parsekeys(value, mod_key, &mod, &ks) == 0) {
setkeybinding(mod, ks, KF_SPAWN_CUSTOM,
sp->name);
int
setkeymapping(char *selector, char *value, int flags)
{
- char keymapping_file[PATH_MAX];
+ char *keymapping_file;
/* suppress unused warnings since vars are needed */
(void)selector;
(void)flags;
DNPRINTF(SWM_D_KEY, "setkeymapping: enter\n");
- if (value[0] == '~')
- snprintf(keymapping_file, sizeof keymapping_file, "%s/%s",
- pwd->pw_dir, &value[1]);
- else
- strlcpy(keymapping_file, value, sizeof keymapping_file);
+
+ keymapping_file = expand_tilde(value);
+
clear_keys();
/* load new key bindings; if it fails, revert to default bindings */
if (conf_load(keymapping_file, SWM_CONF_KEYMAPPING)) {
clear_keys();
setup_keys();
}
+
+ free(keymapping_file);
+
DNPRINTF(SWM_D_KEY, "setkeymapping: leave\n");
return (0);
}
modifiers[2] = XCB_MOD_MASK_LOCK;
modifiers[3] = numlockmask | XCB_MOD_MASK_LOCK;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (k = 0; k < num_screens; k++) {
if (TAILQ_EMPTY(&screens[k].rl))
continue;
"XTERM_FONTADJ",
"FULLSCREEN",
"FOCUSPREV",
+ "NOFOCUSONMAP",
+ "FOCUSONMAP_SINGLE",
};
/* SWM_Q_WS: retain '|' for back compat for now (2009-08-11) */
errx(1, "setconfvalue: bar_enabled_ws: invalid "
"workspace %d.", ws_id + 1);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
ws = (struct workspace *)&screens[i].ws;
ws[ws_id].bar_enabled = atoi(value);
"<master_grow>:<master_add>:<stack_inc>:<always_raise>:"
"<type>'");
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
ws = (struct workspace *)&screens[i].ws;
ws[ws_id].cur_layout = &layouts[st];
conf_load(const char *filename, int keymapping)
{
FILE *config;
- char *line = NULL, *cp, *optsub, *optval;
+ char *line = NULL, *cp, *optsub, *optval = NULL;
size_t linelen, lineno = 0;
int wordlen, i, optidx;
struct config_option *opt = NULL;
warnx("conf_load: no filename");
return (1);
}
+
+ DNPRINTF(SWM_D_CONF, "conf_load: open %s\n", filename);
+
if ((config = fopen(filename, "r")) == NULL) {
warn("conf_load: fopen: %s", filename);
return (1);
DNPRINTF(SWM_D_EVENT, "expose: window: 0x%x\n", e->window);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(r, &screens[i].rl, entry)
if (e->window == WINID(r->bar))
void
maprequest(xcb_map_request_event_t *e)
{
- struct ws_win *win;
+ struct ws_win *win, *w = NULL;
xcb_get_window_attributes_reply_t *war;
DNPRINTF(SWM_D_EVENT, "maprequest: win 0x%x\n",
(war->map_state == XCB_MAP_STATE_VIEWABLE));
/* The new window should get focus; prepare. */
- if (focus_mode != SWM_FOCUS_FOLLOW)
- win->ws->focus_pending = get_focus_magic(win);
+ if (focus_mode != SWM_FOCUS_FOLLOW &&
+ !(win->quirks & SWM_Q_NOFOCUSONMAP)) {
+ if (win->quirks & SWM_Q_FOCUSONMAP_SINGLE) {
+ /* See if other wins of same type are already mapped. */
+ TAILQ_FOREACH(w, &win->ws->winlist, entry) {
+ if (w == win || !w->mapped)
+ continue;
+
+ if (!strcmp(w->ch.class_name,
+ win->ch.class_name) &&
+ !strcmp(w->ch.instance_name,
+ win->ch.instance_name))
+ break;
+ }
+ }
+
+ if (w == NULL)
+ win->ws->focus_pending = get_focus_magic(win);
+ }
/* All windows need to be mapped if they are in the current workspace.*/
if (win->ws->r)
last_event_time = e->time;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
if (screens[i].root == e->root)
break;
xcb_generic_error_t *error;
/* this causes an error if some other window manager is running */
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
if ((sc = get_screen(i)) == NULL)
errx(1, "ERROR: can't get screen %d.", i);
if ((screen = get_screen(i)) == NULL)
errx(1, "ERROR: can't get screen %d.", i);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
if (i >= num_screens)
errx(1, "scan_xrandr: invalid screen");
DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%x\n", e->root);
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
/* silly event doesn't include the screen index */
for (i = 0; i < num_screens; i++)
if (screens[i].root == e->root)
xcb_get_property_cookie_t pc;
DNPRINTF(SWM_D_INIT, "grab_windows: begin\n");
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
qtc = xcb_query_tree(conn, screens[i].root);
qtr = xcb_query_tree_reply(conn, qtc, NULL);
xcb_randr_query_version_cookie_t c;
xcb_randr_query_version_reply_t *r;
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
if ((screens = calloc(num_screens,
sizeof(struct swm_screen))) == NULL)
err(1, "setup_screens: calloc: failed to allocate memory for "
/* work around sun jdk bugs, code from wmname */
netwmcheck = get_atom_from_string("_NET_SUPPORTING_WM_CHECK");
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++) {
root = screens[i].root;
teardown_ewmh();
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; ++i) {
if (screens[i].bar_gc != 0)
xcb_free_gc(conn, screens[i].bar_gc);
if (cfile)
conf_load(cfile, SWM_CONF_DEFAULT);
+ validate_spawns();
+
setup_ewmh();
/* set some values to work around bad programs */
workaround();
setenv("SWM_STARTED", "YES", 1);
/* setup all bars */
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+ num_screens = get_screen_count();
for (i = 0; i < num_screens; i++)
TAILQ_FOREACH(r, &screens[i].rl, entry)
bar_setup(r);
if (stdin_ready) {
stdin_ready = 0;
- if (bar_extra_update()) {
- bar_draw();
- xcb_flush(conn);
- }
+ bar_extra_update();
}
+
+ bar_draw();
+ xcb_flush(conn);
}
done:
shutdown_cleanup();