dwm-windowfollow-6.3.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
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)