Merge pull request #46 from yshui/full-shadow

Add per window type option full-shadow
This commit is contained in:
yshui
2018-11-19 12:31:11 +00:00
committed by GitHub
5 changed files with 30 additions and 6 deletions

View File

@ -531,6 +531,7 @@ typedef struct options_t {
// === Shadow ===
/// Enable/disable shadow for specific window types.
bool wintype_shadow[NUM_WINTYPES];
bool wintype_full_shadow[NUM_WINTYPES];
/// Red, green and blue tone of the shadow.
double shadow_red, shadow_green, shadow_blue;
int shadow_radius;

View File

@ -1919,10 +1919,11 @@ paint_all(session_t *ps, region_t *region, const region_t *region_real, win * co
w->g.x + w->shadow_dx, w->g.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
// Mask out the body of the window from the shadow
// Mask out the body of the window from the shadow if needed
// Doing it here instead of in make_shadow() for saving GPU
// power and handling shaped windows (XXX unconfirmed)
pixman_region32_subtract(&reg_tmp, &reg_tmp, &bshape);
if (!ps->o.wintype_full_shadow[w->window_type])
pixman_region32_subtract(&reg_tmp, &reg_tmp, &bshape);
#ifdef CONFIG_XINERAMA
if (ps->o.xinerama_shadow_crop && w->xinerama_scr >= 0 &&
@ -4059,7 +4060,9 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
ps->o.frame_opacity = atof(optarg);
break;
case 'z':
printf_errf("(): clear-shadow is removed, shadows are automatically cleared now.");
printf_errf("(): clear-shadow is removed, shadows are automatically cleared now.\n"
"If you want to prevent shadow from been cleared under certain types of windows,\n"
"you can use the \"full-shadow\" per window type option.");
break;
case 'n':
case 'a':
@ -4253,6 +4256,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
cfgtmp.menu_opacity = normalize_d(cfgtmp.menu_opacity);
ps->o.refresh_rate = normalize_i_range(ps->o.refresh_rate, 0, 300);
ps->o.alpha_step = normalize_d_range(ps->o.alpha_step, 0.01, 1.0);
if (shadow_enable)
wintype_arr_enable(ps->o.wintype_shadow);
ps->o.wintype_shadow[WINTYPE_DESKTOP] = false;
@ -4262,6 +4266,7 @@ get_cfg(session_t *ps, int argc, char *const *argv, bool first_pass) {
ps->o.wintype_shadow[WINTYPE_DND] = false;
if (fading_enable)
wintype_arr_enable(ps->o.wintype_fade);
if (!safe_isnan(cfgtmp.menu_opacity)) {
ps->o.wintype_opacity[WINTYPE_DROPDOWN_MENU] = cfgtmp.menu_opacity;
ps->o.wintype_opacity[WINTYPE_POPUP_MENU] = cfgtmp.menu_opacity;
@ -5074,6 +5079,7 @@ session_init(session_t *ps_old, int argc, char **argv) {
.vsync_aggressive = false,
.wintype_shadow = { false },
.wintype_full_shadow = { false },
.shadow_red = 0.0,
.shadow_green = 0.0,
.shadow_blue = 0.0,

View File

@ -374,6 +374,7 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
// Wintype settings
// XXX ! Refactor all the wintype_* arrays into a struct
for (wintype_t i = 0; i < NUM_WINTYPES; ++i) {
char *str = mstrjoin("wintypes.", WINTYPES[i]);
config_setting_t *setting = config_lookup(&cfg, str);
@ -385,6 +386,8 @@ parse_config(session_t *ps, struct options_tmp *pcfgtmp) {
ps->o.wintype_fade[i] = (bool) ival;
if (config_setting_lookup_bool(setting, "focus", &ival))
ps->o.wintype_focus[i] = (bool) ival;
if (config_setting_lookup_bool(setting, "full-shadow", &ival))
ps->o.wintype_full_shadow[i] = ival;
double fval;
if (config_setting_lookup_float(setting, "opacity", &fval))