From: Anselm R. Garbe Date: Tue, 20 Feb 2007 12:54:00 +0000 (+0100) Subject: readded draw.c again (except getcolor and setfont) X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=a1913a6af7c9cd6de18e15e989050690fdaa6600;p=dmenu.git readded draw.c again (except getcolor and setfont) --- diff --git a/Makefile b/Makefile index 66040d9..18279f6 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include config.mk -SRC = main.c util.c +SRC = draw.c main.c util.c OBJ = ${SRC:.c=.o} all: options dmenu diff --git a/dmenu.h b/dmenu.h index 5c047ff..bb3b144 100644 --- a/dmenu.h +++ b/dmenu.h @@ -38,6 +38,11 @@ extern int screen; extern Display *dpy; extern DC dc; /* global drawing context */ +/* draw.c */ +extern void drawtext(const char *text, unsigned long col[ColLast]); +extern unsigned int textw(const char *text); +extern unsigned int textnw(const char *text, unsigned int len); + /* util.c */ extern void *emalloc(unsigned int size); /* allocates memory, exits on error */ extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */ diff --git a/draw.c b/draw.c new file mode 100644 index 0000000..145df16 --- /dev/null +++ b/draw.c @@ -0,0 +1,71 @@ +/* (C)opyright MMVI-MMVII Anselm R. Garbe + * (C)opyright MMVI-MMVII Sander van Dijk + * See LICENSE file for license details. + */ +#include "dmenu.h" +#include + +/* extern */ + +void +drawtext(const char *text, unsigned long col[ColLast]) { + int x, y, w, h; + static char buf[256]; + unsigned int len, olen; + XGCValues gcv; + 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 */ + gcv.foreground = col[ColFG]; + if(dc.font.set) { + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, + x, y, buf, len); + } + else { + gcv.font = dc.font.xfont->fid; + XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); + 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); +} diff --git a/main.c b/main.c index 54a3a12..8b24bb0 100644 --- a/main.c +++ b/main.c @@ -3,7 +3,6 @@ * See LICENSE file for license details. */ #include "dmenu.h" - #include #include #include @@ -42,22 +41,6 @@ static Item *curr = NULL; static Window root; static Window win; -static 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); -} - -static unsigned int -textw(const char *text) { - return textnw(text, strlen(text)) + dc.font.height; -} - static void calcoffsets(void) { unsigned int tw, w; @@ -84,53 +67,6 @@ calcoffsets(void) { } } -static void -drawtext(const char *text, unsigned long col[ColLast]) { - int x, y, w, h; - static char buf[256]; - unsigned int len, olen; - XGCValues gcv; - 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 */ - gcv.foreground = col[ColFG]; - if(dc.font.set) { - XChangeGC(dpy, dc.gc, GCForeground, &gcv); - XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, - x, y, buf, len); - } - else { - gcv.font = dc.font.xfont->fid; - XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); - } -} - static void drawmenu(void) { Item *i; diff --git a/util.c b/util.c index 01b38bb..124bcd5 100644 --- a/util.c +++ b/util.c @@ -6,8 +6,6 @@ #include #include #include -#include -#include void * emalloc(unsigned int size) {