Skip to content

Instantly share code, notes, and snippets.

@aleksandersumowski
Created February 29, 2024 16:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aleksandersumowski/a296a910fd3c6722744a2c3b0a1b5bf5 to your computer and use it in GitHub Desktop.
Save aleksandersumowski/a296a910fd3c6722744a2c3b0a1b5bf5 to your computer and use it in GitHub Desktop.
Python script to emulate media keys on mac
#!/opt/homebrew/bin/python3
# CLI program to control the mediakeys on OS X. Used to emulate the mediakey on a keyboard with no such keys.
# Easiest used in combination with a launcher/trigger software such as Quicksilver.
# Main part taken from http://stackoverflow.com/questions/11045814/emulate-media-key-press-on-mac
# Glue to make it into cli program by Fredrik Wallner http://www.wallner.nu/fredrik/
# requires installing `pyobjc` eg via `/opt/homebrew/bin/pip3 install -U pyobjc`
import Quartz
import sys
# NSEvent.h
NSSystemDefined = 14
# hidsystem/ev_keymap.h
NX_KEYTYPE_SOUND_UP = 0
NX_KEYTYPE_SOUND_DOWN = 1
NX_KEYTYPE_PLAY = 16
NX_KEYTYPE_NEXT = 17
NX_KEYTYPE_PREVIOUS = 18
NX_KEYTYPE_FAST = 19
NX_KEYTYPE_REWIND = 20
supportedcmds = {'playpause': NX_KEYTYPE_PLAY,
'next': NX_KEYTYPE_NEXT,
'prev': NX_KEYTYPE_PREVIOUS,
'volup': NX_KEYTYPE_SOUND_UP,
'voldown': NX_KEYTYPE_SOUND_DOWN}
def HIDPostAuxKey(key):
def doKey(down):
ev = Quartz.NSEvent.otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
NSSystemDefined, # type
(0, 0), # location
0xa00 if down else 0xb00, # flags
0, # timestamp
0, # window
0, # ctx
8, # subtype
(key << 16) | ((0xa if down else 0xb) << 8), # data1
-1 # data2
)
cev = ev.CGEvent()
Quartz.CGEventPost(0, cev)
doKey(True)
doKey(False)
if __name__ == "__main__":
try:
command = sys.argv[1]
assert (command in supportedcmds)
HIDPostAuxKey(supportedcmds[command])
except (IndexError, AssertionError):
print("Usage: %s command" % (sys.argv[0],))
print("\tSupported commands are %s" % supportedcmds.keys())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment