Package: ratmenu
Version: 2.3.14
Severity: wishlist
Tags: patch

The attached patch adds emacs-style keybindings to ratmenu. C-p, C-n, C-b, and C-f correspond to up, down, left, and right (where C- indicates that the control key is pressed), C-g is cancel, C-i is Tab, and both C-m and C-j are variations on Return.

I would appreciate it very much if you would apply this patch (or something similar--I'll admit that the code duplication between the Control and non-Control cases might not be ideal) to the Debian ratmenu package.

Thank you,

Kent Hunter
[EMAIL PROTECTED]
diff -Naur ratmenu.old/ratmenu.1 ratmenu.new/ratmenu.1
--- ratmenu.old/ratmenu.1	2006-03-10 19:21:21.000000000 -0500
+++ ratmenu.new/ratmenu.1	2007-06-21 21:36:15.000000000 -0400
@@ -159,19 +159,19 @@
 .RS
 .TP
 .BI Up
- 'k', Up_arrow, BackSpace, '\-'
+ 'k', Up_arrow, BackSpace, '\-', C\-p
 .TP
 .BI Down
- 'j', Down_arrow, Space, Tab, '+'
+ 'j', Down_arrow, Space, Tab, '+', C\-n, C\-i
 .TP
 .BI Select
- 'l', Right_arrow, Return
+ 'l', Right_arrow, Return, C\-f, C\-m, C\-j
 .TP
 .BI Back
- 'h', Left_arrow
+ 'h', Left_arrow, C\-b
 .TP
 .BI Exit
- 'q', Escape
+ 'q', Escape, C\-g
 .RE
 .SH CONFIGURATION USING X RESOURCES
 .PP
diff -Naur ratmenu.old/ratmenu.c ratmenu.new/ratmenu.c
--- ratmenu.old/ratmenu.c	2005-03-31 02:56:24.000000000 -0500
+++ ratmenu.new/ratmenu.c	2007-06-21 21:35:51.000000000 -0400
@@ -348,27 +348,52 @@
 		switch (ev.type) {
 		case KeyPress:
 			XLookupString(&ev.xkey, NULL, 0, &key, NULL);
-			switch (key) {
-			case XK_Escape: case XK_q:
-				return;
-				break;
-			case XK_Left: case XK_h:
-				if (prevmenu) {
-					spawn(prevmenu);
-				}
-				break;
-			case XK_Right: case XK_Return: case XK_l:
-				spawn(commands[curitem]);
-				break;
-			case XK_Tab: case XK_space: case XK_Down: case XK_j: case XK_plus:
-				++curitem >= numitems ? curitem =            0 : 0 ;
-				redraw(curitem, high, wide, 0);
-				break;
-			case XK_BackSpace: case XK_Up: case XK_k: case XK_minus:
-				curitem-- <= 0        ? curitem = numitems - 1 : 0 ;
-				redraw(curitem, high, wide, 0);
-				break;
-			}
+                        if (ev.xkey.state & ControlMask) {
+                             switch (key) {
+                             case XK_Escape: case XK_q: case XK_g:
+                                  return;
+                                  break;
+                             case XK_Left: case XK_b:
+                                  if (prevmenu) {
+                                       spawn(prevmenu);
+                                  }
+                                  break;
+                             case XK_Right: case XK_Return: case XK_f: case XK_KP_Enter: case XK_m: case XK_j:
+                                  spawn(commands[curitem]);
+                                  break;
+                             case XK_Tab: case XK_i: case XK_space: case XK_Down: case XK_n: case XK_plus:
+                                  ++curitem >= numitems ? curitem =            0 : 0 ;
+                                  redraw(curitem, high, wide, 0);
+                                  break;
+                             case XK_BackSpace: case XK_Up: case XK_p: case XK_minus:
+                                  curitem-- <= 0        ? curitem = numitems - 1 : 0 ;
+                                  redraw(curitem, high, wide, 0);
+                                  break;
+                             }
+                        } else {
+                             switch (key) {
+                             case XK_Escape: case XK_q:
+                                  return;
+                                  break;
+                             case XK_Left: case XK_h:
+                                  if (prevmenu) {
+                                       spawn(prevmenu);
+                                  }
+                                  break;
+                             case XK_Right: case XK_Return: case XK_l: case XK_KP_Enter:
+                                  spawn(commands[curitem]);
+                                  break;
+                             case XK_Tab: case XK_space: case XK_Down: case XK_j: case XK_plus:
+                                  ++curitem >= numitems ? curitem =            0 : 0 ;
+                                  redraw(curitem, high, wide, 0);
+                                  break;
+                             case XK_BackSpace: case XK_Up: case XK_k: case XK_minus:
+                                  curitem-- <= 0        ? curitem = numitems - 1 : 0 ;
+                                  redraw(curitem, high, wide, 0);
+                                  break;
+                             }
+                             
+                        }
 			break;
 		case MapNotify: case Expose: redraw(curitem, high, wide, 1); break;
 		case UnmapNotify: if (persist == no) return; else XClearWindow(dpy, menuwin); break;

Reply via email to