aboutsummaryrefslogtreecommitdiff
path: root/dmenu.c
diff options
context:
space:
mode:
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c53
1 files changed, 23 insertions, 30 deletions
diff --git a/dmenu.c b/dmenu.c
index 3256f9c..864c8f0 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -56,8 +56,7 @@ void kpress(XKeyEvent * e);
56void match(char *pattern); 56void match(char *pattern);
57void readstdin(void); 57void readstdin(void);
58void run(void); 58void run(void);
59void setup(Bool bottom); 59void setup(int x, int y, int w);
60int strcaseido(const char *text, const char *pattern);
61char *cistrstr(const char *s, const char *sub); 60char *cistrstr(const char *s, const char *sub);
62unsigned int textnw(const char *text, unsigned int len); 61unsigned int textnw(const char *text, unsigned int len);
63unsigned int textw(const char *text); 62unsigned int textw(const char *text);
@@ -80,7 +79,6 @@ unsigned int mw, mh;
80unsigned int promptw = 0; 79unsigned int promptw = 0;
81unsigned int nitem = 0; 80unsigned int nitem = 0;
82unsigned int numlockmask = 0; 81unsigned int numlockmask = 0;
83Bool idomatch = False;
84Bool running = True; 82Bool running = True;
85Display *dpy; 83Display *dpy;
86DC dc = {0}; 84DC dc = {0};
@@ -91,6 +89,7 @@ Item *next = NULL;
91Item *prev = NULL; 89Item *prev = NULL;
92Item *curr = NULL; 90Item *curr = NULL;
93Window root, win; 91Window root, win;
92char *(*fstrstr)(const char *, const char *) = strstr;
94 93
95Item * 94Item *
96appenditem(Item *i, Item *last) { 95appenditem(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
571void 566void
572setup(Bool bottom) { 567setup(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
625int
626strcaseido(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
633char * 619char *
634cistrstr(const char *s, const char *sub) { 620cistrstr(const char *s, const char *sub) {
635 int c, csub; 621 int c, csub;
@@ -671,16 +657,13 @@ textw(const char *text) {
671 657
672int 658int
673main(int argc, char *argv[]) { 659main(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();