X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=dmenu.c;h=5f168941881c50b8642c7430e17f5cfdc61768f7;hb=8e3e61170bd34d8a8269e376c30cb3afa25343a2;hp=be9b41b5e0c8615d69941f28e45cb86083f879ee;hpb=569a1f925a7cf351e6ec3e38529f46a1d9becf3f;p=dmenu.git diff --git a/dmenu.c b/dmenu.c index be9b41b..5f16894 100644 --- a/dmenu.c +++ b/dmenu.c @@ -52,6 +52,7 @@ static void calcoffsetsh(void); static void calcoffsetsv(void); static char *cistrstr(const char *s, const char *sub); static void cleanup(void); +static void drawmenu(void); static void drawmenuh(void); static void drawmenuv(void); static void drawtext(const char *text, unsigned long col[ColLast]); @@ -95,7 +96,6 @@ static char *(*fstrstr)(const char *, const char *) = strstr; static Bool vlist = False; static unsigned int lines = 5; static void (*calcoffsets)(void) = calcoffsetsh; -static void (*drawmenu)(void) = drawmenuh; void appenditem(Item *i, Item **list, Item **last) { @@ -200,7 +200,7 @@ cleanup(void) { void drawcursor(void) { - XRectangle r = { dc.x, dc.y + 2, 1, dc.h - 4 }; + XRectangle r = { dc.x, dc.y + 2, 1, dc.font.height - 2 }; r.x += textnw(text, cursor) + dc.font.height / 2; @@ -209,9 +209,7 @@ drawcursor(void) { } void -drawmenuh(void) { - Item *i; - +drawmenu(void) { dc.x = 0; dc.y = 0; dc.w = mw; @@ -231,56 +229,48 @@ drawmenuh(void) { drawcursor(); dc.x += cmdw; if(curr) { - dc.w = spaceitem; - drawtext((curr && curr->left) ? "<" : NULL, dc.norm); - dc.x += dc.w; - /* determine maximum items */ - for(i = curr; i != next; i=i->right) { - dc.w = textw(i->text); - if(dc.w > mw / 3) - dc.w = mw / 3; - drawtext(i->text, (sel == i) ? dc.sel : dc.norm); - dc.x += dc.w; - } - dc.x = mw - spaceitem; - dc.w = spaceitem; - drawtext(next ? ">" : NULL, dc.norm); + if(vlist) + drawmenuv(); + else + drawmenuh(); } XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); XFlush(dpy); } +void +drawmenuh(void) { + Item *i; + + dc.w = spaceitem; + drawtext((curr && curr->left) ? "<" : NULL, dc.norm); + dc.x += dc.w; + /* determine maximum items */ + for(i = curr; i != next; i=i->right) { + dc.w = textw(i->text); + if(dc.w > mw / 3) + dc.w = mw / 3; + drawtext(i->text, (sel == i) ? dc.sel : dc.norm); + dc.x += dc.w; + } + dc.x = mw - spaceitem; + dc.w = spaceitem; + drawtext(next ? ">" : NULL, dc.norm); +} + void drawmenuv(void) { Item *i; dc.x = 0; - dc.y = 0; dc.w = mw; - dc.h = mh; - drawtext(NULL, dc.norm); - /* print prompt? */ - if(promptw) { - dc.w = promptw; - drawtext(prompt, dc.sel); - } - dc.x += promptw; - dc.w = mw - promptw; - /* print command */ - drawtext(text[0] ? text : NULL, dc.norm); - if(curr) { - dc.x = 0; - dc.w = mw; + dc.y += dc.font.height + 2; + /* determine maximum items */ + for(i = curr; i != next; i=i->right) { + drawtext(i->text, (sel == i) ? dc.sel : dc.norm); dc.y += dc.font.height + 2; - /* determine maximum items */ - for(i = curr; i != next; i=i->right) { - drawtext(i->text, (sel == i) ? dc.sel : dc.norm); - dc.y += dc.font.height + 2; - } - drawtext(NULL, dc.norm); } - XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); - XFlush(dpy); + drawtext(NULL, dc.norm); } void @@ -382,7 +372,7 @@ initfont(const char *fontstr) { void kpress(XKeyEvent * e) { - char buf[32]; + char buf[sizeof text]; int i, num; unsigned int len; KeySym ksym; @@ -466,26 +456,24 @@ kpress(XKeyEvent * e) { FILE *fp; char *c; if(!(fp = (FILE*)popen("sselp", "r"))) - fprintf(stderr, "dmenu: Could not popen sselp\n"); - c = fgets(text + len, sizeof(text) - len, fp); + eprint("dmenu: Could not popen sselp\n"); + c = fgets(buf, sizeof buf, fp); pclose(fp); if(c == NULL) return; } - len = strlen(text); - if(len && text[len-1] == '\n') - text[--len] = '\0'; - match(text); - drawmenu(); - return; + num = strlen(buf); + if(num && buf[num-1] == '\n') + buf[--num] = '\0'; + break; } } switch(ksym) { default: + num = MIN(num, sizeof text - cursor); if(num && !iscntrl((int) buf[0])) { - buf[num] = 0; - memmove(text + cursor + num, text + cursor, sizeof text - cursor); - strncpy(text + cursor, buf, sizeof text - cursor); + memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); + memmove(text + cursor, buf, num); cursor+=num; match(text); } @@ -497,6 +485,10 @@ kpress(XKeyEvent * e) { match(text); } break; + case XK_Delete: + memmove(text + cursor, text + cursor + 1, sizeof text - cursor); + match(text); + break; case XK_End: if(!item) return; @@ -786,8 +778,7 @@ main(int argc, char *argv[]) { else if(!strcmp(argv[i], "-l")) { vlist = True; calcoffsets = calcoffsetsv; - drawmenu = drawmenuv; - if(++i < argc) lines += atoi(argv[i]); + if(++i < argc) lines = atoi(argv[i]); } else if(!strcmp(argv[i], "-fn")) { if(++i < argc) font = argv[i];