diff options
-rw-r--r-- | dinput.c | 5 | ||||
-rw-r--r-- | dmenu.c | 56 | ||||
-rw-r--r-- | draw.c | 12 | ||||
-rw-r--r-- | draw.h | 2 |
4 files changed, 42 insertions, 33 deletions
@@ -164,7 +164,7 @@ kpress(XKeyEvent * e) { | |||
164 | FILE *fp; | 164 | FILE *fp; |
165 | char *s; | 165 | char *s; |
166 | if(!(fp = popen("sselp", "r"))) | 166 | if(!(fp = popen("sselp", "r"))) |
167 | eprint("dinput: cannot popen sselp\n"); | 167 | eprint("cannot popen sselp\n"); |
168 | s = fgets(buf, sizeof buf, fp); | 168 | s = fgets(buf, sizeof buf, fp); |
169 | pclose(fp); | 169 | pclose(fp); |
170 | if(s == NULL) | 170 | if(s == NULL) |
@@ -322,6 +322,7 @@ main(int argc, char *argv[]) { | |||
322 | Bool topbar = True; | 322 | Bool topbar = True; |
323 | 323 | ||
324 | /* command line args */ | 324 | /* command line args */ |
325 | progname = argv[0]; | ||
325 | for(i = 1; i < argc; i++) | 326 | for(i = 1; i < argc; i++) |
326 | if(!strcmp(argv[i], "-b")) | 327 | if(!strcmp(argv[i], "-b")) |
327 | topbar = False; | 328 | topbar = False; |
@@ -356,7 +357,7 @@ main(int argc, char *argv[]) { | |||
356 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | 357 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) |
357 | fprintf(stderr, "dinput: warning: no locale support\n"); | 358 | fprintf(stderr, "dinput: warning: no locale support\n"); |
358 | if(!(dpy = XOpenDisplay(NULL))) | 359 | if(!(dpy = XOpenDisplay(NULL))) |
359 | eprint("dinput: cannot open display\n"); | 360 | eprint("cannot open display\n"); |
360 | screen = DefaultScreen(dpy); | 361 | screen = DefaultScreen(dpy); |
361 | if(!parent) | 362 | if(!parent) |
362 | parent = RootWindow(dpy, screen); | 363 | parent = RootWindow(dpy, screen); |
@@ -34,6 +34,7 @@ static void calcoffsetsh(void); | |||
34 | static void calcoffsetsv(void); | 34 | static void calcoffsetsv(void); |
35 | static char *cistrstr(const char *s, const char *sub); | 35 | static char *cistrstr(const char *s, const char *sub); |
36 | static void cleanup(void); | 36 | static void cleanup(void); |
37 | static void dinput(void); | ||
37 | static void drawmenu(void); | 38 | static void drawmenu(void); |
38 | static void drawmenuh(void); | 39 | static void drawmenuh(void); |
39 | static void drawmenuv(void); | 40 | static void drawmenuv(void); |
@@ -89,28 +90,25 @@ void | |||
89 | calcoffsetsh(void) { | 90 | calcoffsetsh(void) { |
90 | unsigned int w; | 91 | unsigned int w; |
91 | 92 | ||
92 | if(!curr) | 93 | w = promptw + cmdw + (2 * spaceitem); |
93 | return; | 94 | for(next = curr; next; next = next->right) |
94 | w = promptw + cmdw + 2 * spaceitem; | 95 | if((w += MIN(textw(next->text), mw / 3)) > mw) |
95 | for(next = curr; next && w < mw; next=next->right) | 96 | break; |
96 | w += MIN(textw(next->text), mw / 3); | 97 | w = promptw + cmdw + (2 * spaceitem); |
97 | w = promptw + cmdw + 2 * spaceitem; | 98 | for(prev = curr; prev && prev->left; prev = prev->left) |
98 | for(prev = curr; prev && prev->left && w < mw; prev=prev->left) | 99 | if((w += MIN(textw(prev->left->text), mw / 3)) > mw) |
99 | w += MIN(textw(prev->left->text), mw / 3); | 100 | break; |
100 | } | 101 | } |
101 | 102 | ||
102 | void | 103 | void |
103 | calcoffsetsv(void) { | 104 | calcoffsetsv(void) { |
104 | unsigned int h; | 105 | unsigned int i; |
105 | 106 | ||
106 | if(!curr) | 107 | next = prev = curr; |
107 | return; | 108 | for(i = 0; i < lines && next; i++) |
108 | h = (dc.font.height + 2) * lines; | 109 | next = next->right; |
109 | for(next = curr; next && h > 0; next = next->right) | 110 | for(i = 0; i < lines && prev && prev->left; i++) |
110 | h -= dc.font.height + 2; | 111 | prev = prev->left; |
111 | h = (dc.font.height + 2) * lines; | ||
112 | for(prev = curr; prev && prev->left && h > 0; prev = prev->left) | ||
113 | h -= dc.font.height + 2; | ||
114 | } | 112 | } |
115 | 113 | ||
116 | char * | 114 | char * |
@@ -151,6 +149,13 @@ cleanup(void) { | |||
151 | } | 149 | } |
152 | 150 | ||
153 | void | 151 | void |
152 | dinput(void) { | ||
153 | cleanup(); | ||
154 | execlp("dinput", "dinput", text, NULL); /* todo: argv */ | ||
155 | eprint("cannot exec dinput\n"); | ||
156 | } | ||
157 | |||
158 | void | ||
154 | drawmenu(void) { | 159 | drawmenu(void) { |
155 | dc.x = 0; | 160 | dc.x = 0; |
156 | dc.y = 0; | 161 | dc.y = 0; |
@@ -290,8 +295,7 @@ kpress(XKeyEvent * e) { | |||
290 | match(text); | 295 | match(text); |
291 | break; | 296 | break; |
292 | case XK_x: | 297 | case XK_x: |
293 | execlp("dinput", "dinput", text, NULL); /* todo: argv */ | 298 | dinput(); |
294 | eprint("dmenu: cannot exec dinput:"); | ||
295 | break; | 299 | break; |
296 | } | 300 | } |
297 | } | 301 | } |
@@ -369,10 +373,9 @@ kpress(XKeyEvent * e) { | |||
369 | } | 373 | } |
370 | break; | 374 | break; |
371 | case XK_Tab: | 375 | case XK_Tab: |
372 | if(!sel) | 376 | if(sel) |
373 | return; | 377 | strncpy(text, sel->text, sizeof text); |
374 | strncpy(text, sel->text, sizeof text); | 378 | dinput(); |
375 | match(text); | ||
376 | break; | 379 | break; |
377 | } | 380 | } |
378 | drawmenu(); | 381 | drawmenu(); |
@@ -431,11 +434,11 @@ readstdin(void) { | |||
431 | if(buf[len-1] == '\n') | 434 | if(buf[len-1] == '\n') |
432 | buf[--len] = '\0'; | 435 | buf[--len] = '\0'; |
433 | if(!(p = strdup(buf))) | 436 | if(!(p = strdup(buf))) |
434 | eprint("dmenu: cannot strdup %u bytes\n", len); | 437 | eprint("cannot strdup %u bytes\n", len); |
435 | if((max = MAX(max, len)) == len) | 438 | if((max = MAX(max, len)) == len) |
436 | maxname = p; | 439 | maxname = p; |
437 | if(!(new = malloc(sizeof *new))) | 440 | if(!(new = malloc(sizeof *new))) |
438 | eprint("dmenu: cannot malloc %u bytes\n", sizeof *new); | 441 | eprint("cannot malloc %u bytes\n", sizeof *new); |
439 | new->next = new->left = new->right = NULL; | 442 | new->next = new->left = new->right = NULL; |
440 | new->text = p; | 443 | new->text = p; |
441 | if(!i) | 444 | if(!i) |
@@ -544,6 +547,7 @@ main(int argc, char *argv[]) { | |||
544 | Bool topbar = True; | 547 | Bool topbar = True; |
545 | 548 | ||
546 | /* command line args */ | 549 | /* command line args */ |
550 | progname = argv[0]; | ||
547 | for(i = 1; i < argc; i++) | 551 | for(i = 1; i < argc; i++) |
548 | if(!strcmp(argv[i], "-i")) { | 552 | if(!strcmp(argv[i], "-i")) { |
549 | fstrncmp = strncasecmp; | 553 | fstrncmp = strncasecmp; |
@@ -585,7 +589,7 @@ main(int argc, char *argv[]) { | |||
585 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | 589 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) |
586 | fprintf(stderr, "dmenu: warning: no locale support\n"); | 590 | fprintf(stderr, "dmenu: warning: no locale support\n"); |
587 | if(!(dpy = XOpenDisplay(NULL))) | 591 | if(!(dpy = XOpenDisplay(NULL))) |
588 | eprint("dmenu: cannot open display\n"); | 592 | eprint("cannot open display\n"); |
589 | screen = DefaultScreen(dpy); | 593 | screen = DefaultScreen(dpy); |
590 | if(!parent) | 594 | if(!parent) |
591 | parent = RootWindow(dpy, screen); | 595 | parent = RootWindow(dpy, screen); |
@@ -13,6 +13,9 @@ | |||
13 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) | 13 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
14 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) | 14 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) |
15 | 15 | ||
16 | /* variables */ | ||
17 | char *progname; | ||
18 | |||
16 | void | 19 | void |
17 | drawcleanup(void) { | 20 | drawcleanup(void) { |
18 | if(dc.font.set) | 21 | if(dc.font.set) |
@@ -71,6 +74,7 @@ void | |||
71 | eprint(const char *errstr, ...) { | 74 | eprint(const char *errstr, ...) { |
72 | va_list ap; | 75 | va_list ap; |
73 | 76 | ||
77 | fprintf(stderr, "%s: ", progname); | ||
74 | va_start(ap, errstr); | 78 | va_start(ap, errstr); |
75 | vfprintf(stderr, errstr, ap); | 79 | vfprintf(stderr, errstr, ap); |
76 | va_end(ap); | 80 | va_end(ap); |
@@ -83,7 +87,7 @@ getcolor(const char *colstr) { | |||
83 | XColor color; | 87 | XColor color; |
84 | 88 | ||
85 | if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) | 89 | if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) |
86 | eprint("drawtext: cannot allocate color '%s'\n", colstr); | 90 | eprint("cannot allocate color '%s'\n", colstr); |
87 | return color.pixel; | 91 | return color.pixel; |
88 | } | 92 | } |
89 | 93 | ||
@@ -92,8 +96,8 @@ initfont(const char *fontstr) { | |||
92 | char *def, **missing = NULL; | 96 | char *def, **missing = NULL; |
93 | int i, n; | 97 | int i, n; |
94 | 98 | ||
95 | if(!fontstr || fontstr[0] == '\0') | 99 | if(!fontstr || !*fontstr) |
96 | eprint("drawtext: cannot load font: '%s'\n", fontstr); | 100 | eprint("cannot load null font\n"); |
97 | dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); | 101 | dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); |
98 | if(missing) | 102 | if(missing) |
99 | XFreeStringList(missing); | 103 | XFreeStringList(missing); |
@@ -111,7 +115,7 @@ initfont(const char *fontstr) { | |||
111 | else { | 115 | else { |
112 | if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) | 116 | if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) |
113 | && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) | 117 | && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) |
114 | eprint("drawtext: cannot load font: '%s'\n", fontstr); | 118 | eprint("cannot load font '%s'\n", fontstr); |
115 | dc.font.ascent = dc.font.xfont->ascent; | 119 | dc.font.ascent = dc.font.xfont->ascent; |
116 | dc.font.descent = dc.font.xfont->descent; | 120 | dc.font.descent = dc.font.xfont->descent; |
117 | } | 121 | } |
@@ -30,13 +30,13 @@ int textnw(const char *text, unsigned int len); | |||
30 | int textw(const char *text); | 30 | int textw(const char *text); |
31 | 31 | ||
32 | /* variables */ | 32 | /* variables */ |
33 | extern char *progname; | ||
33 | extern Display *dpy; | 34 | extern Display *dpy; |
34 | extern DC dc; | 35 | extern DC dc; |
35 | extern int screen; | 36 | extern int screen; |
36 | extern unsigned int mw, mh; | 37 | extern unsigned int mw, mh; |
37 | extern Window parent; | 38 | extern Window parent; |
38 | 39 | ||
39 | /* style */ | ||
40 | extern const char *font; | 40 | extern const char *font; |
41 | extern const char *normbgcolor; | 41 | extern const char *normbgcolor; |
42 | extern const char *normfgcolor; | 42 | extern const char *normfgcolor; |