[wiki] [sites] [dwm][patch] Add qubesdecorations patch || 3o14r473

From: <git_AT_suckless.org>
Date: Thu, 20 Jan 2022 21:01:57 +0100

commit 7d617fac7e3cfbdb2e8508a9e0be4f9a978f1c96
Author: 3o14r473 <3o14_AT_pm.me>
Date: Thu Jan 20 19:52:58 2022 +0000

    [dwm][patch] Add qubesdecorations patch
    
    This patch enables dwm to read QubesOS-specific window properties
    and use the windowborders, titlebar and tagbar to indicate to the
    user what qube the focused window belongs to.

diff --git a/dwm.suckless.org/patches/qubesdecorations/dwm-qubesdecorations-6.3.diff b/dwm.suckless.org/patches/qubesdecorations/dwm-qubesdecorations-6.3.diff
new file mode 100644
index 00000000..4c62ec5d
--- /dev/null
+++ b/dwm.suckless.org/patches/qubesdecorations/dwm-qubesdecorations-6.3.diff
_AT_@ -0,0 +1,193 @@
+From: 3o14r473 <3o14_AT_pm.me>
+Donate: monero:41rMoMLvk8hEJYP2vbv3dNUGzN95CLXoANAtmAVaUxzse5KfPjhkE7d4PUwh8kCkF16FwwqfZTmS4ZKmYCjrsFAcGXTPpwH
+Subject: [PATCH] dwm-qubesdecorations-6.3.diff
+
+This patch enables dwm to read QubesOS-specific window properties and use the
+windowborders, titlebar and tagbar to indicate to the user what qube the
+focused window belongs to.
+
+Each qube-label gets its own SchemeSel colorscheme that can be conviniently configured in config.def.h
+---
+ config.def.h | 23 ++++++++++++++++++++---
+ dwm.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 64 insertions(+), 6 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a2ac963..42dce05 100644
+--- a/config.def.h
++++ b/config.def.h
+_AT_@ -12,10 +12,27 @@ static const char col_gray2[] = "#444444";
+ static const char col_gray3[] = "#bbbbbb";
+ static const char col_gray4[] = "#eeeeee";
+ static const char col_cyan[] = "#005577";
++static const char col_black[] = "#000000";
++static const char col_blue[] = "#4363d8";
++static const char col_gray[] = "#bebebe";
++static const char col_green[] = "#3cb44b";
++static const char col_orange[] = "#f58231";
++static const char col_purple[] = "#9a009a";
++static const char col_red[] = "#e6194b";
++static const char col_white[] = "#ffffff";
++static const char col_yellow[] = "#ffe119";
+ static const char *colors[][3] = {
+- /* fg bg border */
+- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+- [SchemeSel] = { col_gray4, col_cyan, col_cyan },
++ /*fg bg border */
++ { col_black, col_white, col_white }, /* SchemeSel dom0 */
++ { col_white, col_red, col_red }, /* SchemeSel label 1 */
++ { col_white, col_orange, col_orange }, /* SchemeSel label 2 */
++ { col_white, col_yellow, col_yellow }, /* SchemeSel label 3 */
++ { col_white, col_green, col_green }, /* SchemeSel label 4 */
++ { col_white, col_gray, col_gray }, /* SchemeSel label 5 */
++ { col_white, col_blue, col_blue }, /* SchemeSel label 6 */
++ { col_white, col_purple, col_purple }, /* SchemeSel label 7 */
++ { col_white, col_black, col_black }, /* SchemeSel label 8 */
++ { col_gray3, col_gray1, col_gray2 }, /* SchemeNorm */
+ };
+
+ /* tagging */
+diff --git a/dwm.c b/dwm.c
+index a96f33c..be99dde 100644
+--- a/dwm.c
++++ b/dwm.c
+_AT_@ -59,11 +59,11 @@
+
+ /* enums */
+ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
+-enum { SchemeNorm, SchemeSel }; /* color schemes */
+ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
+ NetWMFullscreen, NetActiveWindow, NetWMWindowType,
+ NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
+ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
++enum { QubesLabel, QubesVMName, QubesLast }; /* QubesOS atoms */
+ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
+ ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
+
+_AT_@ -85,6 +86,7 @@ typedef struct {
+ typedef struct Monitor Monitor;
+ typedef struct Client Client;
+ struct Client {
++ char vmname[256];
+ char name[256];
+ float mina, maxa;
+ int x, y, w, h;
+_AT_@ -170,6 +172,7 @@ static void focusin(XEvent *e);
+ static void focusmon(const Arg *arg);
+ static void focusstack(const Arg *arg);
+ static Atom getatomprop(Client *c, Atom prop);
++static int getlabel(Client *c);
+ static int getrootptr(int *x, int *y);
+ static long getstate(Window w);
+ static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
+_AT_@ -237,6 +240,7 @@ static void zoom(const Arg *arg);
+
+ /* variables */
+ static const char broken[] = "broken";
++static const char dom0[] = "dom0";
+ static char stext[256];
+ static int screen;
+ static int sw, sh; /* X display screen geometry width, height */
+_AT_@ -260,8 +264,10 @@ static void (*handler[LASTEvent]) (XEvent *) = {
+ [PropertyNotify] = propertynotify,
+ [UnmapNotify] = unmapnotify
+ };
+-static Atom wmatom[WMLast], netatom[NetLast];
++static Atom wmatom[WMLast], netatom[NetLast], qubesatom[QubesLast];
+ static int running = 1;
++static int SchemeSel = 0;
++static const int SchemeNorm = 9;
+ static Cur *cursor[CurLast];
+ static Clr **scheme;
+ static Display *dpy;
+_AT_@ -702,6 +708,9 @@ drawbar(Monitor *m)
+ unsigned int i, occ = 0, urg = 0;
+ Client *c;
+
++ int size;
++ char *fullname = NULL;
++
+ if (!m->showbar)
+ return;
+
+_AT_@ -735,7 +744,11 @@ drawbar(Monitor *m)
+ if ((w = m->ww - tw - x) > bh) {
+ if (m->sel) {
+ drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
+- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
++ size = strlen(m->sel->vmname) + strlen(m->sel->name) + 4;
++ fullname = ecalloc(size, 1);
++ snprintf(fullname, size, "[%s] %s", m->sel->vmname, m->sel->name);
++ drw_text(drw, x, 0, w, bh, lrpad / 2, fullname, 0);
++ XFree(fullname);
+ if (m->sel->isfloating)
+ drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
+ } else {
+_AT_@ -799,6 +812,7 @@ focus(Client *c)
+ detachstack(c);
+ attachstack(c);
+ grabbuttons(c, 1);
++ SchemeSel = getlabel(c);
+ XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
+ setfocus(c);
+ } else {
+_AT_@ -875,6 +889,28 @@ getatomprop(Client *c, Atom prop)
+ return atom;
+ }
+
++int
++getlabel(Client *c)
++{
++ Atom actual_type;
++ int actual_format;
++ unsigned long nitems;
++ unsigned long nbytes;
++ char *value = 0;
++ int result;
++
++ XGetWindowProperty(dpy, c->win, qubesatom[QubesLabel], 0, 1, False, XA_CARDINAL,
++ &actual_type, &actual_format, &nitems, &nbytes, (unsigned char **) &value);
++
++ if (nitems) {
++ result = (int)*value;
++ } else {
++ result = 0;
++ }
++ XFree(value);
++ return result;
++}
++
+ int
+ getrootptr(int *x, int *y)
+ {
+_AT_@ -1239,7 +1275,7 @@ propertynotify(XEvent *e)
+ drawbars();
+ break;
+ }
+- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
++ if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName] || ev->atom == qubesatom[QubesVMName]) {
+ updatetitle(c);
+ if (c == c->mon->sel)
+ drawbar(c->mon);
+_AT_@ -1566,6 +1602,9 @@ 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);
++ /* init QubesOS atoms */
++ qubesatom[QubesLabel] = XInternAtom(dpy, "_QUBES_LABEL", False);
++ qubesatom[QubesVMName] = XInternAtom(dpy, "_QUBES_VMNAME", False);
+ /* init cursors */
+ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
+ cursor[CurResize] = drw_cur_create(drw, XC_sizing);
+_AT_@ -2001,6 +2040,8 @@ updatestatus(void)
+ void
+ updatetitle(Client *c)
+ {
++ if (!gettextprop(c->win, qubesatom[QubesVMName], c->vmname, sizeof c->vmname))
++ strcpy(c->vmname, dom0);
+ if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
+ gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name);
+ if (c->name[0] == '+--
+2.30.2
+
diff --git a/dwm.suckless.org/patches/qubesdecorations/five.png b/dwm.suckless.org/patches/qubesdecorations/five.png
new file mode 100644
index 00000000..27a1e447
Binary files /dev/null and b/dwm.suckless.org/patches/qubesdecorations/five.png differ
diff --git a/dwm.suckless.org/patches/qubesdecorations/index.md b/dwm.suckless.org/patches/qubesdecorations/index.md
new file mode 100644
index 00000000..353d4416
--- /dev/null
+++ b/dwm.suckless.org/patches/qubesdecorations/index.md
_AT_@ -0,0 +1,21 @@
+qubesdecorations
+================
+
+Description
+-----------
+This patch enables dwm to read [QubesOS](https://qubes-os.org)-specific window properties and use the
+windowborders, titlebar and tagbar to indicate to the user what qube the
+focused window belongs to.
+
+Each qube-label gets its own SchemeSel colorscheme that can be conviniently configured in config.def.h
+
+![screenshot](three.png)
+![screenshot](five.png)
+
+Download
+--------
+* [dwm-qubesdecorations-6.3.diff](dwm-qubesdecorations-6.3.diff) (2022-01-07)
+
+Author
+-------
+* 3o14r473 - [fingerprint](E4FEE61C3B02F4CAB6D80CA7F105757D34BEFA98) [email](3o14_AT_pm.me) [github](https://github.com/3o14r473) [moneroj](41rMoMLvk8hEJYP2vbv3dNUGzN95CLXoANAtmAVaUxzse5KfPjhkE7d4PUwh8kCkF16FwwqfZTmS4ZKmYCjrsFAcGXTPpwH)
diff --git a/dwm.suckless.org/patches/qubesdecorations/three.png b/dwm.suckless.org/patches/qubesdecorations/three.png
new file mode 100644
index 00000000..5687dd1e
Binary files /dev/null and b/dwm.suckless.org/patches/qubesdecorations/three.png differ
Received on Thu Jan 20 2022 - 21:01:57 CET

This archive was generated by hypermail 2.3.0 : Thu Jan 20 2022 - 21:12:46 CET