bool clock_enabled = true;
bool iconic_enabled = false;
bool urgent_enabled = false;
+int composite_enabled = 0;
+double opacity_focus = 1.0;
+double opacity_unfocus = 0.6;
char *clock_format = NULL;
bool window_class_enabled = false;
bool window_instance_enabled = false;
_NET_WM_STATE_MAXIMIZED_HORZ,
_NET_WM_STATE_SKIP_PAGER,
_NET_WM_STATE_SKIP_TASKBAR,
+ _NET_WM_WINDOW_OPACITY,
_NET_WM_WINDOW_TYPE,
_NET_WM_WINDOW_TYPE_DIALOG,
_NET_WM_WINDOW_TYPE_DOCK,
{"_NET_WM_STATE_MAXIMIZED_HORZ", XCB_ATOM_NONE},
{"_NET_WM_STATE_SKIP_PAGER", XCB_ATOM_NONE},
{"_NET_WM_STATE_SKIP_TASKBAR", XCB_ATOM_NONE},
+ {"_NET_WM_WINDOW_OPACITY", XCB_ATOM_NONE},
{"_NET_WM_WINDOW_TYPE", XCB_ATOM_NONE},
{"_NET_WM_WINDOW_TYPE_DIALOG", XCB_ATOM_NONE},
{"_NET_WM_WINDOW_TYPE_DOCK", XCB_ATOM_NONE},
void setup_screens(void);
void setup_spawn(void);
void set_child_transient(struct ws_win *, xcb_window_t *);
+void set_opacity(struct ws_win *, uint32_t);
void set_win_state(struct ws_win *, uint8_t);
void shutdown_cleanup(void);
void sighdlr(int);
return (1);
}
+#define OPAQUE 0xffffffff
+void
+set_opacity(struct ws_win *win, uint32_t opacity)
+{
+ if (opacity != OPAQUE)
+ xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
+ ewmh[_NET_WM_WINDOW_OPACITY].atom, XCB_ATOM_CARDINAL, 32, 1,
+ &opacity);
+ else
+ xcb_delete_property(conn, win->id,
+ ewmh[_NET_WM_WINDOW_OPACITY].atom);
+}
+
void
unfocus_win(struct ws_win *win)
{
&cfw->s->c[(MAXIMIZED(cfw) ?
SWM_S_COLOR_UNFOCUS_MAXIMIZED :
SWM_S_COLOR_UNFOCUS)].pixel);
+
+ if (composite_enabled)
+ set_opacity(cfw,
+ opacity_unfocus * OPAQUE);
} else {
unfocus_win(cfw);
}
{
uint32_t *pixel;
- if (WS_FOCUSED(win->ws) && win->ws->focus == win)
+ if (WS_FOCUSED(win->ws) && win->ws->focus == win) {
pixel = MAXIMIZED(win) ?
&win->s->c[SWM_S_COLOR_FOCUS_MAXIMIZED].pixel :
&win->s->c[SWM_S_COLOR_FOCUS].pixel;
- else
+
+ if (composite_enabled)
+ set_opacity(win, opacity_focus * OPAQUE);
+ } else {
pixel = MAXIMIZED(win) ?
&win->s->c[SWM_S_COLOR_UNFOCUS_MAXIMIZED].pixel :
&win->s->c[SWM_S_COLOR_UNFOCUS].pixel;
+ if (composite_enabled)
+ set_opacity(win, opacity_unfocus * OPAQUE);
+ }
+
xcb_change_window_attributes(conn, win->id,
XCB_CW_BORDER_PIXEL, pixel);
}
SWM_S_BOUNDARY_WIDTH,
SWM_S_CLOCK_ENABLED,
SWM_S_CLOCK_FORMAT,
+ SWM_S_COMPOSITE_ENABLED,
SWM_S_CYCLE_EMPTY,
SWM_S_CYCLE_VISIBLE,
SWM_S_DIALOG_RATIO,
SWM_S_FOCUS_MODE,
SWM_S_ICONIC_ENABLED,
SWM_S_JAVA_WORKAROUND,
+ SWM_S_OPACITY_FOCUS,
+ SWM_S_OPACITY_UNFOCUS,
SWM_S_REGION_PADDING,
SWM_S_SPAWN_ORDER,
SWM_S_SPAWN_TERM,
case SWM_S_URGENT_ENABLED:
urgent_enabled = (atoi(value) != 0);
break;
+ case SWM_S_COMPOSITE_ENABLED:
+ composite_enabled = atoi(value);
+ break;
+ case SWM_S_OPACITY_FOCUS:
+ opacity_focus = atof(value);
+ if (opacity_focus > 1.0)
+ opacity_focus = 1.0;
+ else if (opacity_focus < 0.0)
+ opacity_focus = 0.0;
+ break;
+ case SWM_S_OPACITY_UNFOCUS:
+ opacity_unfocus = atof(value);
+ if (opacity_unfocus > 1.0)
+ opacity_unfocus = 1.0;
+ else if (opacity_unfocus < 0.0)
+ opacity_unfocus = 0.0;
+ break;
case SWM_S_VERBOSE_LAYOUT:
verbose_layout = (atoi(value) != 0);
for (i = 0; layouts[i].l_stack != NULL; i++) {
{ "color_focus_maximized", setconfcolor, SWM_S_COLOR_FOCUS_MAXIMIZED },
{ "color_unfocus", setconfcolor, SWM_S_COLOR_UNFOCUS },
{ "color_unfocus_maximized", setconfcolor, SWM_S_COLOR_UNFOCUS_MAXIMIZED },
+ { "composite_enabled", setconfvalue, SWM_S_COMPOSITE_ENABLED },
{ "cycle_empty", setconfvalue, SWM_S_CYCLE_EMPTY },
{ "cycle_visible", setconfvalue, SWM_S_CYCLE_VISIBLE },
{ "dialog_ratio", setconfvalue, SWM_S_DIALOG_RATIO },
{ "keyboard_mapping", setkeymapping, 0 },
{ "layout", setlayout, 0 },
{ "modkey", setconfmodkey, 0 },
+ { "opacity_focus", setconfvalue, SWM_S_OPACITY_FOCUS },
+ { "opacity_unfocus", setconfvalue, SWM_S_OPACITY_UNFOCUS },
{ "program", setconfspawn, 0 },
{ "quirk", setconfquirk, 0 },
{ "region", setconfregion, 0 },
xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL |
XCB_CW_EVENT_MASK, wa);
+ if (composite_enabled)
+ set_opacity(win, opacity_unfocus * OPAQUE);
+
/* Get WM_SIZE_HINTS. */
xcb_icccm_get_wm_normal_hints_reply(conn,
xcb_icccm_get_wm_normal_hints(conn, win->id),