-
Notifications
You must be signed in to change notification settings - Fork 1
/
acme-profile.py
63 lines (45 loc) · 1.73 KB
/
acme-profile.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python3
import asyncio
import evdev
import evdev.ecodes as ecodes
"""
This mapping is for the Acme editor. It just makes both side buttons
(BTN_SIDE and BTN_EXTRA) behave like the wheel button, so it's
easier to press, drag, and chord.
"""
# Listen to events from the mouse
# TODO Implement mouse finder (right now upon every boot
# I have to search for it manually)
mouse = evdev.InputDevice("/dev/input/event7") # /dev/input/event?
# Create virtual mouse
virtual_mouse = evdev.UInput.from_device(mouse, name="virtual-mouse")
# Lock the real mouse so noone hears it
mouse.grab()
class KeyEventProcessor:
def process_key_event(self, key_event):
pass
class AcmeProcessor(KeyEventProcessor):
def process_key_event(self, key_event):
state = key_event.keystate
virtual_mouse.write(ecodes.EV_KEY, ecodes.BTN_MIDDLE, state)
class XxxProcessor(KeyEventProcessor):
def process_key_event(self, key_event):
print(key_event.keycode)
processors = {"acme": AcmeProcessor(), "xxx": XxxProcessor()}
# Read the mouse loop and write events to the virtual mouse conditionally
async def handle_mouse():
async for event in mouse.async_read_loop():
if event.type == ecodes.EV_KEY:
key_event = evdev.categorize(event)
print(key_event.keycode)
if key_event.keycode == "BTN_SIDE" or key_event.keycode == "BTN_EXTRA":
processors["acme"].process_key_event(key_event)
continue
else:
virtual_mouse.write_event(event)
else:
virtual_mouse.write_event(event)
asyncio.ensure_future(handle_mouse())
# asyncio.create_task(handle_mouse())
event_loop = asyncio.get_event_loop()
event_loop.run_forever()