diff options
Diffstat (limited to 'drw.c')
| -rw-r--r-- | drw.c | 172 |
1 files changed, 97 insertions, 75 deletions
| @@ -11,13 +11,14 @@ | |||
| 11 | #define UTF_INVALID 0xFFFD | 11 | #define UTF_INVALID 0xFFFD |
| 12 | #define UTF_SIZ 4 | 12 | #define UTF_SIZ 4 |
| 13 | 13 | ||
| 14 | static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; | 14 | static const unsigned char utfbyte[UTF_SIZ + 1] = { 0x80, 0, 0xC0, 0xE0, 0xF0 }; |
| 15 | static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; | 15 | static const unsigned char utfmask[UTF_SIZ + 1] = |
| 16 | static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; | 16 | { 0xC0, 0x80, 0xE0, 0xF0, 0xF8 }; |
| 17 | static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; | 17 | static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000 }; |
| 18 | 18 | static const long utfmax[UTF_SIZ + 1] = | |
| 19 | static long | 19 | { 0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF }; |
| 20 | utf8decodebyte(const char c, size_t *i) | 20 | |
| 21 | static long utf8decodebyte(const char c, size_t *i) | ||
| 21 | { | 22 | { |
| 22 | for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) | 23 | for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) |
| 23 | if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) | 24 | if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) |
| @@ -25,18 +26,15 @@ utf8decodebyte(const char c, size_t *i) | |||
| 25 | return 0; | 26 | return 0; |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | static size_t | 29 | static size_t utf8validate(long *u, size_t i) |
| 29 | utf8validate(long *u, size_t i) | ||
| 30 | { | 30 | { |
| 31 | if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) | 31 | if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) |
| 32 | *u = UTF_INVALID; | 32 | *u = UTF_INVALID; |
| 33 | for (i = 1; *u > utfmax[i]; ++i) | 33 | for (i = 1; *u > utfmax[i]; ++i) ; |
| 34 | ; | ||
| 35 | return i; | 34 | return i; |
| 36 | } | 35 | } |
| 37 | 36 | ||
| 38 | static size_t | 37 | static size_t utf8decode(const char *c, long *u, size_t clen) |
| 39 | utf8decode(const char *c, long *u, size_t clen) | ||
| 40 | { | 38 | { |
| 41 | size_t i, j, len, type; | 39 | size_t i, j, len, type; |
| 42 | long udecoded; | 40 | long udecoded; |
| @@ -60,8 +58,8 @@ utf8decode(const char *c, long *u, size_t clen) | |||
| 60 | return len; | 58 | return len; |
| 61 | } | 59 | } |
| 62 | 60 | ||
| 63 | Drw * | 61 | Drw *drw_create(Display *dpy, int screen, Window root, unsigned int w, |
| 64 | drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) | 62 | unsigned int h) |
| 65 | { | 63 | { |
| 66 | Drw *drw = ecalloc(1, sizeof(Drw)); | 64 | Drw *drw = ecalloc(1, sizeof(Drw)); |
| 67 | 65 | ||
| @@ -70,15 +68,15 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h | |||
| 70 | drw->root = root; | 68 | drw->root = root; |
| 71 | drw->w = w; | 69 | drw->w = w; |
| 72 | drw->h = h; | 70 | drw->h = h; |
| 73 | drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | 71 | drw->drawable = |
| 72 | XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); | ||
| 74 | drw->gc = XCreateGC(dpy, root, 0, NULL); | 73 | drw->gc = XCreateGC(dpy, root, 0, NULL); |
| 75 | XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); | 74 | XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); |
| 76 | 75 | ||
| 77 | return drw; | 76 | return drw; |
| 78 | } | 77 | } |
| 79 | 78 | ||
| 80 | void | 79 | void drw_resize(Drw *drw, unsigned int w, unsigned int h) |
| 81 | drw_resize(Drw *drw, unsigned int w, unsigned int h) | ||
| 82 | { | 80 | { |
| 83 | if (!drw) | 81 | if (!drw) |
| 84 | return; | 82 | return; |
| @@ -87,11 +85,12 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) | |||
| 87 | drw->h = h; | 85 | drw->h = h; |
| 88 | if (drw->drawable) | 86 | if (drw->drawable) |
| 89 | XFreePixmap(drw->dpy, drw->drawable); | 87 | XFreePixmap(drw->dpy, drw->drawable); |
| 90 | drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); | 88 | drw->drawable = |
| 89 | XCreatePixmap(drw->dpy, drw->root, w, h, | ||
| 90 | DefaultDepth(drw->dpy, drw->screen)); | ||
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | void | 93 | void drw_free(Drw *drw) |
| 94 | drw_free(Drw *drw) | ||
| 95 | { | 94 | { |
| 96 | XFreePixmap(drw->dpy, drw->drawable); | 95 | XFreePixmap(drw->dpy, drw->drawable); |
| 97 | XFreeGC(drw->dpy, drw->gc); | 96 | XFreeGC(drw->dpy, drw->gc); |
| @@ -102,8 +101,7 @@ drw_free(Drw *drw) | |||
| 102 | /* This function is an implementation detail. Library users should use | 101 | /* This function is an implementation detail. Library users should use |
| 103 | * drw_fontset_create instead. | 102 | * drw_fontset_create instead. |
| 104 | */ | 103 | */ |
| 105 | static Fnt * | 104 | static Fnt *xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) |
| 106 | xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) | ||
| 107 | { | 105 | { |
| 108 | Fnt *font; | 106 | Fnt *font; |
| 109 | XftFont *xfont = NULL; | 107 | XftFont *xfont = NULL; |
| @@ -116,17 +114,22 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) | |||
| 116 | * behaviour whereas the former just results in missing-character | 114 | * behaviour whereas the former just results in missing-character |
| 117 | * rectangles being drawn, at least with some fonts. */ | 115 | * rectangles being drawn, at least with some fonts. */ |
| 118 | if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { | 116 | if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { |
| 119 | fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); | 117 | fprintf(stderr, |
| 118 | "error, cannot load font from name: '%s'\n", | ||
| 119 | fontname); | ||
| 120 | return NULL; | 120 | return NULL; |
| 121 | } | 121 | } |
| 122 | if (!(pattern = FcNameParse((FcChar8 *) fontname))) { | 122 | if (!(pattern = FcNameParse((FcChar8 *) fontname))) { |
| 123 | fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); | 123 | fprintf(stderr, |
| 124 | "error, cannot parse font name to pattern: '%s'\n", | ||
| 125 | fontname); | ||
| 124 | XftFontClose(drw->dpy, xfont); | 126 | XftFontClose(drw->dpy, xfont); |
| 125 | return NULL; | 127 | return NULL; |
| 126 | } | 128 | } |
| 127 | } else if (fontpattern) { | 129 | } else if (fontpattern) { |
| 128 | if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { | 130 | if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { |
| 129 | fprintf(stderr, "error, cannot load font from pattern.\n"); | 131 | fprintf(stderr, |
| 132 | "error, cannot load font from pattern.\n"); | ||
| 130 | return NULL; | 133 | return NULL; |
| 131 | } | 134 | } |
| 132 | } else { | 135 | } else { |
| @@ -142,8 +145,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) | |||
| 142 | return font; | 145 | return font; |
| 143 | } | 146 | } |
| 144 | 147 | ||
| 145 | static void | 148 | static void xfont_free(Fnt *font) |
| 146 | xfont_free(Fnt *font) | ||
| 147 | { | 149 | { |
| 148 | if (!font) | 150 | if (!font) |
| 149 | return; | 151 | return; |
| @@ -153,8 +155,7 @@ xfont_free(Fnt *font) | |||
| 153 | free(font); | 155 | free(font); |
| 154 | } | 156 | } |
| 155 | 157 | ||
| 156 | Fnt* | 158 | Fnt *drw_fontset_create(Drw *drw, const char *fonts[], size_t fontcount) |
| 157 | drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) | ||
| 158 | { | 159 | { |
| 159 | Fnt *cur, *ret = NULL; | 160 | Fnt *cur, *ret = NULL; |
| 160 | size_t i; | 161 | size_t i; |
| @@ -171,8 +172,7 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) | |||
| 171 | return (drw->fonts = ret); | 172 | return (drw->fonts = ret); |
| 172 | } | 173 | } |
| 173 | 174 | ||
| 174 | void | 175 | void drw_fontset_free(Fnt *font) |
| 175 | drw_fontset_free(Fnt *font) | ||
| 176 | { | 176 | { |
| 177 | if (font) { | 177 | if (font) { |
| 178 | drw_fontset_free(font->next); | 178 | drw_fontset_free(font->next); |
| @@ -180,28 +180,27 @@ drw_fontset_free(Fnt *font) | |||
| 180 | } | 180 | } |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | void | 183 | void drw_clr_create(Drw *drw, Clr *dest, const char *clrname) |
| 184 | drw_clr_create(Drw *drw, Clr *dest, const char *clrname) | ||
| 185 | { | 184 | { |
| 186 | if (!drw || !dest || !clrname) | 185 | if (!drw || !dest || !clrname) |
| 187 | return; | 186 | return; |
| 188 | 187 | ||
| 189 | if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), | 188 | if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), |
| 190 | DefaultColormap(drw->dpy, drw->screen), | 189 | DefaultColormap(drw->dpy, drw->screen), |
| 191 | clrname, dest)) | 190 | clrname, dest)) |
| 192 | die("error, cannot allocate color '%s'", clrname); | 191 | die("error, cannot allocate color '%s'", clrname); |
| 193 | } | 192 | } |
| 194 | 193 | ||
| 195 | /* Wrapper to create color schemes. The caller has to call free(3) on the | 194 | /* Wrapper to create color schemes. The caller has to call free(3) on the |
| 196 | * returned color scheme when done using it. */ | 195 | * returned color scheme when done using it. */ |
| 197 | Clr * | 196 | Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) |
| 198 | drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | ||
| 199 | { | 197 | { |
| 200 | size_t i; | 198 | size_t i; |
| 201 | Clr *ret; | 199 | Clr *ret; |
| 202 | 200 | ||
| 203 | /* need at least two colors for a scheme */ | 201 | /* need at least two colors for a scheme */ |
| 204 | if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) | 202 | if (!drw || !clrnames || clrcount < 2 |
| 203 | || !(ret = ecalloc(clrcount, sizeof(XftColor)))) | ||
| 205 | return NULL; | 204 | return NULL; |
| 206 | 205 | ||
| 207 | for (i = 0; i < clrcount; i++) | 206 | for (i = 0; i < clrcount; i++) |
| @@ -209,34 +208,37 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) | |||
| 209 | return ret; | 208 | return ret; |
| 210 | } | 209 | } |
| 211 | 210 | ||
| 212 | void | 211 | void drw_setfontset(Drw *drw, Fnt *set) |
| 213 | drw_setfontset(Drw *drw, Fnt *set) | ||
| 214 | { | 212 | { |
| 215 | if (drw) | 213 | if (drw) |
| 216 | drw->fonts = set; | 214 | drw->fonts = set; |
| 217 | } | 215 | } |
| 218 | 216 | ||
| 219 | void | 217 | void drw_setscheme(Drw *drw, Clr *scm) |
| 220 | drw_setscheme(Drw *drw, Clr *scm) | ||
| 221 | { | 218 | { |
| 222 | if (drw) | 219 | if (drw) |
| 223 | drw->scheme = scm; | 220 | drw->scheme = scm; |
| 224 | } | 221 | } |
| 225 | 222 | ||
| 226 | void | 223 | void |
| 227 | drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) | 224 | drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, |
| 225 | int invert) | ||
| 228 | { | 226 | { |
| 229 | if (!drw || !drw->scheme) | 227 | if (!drw || !drw->scheme) |
| 230 | return; | 228 | return; |
| 231 | XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); | 229 | XSetForeground(drw->dpy, drw->gc, |
| 230 | invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg]. | ||
| 231 | pixel); | ||
| 232 | if (filled) | 232 | if (filled) |
| 233 | XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | 233 | XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); |
| 234 | else | 234 | else |
| 235 | XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); | 235 | XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, |
| 236 | h - 1); | ||
| 236 | } | 237 | } |
| 237 | 238 | ||
| 238 | int | 239 | int |
| 239 | drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) | 240 | drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, |
| 241 | unsigned int lpad, const char *text, int invert) | ||
| 240 | { | 242 | { |
| 241 | int i, ty, ellipsis_x = 0; | 243 | int i, ty, ellipsis_x = 0; |
| 242 | unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; | 244 | unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; |
| @@ -252,7 +254,10 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 252 | int charexists = 0, overflow = 0; | 254 | int charexists = 0, overflow = 0; |
| 253 | /* keep track of a couple codepoints for which we have no match. */ | 255 | /* keep track of a couple codepoints for which we have no match. */ |
| 254 | enum { nomatches_len = 64 }; | 256 | enum { nomatches_len = 64 }; |
| 255 | static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; | 257 | static struct { |
| 258 | long codepoint[nomatches_len]; | ||
| 259 | unsigned int idx; | ||
| 260 | } nomatches; | ||
| 256 | static unsigned int ellipsis_width = 0; | 261 | static unsigned int ellipsis_width = 0; |
| 257 | 262 | ||
| 258 | if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) | 263 | if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) |
| @@ -261,11 +266,12 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 261 | if (!render) { | 266 | if (!render) { |
| 262 | w = invert ? invert : ~invert; | 267 | w = invert ? invert : ~invert; |
| 263 | } else { | 268 | } else { |
| 264 | XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); | 269 | XSetForeground(drw->dpy, drw->gc, |
| 270 | drw->scheme[invert ? ColFg : ColBg].pixel); | ||
| 265 | XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | 271 | XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); |
| 266 | d = XftDrawCreate(drw->dpy, drw->drawable, | 272 | d = XftDrawCreate(drw->dpy, drw->drawable, |
| 267 | DefaultVisual(drw->dpy, drw->screen), | 273 | DefaultVisual(drw->dpy, drw->screen), |
| 268 | DefaultColormap(drw->dpy, drw->screen)); | 274 | DefaultColormap(drw->dpy, drw->screen)); |
| 269 | x += lpad; | 275 | x += lpad; |
| 270 | w -= lpad; | 276 | w -= lpad; |
| 271 | } | 277 | } |
| @@ -279,10 +285,15 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 279 | nextfont = NULL; | 285 | nextfont = NULL; |
| 280 | while (*text) { | 286 | while (*text) { |
| 281 | utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); | 287 | utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); |
| 282 | for (curfont = drw->fonts; curfont; curfont = curfont->next) { | 288 | for (curfont = drw->fonts; curfont; |
| 283 | charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); | 289 | curfont = curfont->next) { |
| 290 | charexists = charexists | ||
| 291 | || XftCharExists(drw->dpy, curfont->xfont, | ||
| 292 | utf8codepoint); | ||
| 284 | if (charexists) { | 293 | if (charexists) { |
| 285 | drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); | 294 | drw_font_getexts(curfont, text, |
| 295 | utf8charlen, &tmpw, | ||
| 296 | NULL); | ||
| 286 | if (ew + ellipsis_width <= w) { | 297 | if (ew + ellipsis_width <= w) { |
| 287 | /* keep track where the ellipsis still fits */ | 298 | /* keep track where the ellipsis still fits */ |
| 288 | ellipsis_x = x + ew; | 299 | ellipsis_x = x + ew; |
| @@ -298,7 +309,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 298 | if (!render) | 309 | if (!render) |
| 299 | x += tmpw; | 310 | x += tmpw; |
| 300 | else | 311 | else |
| 301 | utf8strlen = ellipsis_len; | 312 | utf8strlen = |
| 313 | ellipsis_len; | ||
| 302 | } else if (curfont == usedfont) { | 314 | } else if (curfont == usedfont) { |
| 303 | utf8strlen += utf8charlen; | 315 | utf8strlen += utf8charlen; |
| 304 | text += utf8charlen; | 316 | text += utf8charlen; |
| @@ -318,15 +330,22 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 318 | 330 | ||
| 319 | if (utf8strlen) { | 331 | if (utf8strlen) { |
| 320 | if (render) { | 332 | if (render) { |
| 321 | ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; | 333 | ty = y + (h - usedfont->h) / 2 + |
| 322 | XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], | 334 | usedfont->xfont->ascent; |
| 323 | usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); | 335 | XftDrawStringUtf8(d, |
| 336 | &drw-> | ||
| 337 | scheme[invert ? ColBg : | ||
| 338 | ColFg], | ||
| 339 | usedfont->xfont, x, ty, | ||
| 340 | (XftChar8 *) utf8str, | ||
| 341 | utf8strlen); | ||
| 324 | } | 342 | } |
| 325 | x += ew; | 343 | x += ew; |
| 326 | w -= ew; | 344 | w -= ew; |
| 327 | } | 345 | } |
| 328 | if (render && overflow) | 346 | if (render && overflow) |
| 329 | drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); | 347 | drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", |
| 348 | invert); | ||
| 330 | 349 | ||
| 331 | if (!*text || overflow) { | 350 | if (!*text || overflow) { |
| 332 | break; | 351 | break; |
| @@ -358,21 +377,26 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp | |||
| 358 | 377 | ||
| 359 | FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); | 378 | FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); |
| 360 | FcDefaultSubstitute(fcpattern); | 379 | FcDefaultSubstitute(fcpattern); |
| 361 | match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); | 380 | match = |
| 381 | XftFontMatch(drw->dpy, drw->screen, fcpattern, | ||
| 382 | &result); | ||
| 362 | 383 | ||
| 363 | FcCharSetDestroy(fccharset); | 384 | FcCharSetDestroy(fccharset); |
| 364 | FcPatternDestroy(fcpattern); | 385 | FcPatternDestroy(fcpattern); |
| 365 | 386 | ||
| 366 | if (match) { | 387 | if (match) { |
| 367 | usedfont = xfont_create(drw, NULL, match); | 388 | usedfont = xfont_create(drw, NULL, match); |
| 368 | if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { | 389 | if (usedfont |
| 369 | for (curfont = drw->fonts; curfont->next; curfont = curfont->next) | 390 | && XftCharExists(drw->dpy, usedfont->xfont, |
| 370 | ; /* NOP */ | 391 | utf8codepoint)) { |
| 392 | for (curfont = drw->fonts; curfont->next; curfont = curfont->next) ; /* NOP */ | ||
| 371 | curfont->next = usedfont; | 393 | curfont->next = usedfont; |
| 372 | } else { | 394 | } else { |
| 373 | xfont_free(usedfont); | 395 | xfont_free(usedfont); |
| 374 | nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; | 396 | nomatches.codepoint[++nomatches.idx % |
| 375 | no_match: | 397 | nomatches_len] = |
| 398 | utf8codepoint; | ||
| 399 | no_match: | ||
| 376 | usedfont = drw->fonts; | 400 | usedfont = drw->fonts; |
| 377 | } | 401 | } |
| 378 | } | 402 | } |
| @@ -384,8 +408,7 @@ no_match: | |||
| 384 | return x + (render ? w : 0); | 408 | return x + (render ? w : 0); |
| 385 | } | 409 | } |
| 386 | 410 | ||
| 387 | void | 411 | void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) |
| 388 | drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) | ||
| 389 | { | 412 | { |
| 390 | if (!drw) | 413 | if (!drw) |
| 391 | return; | 414 | return; |
| @@ -394,8 +417,7 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) | |||
| 394 | XSync(drw->dpy, False); | 417 | XSync(drw->dpy, False); |
| 395 | } | 418 | } |
| 396 | 419 | ||
| 397 | unsigned int | 420 | unsigned int drw_fontset_getwidth(Drw *drw, const char *text) |
| 398 | drw_fontset_getwidth(Drw *drw, const char *text) | ||
| 399 | { | 421 | { |
| 400 | if (!drw || !drw->fonts || !text) | 422 | if (!drw || !drw->fonts || !text) |
| 401 | return 0; | 423 | return 0; |
| @@ -412,22 +434,23 @@ drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) | |||
| 412 | } | 434 | } |
| 413 | 435 | ||
| 414 | void | 436 | void |
| 415 | drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) | 437 | drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, |
| 438 | unsigned int *h) | ||
| 416 | { | 439 | { |
| 417 | XGlyphInfo ext; | 440 | XGlyphInfo ext; |
| 418 | 441 | ||
| 419 | if (!font || !text) | 442 | if (!font || !text) |
| 420 | return; | 443 | return; |
| 421 | 444 | ||
| 422 | XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); | 445 | XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *) text, len, |
| 446 | &ext); | ||
| 423 | if (w) | 447 | if (w) |
| 424 | *w = ext.xOff; | 448 | *w = ext.xOff; |
| 425 | if (h) | 449 | if (h) |
| 426 | *h = font->h; | 450 | *h = font->h; |
| 427 | } | 451 | } |
| 428 | 452 | ||
| 429 | Cur * | 453 | Cur *drw_cur_create(Drw *drw, int shape) |
| 430 | drw_cur_create(Drw *drw, int shape) | ||
| 431 | { | 454 | { |
| 432 | Cur *cur; | 455 | Cur *cur; |
| 433 | 456 | ||
| @@ -439,8 +462,7 @@ drw_cur_create(Drw *drw, int shape) | |||
| 439 | return cur; | 462 | return cur; |
| 440 | } | 463 | } |
| 441 | 464 | ||
| 442 | void | 465 | void drw_cur_free(Drw *drw, Cur *cursor) |
| 443 | drw_cur_free(Drw *drw, Cur *cursor) | ||
| 444 | { | 466 | { |
| 445 | if (!cursor) | 467 | if (!cursor) |
| 446 | return; | 468 | return; |
