Compare commits

..

13 Commits
3.3 ... 3.4

6 changed files with 73 additions and 48 deletions

View File

@ -32,3 +32,4 @@ dd3d02b07cac44fbafc074a361c1002cebe7aae4 2.8
59b3024854db49739c6d237fa9077f04a2da847a 3.0 59b3024854db49739c6d237fa9077f04a2da847a 3.0
8f0f917ac988164e1b4446236e3a6ab6cfcb8c67 3.1 8f0f917ac988164e1b4446236e3a6ab6cfcb8c67 3.1
e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2 e4c81a78ffbad6ba4d1ad119cc654da6eca63a4c 3.2
709df5a4bad7015a346b2b44b1b3b573ea3088ff 3.3

View File

@ -2,6 +2,7 @@ MIT/X Consortium License
© 2006-2007 Anselm R. Garbe <garbeam at gmail dot com> © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com> © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Michał Janeczek <janeczek at gmail dot com>
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),

View File

@ -1,10 +1,10 @@
/* See LICENSE file for copyright and license details. */ /* See LICENSE file for copyright and license details. */
/* appearance */ /* appearance */
#define FONT "-*-terminus-medium-r-*-*-12-*-*-*-*-*-iso10646-*" #define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*"
#define NORMBGCOLOR "#000" #define NORMBGCOLOR "#cccccc"
#define NORMFGCOLOR "#ccc" #define NORMFGCOLOR "#000000"
#define SELBGCOLOR "#00f" #define SELBGCOLOR "#0066ff"
#define SELFGCOLOR "#fff" #define SELFGCOLOR "#ffffff"
/* next macro defines the space between menu items */ /* next macro defines the space between menu items */
#define SPACE 30 /* px */ #define SPACE 30 /* px */

View File

@ -1,5 +1,5 @@
# dmenu version # dmenu version
VERSION = 3.3 VERSION = 3.4
# Customize below to fit your system # Customize below to fit your system
@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags # flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = -s ${LIBS} LDFLAGS = -s ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" #CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS} #LDFLAGS = -g ${LIBS}
# Solaris # Solaris

View File

@ -1,9 +1,10 @@
.TH DMENU 1 dmenu\-3.2 .TH DMENU 1 dmenu\-VERSION
.SH NAME .SH NAME
dmenu \- dynamic menu dmenu \- dynamic menu
.SH SYNOPSIS .SH SYNOPSIS
.B dmenu .B dmenu
.RB [ \-b ] .RB [ \-b ]
.RB [ \-i ]
.RB [ \-fn " <font>"] .RB [ \-fn " <font>"]
.RB [ \-nb " <color>"] .RB [ \-nb " <color>"]
.RB [ \-nf " <color>"] .RB [ \-nf " <color>"]
@ -22,6 +23,9 @@ efficiently.
.B \-b .B \-b
makes dmenu appear at the screen bottom (by default it appears at the screen top). makes dmenu appear at the screen bottom (by default it appears at the screen top).
.TP .TP
.B \-i
makes dmenu match menu entries with ignoring intermediate characters.
.TP
.B \-fn <font> .B \-fn <font>
defines the font. defines the font.
.TP .TP

95
dmenu.c
View File

