Skip to content

Instantly share code, notes, and snippets.

@pawnhearts
Created February 25, 2016 00:00
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save pawnhearts/ac22877571fb5a1f6fba to your computer and use it in GitHub Desktop.
#!/usr/bin/python
from Xlib import X,XK,display
import sys,os
import gobject
class Hotkey:
def __init__(self,keystr,action,*args):
self.action=action
self.args=args
self.disp = display.Display()
self.root = self.disp.screen().root
self.key,self.mask=self.parse_keystr(keystr)
self.root.change_attributes(event_mask = X.KeyPressMask)
self.root.grab_key(self.key, self.mask,0,X.GrabModeAsync, X.GrabModeAsync)
gobject.timeout_add(100,self.next_event)
def next_event(self):
try:
if self.disp.pending_events():
for xev in [self.root.display.next_event() for i in xrange(self.disp.pending_events())]:
if xev and xev.type==X.KeyPress and xev.detail==self.key:
self.action(*self.args)
return True
return True
except:
self.disp.ungrab_keyboard(X.CurrentTime)
self.disp.flush()
self.root.ungrab_key(X.AnyKey,X.AnyModifier)
def parse_keystr(self,keystr):
keystr=keystr.replace('<','').lower().split('>')
KEY=dict([(key.lower()[3:],self.disp.keysym_to_keycode(val)) for key,val in XK.__dict__.items() if key.startswith('XK_')])[keystr.pop()]
if not keystr:
MASK=X.AnyModifier
else:
MASK=0
for val in keystr:
MASK=MASK | getattr(X,'%sMask'%val.capitalize())
return (KEY,MASK)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment