import logging import struct from screeninfo import get_monitors # from .codes import EV_SYN, EV_ABS, ABS_X, ABS_Y, BTN_TOUCH from .codes import codes from .common import get_monitor, remap, wacom_max_x, wacom_max_y, log_event logging.basicConfig(format='%(message)s') log = logging.getLogger('remouse') # wacom digitizer dimensions # touchscreen dimensions # finger_width = 767 # finger_height = 1023 def read_tablet(rm_inputs, *, orientation, monitor_num, region, threshold, mode): """Loop forever and map evdev events to mouse Args: rm_inputs (dictionary of paramiko.ChannelFile): dict of pen, button and touch input streams orientation (str): tablet orientation monitor_num (int): monitor number to map to region (boolean): whether to selection mapping region with region tool threshold (int): pressure threshold mode (str): mapping mode """ from pynput.mouse import Button, Controller mouse = Controller() monitor, _ = get_monitor(region, monitor_num, orientation) log.debug('Chose monitor: {}'.format(monitor)) x = y = 0 stream = rm_inputs['pen'] while True: try: data = stream.read(16) except TimeoutError: continue e_time, e_millis, e_type, e_code, e_value = struct.unpack('2IHHi', data) # handle x direction if codes[e_type][e_code] == 'ABS_X': x = e_value # handle y direction if codes[e_type][e_code] == 'ABS_Y': y = e_value # handle draw if codes[e_type][e_code] == 'BTN_TOUCH': if e_value == 1: mouse.press(Button.left) else: mouse.release(Button.left) if codes[e_type][e_code] == 'SYN_REPORT': mapped_x, mapped_y = remap( x, y, wacom_max_x, wacom_max_y, monitor.width, monitor.height, mode, orientation, ) mouse.move( monitor.x + mapped_x - mouse.position[0], monitor.y + mapped_y - mouse.position[1] ) if log.level == logging.DEBUG: log_event(e_time, e_millis, e_type, e_code, e_value)