I am writing an anti-RSI/typing break programme for Ubuntu Linux in python. I would like to be able to "lock the keyboard" so that all keypresses are ignored until I "unlock" it. I want to be able to force the user to take a typing break.
I would like some programmatic way to "turn off" the keyboard (near instantaneously) until my programme releases it later (which could be 0.1 sec → 10 sec later). While I have "turned off the keyboard", no key presses should be sent to any windows, window managers, etc. Preferably, the screen should still show the same content. The keyboard should be locked even if this programme is not at the forefont and does not have focus.
Some programmes are able to do this already (e.g. Work Rave)
How do I do this on Linux/X11? (Preferable in Python)
This can be done easily with a shell script using xinput :
This logic is easily rewritable in Python. If installing xinput is problematic, it might be a good idea to fetch the source of xinput and try to reimplement it in Python using a library like python-xlib.
The canonical way to do this is by grabbing the input. For this no window must be actually visible. A input only window usually does the trick. However you should give the user some sort of feedback, why his input no longer works. Doing this as a focus grab has the advantage that a crash of the program won't turn the system unresponsive.
BTW: I think forcibly interrupting the user, maybe in the middle of a critical operations is a huge No-Go! I never understood the purpose of those programs. The user will sit in front of the screen idling, maybe loosing his thoughts. Just my 2 cents.
Based on that, here's a code I came up with:
Tested on Linux Mint 12, X11, HP Laptop, Gnome. Not sure if any of that matters though :)
UPDATE Added an option to change the path, e.g. "serio0" or "serio1". And prints the description, for me serio0 gave me:
i8042 KBD port
, most likely if you have "KBD" in it, it's right, continue, otherwise I give you no guarantee :)This isn't my code by the way
This stops the user from the pressing the Win Key, Shift Key or Alt Key, but I'm sure you can apply other keys as well.
Usage: