@@ -40,7 +40,7 @@ defines the seconds to wait for standard input, before exiting (default is 3). | |||||
prints version information to standard output, then exits. | prints version information to standard output, then exits. | ||||
.SH USAGE | .SH USAGE | ||||
dmenu reads a list of newline-separated items from standard input and creates a | dmenu reads a list of newline-separated items from standard input and creates a | ||||
menu. When the user selects an item or enters any text and presses Return, his | |||||
menu. When the user selects an item or enters any text and presses Return, his/her | |||||
choice is printed to standard output and dmenu terminates. | choice is printed to standard output and dmenu terminates. | ||||
.P | .P | ||||
dmenu is completely controlled by the keyboard. The following keys are recognized: | dmenu is completely controlled by the keyboard. The following keys are recognized: | ||||
@@ -52,6 +52,12 @@ only items containing this text will be displayed. | |||||
.B Left/Right | .B Left/Right | ||||
Select the previous/next item. | Select the previous/next item. | ||||
.TP | .TP | ||||
.B PageUp/PageDown | |||||
Select the first item of the previous/next 'page' of items. | |||||
.TP | |||||
.B Home/End | |||||
Select the first/last item. | |||||
.TP | |||||
.B Tab | .B Tab | ||||
Copy the selected item to the input field. | Copy the selected item to the input field. | ||||
.TP | .TP | ||||
@@ -170,6 +170,42 @@ kpress(XKeyEvent * e) { | |||||
} | } | ||||
} | } | ||||
switch(ksym) { | switch(ksym) { | ||||
default: | |||||
if(num && !iscntrl((int) buf[0])) { | |||||
buf[num] = 0; | |||||
if(len > 0) | |||||
strncat(text, buf, sizeof text); | |||||
else | |||||
strncpy(text, buf, sizeof text); | |||||
match(text); | |||||
} | |||||
break; | |||||
case XK_BackSpace: | |||||
if((i = len)) { | |||||
prev_nitem = nitem; | |||||
do { | |||||
text[--i] = 0; | |||||
match(text); | |||||
} while(i && nitem && prev_nitem == nitem); | |||||
match(text); | |||||
} | |||||
break; | |||||
case XK_End: | |||||
while(next) { | |||||
sel = curr = next; | |||||
calcoffsets(); | |||||
} | |||||
while(sel->right) | |||||
sel = sel->right; | |||||
break; | |||||
case XK_Escape: | |||||
ret = 1; | |||||
running = False; | |||||
break; | |||||
case XK_Home: | |||||
sel = curr = item; | |||||
calcoffsets(); | |||||
break; | |||||
case XK_Left: | case XK_Left: | ||||
if(!(sel && sel->left)) | if(!(sel && sel->left)) | ||||
return; | return; | ||||
@@ -179,18 +215,15 @@ kpress(XKeyEvent * e) { | |||||
calcoffsets(); | calcoffsets(); | ||||
} | } | ||||
break; | break; | ||||
case XK_Tab: | |||||
if(!sel) | |||||
return; | |||||
strncpy(text, sel->text, sizeof text); | |||||
match(text); | |||||
case XK_Next: | |||||
if(next) { | |||||
sel = curr = next; | |||||
calcoffsets(); | |||||
} | |||||
break; | break; | ||||
case XK_Right: | |||||
if(!(sel && sel->right)) | |||||
return; | |||||
sel=sel->right; | |||||
if(sel == next) { | |||||
curr = next; | |||||
case XK_Prior: | |||||
if(prev) { | |||||
sel = curr = prev; | |||||
calcoffsets(); | calcoffsets(); | ||||
} | } | ||||
break; | break; | ||||
@@ -204,29 +237,21 @@ kpress(XKeyEvent * e) { | |||||
fflush(stdout); | fflush(stdout); | ||||
running = False; | running = False; | ||||
break; | break; | ||||
case XK_Escape: | |||||
ret = 1; | |||||
running = False; | |||||
break; | |||||
case XK_BackSpace: | |||||
if((i = len)) { | |||||
prev_nitem = nitem; | |||||
do { | |||||
text[--i] = 0; | |||||
match(text); | |||||
} while(i && nitem && prev_nitem == nitem); | |||||
match(text); | |||||
case XK_Right: | |||||
if(!(sel && sel->right)) | |||||
return; | |||||
sel=sel->right; | |||||
if(sel == next) { | |||||
curr = next; | |||||
calcoffsets(); | |||||
} | } | ||||
break; | break; | ||||
default: | |||||
if(num && !iscntrl((int) buf[0])) { | |||||
buf[num] = 0; | |||||
if(len > 0) | |||||
strncat(text, buf, sizeof text); | |||||
else | |||||
strncpy(text, buf, sizeof text); | |||||
match(text); | |||||
} | |||||
case XK_Tab: | |||||
if(!sel) | |||||
return; | |||||
strncpy(text, sel->text, sizeof text); | |||||
match(text); | |||||
break; | |||||
} | } | ||||
drawmenu(); | drawmenu(); | ||||
} | } | ||||