Skip to content

Instantly share code, notes, and snippets.

@fornellas
Last active February 10, 2018 11:03
Show Gist options
  • Save fornellas/359e649939e426c00b36fbbcac0f91b4 to your computer and use it in GitHub Desktop.
Save fornellas/359e649939e426c00b36fbbcac0f91b4 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import evdev
import time
import logging
import os
class MouseToKeyboard(object):
LOOP_SLEEP = 1
def __init__(self, mouse_device, mouse_setup_command, button_to_key):
self.mouse_device = mouse_device
self.mouse_setup_command = mouse_setup_command
self.button_to_key = button_to_key
def loop(self):
logging.info('Starting execution loop')
while True:
try:
self._do_mapping()
except Exception as e:
logging.error('Failed: %s (%s)' %(e, e.__class__))
time.sleep(self.LOOP_SLEEP)
def _do_mapping(self):
logging.info('Opening input device ' + self.mouse_device)
mouse = evdev.InputDevice(self.mouse_device)
try:
self._setup_mouse()
logging.info('Creatiing uinput repeater mouse')
with evdev.UInput.from_device(mouse, name=mouse.name+' (repeater)') as repeater_mouse:
logging.info('Creatiing uinput keyboard')
with evdev.UInput(name=mouse.name+' (keyboard)') as keyboard:
self._read_and_repeat_loop(mouse, repeater_mouse, keyboard)
finally:
logging.info('Closing input device ' + self.mouse_device)
mouse.close()
def _setup_mouse(self):
logging.info('Setting up mouse: ' + self.mouse_setup_command)
exit_code = os.system(self.mouse_setup_command)
if not exit_code == 0:
raise RuntimeError('Command exited with ' + exit_code)
def _read_and_repeat_loop(self, mouse, repeater_mouse, keyboard):
logging.info('Grabbing mouse')
mouse.grab()
logging.info('Starting repeat loop')
for event in mouse.read_loop():
logging.debug('Received mouse event: '+ str(event))
if event.code in self.button_to_key:
key_name = self.button_to_key[event.code]
code = getattr(evdev.ecodes, 'KEY_' + key_name)
logging.debug('Sending keyboard key event: code=%s, value=%s' %(code, event.value))
keyboard.write(evdev.ecodes.EV_KEY, code, event.value)
keyboard.syn()
else:
repeater_mouse.write_event(event)
MOUSE_DEVICE = '/dev/input/by-id/usb-Logitech_USB-PS_2_Optical_Mouse-event-mouse'
MOUSE_SETUP_COMMAND = '/usr/bin/lomoco --pid=c01e --1200 --sms'
BUTTON_TO_KEY = {
276: 'C', # j
275: 'V', # k
278: 'PAGEUP',
279: 'PAGEDOWN',
277: 'HOME',
}
logging.basicConfig(level=logging.INFO)
# logging.basicConfig(level=logging.DEBUG)
MouseToKeyboard(
mouse_device=MOUSE_DEVICE,
mouse_setup_command=MOUSE_SETUP_COMMAND,
button_to_key=BUTTON_TO_KEY,
).loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment