tremoved draw.c, implemented C-w handling (backward word deletion) - 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 665488a6eedeecf743e44bd9624105c8b47c4f97
 (DIR) parent 1e01ca03176e6e845a2a300545061e7384c4836d
 (HTM) Author: Anselm R. Garbe <arg@suckless.org>
       Date:   Mon, 19 Feb 2007 15:49:50 +0100
       
       removed draw.c, implemented C-w handling (backward word deletion)
       Diffstat:
         Makefile                            |       2 +-
         config.mk                           |       2 +-
         dmenu.1                             |       3 +++
         dmenu.h                             |       7 -------
         draw.c                              |     121 -------------------------------
         main.c                              |     127 ++++++++++++++++++++++++++++++-
       
       6 files changed, 130 insertions(+), 132 deletions(-)
       ---
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -SRC = draw.c main.c util.c
       +SRC = main.c util.c
        OBJ = ${SRC:.c=.o}
        
        all: options dmenu
 (DIR) diff --git a/config.mk b/config.mk
       t@@ -1,5 +1,5 @@
        # dmenu version
       -VERSION = 2.2
       +VERSION = 2.3
        
        # Customize below to fit your system
        
 (DIR) diff --git a/dmenu.1 b/dmenu.1
       t@@ -90,6 +90,9 @@ Remove enough characters from the input field to change its filtering effect.
        .TP
        .B Control-u
        Remove all characters from the input field.
       +.TP
       +.B Control-w
       +Remove all characters of current word from the input field.
        .SH SEE ALSO
        .BR dwm (1),
        .BR wmii (1) .
 (DIR) diff --git a/dmenu.h b/dmenu.h
       t@@ -38,13 +38,6 @@ extern int screen;
        extern Display *dpy;
        extern DC dc;                        /* global drawing context */
        
       -/* draw.c */
       -extern void drawtext(const char *text,
       -                        unsigned long col[ColLast]);        /* draws text with the defined color tuple */
       -extern unsigned long getcolor(const char *colstr);        /* returns color of colstr */
       -extern void setfont(const char *fontstr);                /* sets global font */
       -extern unsigned int textw(const char *text);                /* returns width of text in px */
       -
        /* 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@@ -1,121 +0,0 @@
       -/* (C)opyright MMIV-MMVII Anselm R. Garbe <garbeam at gmail dot com>
       - * See LICENSE file for license details.
       - */
       -#include "dmenu.h"
       -#include <stdio.h>
       -#include <string.h>
       -
       -/* static */
       -
       -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);
       -}
       -
       -/* 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 long
       -getcolor(const char *colstr) {
       -        Colormap cmap = DefaultColormap(dpy, screen);
       -        XColor color;
       -
       -        if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
       -                eprint("error, cannot allocate color '%s'\n", colstr);
       -        return color.pixel;
       -}
       -
       -void
       -setfont(const char *fontstr) {
       -        char *def, **missing;
       -        int i, n;
       -
       -        missing = NULL;
       -        if(dc.font.set)
       -                XFreeFontSet(dpy, dc.font.set);
       -        dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
       -        if(missing)
       -                XFreeStringList(missing);
       -        if(dc.font.set) {
       -                XFontSetExtents *font_extents;
       -                XFontStruct **xfonts;
       -                char **font_names;
       -                dc.font.ascent = dc.font.descent = 0;
       -                font_extents = XExtentsOfFontSet(dc.font.set);
       -                n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
       -                for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
       -                        if(dc.font.ascent < (*xfonts)->ascent)
       -                                dc.font.ascent = (*xfonts)->ascent;
       -                        if(dc.font.descent < (*xfonts)->descent)
       -                                dc.font.descent = (*xfonts)->descent;
       -                        xfonts++;
       -                }
       -        }
       -        else {
       -                if(dc.font.xfont)
       -                        XFreeFont(dpy, dc.font.xfont);
       -                dc.font.xfont = NULL;
       -                if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
       -                        eprint("error, cannot load font: '%s'\n", fontstr);
       -                dc.font.ascent = dc.font.xfont->ascent;
       -                dc.font.descent = dc.font.xfont->descent;
       -        }
       -        dc.font.height = dc.font.ascent + dc.font.descent;
       -}
       -
       -unsigned int
       -textw(const char *text) {
       -        return textnw(text, strlen(text)) + dc.font.height;
       -}
 (DIR) diff --git a/main.c b/main.c
       t@@ -44,6 +44,22 @@ 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@@ -71,6 +87,53 @@ 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;
        
       t@@ -111,6 +174,54 @@ drawmenu(void) {
                XFlush(dpy);
        }
        
       +static unsigned long
       +getcolor(const char *colstr) {
       +        Colormap cmap = DefaultColormap(dpy, screen);
       +        XColor color;
       +
       +        if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
       +                eprint("error, cannot allocate color '%s'\n", colstr);
       +        return color.pixel;
       +}
       +
       +static void
       +setfont(const char *fontstr) {
       +        char *def, **missing;
       +        int i, n;
       +
       +        missing = NULL;
       +        if(dc.font.set)
       +                XFreeFontSet(dpy, dc.font.set);
       +        dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
       +        if(missing)
       +                XFreeStringList(missing);
       +        if(dc.font.set) {
       +                XFontSetExtents *font_extents;
       +                XFontStruct **xfonts;
       +                char **font_names;
       +                dc.font.ascent = dc.font.descent = 0;
       +                font_extents = XExtentsOfFontSet(dc.font.set);
       +                n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
       +                for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
       +                        if(dc.font.ascent < (*xfonts)->ascent)
       +                                dc.font.ascent = (*xfonts)->ascent;
       +                        if(dc.font.descent < (*xfonts)->descent)
       +                                dc.font.descent = (*xfonts)->descent;
       +                        xfonts++;
       +                }
       +        }
       +        else {
       +                if(dc.font.xfont)
       +                        XFreeFont(dpy, dc.font.xfont);
       +                dc.font.xfont = NULL;
       +                if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
       +                        eprint("error, cannot load font: '%s'\n", fontstr);
       +                dc.font.ascent = dc.font.xfont->ascent;
       +                dc.font.descent = dc.font.xfont->descent;
       +        }
       +        dc.font.height = dc.font.ascent + dc.font.descent;
       +}
       +
        static void
        match(char *pattern) {
                unsigned int plen;
       t@@ -151,8 +262,8 @@ match(char *pattern) {
        static void
        kpress(XKeyEvent * e) {
                char buf[32];
       -        int num, prev_nitem;
       -        unsigned int i, len;
       +        int i, num, prev_nitem;
       +        unsigned int len;
                KeySym ksym;
        
                len = strlen(text);
       t@@ -188,6 +299,18 @@ kpress(XKeyEvent * e) {
                                match(text);
                                drawmenu();
                                return;
       +                case XK_w:
       +                case XK_W:
       +                        if(len) {
       +                                i = len - 1;
       +                                while(i >= 0 && text[i] == ' ')
       +                                        text[i--] = 0;
       +                                while(i >= 0 && text[i] != ' ')
       +                                        text[i--] = 0;
       +                                match(text);
       +                                drawmenu();
       +                        }
       +                        return;
                        }
                }
                if(CLEANMASK(e->state) & Mod1Mask) {