@ -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,7 @@ 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 strcase ido ( const char * text , const char * pattern ) ;
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 +79,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 +91,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 +506,21 @@ 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 ) ) {
if ( ! j )
item = i ;
else
j - > right = i ;
i - > left = j ;
i - > right = NULL ;
j = i ;
nitem + + ;
}
for ( i = allitems ; i ; i = i - > next )
if ( plen & & strncmp ( pattern , i - > text , plen )
& & strstr ( i - > text , pattern ) ) {
if ( ! j )
item = i ;
else
j - > right = i ;
i - > left = j ;
i - > right = NULL ;
j = i ;
nitem + + ;
}
for ( i = allitems ; i ; i = i - > next )
if ( plen & & strncmp ( pattern , i - > text , plen )
& & ! strstr ( i - > text , pattern )
& & strido ( i - > text , pattern ) ) {
if ( ! j )
item = i ;
else
j - > right = i ;
i - > left = j ;
i - > right = NULL ;
j = i ;
nitem + + ;
}
i - > matched = False ;
for ( i = allitems ; i ; i = i - > next )
if ( ! i - > matched & & ! strncasecmp ( pattern , i - > text , plen ) )
j = appenditem ( i , j ) ;
for ( i = allitems ; i ; i = i - > next )
if ( ! i - > matched & & strcasestr ( i - > text , pattern ) )
j = appenditem ( i , j ) ;
if ( idomatch )
for ( i = allitems ; i ; i = i - > next )
if ( ! i - > matched & & strcaseido ( i - > text , pattern ) )
j = appenditem ( i , j ) ;
curr = prev = next = sel = item ;
curr = prev = next = sel = item ;
calcoffsets ( ) ;
calcoffsets ( ) ;
}
}
@ -629,9 +626,9 @@ setup(Bool bottom) {
}
}
int
int
strido ( const char * text , const char * pattern ) {
strcase ido ( const char * text , const char * pattern ) {
for ( ; * text & & * pattern ; text + + )
for ( ; * text & & * pattern ; text + + )
if ( * text = = * pattern )
if ( tolower ( * text ) = = tolower ( * pattern ) )
pattern + + ;
pattern + + ;
return ! * pattern ;
return ! * pattern ;
}
}
@ -662,6 +659,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 +680,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 ) ;