dwm-windowfollow-6.3.diff (5187B)
1 diff '--color=auto' -up dwm-6.3/config.def.h windowfollow-impl-6-3/config.def.h 2 --- dwm-6.3/config.def.h 2022-01-07 11:42:18.000000000 +0000 3 +++ windowfollow-impl-6-3/config.def.h 2022-10-02 18:32:22.244267491 +0100 4 @@ -31,6 +31,11 @@ static const Rule rules[] = { 5 { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, 6 }; 7 8 +/* window following */ 9 +#define WFACTIVE '>' 10 +#define WFINACTIVE 'v' 11 +#define WFDEFAULT WFINACTIVE 12 + 13 /* layout(s) */ 14 static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ 15 static const int nmaster = 1; /* number of clients in master area */ 16 @@ -65,6 +70,7 @@ static Key keys[] = { 17 { MODKEY, XK_p, spawn, {.v = dmenucmd } }, 18 { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, 19 { MODKEY, XK_b, togglebar, {0} }, 20 + { MODKEY, XK_n, togglefollow, {0} }, 21 { MODKEY, XK_j, focusstack, {.i = +1 } }, 22 { MODKEY, XK_k, focusstack, {.i = -1 } }, 23 { MODKEY, XK_i, incnmaster, {.i = +1 } }, 24 @@ -103,6 +109,7 @@ static Button buttons[] = { 25 /* click event mask button function argument */ 26 { ClkLtSymbol, 0, Button1, setlayout, {0} }, 27 { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, 28 + { ClkFollowSymbol, 0, Button1, togglefollow, {0} }, 29 { ClkWinTitle, 0, Button2, zoom, {0} }, 30 { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, 31 { ClkClientWin, MODKEY, Button1, movemouse, {0} }, 32 diff '--color=auto' -up dwm-6.3/dwm.1 windowfollow-impl-6-3/dwm.1 33 --- dwm-6.3/dwm.1 2022-01-07 11:42:18.000000000 +0000 34 +++ windowfollow-impl-6-3/dwm.1 2022-10-02 18:32:22.244267491 +0100 35 @@ -44,7 +44,8 @@ command. 36 .TP 37 .B Button1 38 click on a tag label to display all windows with that tag, click on the layout 39 -label toggles between tiled and floating layout. 40 +label toggles between tiled and floating layout, click on the window follow 41 +icon toggles it on and off. 42 .TP 43 .B Button3 44 click on a tag label adds/removes all windows with that tag to/from the view. 45 @@ -80,6 +81,9 @@ Send focused window to next screen, if a 46 .B Mod1\-b 47 Toggles bar on and off. 48 .TP 49 +.B Mod1\-n 50 +Toggles window following on and off. 51 +.TP 52 .B Mod1\-t 53 Sets tiled layout. 54 .TP 55 diff '--color=auto' -up dwm-6.3/dwm.c windowfollow-impl-6-3/dwm.c 56 --- dwm-6.3/dwm.c 2022-01-07 11:42:18.000000000 +0000 57 +++ windowfollow-impl-6-3/dwm.c 2022-10-02 18:32:22.244267491 +0100 58 @@ -65,7 +65,7 @@ enum { NetSupported, NetWMName, NetWMSta 59 NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ 60 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ 61 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, 62 - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ 63 + ClkClientWin, ClkRootWin, ClkFollowSymbol, ClkLast }; /* clicks */ 64 65 typedef union { 66 int i; 67 @@ -113,6 +113,7 @@ typedef struct { 68 69 struct Monitor { 70 char ltsymbol[16]; 71 + char wfsymbol[2]; 72 float mfact; 73 int nmaster; 74 int num; 75 @@ -212,6 +213,7 @@ static void tagmon(const Arg *arg); 76 static void tile(Monitor *); 77 static void togglebar(const Arg *arg); 78 static void togglefloating(const Arg *arg); 79 +static void togglefollow(const Arg *arg); 80 static void toggletag(const Arg *arg); 81 static void toggleview(const Arg *arg); 82 static void unfocus(Client *c, int setfocus); 83 @@ -440,6 +442,8 @@ buttonpress(XEvent *e) 84 arg.ui = 1 << i; 85 } else if (ev->x < x + blw) 86 click = ClkLtSymbol; 87 + else if (ev->x < x + blw + TEXTW(selmon->wfsymbol)) 88 + click = ClkFollowSymbol; 89 else if (ev->x > selmon->ww - (int)TEXTW(stext)) 90 click = ClkStatusText; 91 else 92 @@ -642,6 +646,8 @@ createmon(void) 93 m->lt[0] = &layouts[0]; 94 m->lt[1] = &layouts[1 % LENGTH(layouts)]; 95 strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); 96 + m->wfsymbol[0] = WFDEFAULT; 97 + m->wfsymbol[1] = '\0'; 98 return m; 99 } 100 101 @@ -732,6 +738,9 @@ drawbar(Monitor *m) 102 drw_setscheme(drw, scheme[SchemeNorm]); 103 x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); 104 105 + w = TEXTW(m->wfsymbol); 106 + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->wfsymbol, 0); 107 + 108 if ((w = m->ww - tw - x) > bh) { 109 if (m->sel) { 110 drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); 111 @@ -1664,6 +1673,8 @@ tag(const Arg *arg) 112 focus(NULL); 113 arrange(selmon); 114 } 115 + if (selmon->wfsymbol[0] == WFACTIVE) 116 + view(arg); 117 } 118 119 void 120 @@ -1672,6 +1683,8 @@ tagmon(const Arg *arg) 121 if (!selmon->sel || !mons->next) 122 return; 123 sendmon(selmon->sel, dirtomon(arg->i)); 124 + if (selmon->wfsymbol[0] == WFACTIVE) 125 + focusmon(arg); 126 } 127 128 void 129 @@ -1712,6 +1725,13 @@ togglebar(const Arg *arg) 130 } 131 132 void 133 +togglefollow(const Arg *arg) 134 +{ 135 + selmon->wfsymbol[0] = (selmon->wfsymbol[0] == WFACTIVE) ? WFINACTIVE : WFACTIVE; 136 + drawbars(); 137 +} 138 + 139 +void 140 togglefloating(const Arg *arg) 141 { 142 if (!selmon->sel)