71 lines
1.4 KiB
Diff
71 lines
1.4 KiB
Diff
diff --git a/dmenu.c b/dmenu.c
|
|
index 027dddb..0b92f1f 100644
|
|
--- a/dmenu.c
|
|
+++ b/dmenu.c
|
|
@@ -334,6 +334,8 @@ keypress(XKeyEvent *ev)
|
|
int len;
|
|
KeySym ksym = NoSymbol;
|
|
Status status;
|
|
+ int i, offscreen = 0;
|
|
+ struct item *tmpsel;
|
|
|
|
len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
|
|
switch (status) {
|
|
@@ -465,6 +467,27 @@ insert:
|
|
calcoffsets();
|
|
break;
|
|
case XK_Left:
|
|
+ if (columns > 1) {
|
|
+ if (!sel)
|
|
+ return;
|
|
+ tmpsel = sel;
|
|
+ for (i = 0; i < lines; i++) {
|
|
+ if (!tmpsel->left || tmpsel->left->right != tmpsel) {
|
|
+ if (offscreen)
|
|
+ break;
|
|
+ return;
|
|
+ }
|
|
+ if (tmpsel == curr)
|
|
+ offscreen = 1;
|
|
+ tmpsel = tmpsel->left;
|
|
+ }
|
|
+ sel = tmpsel;
|
|
+ if (offscreen) {
|
|
+ curr = prev;
|
|
+ calcoffsets();
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
case XK_KP_Left:
|
|
if (cursor > 0 && (!sel || !sel->left || lines > 0)) {
|
|
cursor = nextrune(-1);
|
|
@@ -505,6 +528,27 @@ insert:
|
|
sel->out = 1;
|
|
break;
|
|
case XK_Right:
|
|
+ if (columns > 1) {
|
|
+ if (!sel)
|
|
+ return;
|
|
+ tmpsel = sel;
|
|
+ for (i = 0; i < lines; i++) {
|
|
+ if (!tmpsel->right || tmpsel->right->left != tmpsel) {
|
|
+ if (offscreen)
|
|
+ break;
|
|
+ return;
|
|
+ }
|
|
+ tmpsel = tmpsel->right;
|
|
+ if (tmpsel == next)
|
|
+ offscreen = 1;
|
|
+ }
|
|
+ sel = tmpsel;
|
|
+ if (offscreen) {
|
|
+ curr = next;
|
|
+ calcoffsets();
|
|
+ }
|
|
+ break;
|
|
+ }
|
|
case XK_KP_Right:
|
|
if (text[cursor] != '\0') {
|
|
cursor = nextrune(+1);
|
|
|