dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit 6c1d0e4d60b239e9533def6feaf8eb2138858c3e
parent 6efe1932be9425896c34f54501a6194286dd0503
Author: Connor Lane Smith <cls@lubutu.com>
Date:   Thu, 24 Jun 2010 14:22:34 +0100

fixed offsets, updated eprint, cleaned up
Diffstat:
Mdinput.c | 5+++--
Mdmenu.c | 56++++++++++++++++++++++++++++++--------------------------
Mdraw.c | 12++++++++----
Mdraw.h | 2+-
4 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/dinput.c b/dinput.c
@@ -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)
@@ -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;
@@ -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);
diff --git a/dmenu.c b/dmenu.c
@@ -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);
@@ -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 *
@@ -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;
@@ -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;
         }
     }
@@ -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();
@@ -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)
@@ -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;
@@ -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);
diff --git a/draw.c b/draw.c
@@ -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)
@@ -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);
@@ -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;
 }
 
@@ -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);
@@ -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;
     }
diff --git a/draw.h b/draw.h
@@ -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;