diff options
| -rw-r--r-- | dmenu.c | 65 |
1 files changed, 29 insertions, 36 deletions
| @@ -52,6 +52,7 @@ static void calcoffsetsh(void); | |||
| 52 | static void calcoffsetsv(void); | 52 | static void calcoffsetsv(void); |
| 53 | static char *cistrstr(const char *s, const char *sub); | 53 | static char *cistrstr(const char *s, const char *sub); |
| 54 | static void cleanup(void); | 54 | static void cleanup(void); |
| 55 | static void drawcursor(void); | ||
| 55 | static void drawmenu(void); | 56 | static void drawmenu(void); |
| 56 | static void drawmenuh(void); | 57 | static void drawmenuh(void); |
| 57 | static void drawmenuv(void); | 58 | static void drawmenuv(void); |
| @@ -247,9 +248,7 @@ drawmenuh(void) { | |||
| 247 | dc.x += dc.w; | 248 | dc.x += dc.w; |
| 248 | /* determine maximum items */ | 249 | /* determine maximum items */ |
| 249 | for(i = curr; i != next; i=i->right) { | 250 | for(i = curr; i != next; i=i->right) { |
| 250 | dc.w = textw(i->text); | 251 | dc.w = MIN(textw(i->text), mw / 3); |
| 251 | if(dc.w > mw / 3) | ||
| 252 | dc.w = mw / 3; | ||
| 253 | drawtext(i->text, (sel == i) ? dc.sel : dc.norm); | 252 | drawtext(i->text, (sel == i) ? dc.sel : dc.norm); |
| 254 | dc.x += dc.w; | 253 | dc.x += dc.w; |
| 255 | } | 254 | } |
| @@ -395,7 +394,8 @@ kpress(XKeyEvent * e) { | |||
| 395 | switch (ksym) { | 394 | switch (ksym) { |
| 396 | default: /* ignore other control sequences */ | 395 | default: /* ignore other control sequences */ |
| 397 | return; | 396 | return; |
| 398 | case XK_bracketleft: | 397 | case XK_c: |
| 398 | case XK_C: | ||
| 399 | ksym = XK_Escape; | 399 | ksym = XK_Escape; |
| 400 | break; | 400 | break; |
| 401 | case XK_h: | 401 | case XK_h: |
| @@ -414,18 +414,16 @@ kpress(XKeyEvent * e) { | |||
| 414 | case XK_U: | 414 | case XK_U: |
| 415 | text[0] = 0; | 415 | text[0] = 0; |
| 416 | match(text); | 416 | match(text); |
| 417 | drawmenu(); | ||
| 418 | break; | 417 | break; |
| 419 | case XK_w: | 418 | case XK_w: |
| 420 | case XK_W: | 419 | case XK_W: |
| 421 | if(len) { | 420 | if(cursor > 0) { |
| 422 | i = len - 1; | 421 | i = cursor; |
| 423 | while(i >= 0 && text[i] == ' ') | 422 | while(i-- > 0 && text[i] == ' '); |
| 424 | text[i--] = 0; | 423 | while(i-- > 0 && text[i] != ' '); |
| 425 | while(i >= 0 && text[i] != ' ') | 424 | memmove(text + i + 1, text + cursor, sizeof text - cursor); |
| 426 | text[i--] = 0; | 425 | cursor = i + 1; |
| 427 | match(text); | 426 | match(text); |
| 428 | drawmenu(); | ||
| 429 | } | 427 | } |
| 430 | break; | 428 | break; |
| 431 | } | 429 | } |
| @@ -473,14 +471,14 @@ kpress(XKeyEvent * e) { | |||
| 473 | num = MIN(num, sizeof text - cursor); | 471 | num = MIN(num, sizeof text - cursor); |
| 474 | if(num && !iscntrl((int) buf[0])) { | 472 | if(num && !iscntrl((int) buf[0])) { |
| 475 | memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); | 473 | memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); |
| 476 | memmove(text + cursor, buf, num); | 474 | memcpy(text + cursor, buf, num); |
| 477 | cursor+=num; | 475 | cursor+=num; |
| 478 | match(text); | 476 | match(text); |
| 479 | } | 477 | } |
| 480 | break; | 478 | break; |
| 481 | case XK_BackSpace: | 479 | case XK_BackSpace: |
| 482 | if(cursor > 0) { | 480 | if(cursor > 0) { |
| 483 | memmove(text + cursor + -1, text + cursor, sizeof text - cursor); | 481 | memmove(text + cursor - 1, text + cursor, sizeof text - cursor + 1); |
| 484 | cursor--; | 482 | cursor--; |
| 485 | match(text); | 483 | match(text); |
| 486 | } | 484 | } |
| @@ -490,8 +488,10 @@ kpress(XKeyEvent * e) { | |||
| 490 | match(text); | 488 | match(text); |
| 491 | break; | 489 | break; |
| 492 | case XK_End: | 490 | case XK_End: |
| 493 | if(!item) | 491 | if(cursor < len) { |
| 494 | return; | 492 | cursor = len; |
| 493 | break; | ||
| 494 | } | ||
| 495 | while(next) { | 495 | while(next) { |
| 496 | sel = curr = next; | 496 | sel = curr = next; |
| 497 | calcoffsets(); | 497 | calcoffsets(); |
| @@ -504,8 +504,10 @@ kpress(XKeyEvent * e) { | |||
| 504 | running = False; | 504 | running = False; |
| 505 | break; | 505 | break; |
| 506 | case XK_Home: | 506 | case XK_Home: |
| 507 | if(!item) | 507 | if(sel == item) { |
| 508 | return; | 508 | cursor = 0; |
| 509 | break; | ||
| 510 | } | ||
| 509 | sel = curr = item; | 511 | sel = curr = item; |
| 510 | calcoffsets(); | 512 | calcoffsets(); |
| 511 | break; | 513 | break; |
| @@ -536,12 +538,10 @@ kpress(XKeyEvent * e) { | |||
| 536 | calcoffsets(); | 538 | calcoffsets(); |
| 537 | break; | 539 | break; |
| 538 | case XK_Return: | 540 | case XK_Return: |
| 539 | if((e->state & ShiftMask) && *text) | 541 | if((e->state & ShiftMask) || !sel) |
| 540 | fprintf(stdout, "%s", text); | 542 | fprintf(stdout, "%s", text); |
| 541 | else if(sel) | 543 | else |
| 542 | fprintf(stdout, "%s", sel->text); | 544 | fprintf(stdout, "%s", sel->text); |
| 543 | else if(*text) | ||
| 544 | fprintf(stdout, "%s", text); | ||
| 545 | fflush(stdout); | 545 | fflush(stdout); |
| 546 | running = False; | 546 | running = False; |
| 547 | break; | 547 | break; |
| @@ -567,9 +567,6 @@ kpress(XKeyEvent * e) { | |||
| 567 | match(text); | 567 | match(text); |
| 568 | break; | 568 | break; |
| 569 | } | 569 | } |
| 570 | len = strlen(text); | ||
| 571 | cursor = MIN(cursor, len); | ||
| 572 | cursor = MAX(cursor, 0); | ||
| 573 | drawmenu(); | 570 | drawmenu(); |
| 574 | } | 571 | } |
| 575 | 572 | ||
| @@ -620,13 +617,13 @@ readstdin(void) { | |||
| 620 | unsigned int len = 0, max = 0; | 617 | unsigned int len = 0, max = 0; |
| 621 | Item *i, *new; | 618 | Item *i, *new; |
| 622 | 619 | ||
| 623 | i = 0; | 620 | i = NULL; |
| 624 | while(fgets(buf, sizeof buf, stdin)) { | 621 | while(fgets(buf, sizeof buf, stdin)) { |
| 625 | len = strlen(buf); | 622 | len = strlen(buf); |
| 626 | if (buf[len - 1] == '\n') | 623 | if(buf[len-1] == '\n') |
| 627 | buf[len - 1] = 0; | 624 | buf[--len] = '\0'; |
| 628 | if(!(p = strdup(buf))) | 625 | if(!(p = strdup(buf))) |
| 629 | eprint("fatal: could not strdup() %u bytes\n", strlen(buf)); | 626 | eprint("fatal: could not strdup() %u bytes\n", len); |
| 630 | if(max < len) { | 627 | if(max < len) { |
| 631 | maxname = p; | 628 | maxname = p; |
| 632 | max = len; | 629 | max = len; |
| @@ -734,13 +731,9 @@ setup(Bool topbar) { | |||
| 734 | if(!dc.font.set) | 731 | if(!dc.font.set) |
| 735 | XSetFont(dpy, dc.gc, dc.font.xfont->fid); | 732 | XSetFont(dpy, dc.gc, dc.font.xfont->fid); |
| 736 | if(maxname) | 733 | if(maxname) |
| 737 | cmdw = textw(maxname); | 734 | cmdw = MIN(textw(maxname), mw / 3); |
| 738 | if(cmdw > mw / 3) | ||
| 739 | cmdw = mw / 3; | ||
| 740 | if(prompt) | 735 | if(prompt) |
| 741 | promptw = textw(prompt); | 736 | promptw = MIN(textw(prompt), mw / 5); |
| 742 | if(promptw > mw / 5) | ||
| 743 | promptw = mw / 5; | ||
| 744 | text[0] = 0; | 737 | text[0] = 0; |
| 745 | match(text); | 738 | match(text); |
| 746 | XMapRaised(dpy, win); | 739 | XMapRaised(dpy, win); |
| @@ -799,7 +792,7 @@ main(int argc, char *argv[]) { | |||
| 799 | if(++i < argc) selfgcolor = argv[i]; | 792 | if(++i < argc) selfgcolor = argv[i]; |
| 800 | } | 793 | } |
| 801 | else if(!strcmp(argv[i], "-v")) | 794 | else if(!strcmp(argv[i], "-v")) |
| 802 | eprint("dmenu-"VERSION", © 2006-2009 dmenu engineers, see LICENSE for details\n"); | 795 | eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n"); |
| 803 | else | 796 | else |
| 804 | eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n" | 797 | eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n" |
| 805 | " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n"); | 798 | " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n"); |
