63 lines
1.5 KiB
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);
|
|
|