st/patches/st-scrollback-mouse-20161020-6e79e83.diff

63 lines
1.5 KiB
Diff

diff --git a/config.def.h b/config.def.h
index eae969e..34ebb44 100644
--- a/config.def.h
+++ b/config.def.h
@@ -152,8 +152,14 @@ static unsigned int defaultunderline = 7;
*/
static MouseShortcut mshortcuts[] = {
/* button mask string */
- { Button4, XK_ANY_MOD, "\031" },
- { Button5, XK_ANY_MOD, "\005" },
+ { Button4, XK_NO_MOD, "\031" },
+ { Button5, XK_NO_MOD, "\005" },
+};
+
+static MouseKey mkeys[] = {
+ /* button mask function argument */
+ { Button4, ShiftMask, kscrollup, {.i = 1} },
+ { Button5, ShiftMask, kscrolldown, {.i = 1} },
};
/* Internal keyboard shortcuts. */
diff --git a/st.c b/st.c
index 233d301..c71b6e7 100644
--- a/st.c
+++ b/st.c
@@ -299,6 +299,13 @@ typedef union {
const void *v;
} Arg;
+typedef struct {
+ uint b;
+ uint mask;
+ void (*func)(const Arg *);
+ const Arg arg;
+} MouseKey;
+
typedef struct {
uint mod;
KeySym keysym;
@@ -953,6 +960,7 @@ bpress(XEvent *e)
{
struct timespec now;
MouseShortcut *ms;
+ MouseKey *mk;
if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forceselmod)) {
mousereport(e);
@@ -967,6 +975,14 @@ bpress(XEvent *e)
}
}
+ for (mk = mkeys; mk < mkeys + LEN(mkeys); mk++) {
+ if (e->xbutton.button == mk->b
+ && match(mk->mask, e->xbutton.state)) {
+ mk->func(&mk->arg);
+ return;
+ }
+ }
+
if (e->xbutton.button == Button1) {
clock_gettime(CLOCK_MONOTONIC, &now);