dwm-mark-new-6.1.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-mark-new-6.1.diff (5815B) | |
--- | |
1 diff -urp -x config.mk dwm-6.1/drw.h dwm-6.1-patched/drw.h | |
2 --- dwm-6.1/drw.h 2015-11-09 06:39:37.000000000 +0800 | |
3 +++ dwm-6.1-patched/drw.h 2016-03-09 15:12:58.966751900 +0800 | |
4 @@ -23,6 +23,7 @@ typedef struct { | |
5 Clr *fg; | |
6 Clr *bg; | |
7 Clr *border; | |
8 + Clr *mark; | |
9 } ClrScheme; | |
10 | |
11 typedef struct { | |
12 diff -urp -x config.mk dwm-6.1/dwm.c dwm-6.1-patched/dwm.c | |
13 --- dwm-6.1/dwm.c 2015-11-09 06:39:37.000000000 +0800 | |
14 +++ dwm-6.1-patched/dwm.c 2016-03-09 15:55:35.723676356 +0800 | |
15 @@ -201,16 +201,20 @@ static void setclientstate(Client *c, lo | |
16 static void setfocus(Client *c); | |
17 static void setfullscreen(Client *c, int fullscreen); | |
18 static void setlayout(const Arg *arg); | |
19 +static void setmark(Client *c); | |
20 static void setmfact(const Arg *arg); | |
21 static void setup(void); | |
22 static void showhide(Client *c); | |
23 static void sigchld(int unused); | |
24 static void spawn(const Arg *arg); | |
25 +static void swapclient(const Arg *arg); | |
26 +static void swapfocus(const Arg *arg); | |
27 static void tag(const Arg *arg); | |
28 static void tagmon(const Arg *arg); | |
29 static void tile(Monitor *); | |
30 static void togglebar(const Arg *arg); | |
31 static void togglefloating(const Arg *arg); | |
32 +static void togglemark(const Arg *arg); | |
33 static void toggletag(const Arg *arg); | |
34 static void toggleview(const Arg *arg); | |
35 static void unfocus(Client *c, int setfocus); | |
36 @@ -266,6 +270,7 @@ static Display *dpy; | |
37 static Drw *drw; | |
38 static Monitor *mons, *selmon; | |
39 static Window root; | |
40 +static Client *mark; | |
41 | |
42 /* configuration, allows nested code to access above variables */ | |
43 #include "config.h" | |
44 @@ -482,6 +487,7 @@ cleanup(void) | |
45 for (i = 0; i < CurLast; i++) | |
46 drw_cur_free(drw, cursor[i]); | |
47 for (i = 0; i < SchemeLast; i++) { | |
48 + drw_clr_free(scheme[i].mark); | |
49 drw_clr_free(scheme[i].border); | |
50 drw_clr_free(scheme[i].bg); | |
51 drw_clr_free(scheme[i].fg); | |
52 @@ -807,7 +813,10 @@ focus(Client *c) | |
53 detachstack(c); | |
54 attachstack(c); | |
55 grabbuttons(c, 1); | |
56 - XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border-… | |
57 + if (c == mark) | |
58 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel]… | |
59 + else | |
60 + XSetWindowBorder(dpy, c->win, scheme[SchemeSel]… | |
61 setfocus(c); | |
62 } else { | |
63 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentT… | |
64 @@ -1065,7 +1074,10 @@ manage(Window w, XWindowAttributes *wa) | |
65 | |
66 wc.border_width = c->bw; | |
67 XConfigureWindow(dpy, w, CWBorderWidth, &wc); | |
68 - XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); | |
69 + if (c == mark) | |
70 + XSetWindowBorder(dpy, w, scheme[SchemeNorm].mark->pix); | |
71 + else | |
72 + XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix… | |
73 configure(c); /* propagates border_width, if size doesn't chang… | |
74 updatewindowtype(c); | |
75 updatesizehints(c); | |
76 @@ -1528,6 +1540,23 @@ setlayout(const Arg *arg) | |
77 drawbar(selmon); | |
78 } | |
79 | |
80 +void | |
81 +setmark(Client *c) | |
82 +{ | |
83 + if (c == mark) | |
84 + return; | |
85 + if (mark) { | |
86 + XSetWindowBorder(dpy, mark->win, scheme[mark == selmon-… | |
87 + ? SchemeSel : SchemeNorm].border->pix); | |
88 + mark = 0; | |
89 + } | |
90 + if (c) { | |
91 + XSetWindowBorder(dpy, c->win, scheme[c == selmon->sel | |
92 + ? SchemeSel : SchemeNorm].mark->pix); | |
93 + mark = c; | |
94 + } | |
95 +} | |
96 + | |
97 /* arg > 1.0 will set mfact absolutly */ | |
98 void | |
99 setmfact(const Arg *arg) | |
100 @@ -1580,9 +1609,11 @@ setup(void) | |
101 cursor[CurResize] = drw_cur_create(drw, XC_sizing); | |
102 cursor[CurMove] = drw_cur_create(drw, XC_fleur); | |
103 /* init appearance */ | |
104 + scheme[SchemeNorm].mark = drw_clr_create(drw, normmarkcolor); | |
105 scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor… | |
106 scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor); | |
107 scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor); | |
108 + scheme[SchemeSel].mark = drw_clr_create(drw, selmarkcolor); | |
109 scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor); | |
110 scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor); | |
111 scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor); | |
112 @@ -1646,6 +1677,66 @@ spawn(const Arg *arg) | |
113 } | |
114 | |
115 void | |
116 +swapclient(const Arg *arg) | |
117 +{ | |
118 + Client *s, *m, t; | |
119 + | |
120 + if (!mark || !selmon->sel || mark == selmon->sel | |
121 + || !selmon->lt[selmon->sellt]->arrange) | |
122 + return; | |
123 + s = selmon->sel; | |
124 + m = mark; | |
125 + t = *s; | |
126 + strcpy(s->name, m->name); | |
127 + s->win = m->win; | |
128 + s->x = m->x; | |
129 + s->y = m->y; | |
130 + s->w = m->w; | |
131 + s->h = m->h; | |
132 + | |
133 + m->win = t.win; | |
134 + strcpy(m->name, t.name); | |
135 + m->x = t.x; | |
136 + m->y = t.y; | |
137 + m->w = t.w; | |
138 + m->h = t.h; | |
139 + | |
140 + selmon->sel = m; | |
141 + mark = s; | |
142 + focus(s); | |
143 + setmark(m); | |
144 + | |
145 + arrange(s->mon); | |
146 + if (s->mon != m->mon) { | |
147 + arrange(m->mon); | |
148 + } | |
149 +} | |
150 + | |
151 +void | |
152 +swapfocus(const Arg *arg) | |
153 +{ | |
154 + Client *t; | |
155 + | |
156 + if (!selmon->sel || !mark || selmon->sel == mark) | |
157 + return; | |
158 + t = selmon->sel; | |
159 + if (mark->mon != selmon) { | |
160 + unfocus(selmon->sel, 0); | |
161 + selmon = mark->mon; | |
162 + } | |
163 + if (ISVISIBLE(mark)) { | |
164 + focus(mark); | |
165 + restack(selmon); | |
166 + } else { | |
167 + selmon->seltags ^= 1; | |
168 + selmon->tagset[selmon->seltags] = mark->tags; | |
169 + focus(mark); | |
170 + arrange(selmon); | |
171 + } | |
172 + setmark(t); | |
173 +} | |
174 + | |
175 +void | |
176 tag(const Arg *arg) | |
177 { | |
178 if (selmon->sel && arg->ui & TAGMASK) { | |
179 @@ -1713,6 +1804,14 @@ togglefloating(const Arg *arg) | |
180 } | |
181 | |
182 void | |
183 +togglemark(const Arg *arg) | |
184 +{ | |
185 + if (!selmon->sel) | |
186 + return; | |
187 + setmark(selmon->sel == mark ? 0 : selmon->sel); | |
188 +} | |
189 + | |
190 +void | |
191 toggletag(const Arg *arg) | |
192 { | |
193 unsigned int newtags; | |
194 @@ -1745,7 +1844,10 @@ unfocus(Client *c, int setfocus) | |
195 if (!c) | |
196 return; | |
197 grabbuttons(c, 0); | |
198 - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); | |
199 + if (c == mark) | |
200 + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].mark->… | |
201 + else | |
202 + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border… | |
203 if (setfocus) { | |
204 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentT… | |
205 XDeleteProperty(dpy, root, netatom[NetActiveWindow]); | |
206 @@ -1758,6 +1860,8 @@ unmanage(Client *c, int destroyed) | |
207 Monitor *m = c->mon; | |
208 XWindowChanges wc; | |
209 | |
210 + if (c == mark) | |
211 + setmark(0); | |
212 /* The server grab construct avoids race conditions. */ | |
213 detach(c); | |
214 detachstack(c); |