static void drawmenuh(void);
static void drawmenuv(void);
static Bool grabkeyboard(void);
-static void kpress(XKeyEvent * e);
+static void kpress(XKeyEvent *e);
static void match(char *pattern);
static void readstdin(void);
static void run(void);
static int cmdw = 0;
static int promptw = 0;
static int ret = 0;
+static int screen;
static unsigned int lines = 0;
static unsigned int numlockmask = 0;
+static unsigned int mw, mh;
+static unsigned long normcol[ColLast];
+static unsigned long selcol[ColLast];
static Bool running = True;
+static DC dc;
+static Display *dpy;
static Item *allitems = NULL; /* first of all items */
static Item *item = NULL; /* first of pattern matching items */
static Item *sel = NULL;
static Item *next = NULL;
static Item *prev = NULL;
static Item *curr = NULL;
-static Window win;
+static Window win, parent;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
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))
w = promptw + cmdw + (2 * spaceitem);
for(next = curr; next; next = next->right)
- if((w += MIN(textw(next->text), mw / 3)) > mw)
+ if((w += MIN(textw(&dc, 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)
+ if((w += MIN(textw(&dc, prev->left->text), mw / 3)) > mw)
break;
}
free(allitems);
allitems = itm;
}
- drawcleanup();
+ cleanupdraw(&dc);
XDestroyWindow(dpy, win);
XUngrabKeyboard(dpy, CurrentTime);
}
dc.y = 0;
dc.w = mw;
dc.h = mh;
- drawtext(NULL, dc.norm);
+ drawtext(&dc, NULL, normcol, False);
/* print prompt? */
if(prompt) {
dc.w = promptw;
- drawtext(prompt, dc.sel);
+ drawtext(&dc, prompt, selcol, False);
dc.x += dc.w;
}
dc.w = mw - dc.x;
/* print command */
if(cmdw && item && lines == 0)
dc.w = cmdw;
- drawtext(*text ? text : NULL, dc.norm);
+ drawtext(&dc, *text ? text : NULL, normcol, False);
if(curr) {
if(lines > 0)
drawmenuv();
dc.x += cmdw;
dc.w = spaceitem;
- drawtext(curr->left ? "<" : NULL, dc.norm);
+ drawtext(&dc, curr->left ? "<" : NULL, normcol, False);
dc.x += dc.w;
- for(i = curr; i != next; i=i->right) {
- dc.w = MIN(textw(i->text), mw / 3);
- drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
+ for(i = curr; i != next; i = i->right) {
+ dc.w = MIN(textw(&dc, i->text), mw / 3);
+ drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False);
dc.x += dc.w;
}
dc.w = spaceitem;
dc.x = mw - dc.w;
- drawtext(next ? ">" : NULL, dc.norm);
+ drawtext(&dc, next ? ">" : NULL, normcol, False);
}
void
dc.w = mw - dc.x;
dc.h = dc.font.height + 2;
dc.y = dc.h;
- for(i = curr; i != next; i=i->right) {
- drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
+ for(i = curr; i != next; i = i->right) {
+ drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False);
dc.y += dc.h;
}
dc.h = mh - dc.y;
- drawtext(NULL, dc.norm);
+ drawtext(&dc, NULL, normcol, False);
}
Bool
}
void
-kpress(XKeyEvent * e) {
+kpress(XKeyEvent *e) {
char buf[sizeof text];
int num;
unsigned int i, len;
ksym = XK_Tab;
break;
case XK_j:
+ case XK_m:
ksym = XK_Return;
break;
case XK_n:
/* main event loop */
while(running && !XNextEvent(dpy, &ev))
- switch (ev.type) {
+ switch(ev.type) {
case KeyPress:
kpress(&ev.xkey);
break;
}
XFreeModifiermap(modmap);
- initfont(font);
+ dc.dpy = dpy;
+ normcol[ColBG] = getcolor(&dc, normbgcolor);
+ normcol[ColFG] = getcolor(&dc, normfgcolor);
+ selcol[ColBG] = getcolor(&dc, selbgcolor);
+ selcol[ColFG] = getcolor(&dc, selfgcolor);
+ initfont(&dc, font);
/* menu window */
wa.override_redirect = True;
wa.background_pixmap = ParentRelative;
- wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask | VisibilityChangeMask;
+ wa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
/* menu window geometry */
mh = (dc.font.height + 2) * (lines + 1);
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
- drawsetup();
+ setupdraw(&dc, win);
if(maxname)
- cmdw = MIN(textw(maxname), mw / 3);
+ cmdw = MIN(textw(&dc, maxname), mw / 3);
if(prompt)
- promptw = MIN(textw(prompt), mw / 5);
+ promptw = MIN(textw(&dc, prompt), mw / 5);
text[0] = '\0';
match(text);
XMapRaised(dpy, win);