dwm-alpha-6.1.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-alpha-6.1.diff (8683B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 7054c06..4448d46 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -11,6 +11,8 @@ static const char normfgcolor[] = "#bbbbbb";
6 static const char selbordercolor[] = "#005577";
7 static const char selbgcolor[] = "#005577";
8 static const char selfgcolor[] = "#eeeeee";
9 +static unsigned int baralpha = 0xd0;
10 +static unsigned int borderalpha = OPAQUE;
11 static const unsigned int borderpx = 1; /* border pixel of windows */
12 static const unsigned int snap = 32; /* snap pixel */
13 static const int showbar = 1; /* 0 means no bar */
14 diff --git a/config.mk b/config.mk
15 index 4eefb71..de25d2a 100644
16 --- a/config.mk
17 +++ b/config.mk
18 @@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2
19
20 # includes and libs
21 INCS = -I${X11INC} -I${FREETYPEINC}
22 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
23 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender
24
25 # flags
26 CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
27 diff --git a/drw.c b/drw.c
28 index f49200b..12e3ebc 100644
29 --- a/drw.c
30 +++ b/drw.c
31 @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen)
32 }
33
34 Drw *
35 -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
36 +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
37 {
38 Drw *drw;
39
40 @@ -71,8 +71,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
41 drw->root = root;
42 drw->w = w;
43 drw->h = h;
44 - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
45 - drw->gc = XCreateGC(dpy, root, 0, NULL);
46 + drw->visual = visual;
47 + drw->depth = depth;
48 + drw->cmap = cmap;
49 + drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
50 + drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
51 drw->fontcount = 0;
52 XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
53
54 @@ -86,7 +89,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
55 drw->h = h;
56 if (drw->drawable)
57 XFreePixmap(drw->dpy, drw->drawable);
58 - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
59 + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
60 }
61
62 void
63 @@ -180,16 +183,15 @@ drw_font_free(Fnt *font)
64 }
65
66 Clr *
67 -drw_clr_create(Drw *drw, const char *clrname)
68 +drw_clr_create(Drw *drw, const char *clrname, unsigned int alpha)
69 {
70 Clr *clr;
71
72 clr = ecalloc(1, sizeof(Clr));
73 - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
74 - DefaultColormap(drw->dpy, drw->screen),
75 + if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
76 clrname, &clr->rgb))
77 die("error, cannot allocate color '%s'\n", clrname);
78 - clr->pix = clr->rgb.pixel;
79 + clr->pix = (clr->rgb.pixel & 0x00ffffffU) | (alpha << 24);
80
81 return clr;
82 }
83 @@ -245,9 +247,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *tex
84 XSetForeground(drw->dpy, drw->gc, invert ?
85 drw->scheme->fg->pix : drw->scheme->bg->pix);
86 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
87 - d = XftDrawCreate(drw->dpy, drw->drawable,
88 - DefaultVisual(drw->dpy, drw->screen),
89 - DefaultColormap(drw->dpy, drw->screen));
90 + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
91 }
92
93 curfont = drw->fonts[0];
94 diff --git a/drw.h b/drw.h
95 index e3b8515..1fed824 100644
96 --- a/drw.h
97 +++ b/drw.h
98 @@ -30,6 +30,9 @@ typedef struct {
99 Display *dpy;
100 int screen;
101 Window root;
102 + Visual *visual;
103 + unsigned int depth;
104 + Colormap cmap;
105 Drawable drawable;
106 GC gc;
107 ClrScheme *scheme;
108 @@ -43,7 +46,7 @@ typedef struct {
109 } Extnts;
110
111 /* Drawable abstraction */
112 -Drw *drw_create(Display *, int, Window, unsigned int, unsigned int);
113 +Drw *drw_create(Display *, int, Window, unsigned int, unsigned int, Visual*, unsigned int, Colormap);
114 void drw_resize(Drw *, unsigned int, unsigned int);
115 void drw_free(Drw *);
116
117 @@ -55,7 +58,7 @@ void drw_font_getexts(Fnt *, const char *, unsigned int, Extnts *);
118 unsigned int drw_font_getexts_width(Fnt *, const char *, unsigned int);
119
120 /* Colour abstraction */
121 -Clr *drw_clr_create(Drw *, const char *);
122 +Clr *drw_clr_create(Drw *, const char *, unsigned int);
123 void drw_clr_free(Clr *);
124
125 /* Cursor abstraction */
126 diff --git a/dwm.c b/dwm.c
127 index 0362114..17fe373 100644
128 --- a/dwm.c
129 +++ b/dwm.c
130 @@ -57,6 +57,8 @@
131 #define TAGMASK ((1 << LENGTH(tags)) - 1)
132 #define TEXTW(X) (drw_text(drw, 0, 0, 0, 0, (X), 0) + drw->fonts[0]->h)
133
134 +#define OPAQUE 0xffU
135 +
136 /* enums */
137 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
138 enum { SchemeNorm, SchemeSel, SchemeLast }; /* color schemes */
139 @@ -232,6 +234,7 @@ static Monitor *wintomon(Window w);
140 static int xerror(Display *dpy, XErrorEvent *ee);
141 static int xerrordummy(Display *dpy, XErrorEvent *ee);
142 static int xerrorstart(Display *dpy, XErrorEvent *ee);
143 +static void xinitvisual();
144 static void zoom(const Arg *arg);
145
146 /* variables */
147 @@ -267,6 +270,11 @@ static Drw *drw;
148 static Monitor *mons, *selmon;
149 static Window root;
150
151 +static int useargb = 0;
152 +static Visual *visual;
153 +static int depth;
154 +static Colormap cmap;
155 +
156 /* configuration, allows nested code to access above variables */
157 #include "config.h"
158
159 @@ -1556,7 +1564,8 @@ setup(void)
160 sw = DisplayWidth(dpy, screen);
161 sh = DisplayHeight(dpy, screen);
162 root = RootWindow(dpy, screen);
163 - drw = drw_create(dpy, screen, root, sw, sh);
164 + xinitvisual();
165 + drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
166 drw_load_fonts(drw, fonts, LENGTH(fonts));
167 if (!drw->fontcount)
168 die("no fonts could be loaded.\n");
169 @@ -1580,12 +1589,12 @@ setup(void)
170 cursor[CurResize] = drw_cur_create(drw, XC_sizing);
171 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
172 /* init appearance */
173 - scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor);
174 - scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor);
175 - scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor);
176 - scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor);
177 - scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor);
178 - scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor);
179 + scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor, borderalpha);
180 + scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor, baralpha);
181 + scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor, OPAQUE);
182 + scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor, borderalpha);
183 + scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor, baralpha);
184 + scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor, OPAQUE);
185 /* init bars */
186 updatebars();
187 updatestatus();
188 @@ -1798,15 +1807,17 @@ updatebars(void)
189 Monitor *m;
190 XSetWindowAttributes wa = {
191 .override_redirect = True,
192 - .background_pixmap = ParentRelative,
193 + .background_pixel = 0,
194 + .border_pixel = 0,
195 + .colormap = cmap,
196 .event_mask = ButtonPressMask|ExposureMask
197 };
198 for (m = mons; m; m = m->next) {
199 if (m->barwin)
200 continue;
201 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
202 - CopyFromParent, DefaultVisual(dpy, screen),
203 - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
204 + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth,
205 + InputOutput, visual,
206 + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
207 XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
208 XMapRaised(dpy, m->barwin);
209 }
210 @@ -2107,6 +2118,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
211 }
212
213 void
214 +xinitvisual()
215 +{
216 + XVisualInfo *infos;
217 + XRenderPictFormat *fmt;
218 + int nitems;
219 + int i;
220 +
221 + XVisualInfo tpl = {
222 + .screen = screen,
223 + .depth = 32,
224 + .class = TrueColor
225 + };
226 + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
227 +
228 + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
229 + visual = NULL;
230 + for(i = 0; i < nitems; i ++) {
231 + fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
232 + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
233 + visual = infos[i].visual;
234 + depth = infos[i].depth;
235 + cmap = XCreateColormap(dpy, root, visual, AllocNone);
236 + useargb = 1;
237 + break;
238 + }
239 + }
240 +
241 + XFree(infos);
242 +
243 + if (! visual) {
244 + visual = DefaultVisual(dpy, screen);
245 + depth = DefaultDepth(dpy, screen);
246 + cmap = DefaultColormap(dpy, screen);
247 + }
248 +}
249 +
250 +void
251 zoom(const Arg *arg)
252 {
253 Client *c = selmon->sel;