diff --git a/config/matches.cfg b/config/matches.cfg index a9ab651d..a7a8683c 100644 --- a/config/matches.cfg +++ b/config/matches.cfg @@ -56,3 +56,4 @@ Class Kicker Winop shadow off # Specific app hacks - May get fixed, may break stuff in old versions Name Gecko Winop no_app_move Name gecko Winop no_app_move +#Class Eterm Winop opacity 0 diff --git a/config/winops_opacity.menu b/config/winops_opacity.menu index 91aeb1d4..2a324c6b 100644 --- a/config/winops_opacity.menu +++ b/config/winops_opacity.menu @@ -1,4 +1,5 @@ "Opacity" "EMPTY" +"Default" NULL "wop * op 0" "20%" NULL "wop * op 20" "40%" NULL "wop * op 40" "60%" NULL "wop * op 60" diff --git a/src/E.h b/src/E.h index ab6db386..147d0602 100644 --- a/src/E.h +++ b/src/E.h @@ -337,6 +337,8 @@ typedef struct int movres; int menus; int tooltips; + int focused; + int unfocused; } opacity; struct { diff --git a/src/ecompmgr.c b/src/ecompmgr.c index fd181cab..080100f9 100644 --- a/src/ecompmgr.c +++ b/src/ecompmgr.c @@ -2596,6 +2596,9 @@ ECompMgrConfigGet(cfg_composite * cfg) cfg->enable = Conf_compmgr.enable; cfg->shadow = Conf_compmgr.shadows.mode; cfg->fading = Conf_compmgr.fading.enable; + cfg->opacity_focused = Conf.opacity.focused; + cfg->opacity_unfocused = Conf.opacity.unfocused; + cfg->opacity_override = Conf_compmgr.override_redirect.opacity; cfg->fade_speed = 100 - (Conf_compmgr.fading.time / 10); } @@ -2638,6 +2641,12 @@ ECompMgrConfigSet(const cfg_composite * cfg) Conf_compmgr.fading.enable = cfg->fading; Conf_compmgr.fading.time = (100 - cfg->fade_speed) * 10; + Conf.opacity.focused = cfg->opacity_focused; + Conf.opacity.unfocused = cfg->opacity_unfocused; + Conf_compmgr.override_redirect.opacity = cfg->opacity_override; + + EobjsOpacityUpdate(Conf_compmgr.override_redirect.opacity); + autosave(); } diff --git a/src/ecompmgr.h b/src/ecompmgr.h index f862e902..3d5ccb3c 100644 --- a/src/ecompmgr.h +++ b/src/ecompmgr.h @@ -34,6 +34,9 @@ typedef struct int shadow; char fading; int fade_speed; + int opacity_focused; + int opacity_unfocused; + int opacity_override; } cfg_composite; int ECompMgrIsActive(void); diff --git a/src/eobj.c b/src/eobj.c index 6ac0a727..8b91176d 100644 --- a/src/eobj.c +++ b/src/eobj.c @@ -670,3 +670,29 @@ EobjsRepaint(void) #endif ESync(); } + +#if USE_COMPOSITE +void +EobjsOpacityUpdate(int op_or) +{ + EObj *eo, *const *lst; + int i, num; + + lst = EobjListStackGet(&num); + for (i = 0; i < num; i++) + { + eo = lst[i]; + switch (eo->type) + { + default: + break; + case EOBJ_TYPE_EWIN: + EwinUpdateOpacity((EWin *) eo); + break; + case EOBJ_TYPE_EXT: + EobjChangeOpacity(eo, OpacityFromPercent(op_or)); + break; + } + } +} +#endif diff --git a/src/eobj.h b/src/eobj.h index afa60630..11045739 100644 --- a/src/eobj.h +++ b/src/eobj.h @@ -185,6 +185,8 @@ void EobjsSlideBy(EObj ** peo, int num, int dx, int dy, void EobjSlideSizeTo(EObj * eo, int fx, int fy, int tx, int ty, int fw, int fh, int tw, int th, int speed); +void EobjsOpacityUpdate(int op_or); + /* stacking.c */ void EobjListStackAdd(EObj * eo, int ontop); void EobjListStackDel(EObj * eo); diff --git a/src/ewins.c b/src/ewins.c index 76c25ff8..dda3daa5 100644 --- a/src/ewins.c +++ b/src/ewins.c @@ -339,9 +339,7 @@ EwinConfigure(EWin * ewin) if (ewin->state.shaded) EwinInstantShade(ewin, 1); - if (ewin->ewmh.opacity == 0) - ewin->ewmh.opacity = 0xffffffff; - EoChangeOpacity(ewin, ewin->ewmh.opacity); + EwinUpdateOpacity(ewin); HintsSetWindowState(ewin); HintsSetWindowOpacity(ewin); @@ -1892,6 +1890,12 @@ EwinUpdateOpacity(EWin * ewin) opacity = ewin->props.focused_opacity; if (opacity == 0) opacity = ewin->ewmh.opacity; + if (opacity == 0) + opacity = ewin->state.active ? + OpacityFromPercent(Conf.opacity.focused) : + OpacityFromPercent(Conf.opacity.unfocused); + if (opacity == 0) + opacity = 0xffffffff; /* Fallback */ EoChangeOpacity(ewin, opacity); } diff --git a/src/mod-misc.c b/src/mod-misc.c index a981e47b..53a7829d 100644 --- a/src/mod-misc.c +++ b/src/mod-misc.c @@ -162,6 +162,8 @@ static const CfgItem MiscCfgItems[] = { CFG_ITEM_INT(Conf, opacity.menus, 85), CFG_ITEM_INT(Conf, opacity.movres, 60), CFG_ITEM_INT(Conf, opacity.tooltips, 80), + CFG_ITEM_INT(Conf, opacity.focused, 100), + CFG_ITEM_INT(Conf, opacity.unfocused, 100), CFG_ITEM_BOOL(Conf, place.manual, 0), CFG_ITEM_BOOL(Conf, place.manual_mouse_pointer, 0), diff --git a/src/settings.c b/src/settings.c index d1ea15e5..227478e7 100644 --- a/src/settings.c +++ b/src/settings.c @@ -606,6 +606,17 @@ _DlgFillComposite(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__) DialogItemSetText(di, _("Enable Fading")); DialogItemCheckButtonSetPtr(di, &Cfg_composite.fading); + di = DialogAddItem(table, DITEM_TEXT); + DialogItemSetFill(di, 0, 0); + DialogItemSetAlign(di, 0, 512); + DialogItemSetText(di, _("Fading Speed:")); + + di = DialogAddItem(table, DITEM_SLIDER); + DialogItemSliderSetBounds(di, 0, 100); + DialogItemSliderSetUnits(di, 5); + DialogItemSliderSetJump(di, 5); + DialogItemSliderSetValPtr(di, &Cfg_composite.fade_speed); + di = DialogAddItem(table, DITEM_SEPARATOR); DialogItemSetColSpan(di, 2); @@ -634,16 +645,41 @@ _DlgFillComposite(Dialog * d __UNUSED__, DItem * table, void *data __UNUSED__) DialogItemRadioButtonGroupSetVal(di, 2); DialogItemRadioButtonGroupSetValPtr(radio, &Cfg_composite.shadow); + di = DialogAddItem(table, DITEM_SEPARATOR); + DialogItemSetColSpan(di, 2); + di = DialogAddItem(table, DITEM_TEXT); DialogItemSetFill(di, 0, 0); DialogItemSetAlign(di, 0, 512); - DialogItemSetText(di, _("Fading Speed:")); + DialogItemSetText(di, _("Default focused window opacity:")); di = DialogAddItem(table, DITEM_SLIDER); DialogItemSliderSetBounds(di, 0, 100); DialogItemSliderSetUnits(di, 5); DialogItemSliderSetJump(di, 5); - DialogItemSliderSetValPtr(di, &Cfg_composite.fade_speed); + DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_focused); + + di = DialogAddItem(table, DITEM_TEXT); + DialogItemSetFill(di, 0, 0); + DialogItemSetAlign(di, 0, 512); + DialogItemSetText(di, _("Default unfocused window opacity:")); + + di = DialogAddItem(table, DITEM_SLIDER); + DialogItemSliderSetBounds(di, 0, 100); + DialogItemSliderSetUnits(di, 5); + DialogItemSliderSetJump(di, 5); + DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_unfocused); + + di = DialogAddItem(table, DITEM_TEXT); + DialogItemSetFill(di, 0, 0); + DialogItemSetAlign(di, 0, 512); + DialogItemSetText(di, _("Default pop-up window opacity:")); + + di = DialogAddItem(table, DITEM_SLIDER); + DialogItemSliderSetBounds(di, 0, 100); + DialogItemSliderSetUnits(di, 5); + DialogItemSliderSetJump(di, 5); + DialogItemSliderSetValPtr(di, &Cfg_composite.opacity_override); } const DialogDef DlgComposite = { diff --git a/src/snaps.c b/src/snaps.c index 5bc2e1e8..eaa2d576 100644 --- a/src/snaps.c +++ b/src/snaps.c @@ -1506,7 +1506,7 @@ SnapshotEwinApply(EWin * ewin) #if USE_COMPOSITE if (use_flags & SNAP_USE_OPACITY) { - sn->opacity = OpacityFix(sn->opacity, 100); + sn->opacity = OpacityFix(sn->opacity, 0); sn->focused_opacity = OpacityFix(sn->focused_opacity, 0); ewin->ewmh.opacity = OpacityFromPercent(sn->opacity); ewin->props.focused_opacity = OpacityFromPercent(sn->focused_opacity); diff --git a/src/windowmatch.c b/src/windowmatch.c index b395e367..943c8c08 100644 --- a/src/windowmatch.c +++ b/src/windowmatch.c @@ -715,7 +715,7 @@ WindowMatchEwinOpsAction(EWin * ewin, int op, const char *args) case EWIN_OP_OPACITY: a = atoi(args); - ewin->ewmh.opacity = OpacityFromPercent(OpacityFix(a, 100)); + ewin->ewmh.opacity = OpacityFromPercent(OpacityFix(a, 0)); break; case EWIN_OP_FOCUSED_OPACITY: