dwm-preview-all-windows-6.5.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-preview-all-windows-6.5.diff (9620B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 4412cb1..24f39a7 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -1,5 +1,8 @@
6 /* See LICENSE file for copyright and license details. */
7
8 +//#define ACTUALFULLSCREEN /* Uncomment if the actualfullscreen patch is added */
9 +//#define AWESOMEBAR /* Uncommnet if the awesomebar patch is used */
10 +
11 /* appearance */
12 static const unsigned int borderpx = 1; /* border pixel of windows */
13 static const unsigned int snap = 32; /* snap pixel */
14 @@ -95,6 +98,7 @@ static const Key keys[] = {
15 TAGKEYS( XK_8, 7)
16 TAGKEYS( XK_9, 8)
17 { MODKEY|ShiftMask, XK_q, quit, {0} },
18 + { MODKEY, XK_r, previewallwin, {0} },
19 };
20
21 /* button definitions */
22 diff --git a/config.mk b/config.mk
23 index 8efca9a..8df2978 100644
24 --- a/config.mk
25 +++ b/config.mk
26 @@ -23,7 +23,7 @@ FREETYPEINC = /usr/include/freetype2
27
28 # includes and libs
29 INCS = -I${X11INC} -I${FREETYPEINC}
30 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
31 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender
32
33 # flags
34 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
35 diff --git a/dwm.c b/dwm.c
36 index 1443802..ac561fa 100644
37 --- a/dwm.c
38 +++ b/dwm.c
39 @@ -40,6 +40,7 @@
40 #include <X11/extensions/Xinerama.h>
41 #endif /* XINERAMA */
42 #include <X11/Xft/Xft.h>
43 +#include <X11/extensions/Xrender.h>
44
45 #include "drw.h"
46 #include "util.h"
47 @@ -83,6 +84,16 @@ typedef struct {
48
49 typedef struct Monitor Monitor;
50 typedef struct Client Client;
51 +
52 +typedef struct Preview Preview;
53 +struct Preview {
54 + XImage *orig_image;
55 + XImage *scaled_image;
56 + Window win;
57 + unsigned int x, y;
58 + Preview *next;
59 +};
60 +
61 struct Client {
62 char name[256];
63 float mina, maxa;
64 @@ -96,6 +107,7 @@ struct Client {
65 Client *snext;
66 Monitor *mon;
67 Window win;
68 + Preview pre;
69 };
70
71 typedef struct {
72 @@ -232,6 +244,10 @@ static int xerror(Display *dpy, XErrorEvent *ee);
73 static int xerrordummy(Display *dpy, XErrorEvent *ee);
74 static int xerrorstart(Display *dpy, XErrorEvent *ee);
75 static void zoom(const Arg *arg);
76 +static void previewallwin();
77 +static void setpreviewwindowsizepositions(unsigned int n, Monitor *m, unsigned int gappo, unsigned int gappi);
78 +static XImage *getwindowximage(Client *c);
79 +static XImage *scaledownimage(XImage *orig_image, unsigned int cw, unsigned int ch);
80
81 /* variables */
82 static const char broken[] = "broken";
83 @@ -2139,6 +2155,210 @@ zoom(const Arg *arg)
84 pop(c);
85 }
86
87 +void
88 +previewallwin(){
89 + Monitor *m = selmon;
90 + Client *c, *focus_c = NULL;
91 + unsigned int n;
92 + for (n = 0, c = m->clients; c; c = c->next, n++){
93 +#ifdef ACTUALFULLSCREEN
94 + if (c->isfullscreen)
95 + togglefullscr(&(Arg){0});
96 +#endif
97 +#ifdef AWESOMEBAR
98 + if (HIDDEN(c))
99 + continue;
100 +#endif
101 + c->pre.orig_image = getwindowximage(c);
102 + }
103 + if (n == 0)
104 + return;
105 + setpreviewwindowsizepositions(n, m, 60, 15);
106 + XEvent event;
107 + for(c = m->clients; c; c = c->next){
108 + if (!c->pre.win)
109 + c->pre.win = XCreateSimpleWindow(dpy, root, c->pre.x, c->pre.y, c->pre.scaled_image->width, c->pre.scaled_image->height, 1, BlackPixel(dpy, screen), WhitePixel(dpy, screen));
110 + else
111 + XMoveResizeWindow(dpy, c->pre.win, c->pre.x, c->pre.y, c->pre.scaled_image->width, c->pre.scaled_image->height);
112 + XSetWindowBorder(dpy, c->pre.win, scheme[SchemeNorm][ColBorder].pixel);
113 + XUnmapWindow(dpy, c->win);
114 + if (c->pre.win){
115 + XSelectInput(dpy, c->pre.win, ButtonPress | EnterWindowMask | LeaveWindowMask );
116 + XMapWindow(dpy, c->pre.win);
117 + GC gc = XCreateGC(dpy, c->pre.win, 0, NULL);
118 + XPutImage(dpy, c->pre.win, gc, c->pre.scaled_image, 0, 0, 0, 0, c->pre.scaled_image->width, c->pre.scaled_image->height);
119 + }
120 + }
121 + while (1) {
122 + XNextEvent(dpy, &event);
123 + if (event.type == ButtonPress)
124 + if (event.xbutton.button == Button1){
125 + for(c = m->clients; c; c = c->next){
126 + XUnmapWindow(dpy, c->pre.win);
127 + if (event.xbutton.window == c->pre.win){
128 + selmon->seltags ^= 1; /* toggle sel tagset */
129 + m->tagset[selmon->seltags] = c->tags;
130 + focus_c = c;
131 + focus(NULL);
132 +#ifdef AWESOMEBAR
133 + if (HIDDEN(c)){
134 + showwin(c);
135 + continue;
136 + }
137 +#endif
138 + }
139 + /* If you hit awesomebar patch Unlock the notes below;
140 + * And you should add the following line to "hidewin" Function
141 + * c->pre.orig_image = getwindowximage(c);
142 + * */
143 +#ifdef AWESOMEBAR
144 + if (HIDDEN(c)){
145 + continue;
146 + }
147 +#endif
148 + XMapWindow(dpy, c->win);
149 + XDestroyImage(c->pre.orig_image);
150 + XDestroyImage(c->pre.scaled_image);
151 + }
152 + break;
153 + }
154 + if (event.type == EnterNotify)
155 + for(c = m->clients; c; c = c->next)
156 + if (event.xcrossing.window == c->pre.win){
157 + XSetWindowBorder(dpy, c->pre.win, scheme[SchemeSel][ColBorder].pixel);
158 + break;
159 + }
160 + if (event.type == LeaveNotify)
161 + for(c = m->clients; c; c = c->next)
162 + if (event.xcrossing.window == c->pre.win){
163 + XSetWindowBorder(dpy, c->pre.win, scheme[SchemeNorm][ColBorder].pixel);
164 + break;
165 + }
166 + }
167 + arrange(m);
168 + focus(focus_c);
169 +}
170 +
171 +void
172 +setpreviewwindowsizepositions(unsigned int n, Monitor *m, unsigned int gappo, unsigned int gappi){
173 + unsigned int i, j;
174 + unsigned int cx, cy, cw, ch, cmaxh;
175 + unsigned int cols, rows;
176 + Client *c, *tmpc;
177 +
178 + if (n == 1) {
179 + c = m->clients;
180 + cw = (m->ww - 2 * gappo) * 0.8;
181 + ch = (m->wh - 2 * gappo) * 0.9;
182 + c->pre.scaled_image = scaledownimage(c->pre.orig_image, cw, ch);
183 + c->pre.x = m->mx + (m->mw - c->pre.scaled_image->width) / 2;
184 + c->pre.y = m->my + (m->mh - c->pre.scaled_image->height) / 2;
185 + return;
186 + }
187 + if (n == 2) {
188 + c = m->clients;
189 + cw = (m->ww - 2 * gappo - gappi) / 2;
190 + ch = (m->wh - 2 * gappo) * 0.7;
191 + c->pre.scaled_image = scaledownimage(c->pre.orig_image, cw, ch);
192 + c->next->pre.scaled_image = scaledownimage(c->next->pre.orig_image, cw, ch);
193 + c->pre.x = m->mx + (m->mw - c->pre.scaled_image->width - gappi - c->next->pre.scaled_image->width) / 2;
194 + c->pre.y = m->my + (m->mh - c->pre.scaled_image->height) / 2;
195 + c->next->pre.x = c->pre.x + c->pre.scaled_image->width + gappi;
196 + c->next->pre.y = m->my + (m->mh - c->next->pre.scaled_image->height) / 2;
197 + return;
198 + }
199 + for (cols = 0; cols <= n / 2; cols++)
200 + if (cols * cols >= n)
201 + break;
202 + rows = (cols && (cols - 1) * cols >= n) ? cols - 1 : cols;
203 + ch = (m->wh - 2 * gappo) / rows;
204 + cw = (m->ww - 2 * gappo) / cols;
205 + c = m->clients;
206 + cy = 0;
207 + for (i = 0; i < rows; i++) {
208 + cx = 0;
209 + cmaxh = 0;
210 + tmpc = c;
211 + for (int j = 0; j < cols; j++) {
212 + if (!c)
213 + break;
214 + c->pre.scaled_image = scaledownimage(c->pre.orig_image, cw, ch);
215 + c->pre.x = cx;
216 + cmaxh = c->pre.scaled_image->height > cmaxh ? c->pre.scaled_image->height : cmaxh;
217 + cx += c->pre.scaled_image->width + gappi;
218 + c = c->next;
219 + }
220 + c = tmpc;
221 + cx = m->wx + (m->ww - cx) / 2;
222 + for (j = 0; j < cols; j++) {
223 + if (!c)
224 + break;
225 + c->pre.x += cx;
226 + c->pre.y = cy + (cmaxh - c->pre.scaled_image->height) / 2;
227 + c = c->next;
228 + }
229 + cy += cmaxh + gappi;
230 + }
231 + cy = m->wy + (m->wh - cy) / 2;
232 + for (c = m->clients; c; c = c->next)
233 + c->pre.y += cy;
234 +}
235 +
236 +XImage*
237 +getwindowximage(Client *c) {
238 + XWindowAttributes attr;
239 + XGetWindowAttributes( dpy, c->win, &attr );
240 + XRenderPictFormat *format = XRenderFindVisualFormat( dpy, attr.visual );
241 + int hasAlpha = ( format->type == PictTypeDirect && format->direct.alphaMask );
242 + XRenderPictureAttributes pa;
243 + pa.subwindow_mode = IncludeInferiors;
244 + Picture picture = XRenderCreatePicture( dpy, c->win, format, CPSubwindowMode, &pa );
245 + Pixmap pixmap = XCreatePixmap(dpy, root, c->w, c->h, 32);
246 + XRenderPictureAttributes pa2;
247 + XRenderPictFormat *format2 = XRenderFindStandardFormat(dpy, PictStandardARGB32);
248 + Picture pixmapPicture = XRenderCreatePicture( dpy, pixmap, format2, 0, &pa2 );
249 + XRenderColor color;
250 + color.red = 0x0000;
251 + color.green = 0x0000;
252 + color.blue = 0x0000;
253 + color.alpha = 0x0000;
254 + XRenderFillRectangle (dpy, PictOpSrc, pixmapPicture, &color, 0, 0, c->w, c->h);
255 + XRenderComposite(dpy, hasAlpha ? PictOpOver : PictOpSrc, picture, 0,
256 + pixmapPicture, 0, 0, 0, 0, 0, 0,
257 + c->w, c->h);
258 + XImage* temp = XGetImage( dpy, pixmap, 0, 0, c->w, c->h, AllPlanes, ZPixmap );
259 + temp->red_mask = format2->direct.redMask << format2->direct.red;
260 + temp->green_mask = format2->direct.greenMask << format2->direct.green;
261 + temp->blue_mask = format2->direct.blueMask << format2->direct.blue;
262 + temp->depth = DefaultDepth(dpy, screen);
263 + return temp;
264 +}
265 +
266 +XImage*
267 +scaledownimage(XImage *orig_image, unsigned int cw, unsigned int ch) {
268 + int factor_w = orig_image->width / cw + 1;
269 + int factor_h = orig_image->height / ch + 1;
270 + int scale_factor = factor_w > factor_h ? factor_w : factor_h;
271 + int scaled_width = orig_image->width / scale_factor;
272 + int scaled_height = orig_image->height / scale_factor;
273 + XImage *scaled_image = XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)),
274 + orig_image->depth,
275 + ZPixmap, 0, NULL,
276 + scaled_width, scaled_height,
277 + 32, 0);
278 + scaled_image->data = malloc(scaled_image->height * scaled_image->bytes_per_line);
279 + for (int y = 0; y < scaled_height; y++) {
280 + for (int x = 0; x < scaled_width; x++) {
281 + int orig_x = x * scale_factor;
282 + int orig_y = y * scale_factor;
283 + unsigned long pixel = XGetPixel(orig_image, orig_x, orig_y);
284 + XPutPixel(scaled_image, x, y, pixel);
285 + }
286 + }
287 + scaled_image->depth = orig_image->depth;
288 + return scaled_image;
289 +}
290 +
291 int
292 main(int argc, char *argv[])
293 {
294 --
295 2.48.1
296