tabbed-0.6-xft.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
tabbed-0.6-xft.diff (6605B)
---
1 diff --git a/config.def.h b/config.def.h
2 index ceda9f7..bc7cfe2 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -1,7 +1,7 @@
6 /* See LICENSE file for copyright and license details. */
7
8 /* appearance */
9 -static const char font[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
10 +static const char font[] = "monospace-9";
11 static const char* normbgcolor = "#222222";
12 static const char* normfgcolor = "#cccccc";
13 static const char* selbgcolor = "#555555";
14 diff --git a/config.mk b/config.mk
15 index 5279711..037f9d7 100644
16 --- a/config.mk
17 +++ b/config.mk
18 @@ -8,8 +8,8 @@ PREFIX = /usr/local
19 MANPREFIX = ${PREFIX}/share/man
20
21 # includes and libs
22 -INCS = -I. -I/usr/include
23 -LIBS = -L/usr/lib -lc -lX11
24 +INCS = -I. -I/usr/include -I/usr/include/freetype2
25 +LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft
26
27 # flags
28 CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE
29 diff --git a/tabbed.c b/tabbed.c
30 index d30206b..d08348c 100644
31 --- a/tabbed.c
32 +++ b/tabbed.c
33 @@ -15,6 +15,7 @@
34 #include <X11/Xproto.h>
35 #include <X11/Xutil.h>
36 #include <X11/XKBlib.h>
37 +#include <X11/Xft/Xft.h>
38
39 #include "arg.h"
40
41 @@ -64,16 +65,15 @@ typedef struct {
42
43 typedef struct {
44 int x, y, w, h;
45 - unsigned long norm[ColLast];
46 - unsigned long sel[ColLast];
47 + XftColor norm[ColLast];
48 + XftColor sel[ColLast];
49 Drawable drawable;
50 GC gc;
51 struct {
52 int ascent;
53 int descent;
54 int height;
55 - XFontSet set;
56 - XFontStruct *xfont;
57 + XftFont *xfont;
58 } font;
59 } DC; /* draw context */
60
61 @@ -95,7 +95,7 @@ static void createnotify(const XEvent *e);
62 static void destroynotify(const XEvent *e);
63 static void die(const char *errstr, ...);
64 static void drawbar(void);
65 -static void drawtext(const char *text, unsigned long col[ColLast]);
66 +static void drawtext(const char *text, XftColor col[ColLast]);
67 static void *emallocz(size_t size);
68 static void *erealloc(void *o, size_t size);
69 static void expose(const XEvent *e);
70 @@ -105,7 +105,7 @@ static void focusonce(const Arg *arg);
71 static void fullscreen(const Arg *arg);
72 static char* getatom(int a);
73 static int getclient(Window w);
74 -static unsigned long getcolor(const char *colstr);
75 +static XftColor getcolor(const char *colstr);
76 static int getfirsttab(void);
77 static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
78 static void initfont(const char *fontstr);
79 @@ -219,12 +219,6 @@ cleanup(void) {
80 free(clients);
81 clients = NULL;
82
83 - if(dc.font.set) {
84 - XFreeFontSet(dpy, dc.font.set);
85 - } else {
86 - XFreeFont(dpy, dc.font.xfont);
87 - }
88 -
89 XFreePixmap(dpy, dc.drawable);
90 XFreeGC(dpy, dc.gc);
91 XDestroyWindow(dpy, win);
92 @@ -305,7 +299,7 @@ die(const char *errstr, ...) {
93
94 void
95 drawbar(void) {
96 - unsigned long *col;
97 + XftColor *col;
98 int c, fc, width, n = 0;
99 char *name = NULL;
100
101 @@ -362,12 +356,13 @@ drawbar(void) {
102 }
103
104 void
105 -drawtext(const char *text, unsigned long col[ColLast]) {
106 +drawtext(const char *text, XftColor col[ColLast]) {
107 int i, x, y, h, len, olen;
108 char buf[256];
109 + XftDraw *d;
110 XRectangle r = { dc.x, dc.y, dc.w, dc.h };
111
112 - XSetForeground(dpy, dc.gc, col[ColBG]);
113 + XSetForeground(dpy, dc.gc, col[ColBG].pixel);
114 XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
115 if(!text)
116 return;
117 @@ -388,13 +383,10 @@ drawtext(const char *text, unsigned long col[ColLast]) {
118 for(i = len; i && i > len - 3; buf[--i] = '.');
119 }
120
121 - XSetForeground(dpy, dc.gc, col[ColFG]);
122 - if(dc.font.set) {
123 - XmbDrawString(dpy, dc.drawable, dc.font.set,
124 - dc.gc, x, y, buf, len);
125 - } else {
126 - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
127 - }
128 + d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen));
129 +
130 + XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
131 + XftDrawDestroy(d);
132 }
133
134 void *
135 @@ -524,15 +516,14 @@ getclient(Window w) {
136 return -1;
137 }
138
139 -unsigned long
140 +XftColor
141 getcolor(const char *colstr) {
142 - Colormap cmap = DefaultColormap(dpy, screen);
143 - XColor color;
144 + XftColor color;
145
146 - if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
147 + if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
148 die("tabbed: cannot allocate color '%s'\n", colstr);
149
150 - return color.pixel;
151 + return color;
152 }
153
154 int
155 @@ -585,41 +576,12 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) {
156
157 void
158 initfont(const char *fontstr) {
159 - char *def, **missing, **font_names;
160 - int i, n;
161 - XFontStruct **xfonts;
162 -
163 - missing = NULL;
164 - if(dc.font.set)
165 - XFreeFontSet(dpy, dc.font.set);
166 -
167 - dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
168 - if(missing) {
169 - while(n--)
170 - fprintf(stderr, "tabbed: missing fontset: %s\n", missing[n]);
171 - XFreeStringList(missing);
172 - }
173 + if(!(dc.font.xfont = XftFontOpenName(dpy, screen, fontstr))
174 + && !(dc.font.xfont = XftFontOpenName(dpy, screen, "fixed")))
175 + die("error, cannot load font: '%s'\n", fontstr);
176
177 - if(dc.font.set) {
178 - dc.font.ascent = dc.font.descent = 0;
179 - n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
180 - for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
181 - dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
182 - dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
183 - xfonts++;
184 - }
185 - } else {
186 - if(dc.font.xfont)
187 - XFreeFont(dpy, dc.font.xfont);
188 - dc.font.xfont = NULL;
189 - if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
190 - && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) {
191 - die("tabbed: cannot load font: '%s'\n", fontstr);
192 - }
193 -
194 - dc.font.ascent = dc.font.xfont->ascent;
195 - dc.font.descent = dc.font.xfont->descent;
196 - }
197 + dc.font.ascent = dc.font.xfont->ascent;
198 + dc.font.descent = dc.font.xfont->descent;
199 dc.font.height = dc.font.ascent + dc.font.descent;
200 }
201
202 @@ -972,11 +934,9 @@ setup(void) {
203 dc.drawable = XCreatePixmap(dpy, root, ww, wh,
204 DefaultDepth(dpy, screen));
205 dc.gc = XCreateGC(dpy, root, 0, 0);
206 - if(!dc.font.set)
207 - XSetFont(dpy, dc.gc, dc.font.xfont->fid);
208
209 win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0,
210 - dc.norm[ColFG], dc.norm[ColBG]);
211 + dc.norm[ColFG].pixel, dc.norm[ColBG].pixel);
212 XMapRaised(dpy, win);
213 XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask|
214 ButtonPressMask|ExposureMask|KeyPressMask|PropertyChangeMask|
215 @@ -1040,15 +1000,9 @@ spawn(const Arg *arg) {
216
217 int
218 textnw(const char *text, unsigned int len) {
219 - XRectangle r;
220 -
221 - if(dc.font.set) {
222 - XmbTextExtents(dc.font.set, text, len, NULL, &r);
223 -
224 - return r.width;
225 - }
226 -
227 - return XTextWidth(dc.font.xfont, text, len);
228 + XGlyphInfo ext;
229 + XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
230 + return ext.xOff;
231 }
232
233 void