[wiki] [sites] [dwm][patch][clientopacity] Updating clientopacity patch for dwm 6.4 || sympodius

From: <git_AT_suckless.org>
Date: Mon, 20 Mar 2023 17:18:56 +0100

commit 155d645293f05d062add98f9a03cec21cdc8d647
Author: sympodius <mail_AT_sympodius.net>
Date: Mon Mar 20 16:17:16 2023 +0000

    [dwm][patch][clientopacity] Updating clientopacity patch for dwm 6.4

diff --git a/dwm.suckless.org/patches/clientopacity/dwm-clientopacity-6.4.diff b/dwm.suckless.org/patches/clientopacity/dwm-clientopacity-6.4.diff
new file mode 100644
index 00000000..93882bfe
--- /dev/null
+++ b/dwm.suckless.org/patches/clientopacity/dwm-clientopacity-6.4.diff
_AT_@ -0,0 +1,275 @@
+From 10dd5df95f551d81d0a814dcdb2bde20e405fb91 Mon Sep 17 00:00:00 2001
+From: sympodius <mail_AT_sympodius.net>
+Date: Mon, 13 Mar 2023 16:28:16 +0000
+Subject: [PATCH] [dwm][patch][clientopacity] Adds opacity on a per client
+ basis
+
+---
+ config.def.h | 80 ++++++++++++++++++++++++++++------------------------
+ dwm.c | 61 ++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 103 insertions(+), 38 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 9efa774..9ca812d 100644
+--- a/config.def.h
++++ b/config.def.h
+_AT_@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; /* border pixel of windows */
+ static const unsigned int snap = 32; /* snap pixel */
+ static const int showbar = 1; /* 0 means no bar */
+ static const int topbar = 1; /* 0 means bottom bar */
++static const double activeopacity = 0.9f; /* Window opacity when it's focused (0 <= opacity <= 1) */
++static const double inactiveopacity = 0.7f; /* Window opacity when it's inactive (0 <= opacity <= 1) */
+ static const char *fonts[] = { "monospace:size=10" };
+ static const char dmenufont[] = "monospace:size=10";
+ static const char col_gray1[] = "#222222";
+_AT_@ -26,9 +28,9 @@ static const Rule rules[] = {
+ * WM_CLASS(STRING) = instance, class
+ * WM_NAME(STRING) = title
+ */
+- /* class instance title tags mask isfloating monitor */
+- { "Gimp", NULL, NULL, 0, 1, -1 },
+- { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
++ /* class instance title tags mask isfloating focusopacity unfocusopacity monitor */
++ { "Gimp", NULL, NULL, 0, 1, 1.0, inactiveopacity, -1 },
++ { "Firefox", NULL, NULL, 1 << 8, 0, activeopacity, inactiveopacity, -1 },
+ };
+
+ /* layout(s) */
+_AT_@ -61,40 +63,44 @@ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont,
+ static const char *termcmd[] = { "st", NULL };
+
+ static const Key keys[] = {
+- /* modifier key function argument */
+- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
+- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
+- { MODKEY, XK_b, togglebar, {0} },
+- { MODKEY, XK_j, focusstack, {.i = +1 } },
+- { MODKEY, XK_k, focusstack, {.i = -1 } },
+- { MODKEY, XK_i, incnmaster, {.i = +1 } },
+- { MODKEY, XK_d, incnmaster, {.i = -1 } },
+- { MODKEY, XK_h, setmfact, {.f = -0.05} },
+- { MODKEY, XK_l, setmfact, {.f = +0.05} },
+- { MODKEY, XK_Return, zoom, {0} },
+- { MODKEY, XK_Tab, view, {0} },
+- { MODKEY|ShiftMask, XK_c, killclient, {0} },
+- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
+- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
+- { MODKEY, XK_space, setlayout, {0} },
+- { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
+- { MODKEY, XK_0, view, {.ui = ~0 } },
+- { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
+- { MODKEY, XK_comma, focusmon, {.i = -1 } },
+- { MODKEY, XK_period, focusmon, {.i = +1 } },
+- { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
+- { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+- TAGKEYS( XK_1, 0)
+- TAGKEYS( XK_2, 1)
+- TAGKEYS( XK_3, 2)
+- TAGKEYS( XK_4, 3)
+- TAGKEYS( XK_5, 4)
+- TAGKEYS( XK_6, 5)
+- TAGKEYS( XK_7, 6)
+- TAGKEYS( XK_8, 7)
+- TAGKEYS( XK_9, 8)
+- { MODKEY|ShiftMask, XK_q, quit, {0} },
++ /* modifier key function argument */
++ { MODKEY, XK_p, spawn, {.v = dmenucmd } },
++ { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
++ { MODKEY, XK_b, togglebar, {0} },
++ { MODKEY, XK_j, focusstack, {.i = +1 } },
++ { MODKEY, XK_k, focusstack, {.i = -1 } },
++ { MODKEY, XK_i, incnmaster, {.i = +1 } },
++ { MODKEY, XK_d, incnmaster, {.i = -1 } },
++ { MODKEY, XK_h, setmfact, {.f = -0.05} },
++ { MODKEY, XK_l, setmfact, {.f = +0.05} },
++ { MODKEY, XK_Return, zoom, {0} },
++ { MODKEY, XK_Tab, view, {0} },
++ { MODKEY|ShiftMask, XK_c, killclient, {0} },
++ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
++ { MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
++ { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
++ { MODKEY, XK_space, setlayout, {0} },
++ { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
++ { MODKEY, XK_0, view, {.ui = ~0 } },
++ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
++ { MODKEY, XK_comma, focusmon, {.i = -1 } },
++ { MODKEY, XK_period, focusmon, {.i = +1 } },
++ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
++ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
++ { MODKEY|ShiftMask, XK_a, changefocusopacity, {.f = +0.025}},
++ { MODKEY|ShiftMask, XK_s, changefocusopacity, {.f = -0.025}},
++ { MODKEY|ShiftMask, XK_z, changeunfocusopacity, {.f = +0.025}},
++ { MODKEY|ShiftMask, XK_x, changeunfocusopacity, {.f = -0.025}},
++ TAGKEYS( XK_1, 0)
++ TAGKEYS( XK_2, 1)
++ TAGKEYS( XK_3, 2)
++ TAGKEYS( XK_4, 3)
++ TAGKEYS( XK_5, 4)
++ TAGKEYS( XK_6, 5)
++ TAGKEYS( XK_7, 6)
++ TAGKEYS( XK_8, 7)
++ TAGKEYS( XK_9, 8)
++ { MODKEY|ShiftMask, XK_q, quit, {0} },
+ };
+
+ /* button definitions */
+diff --git a/dwm.c b/dwm.c
+index c2bd871..71cf33c 100644
+--- a/dwm.c
++++ b/dwm.c
+_AT_@ -62,7 +62,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
+ enum { SchemeNorm, SchemeSel }; /* color schemes */
+ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
+ NetWMFullscreen, NetActiveWindow, NetWMWindowType,
+- NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
++ NetWMWindowTypeDialog, NetClientList, NetWMWindowsOpacity, NetLast }; /* EWMH atoms */
+ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
+ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
+ ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
+_AT_@ -95,6 +95,8 @@ struct Client {
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
+ Client *next;
+ Client *snext;
++ double opacity;
++ double unfocusopacity;
+ Monitor *mon;
+ Window win;
+ };
+_AT_@ -138,6 +140,8 @@ typedef struct {
+ const char *title;
+ unsigned int tags;
+ int isfloating;
++ double opacity;
++ double unfocusopacity;
+ int monitor;
+ } Rule;
+
+_AT_@ -149,6 +153,8 @@ static void arrangemon(Monitor *m);
+ static void attach(Client *c);
+ static void attachstack(Client *c);
+ static void buttonpress(XEvent *e);
++static void changefocusopacity(const Arg *arg);
++static void changeunfocusopacity(const Arg *arg);
+ static void checkotherwm(void);
+ static void cleanup(void);
+ static void cleanupmon(Monitor *mon);
+_AT_@ -185,6 +191,7 @@ static void monocle(Monitor *m);
+ static void motionnotify(XEvent *e);
+ static void movemouse(const Arg *arg);
+ static Client *nexttiled(Client *c);
++static void opacity(Client *c, double opacity);
+ static void pop(Client *c);
+ static void propertynotify(XEvent *e);
+ static void quit(const Arg *arg);
+_AT_@ -287,6 +294,8 @@ applyrules(Client *c)
+ /* rule matching */
+ c->isfloating = 0;
+ c->tags = 0;
++ c->opacity = activeopacity;
++ c->unfocusopacity = inactiveopacity;
+ XGetClassHint(dpy, c->win, &ch);
+ class = ch.res_class ? ch.res_class : broken;
+ instance = ch.res_name ? ch.res_name : broken;
+_AT_@ -299,6 +308,8 @@ applyrules(Client *c)
+ {
+ c->isfloating = r->isfloating;
+ c->tags |= r->tags;
++ c->opacity = r->opacity;
++ c->unfocusopacity = r->unfocusopacity;
+ for (m = mons; m && m->num != r->monitor; m = m->next);
+ if (m)
+ c->mon = m;
+_AT_@ -457,6 +468,36 @@ buttonpress(XEvent *e)
+ buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
+ }
+
++void
++changefocusopacity(const Arg *arg)
++{
++ if (!selmon->sel)
++ return;
++ selmon->sel->opacity+=arg->f;
++ if(selmon->sel->opacity > 1.0)
++ selmon->sel->opacity = 1.0;
++
++ if(selmon->sel->opacity < 0.1)
++ selmon->sel->opacity = 0.1;
++
++ opacity(selmon->sel, selmon->sel->opacity);
++}
++
++void
++changeunfocusopacity(const Arg *arg)
++{
++ if (!selmon->sel)
++ return;
++ selmon->sel->unfocusopacity+=arg->f;
++ if(selmon->sel->unfocusopacity > 1.0)
++ selmon->sel->unfocusopacity = 1.0;
++
++ if(selmon->sel->unfocusopacity < 0.1)
++ selmon->sel->unfocusopacity = 0.1;
++
++ opacity(selmon->sel, selmon->sel->unfocusopacity);
++}
++
+ void
+ checkotherwm(void)
+ {
+_AT_@ -803,6 +844,8 @@ focus(Client *c)
+ grabbuttons(c, 1);
+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
+ setfocus(c);
++ c->opacity = MIN(1.0, MAX(0, c->opacity));
++ opacity(c, c->opacity);
+ } else {
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
+_AT_@ -1052,6 +1095,7 @@ manage(Window w, XWindowAttributes *wa)
+ c->mon = selmon;
+ applyrules(c);
+ }
++ opacity(c, c->opacity);
+
+ if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww)
+ c->x = c->mon->wx + c->mon->ww - WIDTH(c);
+_AT_@ -1209,6 +1253,18 @@ nexttiled(Client *c)
+ return c;
+ }
+
++void
++opacity(Client *c, double opacity)
++{
++ if(opacity > 0 && opacity < 1) {
++ unsigned long real_opacity[] = { opacity * 0xffffffff };
++ XChangeProperty(dpy, c->win, netatom[NetWMWindowsOpacity], XA_CARDINAL,
++ 32, PropModeReplace, (unsigned char *)real_opacity,
++ 1);
++ } else
++ XDeleteProperty(dpy, c->win, netatom[NetWMWindowsOpacity]);
++}
++
+ void
+ pop(Client *c)
+ {
+_AT_@ -1579,6 +1635,7 @@ setup(void)
+ netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
+ netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
+ netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
++ netatom[NetWMWindowsOpacity] = XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False);
+ /* init cursors */
+ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
+ cursor[CurResize] = drw_cur_create(drw, XC_sizing);
+_AT_@ -1760,6 +1817,8 @@ unfocus(Client *c, int setfocus)
+ if (!c)
+ return;
+ grabbuttons(c, 0);
++ c->unfocusopacity = MIN(1.0, MAX(0, c->unfocusopacity));
++ opacity(c, c->unfocusopacity);
+ XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
+ if (setfocus) {
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+--
+2.39.2
+
diff --git a/dwm.suckless.org/patches/clientopacity/index.md b/dwm.suckless.org/patches/clientopacity/index.md
index be12e6f5..b52db338 100644
--- a/dwm.suckless.org/patches/clientopacity/index.md
+++ b/dwm.suckless.org/patches/clientopacity/index.md
_AT_@ -3,20 +3,33 @@ clientopacity
 
 Description
 -----------
-This patch adds a default transparency parameter to config.h, which specifies the
-transparency, all windows are started with. It also adds opacity to the ruleset, enabling to override the opacity on a per client basis.
+This patch adds default transparency parameters to config.h which specify the starting transparencies of all windows.
 
-Additionally it adds some shortcuts:
+It also adds opacities to the ruleset, enabling override of the opacities on a per client basis for both focus and unfocus.
 
-* MOD + Shift + Numpad_Add -> increase opacity of current focused window
-* MOD + Shift + Numpad_Subtract -> decrease opacity of current focused window
+Additionally, it adds some shortcuts:
+
+* [Alt]+[Shift]+[a] -> increase focus opacity of currently focused window
+* [Alt]+[Shift]+[s] -> decrease focus opacity of currently focused window
+
+* [Alt]+[Shift]+[z] -> increase unfocus opacity of currently focused window
+* [Alt]+[Shift]+[x] -> decrease unfocus opacity of currently focused window
 
 It is based on the transparency patch of Christop Lohmann.
 
+20220612-d3f93c7 Version
+------------------------
+This earlier version restricts control to focussed opacity, and has different default shortcuts:
+
+* [Alt]+[Shift]+[Numpad_Add] -> increase opacity of currently focused window
+* [Alt]+[Shift]+[Numpad_Subtract] -> decrease opacity of currently focused window
+
 Download
 --------
+* [dwm-clientopacity-6.4.diff](dwm-clientopacity-6.4.diff)
 * [dwm-clientopacity-20220612-d3f93c7.diff](dwm-clientopacity-20220612-d3f93c7.diff)
 
 Authors
 -------
 * Fabian Blatz - fabian.blatz at gmail period com
+* John Urquhart Ferguson (sympodius) - <mail_AT_sympodius.net> (6.4 port with unfocussed opacity control)
Received on Mon Mar 20 2023 - 17:18:56 CET

This archive was generated by hypermail 2.3.0 : Mon Mar 20 2023 - 17:24:52 CET