def __init__(self, window, cursors): super(XInputTabletCanvas, self).__init__(window) self.cursors = cursors dispatcher = XInputWindowEventDispatcher.get_dispatcher(window) self.display = window.display self._open_devices = [] self._cursor_map = {} for cursor in cursors: device = cursor.device device_id = device._device_id self._cursor_map[device_id] = cursor cursor.max_pressure = device.axes[2].max if self.display._display != device.display._display: raise DeviceOpenException('Window and device displays differ') open_device = xi.XOpenDevice(device.display._display, device_id) if not open_device: # Ignore this cursor; fail if no cursors added continue self._open_devices.append(open_device) dispatcher.open_device(device_id, open_device, self)
def __init__(self, device, window, msg_base=wintab.WT_DEFBASE): super(WintabTabletCanvas, self).__init__(window) self.device = device self.msg_base = msg_base # Just use system context, for similarity w/ os x and xinput. # WTI_DEFCONTEXT detaches mouse from tablet, which is nice, but not # possible on os x afiak. self.context_info = context_info = wintab.LOGCONTEXT() wtinfo(wintab.WTI_DEFSYSCTX, 0, context_info) context_info.lcMsgBase = msg_base context_info.lcOptions |= wintab.CXO_MESSAGES # If you change this, change definition of PACKET also. context_info.lcPktData = ( wintab.PK_CHANGED | wintab.PK_CURSOR | wintab.PK_BUTTONS | wintab.PK_X | wintab.PK_Y | wintab.PK_Z | wintab.PK_NORMAL_PRESSURE | wintab.PK_TANGENT_PRESSURE | wintab.PK_ORIENTATION) context_info.lcPktMode = 0 # All absolute self._context = lib.WTOpenW(window._hwnd, ctypes.byref(context_info), True) if not self._context: raise DeviceOpenException("Couldn't open tablet context") window._event_handlers[msg_base + wintab.WT_PACKET] = \ self._event_wt_packet window._event_handlers[msg_base + wintab.WT_PROXIMITY] = \ self._event_wt_proximity self._current_cursor = None self._pressure_scale = device.pressure_axis.get_scale() self._pressure_bias = device.pressure_axis.get_bias()
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)