backported drawtext() simplifications to dmenu
cf7e4c15
2 file(s) · +11 −22
| 1 | 1 | # dmenu version |
|
| 2 | - | VERSION = 3.8 |
|
| 2 | + | VERSION = 3.9 |
|
| 3 | 3 | ||
| 4 | 4 | # Customize below to fit your system |
|
| 5 | 5 |
| 17 | 17 | /* macros */ |
|
| 18 | 18 | #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) |
|
| 19 | 19 | #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH)) |
|
| 20 | + | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
|
| 20 | 21 | ||
| 21 | 22 | /* enums */ |
|
| 22 | 23 | enum { ColFG, ColBG, ColLast }; |
|
| 212 | 213 | ||
| 213 | 214 | void |
|
| 214 | 215 | drawtext(const char *text, unsigned long col[ColLast]) { |
|
| 215 | - | int x, y, w, h; |
|
| 216 | - | static char buf[256]; |
|
| 217 | - | unsigned int len, olen; |
|
| 216 | + | int i, x, y, h, len, olen; |
|
| 217 | + | char buf[256]; |
|
| 218 | 218 | XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
| 219 | 219 | ||
| 220 | 220 | XSetForeground(dpy, dc.gc, col[ColBG]); |
|
| 221 | 221 | XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); |
|
| 222 | 222 | if(!text) |
|
| 223 | 223 | return; |
|
| 224 | - | w = 0; |
|
| 225 | - | olen = len = strlen(text); |
|
| 226 | - | if(len >= sizeof buf) |
|
| 227 | - | len = sizeof buf - 1; |
|
| 228 | - | memcpy(buf, text, len); |
|
| 229 | - | buf[len] = 0; |
|
| 224 | + | olen = strlen(text); |
|
| 230 | 225 | h = dc.font.ascent + dc.font.descent; |
|
| 231 | 226 | y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; |
|
| 232 | 227 | x = dc.x + (h / 2); |
|
| 233 | 228 | /* shorten text if necessary */ |
|
| 234 | - | while(len && (w = textnw(buf, len)) > dc.w - h) |
|
| 235 | - | buf[--len] = 0; |
|
| 236 | - | if(len < olen) { |
|
| 237 | - | if(len > 1) |
|
| 238 | - | buf[len - 1] = '.'; |
|
| 239 | - | if(len > 2) |
|
| 240 | - | buf[len - 2] = '.'; |
|
| 241 | - | if(len > 3) |
|
| 242 | - | buf[len - 3] = '.'; |
|
| 243 | - | } |
|
| 244 | - | if(w > dc.w) |
|
| 245 | - | return; /* too long */ |
|
| 229 | + | for(len = MIN(olen, sizeof buf); len && (i = textnw(buf, len)) > dc.w - h; len--); |
|
| 230 | + | if(!len) |
|
| 231 | + | return; |
|
| 232 | + | memcpy(buf, text, len); |
|
| 233 | + | if(len < olen) |
|
| 234 | + | for(i = len; i && i > len - 3; buf[--i] = '.'); |
|
| 246 | 235 | XSetForeground(dpy, dc.gc, col[ColFG]); |
|
| 247 | 236 | if(dc.font.set) |
|
| 248 | 237 | XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); |
|