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(); |