@ -37,9 +37,11 @@ struct Item {
Item *next; /* traverses all items */ Item *next; /* traverses all items */
Item *left, *right; /* traverses items matching current search pattern */ Item *left, *right; /* traverses items matching current search pattern */
char *text; char *text;
Bool matched;
}; };
/* forward declarations */ /* forward declarations */
Item *appenditem(Item *i, Item *last);
void calcoffsets(void); void calcoffsets(void);
void cleanup(void); void cleanup(void);
void drawmenu(void); void drawmenu(void);
@ -55,7 +57,8 @@ void match(char *pattern);
void readstdin(void); void readstdin(void);
void run(void); void run(void);
void setup(Bool bottom); void setup(Bool bottom);
int strido(const char *text, const char *pattern); int strcaseido(const char *text, const char *pattern);
char *cistrstr(const char *s, const char *sub);
unsigned int textnw(const char *text, unsigned int len); unsigned int textnw(const char *text, unsigned int len);
unsigned int textw(const char *text); unsigned int textw(const char *text);
@ -77,6 +80,7 @@ unsigned int mw, mh;
unsigned int promptw = 0; unsigned int promptw = 0;
unsigned int nitem = 0; unsigned int nitem = 0;
unsigned int numlockmask = 0; unsigned int numlockmask = 0;
Bool idomatch = False;
Bool running = True; Bool running = True;
Display *dpy; Display *dpy;
DC dc = {0}; DC dc = {0};
@ -88,6 +92,20 @@ Item *prev = NULL;
Item *curr = NULL; Item *curr = NULL;
Window root, win; Window root, win;
Item *
appenditem(Item *i, Item *last) {
if(!last)
item = i;
else
last->right = i;
i->matched = True;
i->left = last;
i->right = NULL;
last = i;
nitem++;
return last;
}
void void
calcoffsets(void) { calcoffsets(void) {
unsigned int tw, w; unsigned int tw, w;
@ -489,41 +507,17 @@ match(char *pattern) {
item = j = NULL; item = j = NULL;
nitem = 0; nitem = 0;
for(i = allitems; i; i=i->next) for(i = allitems; i; i=i->next)
if(!plen || !strncmp(pattern, i->text, plen)) { i->matched = False;
if(!j)
item = i;
else
j->right = i;
i->left = j;
i->right = NULL;
j = i;
nitem++;
}
for(i = allitems; i; i = i->next) for(i = allitems; i; i = i->next)
if(plen && strncmp(pattern, i->text, plen) if(!i->matched && !strncasecmp(pattern, i->text, plen))
&& strstr(i->text, pattern)) { j = appenditem(i, j);
if(!j)
item = i;
else
j->right = i;
i->left = j;
i->right = NULL;
j = i;
nitem++;
}
for(i = allitems; i; i = i->next) for(i = allitems; i; i = i->next)
if(plen && strncmp(pattern, i->text, plen) if(!i->matched && cistrstr(i->text, pattern))
&& !strstr(i->text, pattern) j = appenditem(i, j);
&& strido(i->text,pattern)) { if(idomatch)
if(!j) for(i = allitems; i; i = i->next)
item = i; if(!i->matched && strcaseido(i->text, pattern))
else j = appenditem(i, j);
j->right = i;
i->left = j;
i->right = NULL;
j = i;
nitem++;
}
curr = prev = next = sel = item; curr = prev = next = sel = item;
calcoffsets(); calcoffsets();
} }
@ -629,13 +623,36 @@ setup(Bool bottom) {
} }
int int
strido(const char *text, const char *pattern) { strcaseido(const char *text, const char *pattern) {
for(; *text && *pattern; text++) for(; *text && *pattern; text++)
if (*text == *pattern) if(tolower((int)*text) == tolower((int)*pattern))
pattern++; pattern++;
return !*pattern; return !*pattern;
} }
char *
cistrstr(const char *s, const char *sub) {
int c, csub;
unsigned int len;
if(!sub)
return (char *)s;
if((c = *sub++) != 0) {
c = tolower(c);
len = strlen(sub);
do {
do {
if((csub = *s++) == 0)
return (NULL);
}
while(tolower(csub) != c);
}
while(strncasecmp(s, sub, len) != 0);
s--;
}
return (char *)s;
}
unsigned int unsigned int
textnw(const char *text, unsigned int len) { textnw(const char *text, unsigned int len) {
XRectangle r; XRectangle r;
@ -662,6 +679,8 @@ main(int argc, char *argv[]) {
if(!strcmp(argv[i], "-b")) { if(!strcmp(argv[i], "-b")) {
bottom = True; bottom = True;
} }
else if(!strcmp(argv[i], "-i"))
idomatch = True;
else if(!strcmp(argv[i], "-fn")) { else if(!strcmp(argv[i], "-fn")) {
if(++i < argc) font = argv[i]; if(++i < argc) font = argv[i];
} }
@ -681,9 +700,9 @@ main(int argc, char *argv[]) {
if(++i < argc) selfg = argv[i]; if(++i < argc) selfg = argv[i];
} }
else if(!strcmp(argv[i], "-v")) else if(!strcmp(argv[i], "-v"))
eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk\n"); eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk, Michał Janeczek\n");
else else
eprint("usage: dmenu [-b] [-fn <font>] [-nb <color>] [-nf <color>]\n" eprint("usage: dmenu [-b] [-i] [-fn <font>] [-nb <color>] [-nf <color>]\n"
" [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n"); " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");
setlocale(LC_CTYPE, ""); setlocale(LC_CTYPE, "");
dpy = XOpenDisplay(0); dpy = XOpenDisplay(0);