| @ -0,0 +1,10 @@ | |||
| /* See LICENSE file for copyright and license details. */ | |||
| /* appearance */ | |||
| #define FONT "-*-terminus-medium-r-*-*-12-*-*-*-*-*-iso10646-*" | |||
| #define NORMBGCOLOR "#000" | |||
| #define NORMFGCOLOR "#ccc" | |||
| #define SELBGCOLOR "#00f" | |||
| #define SELFGCOLOR "#fff" | |||
| /* next macro defines the space between menu items */ | |||
| #define SPACE 30 /* px */ | |||
| @ -1,41 +0,0 @@ | |||
| /* See LICENSE file for copyright and license details. */ | |||
| #include <X11/Xlib.h> | |||
| #define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*" | |||
| #define NORMBGCOLOR "#eeeeee" | |||
| #define NORMFGCOLOR "#222222" | |||
| #define SELBGCOLOR "#006699" | |||
| #define SELFGCOLOR "#ffffff" | |||
| #define SPACE 30 /* px */ | |||
| /* color */ | |||
| enum { ColFG, ColBG, ColLast }; | |||
| typedef struct { | |||
| int x, y, w, h; | |||
| unsigned long norm[ColLast]; | |||
| unsigned long sel[ColLast]; | |||
| Drawable drawable; | |||
| GC gc; | |||
| struct { | |||
| XFontStruct *xfont; | |||
| XFontSet set; | |||
| int ascent; | |||
| int descent; | |||
| int height; | |||
| } font; | |||
| } DC; /* draw context */ | |||
| extern int screen; | |||
| extern Display *dpy; | |||
| extern DC dc; /* global drawing context */ | |||
| /* draw.c */ | |||
| void drawtext(const char *text, unsigned long col[ColLast]); | |||
| unsigned int textw(const char *text); | |||
| unsigned int textnw(const char *text, unsigned int len); | |||
| /* util.c */ | |||
| void *emalloc(unsigned int size); /* allocates memory, exits on error */ | |||
| void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */ | |||
| char *estrdup(const char *str); /* duplicates str, exits on allocation error */ | |||
| @ -1,61 +0,0 @@ | |||
| /* See LICENSE file for copyright and license details. */ | |||
| #include "dmenu.h" | |||
| #include <string.h> | |||
| /* extern */ | |||
| void | |||
| drawtext(const char *text, unsigned long col[ColLast]) { | |||
| int x, y, w, h; | |||
| static char buf[256]; | |||
| unsigned int len, olen; | |||
| XRectangle r = { dc.x, dc.y, dc.w, dc.h }; | |||
| XSetForeground(dpy, dc.gc, col[ColBG]); | |||
| XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); | |||
| if(!text) | |||
| return; | |||
| w = 0; | |||
| olen = len = strlen(text); | |||
| if(len >= sizeof buf) | |||
| len = sizeof buf - 1; | |||
| memcpy(buf, text, len); | |||
| buf[len] = 0; | |||
| h = dc.font.ascent + dc.font.descent; | |||
| y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; | |||
| x = dc.x + (h / 2); | |||
| /* shorten text if necessary */ | |||
| while(len && (w = textnw(buf, len)) > dc.w - h) | |||
| buf[--len] = 0; | |||
| if(len < olen) { | |||
| if(len > 1) | |||
| buf[len - 1] = '.'; | |||
| if(len > 2) | |||
| buf[len - 2] = '.'; | |||
| if(len > 3) | |||
| buf[len - 3] = '.'; | |||
| } | |||
| if(w > dc.w) | |||
| return; /* too long */ | |||
| XSetForeground(dpy, dc.gc, col[ColFG]); | |||
| if(dc.font.set) | |||
| XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); | |||
| else | |||
| XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); | |||
| } | |||
| unsigned int | |||
| textw(const char *text) { | |||
| return textnw(text, strlen(text)) + dc.font.height; | |||
| } | |||
| unsigned int | |||
| textnw(const char *text, unsigned int len) { | |||
| XRectangle r; | |||
| if(dc.font.set) { | |||
| XmbTextExtents(dc.font.set, text, len, NULL, &r); | |||
| return r.width; | |||
| } | |||
| return XTextWidth(dc.font.xfont, text, len); | |||
| } | |||
| @ -1,34 +0,0 @@ | |||
| /* See LICENSE file for copyright and license details. */ | |||
| #include "dmenu.h" | |||
| #include <stdarg.h> | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| void * | |||
| emalloc(unsigned int size) { | |||
| void *res = malloc(size); | |||
| if(!res) | |||
| eprint("fatal: could not malloc() %u bytes\n", size); | |||
| return res; | |||
| } | |||
| void | |||
| eprint(const char *errstr, ...) { | |||
| va_list ap; | |||
| va_start(ap, errstr); | |||
| vfprintf(stderr, errstr, ap); | |||
| va_end(ap); | |||
| exit(EXIT_FAILURE); | |||
| } | |||
| char * | |||
| estrdup(const char *str) { | |||
| void *res = strdup(str); | |||
| if(!res) | |||
| eprint("fatal: could not malloc() %u bytes\n", strlen(str)); | |||
| return res; | |||
| } | |||