สืบเนื่องจากได้ไปทำการซื้อ joypad ของ dragon มาใช้ พบว่าสำหรับบางเกมที่มีใน ubuntu มันใช้ joypad บังคับไม่ได้ หลายคนบอกว่าให้ลอง qjoypad ดูดิ แต่ qjoypad เลื่อนเมาส์แบบกระตุก และ ตั้ง axis เป็น wheel ไม่ได้ จึงลองเขียนดูเองด้วย python ต้องการ pygame และ python-xlib
Feature
- smooth mouse
- mouse force
- hold button
Next release
- GUI
- Profile
- Application detect
- Multikey command
import pygame
import math
from Xlib import X, XK, display
import Xlib.ext.xtest
from pygame import locals
display = display.Display()
pygame.init()
pygame.joystick.init()
try:
j=pygame.joystick.Joystick(0)
j.init()
print "Enable joytick: ", j.get_name()
print "Joy num axis: ", j.get_numaxes()
print "Joy num button: ", j.get_numbuttons()
print "Joy num hat: ", j.get_numhats()
ButtonEvent = [0 ,0 ,0 ,0,0,0,0,1 ,0 ,0 ,0 ,0] #0 key 1 mouse click 2 mouse moveX 3 mouse move Y
ButtonKey = [25,40,39,38,37,64,65,2,9,36,124,129] #keycode or mosecode or direction
ButtonHold = [False,False,False,False,False,False,False,False,False,False,False,False]
ButtonFlag = [1,1,1,1,1,1,1,1,1,1,1,1]
AxisHold = [False,False,False,False,False]
AxisEvent = [2,3,-1,1,1]
AxisKeyP = [50,50,0,3,5]
AxisKey = [50,50,0,3,4]
AxisKeyM = [-50,-50,0,1,4]
AxisHoldT = [0,0,0,0,0]
AxisFlag = [1,1,1,1,2] #0 press 1 holdable 2 holduntil press again
HatHold =[False,False,False,False]
HatEvent = [0,0,0,0]
HatKey = [98,104,100,102]
HatFlag = [1,1,1,1]
root = display.screen().root
except pygame.error:
print "no joystick found."
def pressButton(key):
Xlib.ext.xtest.fake_input(display, X.KeyPress, key)
display.sync()
def releaseButton(key):
Xlib.ext.xtest.fake_input(display, X.KeyRelease, key)
display.sync()
def moveMouse(numX,numY,T):
PointerData = display.screen().root.query_pointer()._data
PointX = PointerData["root_x"]
PointY = PointerData["root_y"]
print "T",T
if(numX > 0.00001):
PointX += (numX<strong>13)*T
elif(numX < -0.00001):
PointX += (numX</strong>13)*T
if(numY>0.00001):
PointY += (numY<strong>13)*T
if(numY<-0.00001):
PointY += (numY</strong>13)*T
root.warp_pointer(int(PointX),int(PointY))
display.sync()
def clickMouse(button):
Xlib.ext.xtest.fake_input(display, X.ButtonPress, button)
display.sync()
def releaseMouse(button):
Xlib.ext.xtest.fake_input(display, X.ButtonRelease, button)
display.sync()
while 1:
pygame.time.wait(10)
focus = display.get_input_focus()
nX =0
nY =0
cX = 0
cY = 0
cT = 0
for i in range(j.get_numaxes()):
if AxisHold[i]:
if AxisEvent[i]==2:
nX += 1.0
cX += j.get_axis(i)
cT += AxisHoldT[i]
elif AxisEvent[i]==3:
nY += 1.0
cY += j.get_axis(i)
cT += AxisHoldT[i]
if AxisEvent[i]==1 and AxisHold[i] == True and AxisFlag[i]==2:
clickMouse(AxisKey[i]);
releaseMouse(AxisKey[i]);
AxisHoldT[i] +=1
if cX != 0:
cX /= nX
if cY !=0:
cY /= nY
if cX!=0 or cY != 0:
moveMouse(cX,cY,cT)
for e in pygame.event.get():
if e.type == pygame.locals.JOYAXISMOTION:
for i in range(j.get_numaxes()):
if(j.get_axis(i)!=0):
if j.get_axis(i)>0:
AxisKey[i] = AxisKeyP[i]
else:
AxisKey[i] = AxisKeyM[i]
if AxisHold[i]==False:
if AxisEvent[i]==0:
pressButton(AxisKey[i])
elif AxisEvent[i]==1:
clickMouse(AxisKey[i])
if AxisFlag[i]!=1:
releaseMouse(AxisKey[i])
AxisHoldT[i]=0
AxisHold[i]=True
else:
if AxisHold[i]:
if AxisEvent[i]==0:
releaseButton(AxisKey[i])
elif AxisEvent[i]==1 and AxisFlag[i]==1:
releaseMouse(AxisKey[i])
AxisHold[i]=False
elif e.type == pygame.locals.JOYBUTTONDOWN:
for i in range(j.get_numbuttons()):
if(j.get_button(i)):
if ButtonEvent[i]==0:
pressButton(ButtonKey[i])
#releaseButton(ButtonKey[i])
elif ButtonEvent[i]==1:
clickMouse(ButtonKey[i])
#releaseMouse(ButtonKey[i])
ButtonHold[i]=True
elif e.type == pygame.locals.JOYBUTTONUP:
for i in range(j.get_numbuttons()):
if((j.get_button(i)==0) and ButtonHold[i]):
if ButtonEvent[i]==0:
releaseButton(ButtonKey[i])
elif ButtonEvent[i]==1:
releaseMouse(ButtonKey[i])
ButtonHold[i]=False
elif e.type == pygame.locals.JOYHATMOTION:
if(j.get_hat(0)[0]>0):
if(HatHold[0]==False):
if HatEvent[0]==0:
pressButton(HatKey[0])
elif HatEvent[0]==1:
clickMouse(HatKey[0])
HatHold[0]=True
if(HatHold[1]==True):
if HatEvent[1]==0:
releaseButton(HatKey[1])
elif HatEvent[1]==1:
releaseMouse(HatKey[1])
HatHold[1]=False
if(j.get_hat(0)[0]<0):
if(HatHold[1]==False):
if HatEvent[1]==0:
pressButton(HatKey[1])
elif HatEvent[1]==1:
clickMouse(HatKey[1])
HatHold[1]=True
if(HatHold[0]==True):
if HatEvent[0]==0:
releaseButton(HatKey[0])
elif HatEvent[0]==1:
releaseMouse(HatKey[0])
HatHold[0]=False
if(j.get_hat(0)[0]==0):
if(HatHold[0]==True):
if HatEvent[0]==0:
releaseButton(HatKey[0])
elif HatEvent[0]==1:
releaseMouse(HatKey[0])
HatHold[0]=False
if(HatHold[1]==True):
if HatEvent[1]==0:
releaseButton(HatKey[1])
elif HatEvent[1]==1:
releaseMouse(HatKey[1])
HatHold[1]=False
if(j.get_hat(0)[1]>0):
if(HatHold[2]==False):
if HatEvent[2]==0:
pressButton(HatKey[2])
elif HatEvent[2]==1:
clickMouse(HatKey[2])
HatHold[2]=True
if(HatHold[3]==True):
if HatEvent[3]==0:
releaseButton(HatKey[3])
elif HatEvent[3]==1:
releaseMouse(HatKey[3])
HatHold[1]=False
if(j.get_hat(0)[1]<0):
if(HatHold[3]==False):
if HatEvent[3]==0:
pressButton(HatKey[3])
elif HatEvent[3]==1:
clickMouse(HatKey[3])
HatHold[3]=True
if(HatHold[2]==True):
if HatEvent[2]==0:
releaseButton(HatKey[2])
elif HatEvent[2]==1:
releaseMouse(HatKey[2])
HatHold[2]=False
if(j.get_hat(0)[1]==0):
if(HatHold[2]==True):
if HatEvent[2]==0:
releaseButton(HatKey[2])
elif HatEvent[2]==1:
releaseMouse(HatKey[2])
HatHold[2]=False
if(HatHold[3]==True):
if HatEvent[3]==0:
releaseButton(HatKey[3])
elif HatEvent[3]==1:
releaseMouse(HatKey[3])
HatHold[3]=False
import math
from Xlib import X, XK, display
import Xlib.ext.xtest
from pygame import locals
display = display.Display()
pygame.init()
pygame.joystick.init()
try:
j=pygame.joystick.Joystick(0)
j.init()
print "Enable joytick: ", j.get_name()
print "Joy num axis: ", j.get_numaxes()
print "Joy num button: ", j.get_numbuttons()
print "Joy num hat: ", j.get_numhats()
ButtonEvent = [0 ,0 ,0 ,0,0,0,0,1 ,0 ,0 ,0 ,0] #0 key 1 mouse click 2 mouse moveX 3 mouse move Y
ButtonKey = [25,40,39,38,37,64,65,2,9,36,124,129] #keycode or mosecode or direction
ButtonHold = [False,False,False,False,False,False,False,False,False,False,False,False]
ButtonFlag = [1,1,1,1,1,1,1,1,1,1,1,1]
AxisHold = [False,False,False,False,False]
AxisEvent = [2,3,-1,1,1]
AxisKeyP = [50,50,0,3,5]
AxisKey = [50,50,0,3,4]
AxisKeyM = [-50,-50,0,1,4]
AxisHoldT = [0,0,0,0,0]
AxisFlag = [1,1,1,1,2] #0 press 1 holdable 2 holduntil press again
HatHold =[False,False,False,False]
HatEvent = [0,0,0,0]
HatKey = [98,104,100,102]
HatFlag = [1,1,1,1]
root = display.screen().root
except pygame.error:
print "no joystick found."
def pressButton(key):
Xlib.ext.xtest.fake_input(display, X.KeyPress, key)
display.sync()
def releaseButton(key):
Xlib.ext.xtest.fake_input(display, X.KeyRelease, key)
display.sync()
def moveMouse(numX,numY,T):
PointerData = display.screen().root.query_pointer()._data
PointX = PointerData["root_x"]
PointY = PointerData["root_y"]
print "T",T
if(numX > 0.00001):
PointX += (numX<strong>13)*T
elif(numX < -0.00001):
PointX += (numX</strong>13)*T
if(numY>0.00001):
PointY += (numY<strong>13)*T
if(numY<-0.00001):
PointY += (numY</strong>13)*T
root.warp_pointer(int(PointX),int(PointY))
display.sync()
def clickMouse(button):
Xlib.ext.xtest.fake_input(display, X.ButtonPress, button)
display.sync()
def releaseMouse(button):
Xlib.ext.xtest.fake_input(display, X.ButtonRelease, button)
display.sync()
while 1:
pygame.time.wait(10)
focus = display.get_input_focus()
nX =0
nY =0
cX = 0
cY = 0
cT = 0
for i in range(j.get_numaxes()):
if AxisHold[i]:
if AxisEvent[i]==2:
nX += 1.0
cX += j.get_axis(i)
cT += AxisHoldT[i]
elif AxisEvent[i]==3:
nY += 1.0
cY += j.get_axis(i)
cT += AxisHoldT[i]
if AxisEvent[i]==1 and AxisHold[i] == True and AxisFlag[i]==2:
clickMouse(AxisKey[i]);
releaseMouse(AxisKey[i]);
AxisHoldT[i] +=1
if cX != 0:
cX /= nX
if cY !=0:
cY /= nY
if cX!=0 or cY != 0:
moveMouse(cX,cY,cT)
for e in pygame.event.get():
if e.type == pygame.locals.JOYAXISMOTION:
for i in range(j.get_numaxes()):
if(j.get_axis(i)!=0):
if j.get_axis(i)>0:
AxisKey[i] = AxisKeyP[i]
else:
AxisKey[i] = AxisKeyM[i]
if AxisHold[i]==False:
if AxisEvent[i]==0:
pressButton(AxisKey[i])
elif AxisEvent[i]==1:
clickMouse(AxisKey[i])
if AxisFlag[i]!=1:
releaseMouse(AxisKey[i])
AxisHoldT[i]=0
AxisHold[i]=True
else:
if AxisHold[i]:
if AxisEvent[i]==0:
releaseButton(AxisKey[i])
elif AxisEvent[i]==1 and AxisFlag[i]==1:
releaseMouse(AxisKey[i])
AxisHold[i]=False
elif e.type == pygame.locals.JOYBUTTONDOWN:
for i in range(j.get_numbuttons()):
if(j.get_button(i)):
if ButtonEvent[i]==0:
pressButton(ButtonKey[i])
#releaseButton(ButtonKey[i])
elif ButtonEvent[i]==1:
clickMouse(ButtonKey[i])
#releaseMouse(ButtonKey[i])
ButtonHold[i]=True
elif e.type == pygame.locals.JOYBUTTONUP:
for i in range(j.get_numbuttons()):
if((j.get_button(i)==0) and ButtonHold[i]):
if ButtonEvent[i]==0:
releaseButton(ButtonKey[i])
elif ButtonEvent[i]==1:
releaseMouse(ButtonKey[i])
ButtonHold[i]=False
elif e.type == pygame.locals.JOYHATMOTION:
if(j.get_hat(0)[0]>0):
if(HatHold[0]==False):
if HatEvent[0]==0:
pressButton(HatKey[0])
elif HatEvent[0]==1:
clickMouse(HatKey[0])
HatHold[0]=True
if(HatHold[1]==True):
if HatEvent[1]==0:
releaseButton(HatKey[1])
elif HatEvent[1]==1:
releaseMouse(HatKey[1])
HatHold[1]=False
if(j.get_hat(0)[0]<0):
if(HatHold[1]==False):
if HatEvent[1]==0:
pressButton(HatKey[1])
elif HatEvent[1]==1:
clickMouse(HatKey[1])
HatHold[1]=True
if(HatHold[0]==True):
if HatEvent[0]==0:
releaseButton(HatKey[0])
elif HatEvent[0]==1:
releaseMouse(HatKey[0])
HatHold[0]=False
if(j.get_hat(0)[0]==0):
if(HatHold[0]==True):
if HatEvent[0]==0:
releaseButton(HatKey[0])
elif HatEvent[0]==1:
releaseMouse(HatKey[0])
HatHold[0]=False
if(HatHold[1]==True):
if HatEvent[1]==0:
releaseButton(HatKey[1])
elif HatEvent[1]==1:
releaseMouse(HatKey[1])
HatHold[1]=False
if(j.get_hat(0)[1]>0):
if(HatHold[2]==False):
if HatEvent[2]==0:
pressButton(HatKey[2])
elif HatEvent[2]==1:
clickMouse(HatKey[2])
HatHold[2]=True
if(HatHold[3]==True):
if HatEvent[3]==0:
releaseButton(HatKey[3])
elif HatEvent[3]==1:
releaseMouse(HatKey[3])
HatHold[1]=False
if(j.get_hat(0)[1]<0):
if(HatHold[3]==False):
if HatEvent[3]==0:
pressButton(HatKey[3])
elif HatEvent[3]==1:
clickMouse(HatKey[3])
HatHold[3]=True
if(HatHold[2]==True):
if HatEvent[2]==0:
releaseButton(HatKey[2])
elif HatEvent[2]==1:
releaseMouse(HatKey[2])
HatHold[2]=False
if(j.get_hat(0)[1]==0):
if(HatHold[2]==True):
if HatEvent[2]==0:
releaseButton(HatKey[2])
elif HatEvent[2]==1:
releaseMouse(HatKey[2])
HatHold[2]=False
if(HatHold[3]==True):
if HatEvent[3]==0:
releaseButton(HatKey[3])
elif HatEvent[3]==1:
releaseMouse(HatKey[3])
HatHold[3]=False

