aboutsummaryrefslogtreecommitdiff
path: root/Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py
diff options
context:
space:
mode:
authorSyndamia <kamen.d.mladenov@protonmail.com>2020-09-29 22:43:00 +0300
committerSyndamia <kamen.d.mladenov@protonmail.com>2020-09-29 22:43:00 +0300
commit9a24decd41726ef54fa6613d09829f3f65627b22 (patch)
treee65d5dbc8623cf4b257abaa8fb9047f3c97fe5a0 /Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py
parent6f4cfe7b5c6c74d83b03e18870aeb6977db6c0de (diff)
downloadSelf-learning-9a24decd41726ef54fa6613d09829f3f65627b22.tar
Self-learning-9a24decd41726ef54fa6613d09829f3f65627b22.tar.gz
Self-learning-9a24decd41726ef54fa6613d09829f3f65627b22.zip
Removed python setup files
Diffstat (limited to 'Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py')
-rw-r--r--Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py442
1 files changed, 0 insertions, 442 deletions
diff --git a/Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py b/Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py
deleted file mode 100644
index 85670ee..0000000
--- a/Python/venv1/Lib/site-packages/keyboard/_darwinkeyboard.py
+++ /dev/null
@@ -1,442 +0,0 @@
-import ctypes
-import ctypes.util
-import Quartz
-import time
-import os
-import threading
-from AppKit import NSEvent
-from ._keyboard_event import KeyboardEvent, KEY_DOWN, KEY_UP
-from ._canonical_names import normalize_name
-
-try: # Python 2/3 compatibility
- unichr
-except NameError:
- unichr = chr
-
-Carbon = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Carbon'))
-
-class KeyMap(object):
- non_layout_keys = dict((vk, normalize_name(name)) for vk, name in {
- # Layout specific keys from https://stackoverflow.com/a/16125341/252218
- # Unfortunately no source for layout-independent keys was found.
- 0x24: 'return',
- 0x30: 'tab',
- 0x31: 'space',
- 0x33: 'delete',
- 0x35: 'escape',
- 0x37: 'command',
- 0x38: 'shift',
- 0x39: 'capslock',
- 0x3a: 'option',
- 0x3b: 'control',
- 0x3c: 'right shift',
- 0x3d: 'right option',
- 0x3e: 'right control',
- 0x3f: 'function',
- 0x40: 'f17',
- 0x48: 'volume up',
- 0x49: 'volume down',
- 0x4a: 'mute',
- 0x4f: 'f18',
- 0x50: 'f19',
- 0x5a: 'f20',
- 0x60: 'f5',
- 0x61: 'f6',
- 0x62: 'f7',
- 0x63: 'f3',
- 0x64: 'f8',
- 0x65: 'f9',
- 0x67: 'f11',
- 0x69: 'f13',
- 0x6a: 'f16',
- 0x6b: 'f14',
- 0x6d: 'f10',
- 0x6f: 'f12',
- 0x71: 'f15',
- 0x72: 'help',
- 0x73: 'home',
- 0x74: 'page up',
- 0x75: 'forward delete',
- 0x76: 'f4',
- 0x77: 'end',
- 0x78: 'f2',
- 0x79: 'page down',
- 0x7a: 'f1',
- 0x7b: 'left',
- 0x7c: 'right',
- 0x7d: 'down',
- 0x7e: 'up',
- }.items())
- layout_specific_keys = {}
- def __init__(self):
- # Virtual key codes are usually the same for any given key, unless you have a different
- # keyboard layout. The only way I've found to determine the layout relies on (supposedly
- # deprecated) Carbon APIs. If there's a more modern way to do this, please update this
- # section.
-
- # Set up data types and exported values:
-
- CFTypeRef = ctypes.c_void_p
- CFDataRef = ctypes.c_void_p
- CFIndex = ctypes.c_uint64
- OptionBits = ctypes.c_uint32
- UniCharCount = ctypes.c_uint8
- UniChar = ctypes.c_uint16
- UniChar4 = UniChar * 4
-
- class CFRange(ctypes.Structure):
- _fields_ = [('loc', CFIndex),
- ('len', CFIndex)]
-
- kTISPropertyUnicodeKeyLayoutData = ctypes.c_void_p.in_dll(Carbon, 'kTISPropertyUnicodeKeyLayoutData')
- shiftKey = 0x0200
- alphaKey = 0x0400
- optionKey = 0x0800
- controlKey = 0x1000
- kUCKeyActionDisplay = 3
- kUCKeyTranslateNoDeadKeysBit = 0
-
- # Set up function calls:
- Carbon.CFDataGetBytes.argtypes = [CFDataRef] #, CFRange, UInt8
- Carbon.CFDataGetBytes.restype = None
- Carbon.CFDataGetLength.argtypes = [CFDataRef]
- Carbon.CFDataGetLength.restype = CFIndex
- Carbon.CFRelease.argtypes = [CFTypeRef]
- Carbon.CFRelease.restype = None
- Carbon.LMGetKbdType.argtypes = []
- Carbon.LMGetKbdType.restype = ctypes.c_uint32
- Carbon.TISCopyCurrentKeyboardInputSource.argtypes = []
- Carbon.TISCopyCurrentKeyboardInputSource.restype = ctypes.c_void_p
- Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource.argtypes = []
- Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource.restype = ctypes.c_void_p
- Carbon.TISGetInputSourceProperty.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
- Carbon.TISGetInputSourceProperty.restype = ctypes.c_void_p
- Carbon.UCKeyTranslate.argtypes = [ctypes.c_void_p,
- ctypes.c_uint16,
- ctypes.c_uint16,
- ctypes.c_uint32,
- ctypes.c_uint32,
- OptionBits, # keyTranslateOptions
- ctypes.POINTER(ctypes.c_uint32), # deadKeyState
- UniCharCount, # maxStringLength
- ctypes.POINTER(UniCharCount), # actualStringLength
- UniChar4]
- Carbon.UCKeyTranslate.restype = ctypes.c_uint32
-
- # Get keyboard layout
- klis = Carbon.TISCopyCurrentKeyboardInputSource()
- k_layout = Carbon.TISGetInputSourceProperty(klis, kTISPropertyUnicodeKeyLayoutData)
- if k_layout is None:
- klis = Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource()
- k_layout = Carbon.TISGetInputSourceProperty(klis, kTISPropertyUnicodeKeyLayoutData)
- k_layout_size = Carbon.CFDataGetLength(k_layout)
- k_layout_buffer = ctypes.create_string_buffer(k_layout_size) # TODO - Verify this works instead of initializing with empty string
- Carbon.CFDataGetBytes(k_layout, CFRange(0, k_layout_size), ctypes.byref(k_layout_buffer))
-
- # Generate character representations of key codes
- for key_code in range(0, 128):
- # TODO - Possibly add alt modifier to key map
- non_shifted_char = UniChar4()
- shifted_char = UniChar4()
- keys_down = ctypes.c_uint32()
- char_count = UniCharCount()
-
- retval = Carbon.UCKeyTranslate(k_layout_buffer,
- key_code,
- kUCKeyActionDisplay,
- 0, # No modifier
- Carbon.LMGetKbdType(),
- kUCKeyTranslateNoDeadKeysBit,
- ctypes.byref(keys_down),
- 4,
- ctypes.byref(char_count),
- non_shifted_char)
-
- non_shifted_key = u''.join(unichr(non_shifted_char[i]) for i in range(char_count.value))
-
- retval = Carbon.UCKeyTranslate(k_layout_buffer,
- key_code,
- kUCKeyActionDisplay,
- shiftKey >> 8, # Shift
- Carbon.LMGetKbdType(),
- kUCKeyTranslateNoDeadKeysBit,
- ctypes.byref(keys_down),
- 4,
- ctypes.byref(char_count),
- shifted_char)
-
- shifted_key = u''.join(unichr(shifted_char[i]) for i in range(char_count.value))
-
- self.layout_specific_keys[key_code] = (non_shifted_key, shifted_key)
- # Cleanup
- Carbon.CFRelease(klis)
-
- def character_to_vk(self, character):
- """ Returns a tuple of (scan_code, modifiers) where ``scan_code`` is a numeric scan code
- and ``modifiers`` is an array of string modifier names (like 'shift') """
- for vk in self.non_layout_keys:
- if self.non_layout_keys[vk] == character.lower():
- return (vk, [])
- for vk in self.layout_specific_keys:
- if self.layout_specific_keys[vk][0] == character:
- return (vk, [])
- elif self.layout_specific_keys[vk][1] == character:
- return (vk, ['shift'])
- raise ValueError("Unrecognized character: {}".format(character))
-
- def vk_to_character(self, vk, modifiers=[]):
- """ Returns a character corresponding to the specified scan code (with given
- modifiers applied) """
- if vk in self.non_layout_keys:
- # Not a character
- return self.non_layout_keys[vk]
- elif vk in self.layout_specific_keys:
- if 'shift' in modifiers:
- return self.layout_specific_keys[vk][1]
- return self.layout_specific_keys[vk][0]
- else:
- # Invalid vk
- raise ValueError("Invalid scan code: {}".format(vk))
-
-
-class KeyController(object):
- def __init__(self):
- self.key_map = KeyMap()
- self.current_modifiers = {
- "shift": False,
- "caps": False,
- "alt": False,
- "ctrl": False,
- "cmd": False,
- }
- self.media_keys = {
- 'KEYTYPE_SOUND_UP': 0,
- 'KEYTYPE_SOUND_DOWN': 1,
- 'KEYTYPE_BRIGHTNESS_UP': 2,
- 'KEYTYPE_BRIGHTNESS_DOWN': 3,
- 'KEYTYPE_CAPS_LOCK': 4,
- 'KEYTYPE_HELP': 5,
- 'POWER_KEY': 6,
- 'KEYTYPE_MUTE': 7,
- 'UP_ARROW_KEY': 8,
- 'DOWN_ARROW_KEY': 9,
- 'KEYTYPE_NUM_LOCK': 10,
- 'KEYTYPE_CONTRAST_UP': 11,
- 'KEYTYPE_CONTRAST_DOWN': 12,
- 'KEYTYPE_LAUNCH_PANEL': 13,
- 'KEYTYPE_EJECT': 14,
- 'KEYTYPE_VIDMIRROR': 15,
- 'KEYTYPE_PLAY': 16,
- 'KEYTYPE_NEXT': 17,
- 'KEYTYPE_PREVIOUS': 18,
- 'KEYTYPE_FAST': 19,
- 'KEYTYPE_REWIND': 20,
- 'KEYTYPE_ILLUMINATION_UP': 21,
- 'KEYTYPE_ILLUMINATION_DOWN': 22,
- 'KEYTYPE_ILLUMINATION_TOGGLE': 23
- }
-
- def press(self, key_code):
- """ Sends a 'down' event for the specified scan code """
- if key_code >= 128:
- # Media key
- ev = NSEvent.otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
- 14, # type
- (0, 0), # location
- 0xa00, # flags
- 0, # timestamp
- 0, # window
- 0, # ctx
- 8, # subtype
- ((key_code-128) << 16) | (0xa << 8), # data1
- -1 # data2
- )
- Quartz.CGEventPost(0, ev.CGEvent())
- else:
- # Regular key
- # Apply modifiers if necessary
- event_flags = 0
- if self.current_modifiers["shift"]:
- event_flags += Quartz.kCGEventFlagMaskShift
- if self.current_modifiers["caps"]:
- event_flags += Quartz.kCGEventFlagMaskAlphaShift
- if self.current_modifiers["alt"]:
- event_flags += Quartz.kCGEventFlagMaskAlternate
- if self.current_modifiers["ctrl"]:
- event_flags += Quartz.kCGEventFlagMaskControl
- if self.current_modifiers["cmd"]:
- event_flags += Quartz.kCGEventFlagMaskCommand
-
- # Update modifiers if necessary
- if key_code == 0x37: # cmd
- self.current_modifiers["cmd"] = True
- elif key_code == 0x38 or key_code == 0x3C: # shift or right shift
- self.current_modifiers["shift"] = True
- elif key_code == 0x39: # caps lock
- self.current_modifiers["caps"] = True
- elif key_code == 0x3A: # alt
- self.current_modifiers["alt"] = True
- elif key_code == 0x3B: # ctrl
- self.current_modifiers["ctrl"] = True
- event = Quartz.CGEventCreateKeyboardEvent(None, key_code, True)
- Quartz.CGEventSetFlags(event, event_flags)
- Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)
- time.sleep(0.01)
-
- def release(self, key_code):
- """ Sends an 'up' event for the specified scan code """
- if key_code >= 128:
- # Media key
- ev = NSEvent.otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
- 14, # type
- (0, 0), # location
- 0xb00, # flags
- 0, # timestamp
- 0, # window
- 0, # ctx
- 8, # subtype
- ((key_code-128) << 16) | (0xb << 8), # data1
- -1 # data2
- )
- Quartz.CGEventPost(0, ev.CGEvent())
- else:
- # Regular key
- # Update modifiers if necessary
- if key_code == 0x37: # cmd
- self.current_modifiers["cmd"] = False
- elif key_code == 0x38 or key_code == 0x3C: # shift or right shift
- self.current_modifiers["shift"] = False
- elif key_code == 0x39: # caps lock
- self.current_modifiers["caps"] = False
- elif key_code == 0x3A: # alt
- self.current_modifiers["alt"] = False
- elif key_code == 0x3B: # ctrl
- self.current_modifiers["ctrl"] = False
-
- # Apply modifiers if necessary
- event_flags = 0
- if self.current_modifiers["shift"]:
- event_flags += Quartz.kCGEventFlagMaskShift
- if self.current_modifiers["caps"]:
- event_flags += Quartz.kCGEventFlagMaskAlphaShift
- if self.current_modifiers["alt"]:
- event_flags += Quartz.kCGEventFlagMaskAlternate
- if self.current_modifiers["ctrl"]:
- event_flags += Quartz.kCGEventFlagMaskControl
- if self.current_modifiers["cmd"]:
- event_flags += Quartz.kCGEventFlagMaskCommand
- event = Quartz.CGEventCreateKeyboardEvent(None, key_code, False)
- Quartz.CGEventSetFlags(event, event_flags)
- Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)
- time.sleep(0.01)
-
- def map_char(self, character):
- if character in self.media_keys:
- return (128+self.media_keys[character],[])
- else:
- return self.key_map.character_to_vk(character)
- def map_scan_code(self, scan_code):
- if scan_code >= 128:
- character = [k for k, v in enumerate(self.media_keys) if v == scan_code-128]
- if len(character):
- return character[0]
- return None
- else:
- return self.key_map.vk_to_character(scan_code)
-
-class KeyEventListener(object):
- def __init__(self, callback, blocking=False):
- self.blocking = blocking
- self.callback = callback
- self.listening = True
- self.tap = None
-
- def run(self):
- """ Creates a listener and loops while waiting for an event. Intended to run as
- a background thread. """
- self.tap = Quartz.CGEventTapCreate(
- Quartz.kCGSessionEventTap,
- Quartz.kCGHeadInsertEventTap,
- Quartz.kCGEventTapOptionDefault,
- Quartz.CGEventMaskBit(Quartz.kCGEventKeyDown) |
- Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp) |
- Quartz.CGEventMaskBit(Quartz.kCGEventFlagsChanged),
- self.handler,
- None)
- loopsource = Quartz.CFMachPortCreateRunLoopSource(None, self.tap, 0)
- loop = Quartz.CFRunLoopGetCurrent()
- Quartz.CFRunLoopAddSource(loop, loopsource, Quartz.kCFRunLoopDefaultMode)
- Quartz.CGEventTapEnable(self.tap, True)
-
- while self.listening:
- Quartz.CFRunLoopRunInMode(Quartz.kCFRunLoopDefaultMode, 5, False)
-
- def handler(self, proxy, e_type, event, refcon):
- scan_code = Quartz.CGEventGetIntegerValueField(event, Quartz.kCGKeyboardEventKeycode)
- key_name = name_from_scancode(scan_code)
- flags = Quartz.CGEventGetFlags(event)
- event_type = ""
- is_keypad = (flags & Quartz.kCGEventFlagMaskNumericPad)
- if e_type == Quartz.kCGEventKeyDown:
- event_type = "down"
- elif e_type == Quartz.kCGEventKeyUp:
- event_type = "up"
- elif e_type == Quartz.kCGEventFlagsChanged:
- if key_name.endswith("shift") and (flags & Quartz.kCGEventFlagMaskShift):
- event_type = "down"
- elif key_name == "caps lock" and (flags & Quartz.kCGEventFlagMaskAlphaShift):
- event_type = "down"
- elif (key_name.endswith("option") or key_name.endswith("alt")) and (flags & Quartz.kCGEventFlagMaskAlternate):
- event_type = "down"
- elif key_name == "ctrl" and (flags & Quartz.kCGEventFlagMaskControl):
- event_type = "down"
- elif key_name == "command" and (flags & Quartz.kCGEventFlagMaskCommand):
- event_type = "down"
- else:
- event_type = "up"
-
- if self.blocking:
- return None
-
- self.callback(KeyboardEvent(event_type, scan_code, name=key_name, is_keypad=is_keypad))
- return event
-
-key_controller = KeyController()
-
-""" Exported functions below """
-
-def init():
- key_controller = KeyController()
-
-def press(scan_code):
- """ Sends a 'down' event for the specified scan code """
- key_controller.press(scan_code)
-
-def release(scan_code):
- """ Sends an 'up' event for the specified scan code """
- key_controller.release(scan_code)
-
-def map_name(name):
- """ Returns a tuple of (scan_code, modifiers) where ``scan_code`` is a numeric scan code
- and ``modifiers`` is an array of string modifier names (like 'shift') """
- yield key_controller.map_char(name)
-
-def name_from_scancode(scan_code):
- """ Returns the name or character associated with the specified key code """
- return key_controller.map_scan_code(scan_code)
-
-def listen(callback):
- if not os.geteuid() == 0:
- raise OSError("Error 13 - Must be run as administrator")
- KeyEventListener(callback).run()
-
-def type_unicode(character):
- OUTPUT_SOURCE = Quartz.CGEventSourceCreate(Quartz.kCGEventSourceStateHIDSystemState)
- # Key down
- event = Quartz.CGEventCreateKeyboardEvent(OUTPUT_SOURCE, 0, True)
- Quartz.CGEventKeyboardSetUnicodeString(event, len(character.encode('utf-16-le')) // 2, character)
- Quartz.CGEventPost(Quartz.kCGSessionEventTap, event)
- # Key up
- event = Quartz.CGEventCreateKeyboardEvent(OUTPUT_SOURCE, 0, False)
- Quartz.CGEventKeyboardSetUnicodeString(event, len(character.encode('utf-16-le')) // 2, character)
- Quartz.CGEventPost(Quartz.kCGSessionEventTap, event) \ No newline at end of file