I’m using Debian 12 from a fresh install (with Wayland). The mouse I’m using is an Azeron Cyro keypad. Azeron does not offer configuration software for Linux, but the device has onboard memory and can be configured via Windows or windows emulator. Importantly, what I’m trying to achieve here is not possible on Windows using Azeron’s software.
My goal is to use one of the 16 keypad buttons on the mouse to disable mouse movement while pressed, resuming mouse movement when released. This is how I currently use the mouse in Windows so that I do not have to lift the mouse to reposition it. I’m able to achieve using reWASD on Windows, but they also do not offer a Linux version of their software.
I’ve tried a few different solutions, but I haven’t been able to find something that fits this need, so I’m hoping someone might be able to guide me in a better direction:
- AntiMicroX - I’ve tried using the Flatpak, AppImage, and .deb packages. The software works as expected on other devices (for example, an xbox controller), and while my mouse shows up as a device, the button remapping does not work, the thumb stick is not available for calibration, and there seems to be no access to the mouse sensor.
- Input-Remapper - Very similar results to AntiMicroX, and also, I don’t see a way to use Input-Remapper to disable mouse input anyway.
- Mouseless - While I can generate mouse movement commands through Mouseless, I haven’t been able to disable mouse movement from my physical mouse.
- evdevremapkeys - This has been my most successful tool. With the debugger, I’m able to see my key presses (unless I have the key unmapped on the mouse) and I’m able to remap existing keys with a yaml configuration, but I’ve still not found a way to disable the mouse input.
I found something that seemed close to what I need in a two year old reddit post which mentions that it’s possible with Sway (via man sway-input
). I don’t understand the proposed solution though and I’m not very familiar with compositors, how to interact with them or how installing one would affect my OS environment…
Does anyone know of a way I might be able to achieve this?
My first thought (which probably isn’t the best method, but I’ve done similar before) is an Arduino between the mouse and the system. The Arduino normally just passes the mouse commands to the system, but it listens for the button and blocks movement if it sees the button press.
Because it’s all done in hardware, this method would be system-agnostic. You could plug it into anything.
I used a Teensy 3.6 for a similar project.
This is an interesting idea, thanks for the suggestion! I’m much less experienced working with hardware solutions like this, but this might be a good chance to learn something different. Anecdotally, it seems like there may be some issues with anti cheat software that blocks Arduino input, but that may not end up being a problem for me.
I’ve read through a few different projects and it certainly seems like this would work. Are there any specific projects you would recommend that might help get me on the right path? I’m going to try to work with a custom command plus key bind as a primary solution, but it would be nice to try a couple different approaches.
I’m going to preface this and say that I don’t use Debian or Sway but I think I can help explain the reddit post a bit. On mobile, please excuse the formatting.
Wayland is a protocol that isn’t responsible for drawing anything to your screen by itself. This job is done by a Wayland compositor. (They’re similar to window managers on an X11 system if that means anything to you)
Sway is one such compositor that Debian supports, but it also supports GNOME and KDE Plasma which have their own compositors and the wiki mentions Weston as well.
It looks like Debian defaults to GNOME, so the sway commands aren’t going to be much help. Wayland uses libinput to handle peripherals so none of the xinput commands are going to be usable.
It’s a little in depth and probably not the best way to do things, but I think I have a solution that might work. Hopefully this can at least get you started, let me know if you have any questions!
Reddit implies that in settings -> keyboard -> shortcuts you can create a shortcut to execute arbitrary commands. You should be able to bind a key to “gsettings set org.gnome.desktop.peripherals.mouse speed 0.0” which will keep your cursor from moving and another with the “0.0” at the end changed to something like “0.5” to set the cursor speed back to something reasonable. This could be done as a shell script to toggle back and forth with one key.
Thanks very much for explaining a bit about Sway and compositors in general - that makes more sense now!
I did find the keyboard shortcuts exactly as you described, that’s something I didn’t know about before! Unfortunately, I don’t think the mouse speed setting is exactly as it sounds:
Pointer speed for mice. Accepted values are in the [-1..1] range (from “unaccelerated” to “fast”). A value of 0 is the system default.
It looks like it’s related to the acceleration, not the base movement speed. When I tested, even a value of -1 only slows the mouse instead of stopping it completely. There may be something else that will work, knowing that a custom shortcut exists that can execute a command does open up options I haven’t looked at yet.Glad I could clear some things up, sorry I didn’t have a solution that works out of box
There is a accessibility setting to disable touchpad when typing. You could try to hack into it to disable your mouse.From quick look at it I don’t think it possible
Success! This is certainly a niche issue, but since it’s taken a pretty lengthy amount of research to resolve, I thought I’d add some resources here in case it’s helpful to anyone else.
After exploring others’ recommendations, I’ve saved hardware solutions for tinkering in the future and was also not able to find a way to temporarily disable mouse movement through gnome. I finally landed on python-evdev as my solution. With this, you can read input from one or more devices simultaneously, create a virtual input device to write events to on-demand, and (maybe most importantly) retain exclusive access to the original hardware devices to absorb their input. I’ll also shout out evsieve which lead me to python-evdev. The python-evdev documentation is quite thorough, and it’s quite a custom solution based on your own needs, so I’m not going to go into great detail on my python script - but it’s only 27 lines long, nothing major.
Be aware that you may need to write some udev rules to allow access to the physical devices and to allow the virtual device to be created. This was the easiest part for me to find help with, so I’ll leave some abridged copy/paste details below:
Find your device Vendor and Product IDs
cat /proc/bus/input/devices | more
Write a udev rule (I used priority 71) to allow access to the device:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="", ATTRS{idProduct}=="", TAG+="uaccess"
Add a very poor udev rule to allow a virtual device to be created by python-evdev (there’s probably a much better way to do this):
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess", MODE="0660"