diff options
| author | Syndamia <kami02882@gmail.com> | 2019-07-29 11:46:36 +0300 |
|---|---|---|
| committer | Syndamia <kami02882@gmail.com> | 2019-07-29 11:46:36 +0300 |
| commit | bc09da5a7b65b08b5d5dcd1e90173ad3b6081c23 (patch) | |
| tree | c66cebc02aac30ff859c06ca462f3dd58b6809b0 /Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py | |
| parent | 65edf7296baf48aad1b4e0c09b57f1a7f48791a8 (diff) | |
| download | Self-learning-bc09da5a7b65b08b5d5dcd1e90173ad3b6081c23.tar Self-learning-bc09da5a7b65b08b5d5dcd1e90173ad3b6081c23.tar.gz Self-learning-bc09da5a7b65b08b5d5dcd1e90173ad3b6081c23.zip | |
Did some more work in Python and started officially learning Java
Diffstat (limited to 'Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py')
| -rw-r--r-- | Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py b/Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py new file mode 100644 index 0000000..3db9187 --- /dev/null +++ b/Python/venv1/Lib/site-packages/keyboard/_xlibkeyboard.py @@ -0,0 +1,119 @@ +from collections import defaultdict + +from Xlib import X, XK, display +from Xlib.ext import record +from Xlib.protocol import rq + +from ._keyboard_event import KeyboardEvent, KEY_DOWN, KEY_UP, normalize_name + + +# from ._nixkeyboard import init + +def cleanup_key(name): + if name.startswith('XK_'): + name = name[3:] + + if name.startswith('KP_'): + is_keypad = True + name = name[3:] + else: + is_keypad = False + + if name.endswith('_R'): + name = 'right ' + name[:-2] + if name.endswith('_L'): + name = 'left ' + name[:-2] + + return normalize_name(name), is_keypad + + +keysym_to_keys = defaultdict(list) +name_to_keysyms = defaultdict(list) +for raw_name in dir(XK): + if not raw_name.startswith('XK_'): continue + keysym = getattr(XK, raw_name) + name, is_keypad = cleanup_key(raw_name) + keysym_to_keys[keysym].append((name, is_keypad)) + name_to_keysyms[name].append(keysym) + +local_dpy = None +record_dpy = None +ctx = None + + +def init(): + # Adapted from https://github.com/python-xlib/python-xlib/blob/master/examples/record_demo.py + global local_dpy + global record_dpy + local_dpy = display.Display() + record_dpy = display.Display() + + if not record_dpy.has_extension("RECORD"): + raise ImportError("RECORD extension not found") + + r = record_dpy.record_get_version(0, 0) + # print("RECORD extension version %d.%d" % (r.major_version, r.minor_version)) + + # Create a recording context; we only want key and mouse events + global ctx + ctx = record_dpy.record_create_context( + 0, + [record.AllClients], + [ + { + 'core_requests': (0, 0), + 'core_replies': (0, 0), + 'ext_requests': (0, 0, 0, 0), + 'ext_replies': (0, 0, 0, 0), + 'delivered_events': (0, 0), + 'device_events': (X.KeyPress, X.KeyPress), + 'errors': (0, 0), + 'client_started': False, + 'client_died': False, + } + ] + ) + + +def listen(callback): + def handler(reply): + if reply.category != record.FromServer: + return + if reply.client_swapped: + print("* received swapped protocol data, cowardly ignored") + return + if not len(reply.data) or reply.data[0] < 2: + # not an event + return + + data = reply.data + while len(data): + raw_event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None) + + event_type = {X.KeyPress: KEY_DOWN, X.KeyRelease: KEY_UP}.get(raw_event.type) + if event_type: + keysym = local_dpy.keycode_to_keysym(raw_event.detail, 0) + # TODO: scan code is not correct. + if not keysym: + event = KeyboardEvent(event_type=event_type, scan_code=raw_event.detail) + else: + try: + name, is_keypad = keysym_to_keys[keysym][0] + except IndexError: + name, is_keypad = None, None + event = KeyboardEvent(event_type=event_type, scan_code=keysym, name=name, is_keypad=is_keypad) + + callback(event) + + try: + # Enable the context; this only returns after a call to record_disable_context, + # while calling the callback function in the meantime + record_dpy.record_enable_context(ctx, handler) + finally: + # Finally free the context + record_dpy.record_free_context(ctx) + + +def map_name(name): + for keysym in name_to_keysyms[name]: + yield keysym, () |
