forked from https://github.com/Evidlo/remarkable_mouse | patches include cool mapping mode that actually does proper aspect ratio conversion and fixing it for smartcard ssh setups
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

101 lines
3.0 KiB

import logging
import struct
logging.basicConfig(format='%(message)s')
log = logging.getLogger(__name__)
# evtype_sync = 0
# evtype_key = 1
e_type_abs = 3
# evcode_stylus_distance = 25
# evcode_stylus_xtilt = 26
# evcode_stylus_ytilt = 27
e_code_stylus_xpos = 1
e_code_stylus_ypos = 0
e_code_stylus_pressure = 24
# evcode_finger_xpos = 53
# evcode_finger_ypos = 54
# evcode_finger_pressure = 58
stylus_width = 15725
stylus_height = 20951
# finger_width = 767
# finger_height = 1023
# remap wacom coordinates in various orientations
def fit(x, y, stylus_width, stylus_height, monitor, orientation):
if orientation == 'vertical':
y = stylus_height - y
elif orientation == 'right':
x, y = y, x
stylus_width, stylus_height = stylus_height, stylus_width
elif orientation == 'left':
x, y = stylus_height - y, stylus_width - x
stylus_width, stylus_height = stylus_height, stylus_width
ratio_width, ratio_height = monitor.width / stylus_width, monitor.height / stylus_height
scaling = ratio_width if ratio_width > ratio_height else ratio_height
return (
scaling * (x - (stylus_width - monitor.width / scaling) / 2),
scaling * (y - (stylus_height - monitor.height / scaling) / 2)
)
def read_tablet(args, remote_device):
"""Loop forever and map evdev events to mouse"""
from screeninfo import get_monitors
from pynput.mouse import Button, Controller
lifted = True
new_x = new_y = False
mouse = Controller()
monitor = get_monitors()[args.monitor]
log.debug('Chose monitor: {}'.format(monitor))
while True:
_, _, e_type, e_code, e_value = struct.unpack('2IHHi', remote_device.read(16))
if e_type == e_type_abs:
# handle x direction
if e_code == e_code_stylus_xpos:
log.debug(e_value)
x = e_value
new_x = True
# handle y direction
if e_code == e_code_stylus_ypos:
log.debug('\t{}'.format(e_value))
y = e_value
new_y = True
# handle draw
if e_code == e_code_stylus_pressure:
log.debug('\t\t{}'.format(e_value))
if e_value > args.threshold:
if lifted:
log.debug('PRESS')
lifted = False
mouse.press(Button.left)
else:
if not lifted:
log.debug('RELEASE')
lifted = True
mouse.release(Button.left)
# only move when x and y are updated for smoother mouse
if new_x and new_y:
mapped_x, mapped_y = fit(x, y, stylus_width, stylus_height, monitor, args.orientation)
mouse.move(
monitor.x + mapped_x - mouse.position[0],
monitor.y + mapped_y - mouse.position[1]
)
new_x = new_y = False