tfixed offsets, updated eprint, cleaned up - 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 6c1d0e4d60b239e9533def6feaf8eb2138858c3e
 (DIR) parent 6efe1932be9425896c34f54501a6194286dd0503
 (HTM) Author: Connor Lane Smith <cls@lubutu.com>
       Date:   Thu, 24 Jun 2010 14:22:34 +0100
       
       fixed offsets, updated eprint, cleaned up
       Diffstat:
         dinput.c                            |       5 +++--
         dmenu.c                             |      56 +++++++++++++++++--------------
         draw.c                              |      12 ++++++++----
         draw.h                              |       2 +-
       
       4 files changed, 42 insertions(+), 33 deletions(-)
       ---
 (DIR) diff --git a/dinput.c b/dinput.c
       t@@ -164,7 +164,7 @@ kpress(XKeyEvent * e) {
                                        FILE *fp;
                                        char *s;
                                        if(!(fp = popen("sselp", "r")))
       -                                        eprint("dinput: cannot popen sselp\n");
       +                                        eprint("cannot popen sselp\n");
                                        s = fgets(buf, sizeof buf, fp);
                                        pclose(fp);
                                        if(s == NULL)
       t@@ -322,6 +322,7 @@ main(int argc, char *argv[]) {
                Bool topbar = True;
        
                /* command line args */
       +        progname = argv[0];
                for(i = 1; i < argc; i++)
                        if(!strcmp(argv[i], "-b"))
                                topbar = False;
       t@@ -356,7 +357,7 @@ main(int argc, char *argv[]) {
                if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
                        fprintf(stderr, "dinput: warning: no locale support\n");
                if(!(dpy = XOpenDisplay(NULL)))
       -                eprint("dinput: cannot open display\n");
       +                eprint("cannot open display\n");
                screen = DefaultScreen(dpy);
                if(!parent)
                        parent = RootWindow(dpy, screen);
 (DIR) diff --git a/dmenu.c b/dmenu.c
       t@@ -34,6 +34,7 @@ static void calcoffsetsh(void);
        static void calcoffsetsv(void);
        static char *cistrstr(const char *s, const char *sub);
        static void cleanup(void);
       +static void dinput(void);
        static void drawmenu(void);
        static void drawmenuh(void);
        static void drawmenuv(void);
       t@@ -89,28 +90,25 @@ void
        calcoffsetsh(void) {
                unsigned int w;
        
       -        if(!curr)
       -                return;
       -        w = promptw + cmdw + 2 * spaceitem;
       -        for(next = curr; next && w < mw; next=next->right)
       -                w += MIN(textw(next->text), mw / 3);
       -        w = promptw + cmdw + 2 * spaceitem;
       -        for(prev = curr; prev && prev->left && w < mw; prev=prev->left)
       -                w += MIN(textw(prev->left->text), mw / 3);
       +        w = promptw + cmdw + (2 * spaceitem);
       +        for(next = curr; next; next = next->right)
       +                if((w += MIN(textw(next->text), mw / 3)) > mw)
       +                        break;
       +        w = promptw + cmdw + (2 * spaceitem);
       +        for(prev = curr; prev && prev->left; prev = prev->left)
       +                if((w += MIN(textw(prev->left->text), mw / 3)) > mw)
       +                        break;
        }
        
        void
        calcoffsetsv(void) {
       -        unsigned int h;
       +        unsigned int i;
        
       -        if(!curr)
       -                return;
       -        h = (dc.font.height + 2) * lines;
       -        for(next = curr; next && h > 0; next = next->right)
       -                h -= dc.font.height + 2;
       -        h = (dc.font.height + 2) * lines;
       -        for(prev = curr; prev && prev->left && h > 0; prev = prev->left)
       -                h -= dc.font.height + 2;
       +        next = prev = curr;
       +        for(i = 0; i < lines && next; i++)
       +                next = next->right;
       +        for(i = 0; i < lines && prev && prev->left; i++)
       +                prev = prev->left;
        }
        
        char *
       t@@ -151,6 +149,13 @@ cleanup(void) {
        }
        
        void
       +dinput(void) {
       +        cleanup();
       +        execlp("dinput", "dinput", text, NULL); /* todo: argv */
       +        eprint("cannot exec dinput\n");
       +}
       +
       +void
        drawmenu(void) {
                dc.x = 0;
                dc.y = 0;
       t@@ -290,8 +295,7 @@ kpress(XKeyEvent * e) {
                                match(text);
                                break;
                        case XK_x:
       -                        execlp("dinput", "dinput", text, NULL); /* todo: argv */
       -                        eprint("dmenu: cannot exec dinput:");
       +                        dinput();
                                break;
                        }
                }
       t@@ -369,10 +373,9 @@ kpress(XKeyEvent * e) {
                        }
                        break;
                case XK_Tab:
       -                if(!sel)
       -                        return;
       -                strncpy(text, sel->text, sizeof text);
       -                match(text);
       +                if(sel)
       +                        strncpy(text, sel->text, sizeof text);
       +                dinput();
                        break;
                }
                drawmenu();
       t@@ -431,11 +434,11 @@ readstdin(void) {
                        if(buf[len-1] == '\n')
                                buf[--len] = '\0';
                        if(!(p = strdup(buf)))
       -                        eprint("dmenu: cannot strdup %u bytes\n", len);
       +                        eprint("cannot strdup %u bytes\n", len);
                        if((max = MAX(max, len)) == len)
                                maxname = p;
                        if(!(new = malloc(sizeof *new)))
       -                        eprint("dmenu: cannot malloc %u bytes\n", sizeof *new);
       +                        eprint("cannot malloc %u bytes\n", sizeof *new);
                        new->next = new->left = new->right = NULL;
                        new->text = p;
                        if(!i)
       t@@ -544,6 +547,7 @@ main(int argc, char *argv[]) {
                Bool topbar = True;
        
                /* command line args */
       +        progname = argv[0];
                for(i = 1; i < argc; i++)
                        if(!strcmp(argv[i], "-i")) {
                                fstrncmp = strncasecmp;
       t@@ -585,7 +589,7 @@ main(int argc, char *argv[]) {
                if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
                        fprintf(stderr, "dmenu: warning: no locale support\n");
                if(!(dpy = XOpenDisplay(NULL)))
       -                eprint("dmenu: cannot open display\n");
       +                eprint("cannot open display\n");
                screen = DefaultScreen(dpy);
                if(!parent)
                        parent = RootWindow(dpy, screen);
 (DIR) diff --git a/draw.c b/draw.c
       t@@ -13,6 +13,9 @@
        #define MIN(a, b)               ((a) < (b) ? (a) : (b))
        #define MAX(a, b)               ((a) > (b) ? (a) : (b))
        
       +/* variables */
       +char *progname;
       +
        void
        drawcleanup(void) {
                if(dc.font.set)
       t@@ -71,6 +74,7 @@ void
        eprint(const char *errstr, ...) {
                va_list ap;
        
       +        fprintf(stderr, "%s: ", progname);
                va_start(ap, errstr);
                vfprintf(stderr, errstr, ap);
                va_end(ap);
       t@@ -83,7 +87,7 @@ getcolor(const char *colstr) {
                XColor color;
        
                if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
       -                eprint("drawtext: cannot allocate color '%s'\n", colstr);
       +                eprint("cannot allocate color '%s'\n", colstr);
                return color.pixel;
        }
        
       t@@ -92,8 +96,8 @@ initfont(const char *fontstr) {
                char *def, **missing = NULL;
                int i, n;
        
       -        if(!fontstr || fontstr[0] == '\0')
       -                eprint("drawtext: cannot load font: '%s'\n", fontstr);
       +        if(!fontstr || !*fontstr)
       +                eprint("cannot load null font\n");
                dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
                if(missing)
                        XFreeStringList(missing);
       t@@ -111,7 +115,7 @@ initfont(const char *fontstr) {
                else {
                        if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
                        && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
       -                        eprint("drawtext: cannot load font: '%s'\n", fontstr);
       +                        eprint("cannot load font '%s'\n", fontstr);
                        dc.font.ascent = dc.font.xfont->ascent;
                        dc.font.descent = dc.font.xfont->descent;
                }
 (DIR) diff --git a/draw.h b/draw.h
       t@@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len);
        int textw(const char *text);
        
        /* variables */
       +extern char *progname;
        extern Display *dpy;
        extern DC dc;
        extern int screen;
        extern unsigned int mw, mh;
        extern Window parent;
        
       -/* style */
        extern const char *font;
        extern const char *normbgcolor;
        extern const char *normfgcolor;