treadded draw.c again (except getcolor and setfont) - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a1913a6af7c9cd6de18e15e989050690fdaa6600
 (DIR) parent 66b2e8379f0b851d0535a50321e22b58fdaa247d
 (HTM) Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Tue, 20 Feb 2007 13:54:00 +0100
       
       readded draw.c again (except getcolor and setfont)
       Diffstat:
         Makefile                            |       2 +-
         dmenu.h                             |       5 +++++
         draw.c                              |      71 +++++++++++++++++++++++++++++++
         main.c                              |      64 -------------------------------
         util.c                              |       2 --
       
       5 files changed, 77 insertions(+), 67 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -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
 (DIR) diff --git a/dmenu.h b/dmenu.h
       t@@ -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 */
 (DIR) diff --git a/draw.c b/draw.c
       t@@ -0,0 +1,71 @@
       +/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
       + * (C)opyright MMVI-MMVII Sander van Dijk <a dot h dot vandijk at gmail dot com>
       + * See LICENSE file for 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;
       +        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);
       +}
 (DIR) diff --git a/main.c b/main.c
       t@@ -3,7 +3,6 @@
         * See LICENSE file for license details.
         */
        #include "dmenu.h"
       -
        #include <ctype.h>
        #include <locale.h>
        #include <stdlib.h>
       t@@ -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;
       t@@ -85,53 +68,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;
        
 (DIR) diff --git a/util.c b/util.c
       t@@ -6,8 +6,6 @@
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
       -#include <sys/wait.h>
       -#include <unistd.h>
        
        void *
        emalloc(unsigned int size) {