settings: show potential triggering keys for mouse gesture setting

This commit is contained in:
Peter F. Patel-Schneider 2021-04-15 16:25:32 -04:00
parent 42624c7102
commit 5d885f76e7
3 changed files with 54 additions and 26 deletions

View File

@ -1103,13 +1103,14 @@ MouseGestureKeys = [
class DivertedMouseMovementRW(object): class DivertedMouseMovementRW(object):
def __init__(self, dpi_name): def __init__(self, dpi_name, divert_name):
self.kind = FeatureRW.kind # pretend to be FeatureRW as required for HID++ 2.0 devices self.kind = FeatureRW.kind # pretend to be FeatureRW as required for HID++ 2.0 devices
self.dpi_name = dpi_name self.dpi_name = dpi_name
self.divert_name = divert_name
self.key = None self.key = None
def read(self, device): # need to return bytes, not a boolean def read(self, device): # need to return bytes, as if read from device
return b'0x01' if '_divertedMMState' in device.__dict__ else b'0x00' return _int2bytes(device._divertedMMState.key, 2) if '_divertedMMState' in device.__dict__ else b'\x00\x00'
def write(self, device, data_bytes): def write(self, device, data_bytes):
def handler(device, n): def handler(device, n):
@ -1123,28 +1124,36 @@ class DivertedMouseMovementRW(object):
dx, dy = _unpack('!hh', n.data[:4]) dx, dy = _unpack('!hh', n.data[:4])
state.handle_move_event(dx, dy) state.handle_move_event(dx, dy)
if bool(data_bytes): # enable key = _bytes2int(data_bytes)
if key: # enable
# Enable HID++ events on moving the mouse while button held # Enable HID++ events on moving the mouse while button held
for key_number in MouseGestureKeys: self.key = next((k for k in device.keys if k.key == key), None)
key_index = device.keys.index(key_number) if self.key:
self.key = device.keys[key_index] if key_index is not None else None self.key.set_rawXY_reporting(True)
if self.key and 'raw XY' in self.key.flags: divertSetting = next(filter(lambda s: s.name == self.divert_name, device.settings), None)
self.key.set_rawXY_reporting(True) divertSetting.write_key_value(int(self.key.key), 1)
# Store our variables in the device object from solaar.ui import status_changed as _status_changed
device._divertedMMState = DivertedMouseMovement(device, self.dpi_name, self.key.key) _status_changed(device, refresh=True) # update main window
device.add_notification_handler('diverted-mouse-movement-handler', handler) # Store our variables in the device object
return True device._divertedMMState = DivertedMouseMovement(device, self.dpi_name, self.key.key)
device.add_notification_handler('diverted-mouse-movement-handler', handler)
return True
else: else:
_log.error('cannot enable diverted mouse movement on %s', device) _log.error('cannot enable diverted mouse movement on %s for key %s', device.name, key)
else: # disable else: # disable
if self.key:
self.key.set_rawXY_reporting(False)
divertSetting = next(filter(lambda s: s.name == self.divert_name, device.settings), None)
divertSetting.write_key_value(int(self.key.key), 0)
from solaar.ui import status_changed as _status_changed
_status_changed(device, refresh=True) # update main window
self.key = None
try: try:
device.remove_notification_handler('diverted-mouse-movement-handler') device.remove_notification_handler('diverted-mouse-movement-handler')
del device._divertedMMState
if self.key:
self.key.set_rawXY_reporting(False)
self.key = None
except Exception: except Exception:
_log.error('cannot disable diverted mouse movement on %s', device) pass
if hasattr(device, '_divertedMMState'):
del device._divertedMMState
return True return True

View File

@ -541,11 +541,20 @@ def _feature_adjustable_dpi():
def _feature_mouse_gesture_callback(device): def _feature_mouse_gesture_callback(device):
# need a gesture button that can send raw XY # need a gesture button that can send raw XY
for key in _MouseGestureKeys: if device.kind == _DK.mouse:
key_index = device.keys.index(key) keys = []
if key_index is not None and 'raw XY' in device.keys[key_index].flags: for key in _MouseGestureKeys:
return _BooleanV() key_index = device.keys.index(key)
return None dkey = device.keys[key_index] if key_index is not None else None
if dkey is not None and 'raw XY' in dkey.flags and 'divertable' in dkey.flags:
keys.append(dkey.key)
if not keys: # none of the keys designed for this, so look for any key with correct flags
for key in device.keys:
if 'raw XY' in key.flags and 'divertable' in key.flags and 'virtual' not in key.flags:
keys.append(key.key)
if keys:
keys.insert(0, _NamedInt(0, 'Off'))
return _ChoicesV(_NamedInts.list(keys), byte_count=2)
def _feature_mouse_gesture(): def _feature_mouse_gesture():
@ -554,7 +563,7 @@ def _feature_mouse_gesture():
from .settings import DivertedMouseMovementRW as _DivertedMouseMovementRW from .settings import DivertedMouseMovementRW as _DivertedMouseMovementRW
return _Setting( return _Setting(
_MOUSE_GESTURES, _MOUSE_GESTURES,
_DivertedMouseMovementRW(_DPI[0]), _DivertedMouseMovementRW(_DPI[0], _DIVERT_KEYS[0]),
callback=_feature_mouse_gesture_callback, callback=_feature_mouse_gesture_callback,
device_kind=(_DK.mouse, ) device_kind=(_DK.mouse, )
) )

View File

@ -59,6 +59,7 @@ def _load():
_log.debug('load => %s', _configuration) _log.debug('load => %s', _configuration)
_cleanup(_configuration) _cleanup(_configuration)
_cleanup_load(_configuration)
_configuration[_KEY_VERSION] = __version__ _configuration[_KEY_VERSION] = __version__
return _configuration return _configuration
@ -99,6 +100,15 @@ def _cleanup(d):
_cleanup(value) _cleanup(value)
def _cleanup_load(d):
# remove boolean values for mouse-gestures
for device in d:
if isinstance(device, dict):
mg = device.get('mouse-gestures', None)
if mg is True or mg is False:
del device['mouse-gestures']
class _DeviceEntry(dict): class _DeviceEntry(dict):
def __init__(self, device, **kwargs): def __init__(self, device, **kwargs):
super(_DeviceEntry, self).__init__(**kwargs) super(_DeviceEntry, self).__init__(**kwargs)
@ -125,7 +135,7 @@ class _DeviceEntry(dict):
sensitives = self.get('_sensitive', {}) sensitives = self.get('_sensitive', {})
if sensitives.get(name) != value: if sensitives.get(name) != value:
sensitives[name] = value sensitives[name] = value
self['_sensitive'] = sensitives self.__setitem__('_sensitive', sensitives)
# This is neccessarily complicate because the same device can be attached in several different ways. # This is neccessarily complicate because the same device can be attached in several different ways.