diff options
| -rw-r--r-- | LICENSE | 2 | ||||
| -rw-r--r-- | config.h | 2 | ||||
| -rw-r--r-- | dmenu.1 | 16 | ||||
| -rw-r--r-- | dmenu.c | 53 |
4 files changed, 37 insertions, 36 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | MIT/X Consortium License | 1 | MIT/X Consortium License |
| 2 | 2 | ||
| 3 | © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com> | 3 | © 2006-2008 Anselm R. Garbe <garbeam at gmail dot com> |
| 4 | © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com> | 4 | © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com> |
| 5 | © 2006-2007 Michał Janeczek <janeczek at gmail dot com> | 5 | © 2006-2007 Michał Janeczek <janeczek at gmail dot com> |
| 6 | 6 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* See LICENSE file for copyright and license details. */ | 1 | /* See LICENSE file for copyright and license details. */ |
| 2 | 2 | ||
| 3 | /* appearance */ | 3 | /* appearance */ |
| 4 | #define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*" | 4 | #define FONT "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*" |
| 5 | #define NORMBGCOLOR "#cccccc" | 5 | #define NORMBGCOLOR "#cccccc" |
| 6 | #define NORMFGCOLOR "#000000" | 6 | #define NORMFGCOLOR "#000000" |
| 7 | #define SELBGCOLOR "#0066ff" | 7 | #define SELBGCOLOR "#0066ff" |
| @@ -3,8 +3,10 @@ | |||
| 3 | dmenu \- dynamic menu | 3 | dmenu \- dynamic menu |
| 4 | .SH SYNOPSIS | 4 | .SH SYNOPSIS |
| 5 | .B dmenu | 5 | .B dmenu |
| 6 | .RB [ \-b ] | ||
| 7 | .RB [ \-i ] | 6 | .RB [ \-i ] |
| 7 | .RB [ \-x " <x>"] | ||
| 8 | .RB [ \-y " <y>"] | ||
| 9 | .RB [ \-w " <width>"] | ||
| 8 | .RB [ \-fn " <font>"] | 10 | .RB [ \-fn " <font>"] |
| 9 | .RB [ \-nb " <color>"] | 11 | .RB [ \-nb " <color>"] |
| 10 | .RB [ \-nf " <color>"] | 12 | .RB [ \-nf " <color>"] |
| @@ -20,11 +22,17 @@ It manages huge amounts (up to 10.000 and more) of user defined menu items | |||
| 20 | efficiently. | 22 | efficiently. |
| 21 | .SS Options | 23 | .SS Options |
| 22 | .TP | 24 | .TP |
| 23 | .B \-b | 25 | .B \-x |
| 24 | makes dmenu appear at the screen bottom (by default it appears at the screen top). | 26 | defines the x coordinate dmenu appears at (0 by default). |
| 27 | .TP | ||
| 28 | .B \-y | ||
| 29 | defines the y coordinate dmenu appears at (0 by default). | ||
| 30 | .TP | ||
| 31 | .B \-w | ||
| 32 | defines the width of the dmenu window (screen width by default). | ||
| 25 | .TP | 33 | .TP |
| 26 | .B \-i | 34 | .B \-i |
| 27 | makes dmenu match menu entries with ignoring intermediate characters. | 35 | makes dmenu match menu entries case insensitively. |
| 28 | .TP | 36 | .TP |
| 29 | .B \-fn <font> | 37 | .B \-fn <font> |
| 30 | defines the font. | 38 | defines the font. |
| @@ -56,8 +56,7 @@ void kpress(XKeyEvent * e); | |||
| 56 | void match(char *pattern); | 56 | void match(char *pattern); |
| 57 | void readstdin(void); | 57 | void readstdin(void); |
| 58 | void run(void); | 58 | void run(void); |
| 59 | void setup(Bool bottom); | 59 | void setup(int x, int y, int w); |
| 60 | int strcaseido(const char *text, const char *pattern); | ||
| 61 | char *cistrstr(const char *s, const char *sub); | 60 | char *cistrstr(const char *s, const char *sub); |
| 62 | unsigned int textnw(const char *text, unsigned int len); | 61 | unsigned int textnw(const char *text, unsigned int len); |
| 63 | unsigned int textw(const char *text); | 62 | unsigned int textw(const char *text); |
| @@ -80,7 +79,6 @@ unsigned int mw, mh; | |||
| 80 | unsigned int promptw = 0; | 79 | unsigned int promptw = 0; |
| 81 | unsigned int nitem = 0; | 80 | unsigned int nitem = 0; |
| 82 | unsigned int numlockmask = 0; | 81 | unsigned int numlockmask = 0; |
| 83 | Bool idomatch = False; | ||
| 84 | Bool running = True; | 82 | Bool running = True; |
| 85 | Display *dpy; | 83 | Display *dpy; |
| 86 | DC dc = {0}; | 84 | DC dc = {0}; |
| @@ -91,6 +89,7 @@ Item *next = NULL; | |||
| 91 | Item *prev = NULL; | 89 | Item *prev = NULL; |
| 92 | Item *curr = NULL; | 90 | Item *curr = NULL; |
| 93 | Window root, win; | 91 | Window root, win; |
| 92 | char *(*fstrstr)(const char *, const char *) = strstr; | ||
| 94 | 93 | ||
| 95 | Item * | 94 | Item * |
| 96 | appenditem(Item *i, Item *last) { | 95 | appenditem(Item *i, Item *last) { |
| @@ -512,12 +511,8 @@ match(char *pattern) { | |||
| 512 | if(!i->matched && !strncasecmp(pattern, i->text, plen)) | 511 | if(!i->matched && !strncasecmp(pattern, i->text, plen)) |
| 513 | j = appenditem(i, j); | 512 | j = appenditem(i, j); |
| 514 | for(i = allitems; i; i = i->next) | 513 | for(i = allitems; i; i = i->next) |
| 515 | if(!i->matched && cistrstr(i->text, pattern)) | 514 | if(!i->matched && fstrstr(i->text, pattern)) |
| 516 | j = appenditem(i, j); | 515 | j = appenditem(i, j); |
| 517 | if(idomatch) | ||
| 518 | for(i = allitems; i; i = i->next) | ||
| 519 | if(!i->matched && strcaseido(i->text, pattern)) | ||
| 520 | j = appenditem(i, j); | ||
| 521 | curr = prev = next = sel = item; | 516 | curr = prev = next = sel = item; |
| 522 | calcoffsets(); | 517 | calcoffsets(); |
| 523 | } | 518 | } |
| @@ -569,7 +564,7 @@ run(void) { | |||
| 569 | } | 564 | } |
| 570 | 565 | ||
| 571 | void | 566 | void |
| 572 | setup(Bool bottom) { | 567 | setup(int x, int y, int w) { |
| 573 | unsigned int i, j; | 568 | unsigned int i, j; |
| 574 | XModifierKeymap *modmap; | 569 | XModifierKeymap *modmap; |
| 575 | XSetWindowAttributes wa; | 570 | XSetWindowAttributes wa; |
| @@ -595,10 +590,9 @@ setup(Bool bottom) { | |||
| 595 | wa.override_redirect = 1; | 590 | wa.override_redirect = 1; |
| 596 | wa.background_pixmap = ParentRelative; | 591 | wa.background_pixmap = ParentRelative; |
| 597 | wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; | 592 | wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask; |
| 598 | mw = DisplayWidth(dpy, screen); | 593 | mw = w ? w : DisplayWidth(dpy, screen); |
| 599 | mh = dc.font.height + 2; | 594 | mh = dc.font.height + 2; |
| 600 | win = XCreateWindow(dpy, root, 0, | 595 | win = XCreateWindow(dpy, root, x, y, mw, mh, 0, |
| 601 | bottom ? DisplayHeight(dpy, screen) - mh : 0, mw, mh, 0, | ||
| 602 | DefaultDepth(dpy, screen), CopyFromParent, | 596 | DefaultDepth(dpy, screen), CopyFromParent, |
| 603 | DefaultVisual(dpy, screen), | 597 | DefaultVisual(dpy, screen), |
| 604 | CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); | 598 | CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); |
| @@ -622,14 +616,6 @@ setup(Bool bottom) { | |||
| 622 | XMapRaised(dpy, win); | 616 | XMapRaised(dpy, win); |
| 623 | } | 617 | } |
| 624 | 618 | ||
| 625 | int | ||
| 626 | strcaseido(const char *text, const char *pattern) { | ||
| 627 | for(; *text && *pattern; text++) | ||
| 628 | if(tolower((int)*text) == tolower((int)*pattern)) | ||
| 629 | pattern++; | ||
| 630 | return !*pattern; | ||
| 631 | } | ||
| 632 | |||
| 633 | char * | 619 | char * |
| 634 | cistrstr(const char *s, const char *sub) { | 620 | cistrstr(const char *s, const char *sub) { |
| 635 | int c, csub; | 621 | int c, csub; |
| @@ -671,16 +657,13 @@ textw(const char *text) { | |||
| 671 | 657 | ||
| 672 | int | 658 | int |
| 673 | main(int argc, char *argv[]) { | 659 | main(int argc, char *argv[]) { |
| 674 | Bool bottom = False; | 660 | int x = 0, y = 0, w = 0; |
| 675 | unsigned int i; | 661 | unsigned int i; |
| 676 | 662 | ||
| 677 | /* command line args */ | 663 | /* command line args */ |
| 678 | for(i = 1; i < argc; i++) | 664 | for(i = 1; i < argc; i++) |
| 679 | if(!strcmp(argv[i], "-b")) { | 665 | if(!strcmp(argv[i], "-i")) |
| 680 | bottom = True; | 666 | fstrstr = cistrstr; |
| 681 | } | ||
| 682 | else if(!strcmp(argv[i], "-i")) | ||
| 683 | idomatch = True; | ||
| 684 | else if(!strcmp(argv[i], "-fn")) { | 667 | else if(!strcmp(argv[i], "-fn")) { |
| 685 | if(++i < argc) font = argv[i]; | 668 | if(++i < argc) font = argv[i]; |
| 686 | } | 669 | } |
| @@ -699,11 +682,21 @@ main(int argc, char *argv[]) { | |||
| 699 | else if(!strcmp(argv[i], "-sf")) { | 682 | else if(!strcmp(argv[i], "-sf")) { |
| 700 | if(++i < argc) selfg = argv[i]; | 683 | if(++i < argc) selfg = argv[i]; |
| 701 | } | 684 | } |
| 685 | else if(!strcmp(argv[i], "-x")) { | ||
| 686 | if(++i < argc) x = atoi(argv[i]); | ||
| 687 | } | ||
| 688 | else if(!strcmp(argv[i], "-y")) { | ||
| 689 | if(++i < argc) y = atoi(argv[i]); | ||
| 690 | } | ||
| 691 | else if(!strcmp(argv[i], "-w")) { | ||
| 692 | if(++i < argc) w = atoi(argv[i]); | ||
| 693 | } | ||
| 702 | else if(!strcmp(argv[i], "-v")) | 694 | else if(!strcmp(argv[i], "-v")) |
| 703 | eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk, Michał Janeczek\n"); | 695 | eprint("dmenu-"VERSION", © 2006-2008 dmenu engineers, see LICENSE for details\n"); |
| 704 | else | 696 | else |
| 705 | eprint("usage: dmenu [-b] [-i] [-fn <font>] [-nb <color>] [-nf <color>]\n" | 697 | eprint("usage: dmenu [-i] [-fn <font>] [-nb <color>] [-nf <color>]\n" |
| 706 | " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n"); | 698 | " [-p <prompt>] [-sb <color>] [-sf <color>]\n" |
| 699 | " [-x <x>] [-y <y>] [-w <w>] [-v]\n"); | ||
| 707 | setlocale(LC_CTYPE, ""); | 700 | setlocale(LC_CTYPE, ""); |
| 708 | dpy = XOpenDisplay(0); | 701 | dpy = XOpenDisplay(0); |
| 709 | if(!dpy) | 702 | if(!dpy) |
| @@ -720,7 +713,7 @@ main(int argc, char *argv[]) { | |||
| 720 | readstdin(); | 713 | readstdin(); |
| 721 | } | 714 | } |
| 722 | 715 | ||
| 723 | setup(bottom); | 716 | setup(x, y, w); |
| 724 | drawmenu(); | 717 | drawmenu(); |
| 725 | XSync(dpy, False); | 718 | XSync(dpy, False); |
| 726 | run(); | 719 | run(); |
