def __init__(self, display, device_info): super(XInputDevice, self).__init__(display, asstr(device_info.name)) self._device_id = device_info.id self._device = None # Read device info self.buttons = [] self.keys = [] self.axes = [] ptr = device_info.inputclassinfo for i in range(device_info.num_classes): cp = ctypes.cast(ptr, ctypes.POINTER(xi.XAnyClassInfo)) cls_class = getattr(cp.contents, 'class') if cls_class == xi.KeyClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XKeyInfo)) self.min_keycode = cp.contents.min_keycode num_keys = cp.contents.num_keys for i in range(num_keys): self.keys.append(Button('key%d' % i)) elif cls_class == xi.ButtonClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XButtonInfo)) num_buttons = cp.contents.num_buttons # Pointer buttons start at index 1, with 0 as 'AnyButton' for i in range(num_buttons + 1): self.buttons.append(Button('button%d' % i)) elif cls_class == xi.ValuatorClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XValuatorInfo)) num_axes = cp.contents.num_axes mode = cp.contents.mode axes = ctypes.cast(cp.contents.axes, ctypes.POINTER(xi.XAxisInfo)) for i in range(num_axes): axis = axes[i] if mode == xi.Absolute: self.axes.append( AbsoluteAxis('axis%d' % i, min=axis.min_value, max=axis.max_value)) elif mode == xi.Relative: self.axes.append(RelativeAxis('axis%d' % i)) cls = cp.contents ptr = ptr_add(ptr, cls.length) self.controls = self.buttons + self.keys + self.axes # Can't detect proximity class event without opening device. Just # assume there is the possibility of a control if there are any axes. if self.axes: self.proximity_control = Button('proximity') self.controls.append(self.proximity_control) else: self.proximity_control = None
def __init__(self, display, device_info): super(XInputDevice, self).__init__(display, asstr(device_info.name)) self._device_id = device_info.id self._device = None # Read device info self.buttons = [] self.keys = [] self.axes = [] ptr = device_info.inputclassinfo for i in range(device_info.num_classes): cp = ctypes.cast(ptr, ctypes.POINTER(xi.XAnyClassInfo)) cls_class = getattr(cp.contents, 'class') if cls_class == xi.KeyClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XKeyInfo)) self.min_keycode = cp.contents.min_keycode num_keys = cp.contents.num_keys for i in range(num_keys): self.keys.append(Button('key%d' % i)) elif cls_class == xi.ButtonClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XButtonInfo)) num_buttons = cp.contents.num_buttons for i in range(num_buttons): self.buttons.append(Button('button%d' % i)) elif cls_class == xi.ValuatorClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XValuatorInfo)) num_axes = cp.contents.num_axes mode = cp.contents.mode axes = ctypes.cast(cp.contents.axes, ctypes.POINTER(xi.XAxisInfo)) for i in range(num_axes): axis = axes[i] if mode == xi.Absolute: self.axes.append(AbsoluteAxis('axis%d' % i, min=axis.min_value, max=axis.max_value)) elif mode == xi.Relative: self.axes.append(RelativeAxis('axis%d' % i)) cls = cp.contents ptr = ptr_add(ptr, cls.length) self.controls = self.buttons + self.keys + self.axes # Can't detect proximity class event without opening device. Just # assume there is the possibility of a control if there are any axes. if self.axes: self.proximity_control = Button('proximity') self.controls.append(self.proximity_control) else: self.proximity_control = None
def __init__(self, window, start_point, end_point, color): self.window = window self.start_point = start_point self.end_point = end_point self.color = color self.batch = pyglet.graphics.Batch() self.labels = {} self.labels_amount = 0 self.button = Button('click', 'click') start_x = self.start_point[0] start_y = self.start_point[1] end_x = self.end_point[0] end_y = self.end_point[1] self.batch.add(4, gl.GL_POLYGON, None, ('v2i', [ start_x, start_y, start_x, end_y, end_x, end_y, end_x, start_y ]), ('c4B', self.color * 4))
def __init__(self, index, manager): super().__init__(None, f"XInput{index}") self.index = index self._manager = weakref.proxy(manager) self.connected = False self.xinput_state = XINPUT_STATE() self.packet_number = 0 self.vibration = XINPUT_VIBRATION() self.weak_duration = None self.strong_duration = None self.controls = { 'a': Button('a'), 'b': Button('b'), 'x': Button('x'), 'y': Button('y'), 'back': Button('back'), 'start': Button('start'), 'guide': Button('guide'), 'leftshoulder': Button('leftshoulder'), 'rightshoulder': Button('rightshoulder'), 'leftstick': Button('leftstick'), 'rightstick': Button('rightstick'), 'dpup': Button('dpup'), 'dpdown': Button('dpdown'), 'dpleft': Button('dpleft'), 'dpright': Button('dpright'), 'leftx': AbsoluteAxis('leftx', -32768, 32768), 'lefty': AbsoluteAxis('lefty', -32768, 32768), 'rightx': AbsoluteAxis('rightx', -32768, 32768), 'righty': AbsoluteAxis('righty', -32768, 32768), 'lefttrigger': AbsoluteAxis('lefttrigger', 0, 255), 'righttrigger': AbsoluteAxis('righttrigger', 0, 255) }
class XInputDevice(DeviceResponder, Device): def __init__(self, display, device_info): super().__init__(display, asstr(device_info.name)) self._device_id = device_info.id self._device = None # Read device info self.buttons = list() self.keys = list() self.axes = list() ptr = device_info.inputclassinfo for i in range(device_info.num_classes): cp = ctypes.cast(ptr, ctypes.POINTER(xi.XAnyClassInfo)) cls_class = getattr(cp.contents, 'class') if cls_class == xi.KeyClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XKeyInfo)) self.min_keycode = cp.contents.min_keycode num_keys = cp.contents.num_keys for i in range(num_keys): self.keys.append(Button('key%d' % i)) elif cls_class == xi.ButtonClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XButtonInfo)) num_buttons = cp.contents.num_buttons for i in range(num_buttons): self.buttons.append(Button('button%d' % i)) elif cls_class == xi.ValuatorClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XValuatorInfo)) num_axes = cp.contents.num_axes mode = cp.contents.mode axes = ctypes.cast(cp.contents.axes, ctypes.POINTER(xi.XAxisInfo)) for i in range(num_axes): axis = axes[i] if mode == xi.Absolute: self.axes.append( AbsoluteAxis('axis%d' % i, min=axis.min_value, max=axis.max_value)) elif mode == xi.Relative: self.axes.append(RelativeAxis('axis%d' % i)) cls = cp.contents ptr = ptr_add(ptr, cls.length) self.controls = self.buttons + self.keys + self.axes # Can't detect proximity class event without opening device. Just # assume there is the possibility of a control if there are any axes. if self.axes: self.proximity_control = Button('proximity') self.controls.append(self.proximity_control) else: self.proximity_control = None def get_controls(self): return self.controls def open(self, window=None, exclusive=False): # Checks for is_open and raises if already open. # TODO allow opening on multiple windows. super().open(window, exclusive) if window is None: self._is_open = False raise DeviceOpenException('XInput devices require a window') if window.display._display != self.display._display: self._is_open = False raise DeviceOpenException('Window and device displays differ') if exclusive: self._is_open = False raise DeviceOpenException('Cannot open XInput device exclusive') self._device = xi.XOpenDevice(self.display._display, self._device_id) if not self._device: self._is_open = False raise DeviceOpenException('Cannot open device') self._install_events(window) def close(self): super().close() if not self._device: return # TODO: uninstall events xi.XCloseDevice(self.display._display, self._device) def _install_events(self, window): dispatcher = XInputWindowEventDispatcher.get_dispatcher(window) dispatcher.open_device(self._device_id, self._device, self) # DeviceResponder interface def _key_press(self, e): self.keys[e.keycode - self.min_keycode]._set_value(True) def _key_release(self, e): self.keys[e.keycode - self.min_keycode]._set_value(False) def _button_press(self, e): self.buttons[e.button]._set_value(True) def _button_release(self, e): self.buttons[e.button]._set_value(False) def _motion(self, e): for i in range(e.axes_count): self.axes[i]._set_value(e.axis_data[i]) def _proximity_in(self, e): if self.proximity_control: self.proximity_control._set_value(True) def _proximity_out(self, e): if self.proximity_control: self.proximity_control._set_value(False)
class XInputDevice(DeviceResponder, Device): def __init__(self, display, device_info): super(XInputDevice, self).__init__(display, asstr(device_info.name)) self._device_id = device_info.id self._device = None # Read device info self.buttons = [] self.keys = [] self.axes = [] ptr = device_info.inputclassinfo for i in range(device_info.num_classes): cp = ctypes.cast(ptr, ctypes.POINTER(xi.XAnyClassInfo)) cls_class = getattr(cp.contents, 'class') if cls_class == xi.KeyClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XKeyInfo)) self.min_keycode = cp.contents.min_keycode num_keys = cp.contents.num_keys for i in range(num_keys): self.keys.append(Button('key%d' % i)) elif cls_class == xi.ButtonClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XButtonInfo)) num_buttons = cp.contents.num_buttons for i in range(num_buttons): self.buttons.append(Button('button%d' % i)) elif cls_class == xi.ValuatorClass: cp = ctypes.cast(ptr, ctypes.POINTER(xi.XValuatorInfo)) num_axes = cp.contents.num_axes mode = cp.contents.mode axes = ctypes.cast(cp.contents.axes, ctypes.POINTER(xi.XAxisInfo)) for i in range(num_axes): axis = axes[i] if mode == xi.Absolute: self.axes.append(AbsoluteAxis('axis%d' % i, min=axis.min_value, max=axis.max_value)) elif mode == xi.Relative: self.axes.append(RelativeAxis('axis%d' % i)) cls = cp.contents ptr = ptr_add(ptr, cls.length) self.controls = self.buttons + self.keys + self.axes # Can't detect proximity class event without opening device. Just # assume there is the possibility of a control if there are any axes. if self.axes: self.proximity_control = Button('proximity') self.controls.append(self.proximity_control) else: self.proximity_control = None def get_controls(self): return self.controls def open(self, window=None, exclusive=False): # Checks for is_open and raises if already open. # TODO allow opening on multiple windows. super(XInputDevice, self).open(window, exclusive) if window is None: self.is_open = False raise DeviceOpenException('XInput devices require a window') if window.display._display != self.display._display: self.is_open = False raise DeviceOpenException('Window and device displays differ') if exclusive: self.is_open = False raise DeviceOpenException('Cannot open XInput device exclusive') self._device = xi.XOpenDevice(self.display._display, self._device_id) if not self._device: self.is_open = False raise DeviceOpenException('Cannot open device') self._install_events(window) def close(self): super(XInputDevice, self).close() if not self._device: return # TODO: uninstall events xi.XCloseDevice(self.display._display, self._device) def _install_events(self, window): dispatcher = XInputWindowEventDispatcher.get_dispatcher(window) dispatcher.open_device(self._device_id, self._device, self) # DeviceResponder interface def _key_press(self, e): self.keys[e.keycode - self.min_keycode]._set_value(True) def _key_release(self, e): self.keys[e.keycode - self.min_keycode]._set_value(False) def _button_press(self, e): self.buttons[e.button]._set_value(True) def _button_release(self, e): self.buttons[e.button]._set_value(False) def _motion(self, e): for i in range(e.axes_count): self.axes[i]._set_value(e.axis_data[i]) def _proximity_in(self, e): if self.proximity_control: self.proximity_control._set_value(True) def _proximity_out(self, e): if self.proximity_control: self.proximity_control._set_value(False)