Browse Source

ordered switch branches in kpress alphabetically, applied Sanders patch for PgUp/Dn and Home/End scrolling

master
arg@mig29 18 years ago
parent
commit
4bd3466215
  1. 8
      dmenu.1
  2. 87
      main.c

8
dmenu.1

@ -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

87
main.c

@ -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: case XK_Next:
if(!sel) if(next) {
return; sel = curr = next;
strncpy(text, sel->text, sizeof text); calcoffsets();
match(text); }
break; break;
case XK_Right: case XK_Prior:
if(!(sel && sel->right)) if(prev) {
return; sel = curr = prev;
sel=sel->right;
if(sel == next) {
curr = next;
calcoffsets(); calcoffsets();
} }
break; break;
@ -204,29 +237,21 @@ kpress(XKeyEvent * e) {
fflush(stdout); fflush(stdout);
running = False; running = False;
break; break;
case XK_Escape: case XK_Right:
ret = 1; if(!(sel && sel->right))
running = False; return;
break; sel=sel->right;
case XK_BackSpace: if(sel == next) {
if((i = len)) { curr = next;
prev_nitem = nitem; calcoffsets();
do {
text[--i] = 0;
match(text);
} while(i && nitem && prev_nitem == nitem);
match(text);
} }
break; break;
default: case XK_Tab:
if(num && !iscntrl((int) buf[0])) { if(!sel)
buf[num] = 0; return;
if(len > 0) strncpy(text, sel->text, sizeof text);
strncat(text, buf, sizeof text);
else
strncpy(text, buf, sizeof text);
match(text); match(text);
} break;
} }
drawmenu(); drawmenu();
} }

Loading…
Cancel
Save