commit 4bd34662153f0b2cabac485d01ac2e1300c254c1
parent e19e42adbba5ea74778bcd10c6e8720d0755f812
Author: arg@mig29 <unknown>
Date: Tue, 12 Dec 2006 09:57:42 +0100
ordered switch branches in kpress alphabetically, applied Sanders patch for PgUp/Dn and Home/End scrolling
Diffstat:
dmenu.1 | | | 8 | +++++++- |
main.c | | | 89 | ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- |
2 files changed, 64 insertions(+), 33 deletions(-)
diff --git a/dmenu.1 b/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.
.SH USAGE
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.
.P
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
Select the previous/next item.
.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
Copy the selected item to the input field.
.TP
diff --git a/main.c b/main.c
@@ -170,6 +170,42 @@ kpress(XKeyEvent * e) {
}
}
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:
if(!(sel && sel->left))
return;
@@ -179,18 +215,15 @@ kpress(XKeyEvent * e) {
calcoffsets();
}
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;
- 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();
}
break;
@@ -204,29 +237,21 @@ kpress(XKeyEvent * e) {
fflush(stdout);
running = False;
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;
- 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();
}