Skip to content

Instantly share code, notes, and snippets.

@gabriel-felipe
Last active August 8, 2023 21:09
Show Gist options
  • Save gabriel-felipe/11e9962675051fc827157c53a060a872 to your computer and use it in GitHub Desktop.
Save gabriel-felipe/11e9962675051fc827157c53a060a872 to your computer and use it in GitHub Desktop.
Scroll with auxiliary mouse buttons on wayland
#!/bin/bash
# This file need to be executed with root privilegies
# Dependencies:
# - evemu
# - xinput
MOUSE_ID=6 #Get the correct id with xinput list
# First we'll remap the side buttons to mouse-wheel and disable the mouse-wheel.
# The default mouse-wheel buttons are 4 and 5, so we remap 4 and 5 to 0, to disable it
# The side buttons on my mouse are 8 and 9, so we remap those to 5 and 4
# After this command alone you should be able to scroll with the extra mouse buttons.
# But you'd need one click per line-scroll
# Very hard to use it like that.
# DISCLAIMER: On your mouse the extra buttons may been mapped to other values than 8 and 9.
# Test them with xinput --query-state $MOUSE_ID
xinput set-button-map $MOUSE_ID 1 2 3 0 0 6 7 5 4 10
# The following while loop allow us to be able to keep scrolling while the button is hold down
while true; do
STATE1=$(xinput --query-state $MOUSE_ID | grep "button\[9" | sort); #9 and 8 are the button codes, if you run query state and press the button you'll know what button to call.
STATE2=$(xinput --query-state $MOUSE_ID | grep "button\[8" | sort);
if [ $STATE1 == "button[9]=up" ] && [ $STATE2 == "button[8]=up" ]; then
SCROLL="NONE"
fi
if [ $STATE1 == "button[9]=down" ] && [ $SCROLL != "UP" ]; then
SCROLL="DOWN"
# Wayland doesn't support xdotool so we need to use evemu-event.
# You can use sudo evemu-record /dev/input/event3 > recording.evemu to record your events
# Then you can see the content of recording.evemu to check the event type, code and value
# the lines will look somethhing like this:
# E: 3.018057 0001 0113 0001 # EV_KEY / BTN_SIDE 1
# E: 3.018057 0001 0113 0001 # EV_KEY / BTN_SIDE 0
# Usually when you click a mouse button it will fire an event with value 1 for when the button goes down
# And another event with value 0 saying the button was released
# Here we want to simulate many complete clicks, that's why we need to fire two events.
evemu-event /dev/input/event3 --type EV_KEY --code BTN_SIDE --value 1 --sync
evemu-event /dev/input/event3 --type EV_KEY --code BTN_SIDE --value 0 --sync
fi
if [ $STATE2 == "button[8]=down" ] && [ $SCROLL != "DOWN" ]; then
SCROLL="UP"
evemu-event /dev/input/event3 --type EV_KEY --code BTN_EXTRA --value 1 --sync
evemu-event /dev/input/event3 --type EV_KEY --code BTN_EXTRA --value 0 --sync
fi
sleep .01 # If you increase the time the scroll will be slower, if you reduce it will be faster.
done
@gabriel-felipe
Copy link
Author

This script was made and tested on:
Fedora 32 using Wayland
Mouse: GXT 922 Gaming Mouse

I don't know exactly why but this works on every window but terminal and gedit, I think those still rely on Xorg or something like that internally, but since I don't use those much, isn't a problem to me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment