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);
-static void eprint(const char *errstr, ...);
static Bool grabkeyboard(void);
static void kpress(XKeyEvent * e);
static void match(char *pattern);
static int cmdw = 0;
static int promptw = 0;
static int ret = 0;
+static unsigned int lines = 0;
static unsigned int numlockmask = 0;
static Bool running = True;
static Item *allitems = NULL; /* first of all items */
static Window win;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
-static unsigned int lines = 0;
static void (*calcoffsets)(void) = calcoffsetsh;
+Display *dpy;
+DC dc;
+int screen;
+unsigned int mw, mh;
+Window parent;
+
void
appenditem(Item *i, Item **list, Item **last) {
if(!(*last))
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 *
void
cleanup(void) {
+ Item *itm;
+
+ while(allitems) {
+ itm = allitems->next;
+ free(allitems->text);
+ free(allitems);
+ allitems = itm;
+ }
drawcleanup();
XDestroyWindow(dpy, win);
XUngrabKeyboard(dpy, CurrentTime);
}
+void
+dinput(void) {
+ cleanup();
+ execlp("dinput", "dinput", text, NULL); /* todo: argv */
+ eprint("cannot exec dinput\n");
+}
+
void
drawmenu(void) {
dc.x = 0;
match(text);
break;
case XK_x:
- execlp("dinput", "dinput", text, NULL); /* todo: argv */
- eprint("dmenu: cannot exec dinput:");
+ dinput();
break;
}
}
}
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();
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)
Bool topbar = True;
/* command line args */
+ progname = argv[0];
for(i = 1; i < argc; i++)
if(!strcmp(argv[i], "-i")) {
fstrncmp = strncasecmp;
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);