Hi,
Just a little patch I figured I might share here.
One thing that always annoyed me with in urxvt was how, when running
apps on secondary screen, one could not use the mouse wheel to scroll
within said app, e.g. man or less (something possible in VTE-based
terminals).
So here's a patch to change that. What it does is pretty simple: when
using the mouse wheel, if you’re on secondary screen then no scrolling
will occur, and instead some (3, to be exact) “fake” keystrokes will be
sent to the running application. So, a wheel up will have the same
result as pressing the Up key three times, and wheel down will do the
same as pressing 3 times the Down key.
This is added as a new (disabled by default) option: secondaryWheel (ssw)
I'm also including a patch from rlblaster, posted in the Arch Linux
forums (https://bbs.archlinux.org/viewtopic.php?id=129302), because I
like it a lot as well (and I believe it wasn't shared here).
When resetting the terminal (Ctrl+L), by default urxvt simply moves the
cursor on top of the window, and clears everything that was there.
Meaning that as a result, it can cut off some of your buffer, as those
lines are just cleared.
To fix this, rlblaster's patch will make it, before hand, add lines,
thus allowing to keep your full scrolling buffer intact.
It looks the same, except that when scrolling up everything is there,
nothing was cut.
There you go; Both patches are for rxvt-unicode-9.14
Hopefully this might be useful to some,
-jacky
diff -r d5f9ea7306c4 -r fcdd90688017 src/command.C
--- a/src/command.C Wed Dec 21 22:59:04 2011 +0100
+++ b/src/command.C Wed Dec 21 23:00:37 2011 +0100
@@ -2932,6 +2932,17 @@
case CSI_CUP: /* 8.3.21: (1,1) CURSOR POSITION */
case CSI_HVP: /* 8.3.64: (1,1) CHARACTER AND LINE POSITION */
+ if (nargs == 1 && current_screen == 0)
+ {
+ // This is usually followed with clear screen so add some extra
+ // lines to avoid deleting the lines already on screen. If we are
+ // already at the top, add an extra screen height of lines.
+ int extra_lines = nrow-1;
+ if (screen.cur.row == 0)
+ extra_lines += nrow;
+ for (int i = 0; i < extra_lines; ++i)
+ scr_add_lines (L"\r\n", 2);
+ }
scr_gotorc (arg[0] - 1, nargs < 2 ? 0 : (arg[1] - 1), 0);
break;
diff -r d5f9ea7306c4 -r cca1997c1a85 doc/rxvt.1.pod
--- a/doc/rxvt.1.pod Wed Dec 21 22:59:04 2011 +0100
+++ b/doc/rxvt.1.pod Wed Dec 21 23:01:28 2011 +0100
@@ -455,6 +455,11 @@
Turn on/off secondary screen scroll (default enabled); resource
B<secondaryScroll>.
+=item B<-ssw>|B<+ssw>
+
+Turn on/off secondary screen wheel support (default disabled); resource
+B<secondaryWheel>.
+
=item B<-hold>|B<+hold>
Turn on/off hold window after exit support. If enabled, @@RXVT_NAME@@
@@ -1167,6 +1172,13 @@
scrollback buffer and, when secondaryScreen is off, switching
to/from the secondary screen will instead scroll the screen up.
+=item B<secondaryWheel:> I<boolean>
+
+Turn on/off secondary wheel (default disabled). If enabled, when on
+secondary screen, using the mouse wheel will not scroll in the buffer
+but instead send 3 "fake" keystrokes (Up/Down arrow) to the running
+application (allows e.g. natural scrolling in B<man>, B<less>, etc).
+
=item B<hold>: I<boolean>
Turn on/off hold window after exit support. If enabled, @@RXVT_NAME@@
diff -r d5f9ea7306c4 -r cca1997c1a85 src/command.C
--- a/src/command.C Wed Dec 21 22:59:04 2011 +0100
+++ b/src/command.C Wed Dec 21 23:01:28 2011 +0100
@@ -2197,10 +2197,46 @@
}
else
# endif
+#ifndef NO_SECONDARY_SCREEN
{
- scr_page (v, i);
- scrollBar.show (1);
+ /* on SECONDARY screen, we send "fake" UP/DOWN keys instead
+ * (this allows to scroll within man, less, etc) */
+ if (option (Opt_secondaryWheel) && current_screen != PRIMARY)
+ {
+ XKeyEvent event;
+ event.display = ev.display;
+ event.window = ev.window;
+ event.root = ev.root;
+ event.subwindow = ev.subwindow;
+ event.time = ev.time;
+ event.x = ev.x;
+ event.y = ev.y;
+ event.x_root = ev.x_root;
+ event.y_root = ev.y_root;
+ event.same_screen = ev.same_screen;
+ event.state = 0;
+ event.keycode = XKeysymToKeycode(ev.display,
+ (v == UP) ? XK_Up : XK_Down);
+ for (i = 0; i < 3; ++i)
+ {
+ event.type = KeyPress;
+ XSendEvent (event.display, event.window, TRUE,
+ KeyPressMask, (XEvent *) &event);
+ event.type = KeyRelease;
+ XSendEvent (event.display, event.window, TRUE,
+ KeyPressMask, (XEvent *) &event);
+ }
+ }
+ /* on PRIMARY screen, we scroll in the buffer */
+ else
+#endif
+ {
+ scr_page (v, i);
+ scrollBar.show (1);
+ }
+#ifndef NO_SECONDARY_SCREEN
}
+#endif
}
break;
#endif
diff -r d5f9ea7306c4 -r cca1997c1a85 src/optinc.h
--- a/src/optinc.h Wed Dec 21 22:59:04 2011 +0100
+++ b/src/optinc.h Wed Dec 21 23:01:28 2011 +0100
@@ -26,6 +26,7 @@
def(cursorBlink)
def(secondaryScreen)
def(secondaryScroll)
+ def(secondaryWheel)
def(pastableTabs)
def(cursorUnderline)
#if ENABLE_FRILLS
diff -r d5f9ea7306c4 -r cca1997c1a85 src/rsinc.h
--- a/src/rsinc.h Wed Dec 21 22:59:04 2011 +0100
+++ b/src/rsinc.h Wed Dec 21 23:01:28 2011 +0100
@@ -102,6 +102,7 @@
#ifndef NO_SECONDARY_SCREEN
def (secondaryScreen)
def (secondaryScroll)
+ def (secondaryWheel)
#endif
#ifdef OFF_FOCUS_FADING
def (fade)
diff -r d5f9ea7306c4 -r cca1997c1a85 src/xdefaults.C
--- a/src/xdefaults.C Wed Dec 21 22:59:04 2011 +0100
+++ b/src/xdefaults.C Wed Dec 21 23:01:28 2011 +0100
@@ -261,6 +261,7 @@
#ifndef NO_SECONDARY_SCREEN
BOOL (Rs_secondaryScreen, "secondaryScreen", "ssc", Opt_secondaryScreen, 0, "enable secondary screen"),
BOOL (Rs_secondaryScroll, "secondaryScroll", "ssr", Opt_secondaryScroll, 0, "enable secondary screen scroll"),
+ BOOL (Rs_secondaryWheel, "secondaryWheel", "ssw", Opt_secondaryWheel, 0, "enable secondary screen wheel"),
#endif
#if ENABLE_PERL
RSTRG (Rs_perl_lib, "perl-lib", "string"), //, "colon-separated directories with extension scripts"),TODO
_______________________________________________
rxvt-unicode mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/rxvt-unicode