@@ -114,12 +114,56 @@ def XInputGetBatteryInformation(dwUserIndex, devType, batteryInformation):
114
114
115
115
_last_checked = 0
116
116
117
+ DEADZONE_LEFT_THUMB = 0
118
+ DEADZONE_RIGHT_THUMB = 1
119
+ DEADZONE_TRIGGER = 2
120
+
121
+ DEADZONE_DEFAULT = - 1
122
+
123
+ _deadzones = [{DEADZONE_RIGHT_THUMB : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ,
124
+ DEADZONE_LEFT_THUMB : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ,
125
+ DEADZONE_TRIGGER : XINPUT_GAMEPAD_TRIGGER_THRESHOLD },
126
+ {DEADZONE_RIGHT_THUMB : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ,
127
+ DEADZONE_LEFT_THUMB : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ,
128
+ DEADZONE_TRIGGER : XINPUT_GAMEPAD_TRIGGER_THRESHOLD },
129
+ {DEADZONE_RIGHT_THUMB : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ,
130
+ DEADZONE_LEFT_THUMB : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ,
131
+ DEADZONE_TRIGGER : XINPUT_GAMEPAD_TRIGGER_THRESHOLD },
132
+ {DEADZONE_RIGHT_THUMB : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE ,
133
+ DEADZONE_LEFT_THUMB : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE ,
134
+ DEADZONE_TRIGGER : XINPUT_GAMEPAD_TRIGGER_THRESHOLD }]
135
+
117
136
class XInputNotConnectedError (Exception ):
118
137
pass
119
138
120
139
class XInputBadArgumentError (ValueError ):
121
140
pass
122
141
142
+ def set_deadzone (dzone , value ):
143
+ global XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE , XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE , XINPUT_GAMEPAD_TRIGGER_THRESHOLD
144
+
145
+ assert dzone >= 0 and dzone <= 2 , "invalid deadzone"
146
+
147
+ if value == DEADZONE_DEFAULT :
148
+ value = 7849 if dzone == DEADZONE_LEFT_THUMB else \
149
+ 8689 if dzone == DEADZONE_RIGHT_THUMB else \
150
+ 30
151
+
152
+ if dzone == DEADZONE_LEFT_THUMB :
153
+ assert value >= 0 and value <= 32767
154
+ if value == DEADZONE_DEFAULT : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE = 7849
155
+ else : XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE = value
156
+
157
+ elif dzone == DEADZONE_RIGHT_THUMB :
158
+ assert value >= 0 and value <= 32767
159
+ if value == DEADZONE_DEFAULT : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE = 8689
160
+ else : XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE = value
161
+
162
+ else :
163
+ assert value >= 0 and value <= 255
164
+ if value == DEADZONE_DEFAULT : XINPUT_GAMEPAD_TRIGGER_THRESHOLD = 30
165
+ else : XINPUT_GAMEPAD_TRIGGER_THRESHOLD = value
166
+
123
167
def get_connected ():
124
168
state = XINPUT_STATE ()
125
169
out = [False ] * 4
@@ -424,6 +468,8 @@ def get_events():
424
468
root .title ("XInput" )
425
469
canvas = tk .Canvas (root , width = 600 , height = 400 , bg = "white" )
426
470
canvas .pack ()
471
+
472
+ set_deadzone (DEADZONE_TRIGGER ,10 )
427
473
428
474
class Controller :
429
475
def __init__ (self , center ):
@@ -613,6 +659,9 @@ def __init__(self, center):
613
659
canvas .itemconfig (controller .Y_button , fill = "" )
614
660
elif event .button == "X" :
615
661
canvas .itemconfig (controller .X_button , fill = "" )
616
-
617
- root .update ()
662
+
663
+ try :
664
+ root .update ()
665
+ except tk .TclError :
666
+ break
618
667
0 commit comments