* Copyright (c) 2009 Pierre-Yves Ritschard <pyr@spootnik.org>
* Copyright (c) 2010 Tuukka Kataja <stuge@xor.fi>
* Copyright (c) 2011 Jason L. Wright <jason@thought.net>
- * Copyright (c) 2011-2013 Reginald Kennedy <rk@rejii.com>
+ * Copyright (c) 2011-2014 Reginald Kennedy <rk@rejii.com>
* Copyright (c) 2011-2012 Lawrence Teo <lteo@lteo.net>
* Copyright (c) 2011-2012 Tiago Cunha <tcunha@gmx.com>
* Copyright (c) 2012-2013 David Hill <dhill@mindcry.org>
int bar_font_legacy = 1;
char *bar_fonts;
XftColor bar_font_color;
+XftColor search_font_color;
struct passwd *pwd;
char *startup_exception;
unsigned int nr_exceptions = 0;
#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. */
+#define SWM_Q_OBEYAPPFOCUSREQ (1<<8) /* Focus when applications ask. */
};
TAILQ_HEAD(quirk_list, quirk);
struct quirk_list quirks = TAILQ_HEAD_INITIALIZER(quirks);
xcb_screen_t *get_screen(int);
int get_screen_count(void);
#ifdef SWM_DEBUG
+char *get_source_type_label(uint32_t);
char *get_stack_mode_name(uint8_t);
#endif
int32_t get_swm_ws(xcb_window_t);
void
setscreencolor(const char *val, int i, int c)
{
- int num_screens;
+ if (i < 0 || i >= get_screen_count())
+ return;
- num_screens = get_screen_count();
- if (i > 0 && i <= num_screens) {
- 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(0, val);
- free(screens[i].c[c].name);
- if ((screens[i].c[c].name = strdup(val)) == NULL)
- err(1, "strdup");
- }
- } else
- errx(1, "invalid screen index: %d out of bounds (maximum %d)",
- i, num_screens);
+ screens[i].c[c].pixel = name_to_pixel(i, val);
+ free(screens[i].c[c].name);
+ if ((screens[i].c[c].name = strdup(val)) == NULL)
+ err(1, "strdup");
}
void
DefaultColormap(display, r->s->idx), &color, &bar_font_color))
warn("Xft error: unable to allocate color.");
+ PIXEL_TO_XRENDERCOLOR(r->s->c[SWM_S_COLOR_BAR].pixel, color);
+
+ if (!XftColorAllocValue(display, DefaultVisual(display, r->s->idx),
+ DefaultColormap(display, r->s->idx), &color, &search_font_color))
+ warn("Xft error: unable to allocate color.");
+
bar_height = bar_font->height + 2 * bar_border_width;
if (bar_height < 1)
set_region(ws->r);
- update_window_color(win);
-
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
&win->id);
}
+ if (cfw != win)
+ /* Update window border even if workspace is hidden. */
+ update_window_color(win);
+
out:
bar_draw();
DNPRINTF(SWM_D_MISC, "update_floater: win %#x\n", win->id);
+ win->bordered = 1;
+
if (FULLSCREEN(win)) {
/* _NET_WM_FULLSCREEN: fullscreen without border. */
if (!win->g_floatvalid)
win->g = r->g;
if (bar_enabled && ws->bar_enabled) {
- win->bordered = 1;
if (!bar_at_bottom)
Y(win) += bar_height;
HEIGHT(win) -= bar_height;
} else if (disable_border) {
win->bordered = 0;
- } else {
- win->bordered = 1;
}
if (win->bordered) {
win_to_ws(win, wsid, 1);
- /* Set window to be focus on target ws. */
+ /* Set new focus on target ws. */
if (focus_mode != SWM_FOCUS_FOLLOW) {
+ win->ws->focus_prev = win->ws->focus;
win->ws->focus = win;
win->ws->focus_pending = NULL;
+
+ if (win->ws->focus_prev)
+ update_window_color(win->ws->focus_prev);
}
DNPRINTF(SWM_D_STACK, "send_to_ws: focus_pending: %#x, focus: %#x, "
ewmh_apply_flags(win, win->ewmh_flags & ~EWMH_F_MAXIMIZED);
ewmh_update_wm_state(win);
- /* Restack and set new focus. */
+ /* Restack and set new focus on current ws. */
if (FLOATING(win))
load_float_geom(win);
struct ws_win *win = NULL;
struct search_window *sw = NULL;
xcb_window_t w;
- uint32_t wa[2];
+ uint32_t wa[3];
+ xcb_screen_t *screen;
int i, width, height;
char s[8];
FILE *lfile;
if ((lfile = fdopen(select_list_pipe[1], "w")) == NULL)
return;
+ if ((screen = get_screen(r->s->idx)) == NULL)
+ errx(1, "ERROR: can't get screen %d.", r->s->idx);
+
TAILQ_INIT(&search_wl);
i = 1;
w = xcb_generate_id(conn);
wa[0] = r->s->c[SWM_S_COLOR_FOCUS].pixel;
wa[1] = r->s->c[SWM_S_COLOR_UNFOCUS].pixel;
+ wa[2] = screen->default_colormap;
if (bar_font_legacy) {
XmbTextExtents(bar_fs, s, len, &l_ibox, &l_lbox);
height = bar_font->height + 4;
}
- xcb_create_window(conn, XCB_COPY_FROM_PARENT, w, win->id, 0, 0,
+ xcb_create_window(conn, screen->root_depth, w, win->id, 0, 0,
width, height, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT,
- XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL |
- XCB_CW_BORDER_PIXEL, wa);
+ screen->root_visual, XCB_CW_BACK_PIXEL |
+ XCB_CW_BORDER_PIXEL | XCB_CW_COLORMAP, wa);
xcb_map_window(conn, w);
DefaultVisual(display, r->s->idx),
DefaultColormap(display, r->s->idx));
- XftDrawStringUtf8(draw, &bar_font_color, bar_font, 2,
+ XftDrawStringUtf8(draw, &search_font_color, bar_font, 2,
(HEIGHT(r->bar) + bar_font->height) / 2 -
bar_font->descent, (FcChar8 *)s, len);
"FOCUSPREV",
"NOFOCUSONMAP",
"FOCUSONMAP_SINGLE",
+ "OBEYAPPFOCUSREQ",
};
/* SWM_Q_WS: retain '|' for back compat for now (2009-08-11) */
int
setconfcolor(const char *selector, const char *value, int flags)
{
- int sid, i, num_screens;
+ int first, last, i = 0, num_screens;
- sid = (selector == NULL || strlen(selector) == 0) ? -1 : atoi(selector);
+ num_screens = get_screen_count();
- /*
- * When setting focus/unfocus colors, we need to also
- * set maximize colors to match if they haven't been customized.
- */
- i = sid < 0 ? 0 : sid;
- if (flags == SWM_S_COLOR_FOCUS &&
- !screens[i].c[SWM_S_COLOR_FOCUS_MAXIMIZED].manual)
- setscreencolor(value, sid, SWM_S_COLOR_FOCUS_MAXIMIZED);
- else if (flags == SWM_S_COLOR_UNFOCUS &&
- !screens[i].c[SWM_S_COLOR_UNFOCUS_MAXIMIZED].manual)
- setscreencolor(value, sid, SWM_S_COLOR_UNFOCUS_MAXIMIZED);
+ /* conf screen indices begin at 1; treat vals <= 0 as 'all screens.' */
+ if (selector == NULL || strlen(selector) == 0 ||
+ (last = atoi(selector) - 1) < 0) {
+ first = 0;
+ last = num_screens - 1;
+ } else {
+ first = last;
+ }
- setscreencolor(value, sid, flags);
+ if (last >= num_screens) {
+ add_startup_exception("invalid screen index: %d out of bounds "
+ "(maximum %d)", last + 1, num_screens);
+ return (1);
+ }
+
+ for (i = first; i <= last; ++i) {
+ setscreencolor(value, i, flags);
+
+ /*
+ * When setting focus/unfocus colors, we need to also
+ * set maximize colors to match if they haven't been customized.
+ */
+ if (flags == SWM_S_COLOR_FOCUS &&
+ !screens[i].c[SWM_S_COLOR_FOCUS_MAXIMIZED].manual)
+ setscreencolor(value, i, SWM_S_COLOR_FOCUS_MAXIMIZED);
+ else if (flags == SWM_S_COLOR_UNFOCUS &&
+ !screens[i].c[SWM_S_COLOR_UNFOCUS_MAXIMIZED].manual)
+ setscreencolor(value, i, SWM_S_COLOR_UNFOCUS_MAXIMIZED);
- /* Track override of color. */
- num_screens = get_screen_count();
- if (sid > 0 && sid <= num_screens) {
screens[i].c[flags].manual = 1;
- } else if (sid == -1) {
- for (i = 0; i < num_screens; ++i)
- screens[i].c[flags].manual = 1;
- } else {
- errx(1, "invalid screen index: %d out of bounds (maximum %d)",
- sid, num_screens);
}
return (0);
return;
}
} else {
+ if (e->mode == XCB_NOTIFY_MODE_NORMAL &&
+ e->detail == XCB_NOTIFY_DETAIL_INFERIOR) {
+ DNPRINTF(SWM_D_EVENT, "enternotify: entering from "
+ "inferior; ignoring\n");
+ return;
+ }
+
focus_win(get_focus_magic(win));
}
* Allow focus changes that are a result of direct user
* action and from applications that use the old EWMH spec.
*/
- if (e->data.data32[0] != EWMH_SOURCE_TYPE_NORMAL) {
+ if (e->data.data32[0] != EWMH_SOURCE_TYPE_NORMAL ||
+ win->quirks & SWM_Q_OBEYAPPFOCUSREQ) {
if (WS_FOCUSED(win->ws))
focus_win(win);
else
screens[i].root = screen->root;
/* set default colors */
- setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS);
- setscreencolor("rgb:88/88/88", i + 1, SWM_S_COLOR_UNFOCUS);
- setscreencolor("rgb:00/80/80", i + 1, SWM_S_COLOR_BAR_BORDER);
- setscreencolor("rgb:00/40/40", i + 1,
+ setscreencolor("red", i, SWM_S_COLOR_FOCUS);
+ setscreencolor("rgb:88/88/88", i, SWM_S_COLOR_UNFOCUS);
+ setscreencolor("rgb:00/80/80", i, SWM_S_COLOR_BAR_BORDER);
+ setscreencolor("rgb:00/40/40", i,
SWM_S_COLOR_BAR_BORDER_UNFOCUS);
- setscreencolor("black", i + 1, SWM_S_COLOR_BAR);
- setscreencolor("rgb:a0/a0/a0", i + 1, SWM_S_COLOR_BAR_FONT);
- setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS_MAXIMIZED);
- setscreencolor("rgb:88/88/88", i + 1, SWM_S_COLOR_UNFOCUS_MAXIMIZED);
+ setscreencolor("black", i, SWM_S_COLOR_BAR);
+ setscreencolor("rgb:a0/a0/a0", i, SWM_S_COLOR_BAR_FONT);
+ setscreencolor("red", i, SWM_S_COLOR_FOCUS_MAXIMIZED);
+ setscreencolor("rgb:88/88/88", i,
+ SWM_S_COLOR_UNFOCUS_MAXIMIZED);
/* create graphics context on screen */
screens[i].bar_gc = xcb_generate_id(conn);
if (screens[i].bar_gc != XCB_NONE)
xcb_free_gc(conn, screens[i].bar_gc);
- if (!bar_font_legacy)
+ if (!bar_font_legacy) {
XftColorFree(display, DefaultVisual(display, i),
DefaultColormap(display, i), &bar_font_color);
+ XftColorFree(display, DefaultVisual(display, i),
+ DefaultColormap(display, i), &search_font_color);
+ }
}
if (bar_font_legacy)