| @ -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; | |||||
| } | |||||