X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=main.c;h=224d298ff002e7c87b6fbbd2bdc8d4e070e7c058;hb=2bac5599b3e7629875d692b65a336915ecfee49d;hp=71ad8678133c7a116337b02dc587c5109e453c6e;hpb=771c0cb6072b3e90d4ed7007073552736c49e655;p=dmenu.git diff --git a/main.c b/main.c index 71ad867..224d298 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,5 @@ -/* (C)opyright MMVII Anselm R. Garbe - * (C)opyright MMVII Sander van Dijk +/* (C)opyright MMVI-MMVII Anselm R. Garbe + * (C)opyright MMVI-MMVII Sander van Dijk * See LICENSE file for license details. */ #include "dmenu.h" @@ -15,6 +15,8 @@ #include #include +#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) + typedef struct Item Item; struct Item { Item *next; /* traverses all items */ @@ -26,11 +28,12 @@ struct Item { static char text[4096]; static char *prompt = NULL; -static int mx, my, mw, mh; +static int mw, mh; static int ret = 0; static int nitem = 0; static unsigned int cmdw = 0; static unsigned int promptw = 0; +static unsigned int numlockmask = 0; static Bool running = True; static Item *allitems = NULL; /* first of all items */ static Item *item = NULL; /* first of pattern matching items */ @@ -164,21 +167,30 @@ kpress(XKeyEvent * e) { switch (ksym) { default: /* ignore other control sequences */ return; + case XK_bracketleft: + ksym = XK_Escape; break; case XK_h: case XK_H: ksym = XK_BackSpace; break; + case XK_i: + case XK_I: + ksym = XK_Tab; + break; + case XK_j: + case XK_J: + ksym = XK_Return; + break; case XK_u: case XK_U: text[0] = 0; match(text); drawmenu(); return; - break; } } - if(e->state & Mod1Mask) { + if(CLEANMASK(e->state) & Mod1Mask) { switch(ksym) { default: return; case XK_h: @@ -330,7 +342,6 @@ DC dc = {0}; int main(int argc, char *argv[]) { - Bool bottom = False; char *font = FONT; char *maxname; char *normbg = NORMBGCOLOR; @@ -338,20 +349,18 @@ main(int argc, char *argv[]) { char *selbg = SELBGCOLOR; char *selfg = SELFGCOLOR; fd_set rd; - int i; + int i, j; struct timeval timeout; Item *itm; XEvent ev; + XModifierKeymap *modmap; XSetWindowAttributes wa; timeout.tv_usec = 0; timeout.tv_sec = 3; /* command line args */ for(i = 1; i < argc; i++) - if(!strncmp(argv[i], "-b", 3)) { - bottom = True; - } - else if(!strncmp(argv[i], "-fn", 4)) { + if(!strncmp(argv[i], "-fn", 4)) { if(++i < argc) font = argv[i]; } else if(!strncmp(argv[i], "-nb", 4)) { @@ -373,11 +382,11 @@ main(int argc, char *argv[]) { if(++i < argc) timeout.tv_sec = atoi(argv[i]); } else if(!strncmp(argv[i], "-v", 3)) { - fputs("dmenu-"VERSION", (C)opyright MMVII Anselm R. Garbe\n", stdout); + fputs("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n", stdout); exit(EXIT_SUCCESS); } else - eprint("usage: dmenu [-b] [-fn ] [-nb ] [-nf ] [-p ]\n" + eprint("usage: dmenu [-fn ] [-nb ] [-nf ] [-p ]\n" " [-sb ] [-sf ] [-t ] [-v]\n", stdout); setlocale(LC_CTYPE, ""); dpy = XOpenDisplay(0); @@ -399,6 +408,15 @@ main(int argc, char *argv[]) { if(select(ConnectionNumber(dpy) + 1, &rd, NULL, NULL, &timeout) < 1) goto UninitializedEnd; maxname = readstdin(); + /* init modifier map */ + modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) { + for (j = 0; j < modmap->max_keypermod; j++) { + if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + } + } + XFreeModifiermap(modmap); /* style */ dc.norm[ColBG] = getcolor(normbg); dc.norm[ColFG] = getcolor(normfg); @@ -409,12 +427,10 @@ main(int argc, char *argv[]) { wa.override_redirect = 1; wa.background_pixmap = ParentRelative; wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; - mx = my = 0; mw = DisplayWidth(dpy, screen); mh = dc.font.height + 2; - if(bottom) - my += DisplayHeight(dpy, screen) - mh; - win = XCreateWindow(dpy, root, mx, my, mw, mh, 0, + win = XCreateWindow(dpy, root, 0, + DisplayHeight(dpy, screen) - mh, mw, mh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);