#!/usr/bin/python ''' xdojoy.py, 0.9 (c) 2011 Jan ONDREJ (SAL) Usage: xdojoy.py > /dev/null ''' import pygame, time, os, sys from pygame.locals import QUIT from ctypes import * from ctypes.util import find_library profiles = dict( DEFAULT = [ ['Left', 'Right', 'Up', 'Down'], ['Up', 'space', 'Down', 'Escape'] ], ) try: from joyconfig import profiles except ImportError: pass if len(sys.argv)>2: axmap = sys.argv[1:5] bmap = sys.argv[5:] elif len(sys.argv)>1: axmap, bmap = profiles[sys.argv[1]] else: axmap, bmap = profiles['DEFAULT'] delta = 0.5 CURRENTWINDOW = (0) class xdo_t(Structure): _fields_ = [ ('xdpy', c_char_p), ('display_name', c_char_p), ('charcodes', c_char_p), ('charcodes_len', c_int), ('modmap', c_char_p), ('keymap', c_char_p), ('keycode_high', c_int), ('keycode_low', c_int), ('keysyms_per_keycode', c_int), ('close_display_when_freed', c_int) ] class xdo_so: def __init__(self, display=None): solib = find_library('xdo') self.so = cdll.LoadLibrary(solib) self.so.xdo_new.restype = c_void_p self.xdo = self.so.xdo_new(display) def key(self, key, delay=1): self.so.xdo_keysequence(self.xdo, CURRENTWINDOW, key, delay) def keyup(self, key, delay=1): sys.stderr.write("keyup %s\n" % key) self.so.xdo_keysequence_up(self.xdo, CURRENTWINDOW, key, delay) def keydown(self, key, delay=1): sys.stderr.write("keydown %s\n" % key) self.so.xdo_keysequence_down(self.xdo, CURRENTWINDOW, key, delay) class xdo_cmd: def __init__(self): self.cmd = "xdotool %s --delay=0 %s" def key_uni(self, direction, k): sys.stderr.write("%s %s\n" % (direction, l)) os.system(self.cmd % (direction, k)) def keyup(self, k): self.key_uni("keyup", k) def keydown(self, k): self.key_uni("keydown", k) xdo = xdo_so() pygame.init() pygame.joystick.init() joy = pygame.joystick.Joystick(0) joy.init() print joy.get_name(), joy.get_numaxes(), joy.get_numbuttons() # fix button count bmap = bmap + ['' for x in range(joy.get_numbuttons()-len(bmap))] sys.stderr.write('%s %s\n' % (axmap, bmap)) lasta = [] lastb = [] while True: try: for event in pygame.event.get(): if event.type==QUIT: break x = joy.get_axis(0) y = joy.get_axis(1) a = [x<-delta, x>delta, y<-delta, y>delta] b = list([joy.get_button(x) for x in range(joy.get_numbuttons())]) for l, j, k in zip(lasta, a, axmap): if l!=j: if l and k: xdo.keyup(k) elif k: xdo.keydown(k) for l, j, k in zip(lastb, b, bmap): if l!=j: if l and k: xdo.keyup(k) elif k: xdo.keydown(k) lasta = a lastb = b time.sleep(0.01) except KeyboardInterrupt: break print "Exiting..." pygame.joystick.quit() pygame.quit()