misc: update yapf version
* misc: update yapf version v2 * Update .pre-commit-config.yaml Co-authored-by: Peter F. Patel-Schneider <pfpschneider@gmail.com>
This commit is contained in:
parent
0c7a9dd0a7
commit
5656f90cdb
|
@ -12,7 +12,7 @@ repos:
|
|||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
- repo: https://github.com/pre-commit/mirrors-yapf
|
||||
rev: v0.30.0
|
||||
rev: v0.32.0
|
||||
hooks:
|
||||
- id: yapf
|
||||
- repo: https://github.com/pre-commit/mirrors-isort
|
||||
|
|
|
@ -134,6 +134,7 @@ def _validate_input(line, hidpp=False):
|
|||
|
||||
|
||||
def _open(args):
|
||||
|
||||
def matchfn(bid, vid, pid):
|
||||
if vid == 0x046d:
|
||||
return {'vid': 0x046d}
|
||||
|
|
|
@ -304,6 +304,7 @@ def open(vendor_id, product_id, serial=None):
|
|||
|
||||
:returns: an opaque device handle, or ``None``.
|
||||
"""
|
||||
|
||||
def matchfn(bid, vid, pid):
|
||||
return vid == vendor_id and pid == product_id
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ class NamedInt(int):
|
|||
|
||||
Caution: comparison with strings will also match this NamedInt's name
|
||||
(case-insensitive)."""
|
||||
|
||||
def __new__(cls, value, name):
|
||||
assert is_string(name)
|
||||
obj = int.__new__(cls, value)
|
||||
|
@ -82,6 +83,7 @@ class NamedInts:
|
|||
__slots__ = ('__dict__', '_values', '_indexed', '_fallback', '_is_sorted')
|
||||
|
||||
def __init__(self, dict=None, **kwargs):
|
||||
|
||||
def _readable_name(n):
|
||||
if not is_string(n):
|
||||
raise TypeError('expected string, got ' + str(type(n)))
|
||||
|
@ -213,6 +215,7 @@ class NamedInts:
|
|||
|
||||
|
||||
class UnsortedNamedInts(NamedInts):
|
||||
|
||||
def _sort_values(self):
|
||||
pass
|
||||
|
||||
|
@ -242,6 +245,7 @@ class KwException(Exception):
|
|||
"""An exception that remembers all arguments passed to the constructor.
|
||||
They can be later accessed by simple member access.
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(kwargs)
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ from .hidpp20 import FEATURE as _F
|
|||
from .special_keys import CONTROL as _CONTROL
|
||||
|
||||
import gi # isort:skip
|
||||
|
||||
gi.require_version('Gdk', '3.0') # isort:skip
|
||||
from gi.repository import Gdk, GLib # NOQA: E402 # isort:skip
|
||||
|
||||
|
@ -368,6 +369,7 @@ COMPONENTS = {}
|
|||
|
||||
|
||||
class RuleComponent:
|
||||
|
||||
def compile(self, c):
|
||||
if isinstance(c, RuleComponent):
|
||||
return c
|
||||
|
@ -380,6 +382,7 @@ class RuleComponent:
|
|||
|
||||
|
||||
class Rule(RuleComponent):
|
||||
|
||||
def __init__(self, args, source=None, warn=True):
|
||||
self.components = [self.compile(a) for a in args]
|
||||
self.source = source
|
||||
|
@ -407,6 +410,7 @@ class Rule(RuleComponent):
|
|||
|
||||
|
||||
class Condition(RuleComponent):
|
||||
|
||||
def __init__(self, *args):
|
||||
pass
|
||||
|
||||
|
@ -418,6 +422,7 @@ class Condition(RuleComponent):
|
|||
|
||||
|
||||
class Not(Condition):
|
||||
|
||||
def __init__(self, op, warn=True):
|
||||
if isinstance(op, list) and len(op) == 1:
|
||||
op = op[0]
|
||||
|
@ -436,6 +441,7 @@ class Not(Condition):
|
|||
|
||||
|
||||
class Or(Condition):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
self.components = [self.compile(a) for a in args]
|
||||
|
||||
|
@ -457,6 +463,7 @@ class Or(Condition):
|
|||
|
||||
|
||||
class And(Condition):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
self.components = [self.compile(a) for a in args]
|
||||
|
||||
|
@ -510,6 +517,7 @@ def x11_pointer_prog():
|
|||
|
||||
|
||||
class Process(Condition):
|
||||
|
||||
def __init__(self, process, warn=True):
|
||||
self.process = process
|
||||
if wayland or not x11_setup():
|
||||
|
@ -535,6 +543,7 @@ class Process(Condition):
|
|||
|
||||
|
||||
class MouseProcess(Condition):
|
||||
|
||||
def __init__(self, process, warn=True):
|
||||
self.process = process
|
||||
if wayland or not x11_setup():
|
||||
|
@ -560,6 +569,7 @@ class MouseProcess(Condition):
|
|||
|
||||
|
||||
class Feature(Condition):
|
||||
|
||||
def __init__(self, feature, warn=True):
|
||||
if not (isinstance(feature, str) and feature in _F):
|
||||
if warn:
|
||||
|
@ -578,6 +588,7 @@ class Feature(Condition):
|
|||
|
||||
|
||||
class Report(Condition):
|
||||
|
||||
def __init__(self, report, warn=True):
|
||||
if not (isinstance(report, int)):
|
||||
if warn:
|
||||
|
@ -598,6 +609,7 @@ class Report(Condition):
|
|||
|
||||
# Setting(device, setting, [key], value...)
|
||||
class Setting(Condition):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
if not (isinstance(args, list) and len(args) > 2):
|
||||
if warn:
|
||||
|
@ -643,6 +655,7 @@ MODIFIER_MASK = MODIFIERS['Shift'] + MODIFIERS['Control'] + MODIFIERS['Alt'] + M
|
|||
|
||||
|
||||
class Modifiers(Condition):
|
||||
|
||||
def __init__(self, modifiers, warn=True):
|
||||
modifiers = [modifiers] if isinstance(modifiers, str) else modifiers
|
||||
self.desired = 0
|
||||
|
@ -725,6 +738,7 @@ def bit_test(start, end, bits):
|
|||
|
||||
|
||||
def range_test(start, end, min, max):
|
||||
|
||||
def range_test_helper(f, r, d):
|
||||
value = int.from_bytes(d[start:end], byteorder='big', signed=True)
|
||||
return min <= value <= max and (value if value else True)
|
||||
|
@ -733,6 +747,7 @@ def range_test(start, end, min, max):
|
|||
|
||||
|
||||
class Test(Condition):
|
||||
|
||||
def __init__(self, test, warn=True):
|
||||
self.test = test
|
||||
if isinstance(test, str):
|
||||
|
@ -767,6 +782,7 @@ class Test(Condition):
|
|||
|
||||
|
||||
class TestBytes(Condition):
|
||||
|
||||
def __init__(self, test, warn=True):
|
||||
self.test = test
|
||||
if (
|
||||
|
@ -836,6 +852,7 @@ class MouseGesture(Condition):
|
|||
|
||||
|
||||
class Active(Condition):
|
||||
|
||||
def __init__(self, devID, warn=True):
|
||||
if not (isinstance(devID, str)):
|
||||
if warn:
|
||||
|
@ -855,6 +872,7 @@ class Active(Condition):
|
|||
|
||||
|
||||
class Action(RuleComponent):
|
||||
|
||||
def __init__(self, *args):
|
||||
pass
|
||||
|
||||
|
@ -968,6 +986,7 @@ class KeyPress(Action):
|
|||
|
||||
|
||||
class MouseScroll(Action):
|
||||
|
||||
def __init__(self, amounts, warn=True):
|
||||
import numbers
|
||||
if len(amounts) == 1 and isinstance(amounts[0], list):
|
||||
|
@ -999,6 +1018,7 @@ class MouseScroll(Action):
|
|||
|
||||
|
||||
class MouseClick(Action):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
if len(args) == 1 and isinstance(args[0], list):
|
||||
args = args[0]
|
||||
|
@ -1033,6 +1053,7 @@ class MouseClick(Action):
|
|||
|
||||
|
||||
class Set(Action):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
if not (isinstance(args, list) and len(args) > 2):
|
||||
if warn:
|
||||
|
@ -1072,6 +1093,7 @@ class Set(Action):
|
|||
|
||||
|
||||
class Execute(Action):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
if isinstance(args, str):
|
||||
args = [args]
|
||||
|
@ -1097,6 +1119,7 @@ class Execute(Action):
|
|||
|
||||
|
||||
class Later(Action):
|
||||
|
||||
def __init__(self, args, warn=True):
|
||||
self.delay = 0
|
||||
self.rule = Rule([])
|
||||
|
|
|
@ -234,6 +234,7 @@ class FeatureCallError(_KwException):
|
|||
|
||||
|
||||
class FeaturesArray(dict):
|
||||
|
||||
def __init__(self, device):
|
||||
assert device is not None
|
||||
self.supported = True
|
||||
|
@ -332,6 +333,7 @@ class ReprogrammableKey:
|
|||
- default_task {_NamedInt} -- the native function of this control
|
||||
- flags {List[str]} -- capabilities and desired software handling of the control
|
||||
"""
|
||||
|
||||
def __init__(self, device, index, cid, tid, flags):
|
||||
self._device = device
|
||||
self.index = index
|
||||
|
@ -373,6 +375,7 @@ class ReprogrammableKeyV4(ReprogrammableKey):
|
|||
- remappable_to {List[_NamedInt]} -- list of actions which this control can be remapped to
|
||||
- mapping_flags {List[str]} -- mapping flags set on the control
|
||||
"""
|
||||
|
||||
def __init__(self, device, index, cid, tid, flags, pos, group, gmask):
|
||||
ReprogrammableKey.__init__(self, device, index, cid, tid, flags)
|
||||
self.pos = pos
|
||||
|
@ -515,6 +518,7 @@ class ReprogrammableKeyV4(ReprogrammableKey):
|
|||
|
||||
|
||||
class PersistentRemappableAction():
|
||||
|
||||
def __init__(self, device, index, cid, actionId, remapped, modifierMask, cidStatus):
|
||||
self._device = device
|
||||
self.index = index
|
||||
|
@ -580,6 +584,7 @@ class PersistentRemappableAction():
|
|||
|
||||
class KeysArray:
|
||||
"""A sequence of key mappings supported by a HID++ 2.0 device."""
|
||||
|
||||
def __init__(self, device, count, version):
|
||||
assert device is not None
|
||||
self.device = device
|
||||
|
@ -655,6 +660,7 @@ class KeysArray:
|
|||
|
||||
|
||||
class KeysArrayV1(KeysArray):
|
||||
|
||||
def __init__(self, device, count, version=1):
|
||||
super().__init__(device, count, version)
|
||||
"""The mapping from Control IDs to their native Task IDs.
|
||||
|
@ -682,6 +688,7 @@ class KeysArrayV1(KeysArray):
|
|||
|
||||
|
||||
class KeysArrayV4(KeysArrayV1):
|
||||
|
||||
def __init__(self, device, count):
|
||||
super().__init__(device, count, 4)
|
||||
|
||||
|
@ -702,6 +709,7 @@ class KeysArrayV4(KeysArrayV1):
|
|||
|
||||
# we are only interested in the current host, so use 0xFF for the host throughout
|
||||
class KeysArrayPersistent(KeysArray):
|
||||
|
||||
def __init__(self, device, count):
|
||||
super().__init__(device, count, 5)
|
||||
self._capabilities = None
|
||||
|
@ -886,6 +894,7 @@ ACTION_ID._fallback = lambda x: 'unknown:%04X' % x
|
|||
|
||||
|
||||
class Gesture:
|
||||
|
||||
def __init__(self, device, low, high, next_index, next_diversion_index):
|
||||
self._device = device
|
||||
self.id = low
|
||||
|
@ -1009,6 +1018,7 @@ class Param:
|
|||
|
||||
|
||||
class Spec:
|
||||
|
||||
def __init__(self, device, low, high):
|
||||
self._device = device
|
||||
self.id = low
|
||||
|
@ -1040,6 +1050,7 @@ class Gestures:
|
|||
Right now only some information fields are supported.
|
||||
WARNING: Assumes that parameters are always global, which is not the case.
|
||||
"""
|
||||
|
||||
def __init__(self, device):
|
||||
self.device = device
|
||||
self.gestures = {}
|
||||
|
|
|
@ -138,6 +138,7 @@ class EventsListener(_threading.Thread):
|
|||
|
||||
Incoming packets will be passed to the callback function in sequence.
|
||||
"""
|
||||
|
||||
def __init__(self, receiver, notifications_callback):
|
||||
super().__init__(name=self.__class__.__name__ + ':' + receiver.path.split('/')[2])
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ def bool_or_toggle(current, new):
|
|||
|
||||
# moved first for dependency reasons
|
||||
class Validator:
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device, **kwargs):
|
||||
return cls(**kwargs)
|
||||
|
@ -356,6 +357,7 @@ class Setting:
|
|||
class Settings(Setting):
|
||||
"""A setting descriptor for multiple choices, being a map from keys to values.
|
||||
Needs to be instantiated for each specific device."""
|
||||
|
||||
def read(self, cached=True):
|
||||
assert hasattr(self, '_value')
|
||||
assert hasattr(self, '_device')
|
||||
|
@ -453,6 +455,7 @@ class LongSettings(Setting):
|
|||
Allows multiple write requests, if the options don't fit in 16 bytes.
|
||||
The validator must return a list.
|
||||
Needs to be instantiated for each specific device."""
|
||||
|
||||
def read(self, cached=True):
|
||||
assert hasattr(self, '_value')
|
||||
assert hasattr(self, '_device')
|
||||
|
@ -548,6 +551,7 @@ class LongSettings(Setting):
|
|||
class BitFieldSetting(Setting):
|
||||
"""A setting descriptor for a set of choices represented by one bit each, being a map from options to booleans.
|
||||
Needs to be instantiated for each specific device."""
|
||||
|
||||
def read(self, cached=True):
|
||||
assert hasattr(self, '_value')
|
||||
assert hasattr(self, '_device')
|
||||
|
@ -653,6 +657,7 @@ class BitFieldWithOffsetAndMaskSetting(BitFieldSetting):
|
|||
"""A setting descriptor for a set of choices represented by one bit each,
|
||||
each one having an offset, being a map from options to booleans.
|
||||
Needs to be instantiated for each specific device."""
|
||||
|
||||
def _do_read(self):
|
||||
return {r: self._rw.read(self._device, r) for r in self._validator.prepare_read()}
|
||||
|
||||
|
@ -664,6 +669,7 @@ class BitFieldWithOffsetAndMaskSetting(BitFieldSetting):
|
|||
class RangeFieldSetting(Setting):
|
||||
"""A setting descriptor for a set of choices represented by one field each, with map from option names to range(0,n).
|
||||
Needs to be instantiated for each specific device."""
|
||||
|
||||
def read(self, cached=True):
|
||||
assert hasattr(self, '_value')
|
||||
assert hasattr(self, '_device')
|
||||
|
@ -819,6 +825,7 @@ class BitFieldValidator(Validator):
|
|||
self.byte_count = byte_count
|
||||
|
||||
def to_string(self, value):
|
||||
|
||||
def element_to_string(key, val):
|
||||
k = next((k for k in self.options if int(key) == k), None)
|
||||
return str(k) + ':' + str(val) if k is not None else '?'
|
||||
|
@ -1079,6 +1086,7 @@ class ChoicesMapValidator(ChoicesValidator):
|
|||
assert self._byte_count + len(self._write_prefix_bytes) + self._key_byte_count <= 14
|
||||
|
||||
def to_string(self, value):
|
||||
|
||||
def element_to_string(key, val):
|
||||
k, c = next(((k, c) for k, c in self.choices.items() if int(key) == k), (None, None))
|
||||
return str(k) + ':' + str(c[val]) if k is not None else '?'
|
||||
|
@ -1325,6 +1333,7 @@ class MultipleRangeValidator(Validator):
|
|||
|
||||
class ActionSettingRW:
|
||||
"""Special RW class for settings that turn on and off special processing when a key or button is depressed"""
|
||||
|
||||
def __init__(self, feature, name='', divert_setting_name='divert-keys'):
|
||||
self.feature = feature # not used?
|
||||
self.name = name
|
||||
|
@ -1357,6 +1366,7 @@ class ActionSettingRW:
|
|||
return _int2bytes(self.key.key, 2) if self.active and self.key else b'\x00\x00'
|
||||
|
||||
def write(self, device, data_bytes):
|
||||
|
||||
def handler(device, n): # Called on notification events from the device
|
||||
if n.sub_id < 0x40 and device.features.get_feature(n.sub_id) == _hidpp20.FEATURE.REPROG_CONTROLS_V4:
|
||||
if n.address == 0x00:
|
||||
|
@ -1413,6 +1423,7 @@ class ActionSettingRW:
|
|||
|
||||
class RawXYProcessing:
|
||||
"""Special class for processing RawXY action messages initiated by pressing a key with rawXY diversion capability"""
|
||||
|
||||
def __init__(self, device, name=''):
|
||||
self.device = device
|
||||
self.name = name
|
||||
|
|
|
@ -337,6 +337,7 @@ class ReportRate(_Setting):
|
|||
choices_universe = _NamedInts.range(1, 8)
|
||||
|
||||
class _rw_class(_FeatureRW): # no longer needed - set Onboard Profiles to disable
|
||||
|
||||
def write(self, device, data_bytes):
|
||||
# Host mode is required for report rate to be adjustable
|
||||
if _hidpp20.get_onboard_mode(device) != _hidpp20.ONBOARD_MODES.MODE_HOST:
|
||||
|
@ -344,6 +345,7 @@ class ReportRate(_Setting):
|
|||
return super().write(device, data_bytes)
|
||||
|
||||
class validator_class(_ChoicesV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
# if device.wpid == '408E':
|
||||
|
@ -387,6 +389,7 @@ class DivertGkeys(_Setting):
|
|||
validator_options = {'true_value': 0x01, 'false_value': 0x00, 'mask': 0xff}
|
||||
|
||||
class rw_class(_FeatureRW):
|
||||
|
||||
def __init__(self, feature):
|
||||
super().__init__(feature, write_fnid=0x20)
|
||||
|
||||
|
@ -467,6 +470,7 @@ class ReprogrammableKeys(_Settings):
|
|||
choices_universe = _special_keys.CONTROL
|
||||
|
||||
class rw_class:
|
||||
|
||||
def __init__(self, feature):
|
||||
self.feature = feature
|
||||
self.kind = _FeatureRW.kind
|
||||
|
@ -483,6 +487,7 @@ class ReprogrammableKeys(_Settings):
|
|||
return True
|
||||
|
||||
class validator_class(_ChoicesMapV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
choices = {}
|
||||
|
@ -495,6 +500,7 @@ class ReprogrammableKeys(_Settings):
|
|||
|
||||
|
||||
class DpiSlidingXY(_RawXYProcessing):
|
||||
|
||||
def activate_action(self):
|
||||
self.dpiSetting = next(filter(lambda s: s.name == 'dpi', self.device.settings), None)
|
||||
self.dpiChoices = list(self.dpiSetting.choices)
|
||||
|
@ -559,6 +565,7 @@ class DpiSlidingXY(_RawXYProcessing):
|
|||
|
||||
|
||||
class MouseGesturesXY(_RawXYProcessing):
|
||||
|
||||
def activate_action(self):
|
||||
self.dpiSetting = next(filter(lambda s: s.name == 'dpi', self.device.settings), None)
|
||||
self.fsmState = 'idle'
|
||||
|
@ -638,6 +645,7 @@ class DivertKeys(_Settings):
|
|||
choices_divert = _NamedInts(**{_('Regular'): 0, _('Diverted'): 1})
|
||||
|
||||
class rw_class:
|
||||
|
||||
def __init__(self, feature):
|
||||
self.feature = feature
|
||||
self.kind = _FeatureRW.kind
|
||||
|
@ -654,6 +662,7 @@ class DivertKeys(_Settings):
|
|||
return True
|
||||
|
||||
class validator_class(_ChoicesMapV):
|
||||
|
||||
def __init__(self, choices, key_byte_count=2, byte_count=1, mask=0x01):
|
||||
super().__init__(choices, key_byte_count, byte_count, mask)
|
||||
|
||||
|
@ -706,6 +715,7 @@ class AdjustableDpi(_Setting):
|
|||
choices_universe = _NamedInts.range(200, 4000, str, 50)
|
||||
|
||||
class validator_class(_ChoicesV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
# [1] getSensorDpiList(sensorIdx)
|
||||
|
@ -750,6 +760,7 @@ class SpeedChange(_Setting):
|
|||
rw_options = {'name': 'speed change'}
|
||||
|
||||
class rw_class(_ActionSettingRW):
|
||||
|
||||
def press_action(self): # switch sensitivity
|
||||
currentSpeed = self.device.persister.get('pointer_speed', None) if self.device.persister else None
|
||||
newSpeed = self.device.persister.get('_speed-change', None) if self.device.persister else None
|
||||
|
@ -765,6 +776,7 @@ class SpeedChange(_Setting):
|
|||
self.device.persister['_speed-change'] = currentSpeed
|
||||
|
||||
class validator_class(_ChoicesV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
key_index = device.keys.index(_special_keys.CONTROL.DPI_Change)
|
||||
|
@ -784,6 +796,7 @@ class DisableKeyboardKeys(_BitFieldSetting):
|
|||
choices_universe = _DKEY
|
||||
|
||||
class validator_class(_BitFieldV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
mask = device.feature_request(_F.KEYBOARD_DISABLE_KEYS, 0x00)[0]
|
||||
|
@ -807,9 +820,12 @@ class Multiplatform(_Setting):
|
|||
# as, for example, the integer value for 'Windows' can be different on different devices
|
||||
|
||||
class validator_class(_ChoicesV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
|
||||
def _str_os_versions(low, high):
|
||||
|
||||
def _str_os_version(version):
|
||||
if version == 0:
|
||||
return ''
|
||||
|
@ -862,6 +878,7 @@ class ChangeHost(_Setting):
|
|||
choices_universe = _NamedInts(**{'Host ' + str(i + 1): i for i in range(3)})
|
||||
|
||||
class validator_class(_ChoicesV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
infos = device.feature_request(_F.CHANGE_HOST)
|
||||
|
@ -971,6 +988,7 @@ class Gesture2Gestures(_BitFieldOMSetting):
|
|||
_labels = _GESTURE2_GESTURES_LABELS
|
||||
|
||||
class validator_class(_BitFieldOMV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device, om_method=None):
|
||||
options = [g for g in device.gestures.gestures.values() if g.can_be_enabled or g.default_enabled]
|
||||
|
@ -988,6 +1006,7 @@ class Gesture2Divert(_BitFieldOMSetting):
|
|||
_labels = _GESTURE2_GESTURES_LABELS
|
||||
|
||||
class validator_class(_BitFieldOMV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device, om_method=None):
|
||||
options = [g for g in device.gestures.gestures.values() if g.can_be_diverted]
|
||||
|
@ -1009,6 +1028,7 @@ class Gesture2Params(_LongSettings):
|
|||
_labels_sub = _GESTURE2_PARAMS_LABELS_SUB
|
||||
|
||||
class validator_class(_MultipleRangeV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
params = _hidpp20.get_gestures(device).params.values()
|
||||
|
@ -1033,6 +1053,7 @@ class MKeyLEDs(_BitFieldSetting):
|
|||
_labels = {k: (None, _('Lights up the %s key.') % k) for k in choices_universe}
|
||||
|
||||
class rw_class(_FeatureRW):
|
||||
|
||||
def __init__(self, feature):
|
||||
super().__init__(feature, write_fnid=0x10)
|
||||
|
||||
|
@ -1040,6 +1061,7 @@ class MKeyLEDs(_BitFieldSetting):
|
|||
return b'\x00'
|
||||
|
||||
class validator_class(_BitFieldV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
number = device.feature_request(setting_class.feature, 0x00)[0]
|
||||
|
@ -1057,6 +1079,7 @@ class MRKeyLED(_Setting):
|
|||
feature = _F.MR
|
||||
|
||||
class rw_class(_FeatureRW):
|
||||
|
||||
def __init__(self, feature):
|
||||
super().__init__(feature, write_fnid=0x00)
|
||||
|
||||
|
@ -1080,6 +1103,7 @@ class PersistentRemappableAction(_Settings):
|
|||
choices_universe = _special_keys.KEYS
|
||||
|
||||
class rw_class:
|
||||
|
||||
def __init__(self, feature):
|
||||
self.feature = feature
|
||||
self.kind = _FeatureRW.kind
|
||||
|
@ -1094,6 +1118,7 @@ class PersistentRemappableAction(_Settings):
|
|||
return v
|
||||
|
||||
class validator_class(_ChoicesMapV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
remap_keys = device.remap_keys
|
||||
|
@ -1146,6 +1171,7 @@ class Equalizer(_RangeFieldSetting):
|
|||
keys_universe = []
|
||||
|
||||
class validator_class(_PackedRangeV):
|
||||
|
||||
@classmethod
|
||||
def build(cls, setting_class, device):
|
||||
data = device.feature_request(_F.EQUALIZER, 0x00)
|
||||
|
|
|
@ -86,6 +86,7 @@ class ReceiverStatus(dict):
|
|||
"""The 'runtime' status of a receiver, mostly about the pairing process --
|
||||
is the pairing lock open or closed, any pairing errors, etc.
|
||||
"""
|
||||
|
||||
def __init__(self, receiver, changed_callback):
|
||||
assert receiver
|
||||
self._receiver = receiver
|
||||
|
@ -144,6 +145,7 @@ class DeviceStatus(dict):
|
|||
active/inactive, battery charge, lux, etc. It updates them mostly by
|
||||
processing incoming notification events from the device itself.
|
||||
"""
|
||||
|
||||
def __init__(self, device, changed_callback):
|
||||
assert device
|
||||
self._device = device
|
||||
|
@ -158,6 +160,7 @@ class DeviceStatus(dict):
|
|||
self.updated = 0
|
||||
|
||||
def to_string(self):
|
||||
|
||||
def _items():
|
||||
comma = False
|
||||
|
||||
|
|
|
@ -49,6 +49,7 @@ def run(receivers, args, find_receiver, _ignore):
|
|||
known_devices = [dev.number for dev in receiver]
|
||||
|
||||
class _HandleWithNotificationHook(int):
|
||||
|
||||
def notifications_hook(self, n):
|
||||
nonlocal known_devices
|
||||
assert n
|
||||
|
|
|
@ -159,6 +159,7 @@ def _cleanup_load(c):
|
|||
|
||||
|
||||
class _DeviceEntry(dict):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
|
@ -209,6 +210,7 @@ _yaml.add_representer(_NamedInt, named_int_representer)
|
|||
# that is directly connected. Here there is no way to realize that the two devices are the same.
|
||||
# So new entries are not created for unseen off-line receiver-connected devices except for those with protocol 1.0
|
||||
def persister(device):
|
||||
|
||||
def match(wpid, serial, modelId, unitId, c):
|
||||
return ((wpid and wpid == c.get(_KEY_WPID) and serial and serial == c.get(_KEY_SERIAL)) or (
|
||||
modelId and modelId != '000000000000' and modelId == c.get(_KEY_MODEL_ID) and unitId
|
||||
|
|
|
@ -69,6 +69,7 @@ def _ghost(device):
|
|||
class ReceiverListener(_listener.EventsListener):
|
||||
"""Keeps the status of a Receiver.
|
||||
"""
|
||||
|
||||
def __init__(self, receiver, status_changed_callback):
|
||||
super().__init__(receiver, self._notifications_handler)
|
||||
# no reason to enable polling yet
|
||||
|
|
|
@ -36,6 +36,7 @@ except ImportError:
|
|||
|
||||
|
||||
class TaskRunner(_Thread):
|
||||
|
||||
def __init__(self, name):
|
||||
super().__init__(name=name)
|
||||
self.daemon = True
|
||||
|
|
|
@ -23,6 +23,7 @@ from logging import getLogger
|
|||
import yaml as _yaml
|
||||
|
||||
import gi # isort:skip
|
||||
|
||||
gi.require_version('Gtk', '3.0') # NOQA: E402
|
||||
from gi.repository import GLib, Gtk, Gio # NOQA: E402 # isort:skip
|
||||
from logitech_receiver.status import ALERT # NOQA: E402 # isort:skip
|
||||
|
|
|
@ -37,6 +37,7 @@ del getLogger
|
|||
|
||||
|
||||
def _read_async(setting, force_read, sbox, device_is_online, sensitive):
|
||||
|
||||
def _do_read(s, force, sb, online, sensitive):
|
||||
v = s.read(not force)
|
||||
GLib.idle_add(_update_setting_item, sb, v, online, sensitive, priority=99)
|
||||
|
@ -45,6 +46,7 @@ def _read_async(setting, force_read, sbox, device_is_online, sensitive):
|
|||
|
||||
|
||||
def _write_async(setting, value, sbox, sensitive=True, key=None):
|
||||
|
||||
def _do_write(s, v, sb, key):
|
||||
try:
|
||||
if key is None:
|
||||
|
@ -72,6 +74,7 @@ def _write_async(setting, value, sbox, sensitive=True, key=None):
|
|||
|
||||
|
||||
class Control():
|
||||
|
||||
def __init__(**kwargs):
|
||||
pass
|
||||
|
||||
|
@ -96,6 +99,7 @@ class Control():
|
|||
|
||||
|
||||
class ToggleControl(Gtk.Switch, Control):
|
||||
|
||||
def __init__(self, sbox, delegate=None):
|
||||
super().__init__(halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER)
|
||||
self.init(sbox, delegate)
|
||||
|
@ -109,6 +113,7 @@ class ToggleControl(Gtk.Switch, Control):
|
|||
|
||||
|
||||
class SliderControl(Gtk.Scale, Control):
|
||||
|
||||
def __init__(self, sbox, delegate=None):
|
||||
super().__init__(halign=Gtk.Align.FILL)
|
||||
self.init(sbox, delegate)
|
||||
|
@ -143,6 +148,7 @@ def _create_choice_control(sbox, delegate=None, choices=None):
|
|||
|
||||
# GTK boxes have property lists, but the keys must be strings
|
||||
class ChoiceControlLittle(Gtk.ComboBoxText, Control):
|
||||
|
||||
def __init__(self, sbox, delegate=None, choices=None):
|
||||
super().__init__(halign=Gtk.Align.FILL)
|
||||
self.init(sbox, delegate)
|
||||
|
@ -168,6 +174,7 @@ class ChoiceControlLittle(Gtk.ComboBoxText, Control):
|
|||
|
||||
|
||||
class ChoiceControlBig(Gtk.Entry, Control):
|
||||
|
||||
def __init__(self, sbox, delegate=None, choices=None):
|
||||
super().__init__(halign=Gtk.Align.FILL)
|
||||
self.init(sbox, delegate)
|
||||
|
@ -218,6 +225,7 @@ class ChoiceControlBig(Gtk.Entry, Control):
|
|||
|
||||
|
||||
class MapChoiceControl(Gtk.HBox, Control):
|
||||
|
||||
def __init__(self, sbox, delegate=None):
|
||||
super().__init__(homogeneous=False, spacing=6)
|
||||
self.init(sbox, delegate)
|
||||
|
@ -268,6 +276,7 @@ class MapChoiceControl(Gtk.HBox, Control):
|
|||
|
||||
|
||||
class MultipleControl(Gtk.ListBox, Control):
|
||||
|
||||
def __init__(self, sbox, change, button_label='...', delegate=None):
|
||||
super().__init__()
|
||||
self.init(sbox, delegate)
|
||||
|
@ -311,6 +320,7 @@ class MultipleControl(Gtk.ListBox, Control):
|
|||
|
||||
|
||||
class MultipleToggleControl(MultipleControl):
|
||||
|
||||
def setup(self, setting):
|
||||
self._label_control_pairs = []
|
||||
for k in setting._validator.get_options():
|
||||
|
@ -358,6 +368,7 @@ class MultipleToggleControl(MultipleControl):
|
|||
|
||||
|
||||
class MultipleRangeControl(MultipleControl):
|
||||
|
||||
def setup(self, setting):
|
||||
self._items = []
|
||||
for item in setting._validator.items:
|
||||
|
@ -447,6 +458,7 @@ class MultipleRangeControl(MultipleControl):
|
|||
|
||||
|
||||
class PackedRangeControl(MultipleRangeControl):
|
||||
|
||||
def setup(self, setting):
|
||||
validator = setting._validator
|
||||
self._items = []
|
||||
|
|
|
@ -52,6 +52,7 @@ _rule_component_clipboard = None
|
|||
|
||||
|
||||
class RuleComponentWrapper(GObject.GObject):
|
||||
|
||||
def __init__(self, component, level=0, editable=False):
|
||||
self.component = component
|
||||
self.level = level
|
||||
|
@ -86,6 +87,7 @@ class RuleComponentWrapper(GObject.GObject):
|
|||
|
||||
|
||||
class DiversionDialog:
|
||||
|
||||
def __init__(self):
|
||||
|
||||
window = Gtk.Window()
|
||||
|
@ -701,6 +703,7 @@ class DiversionDialog:
|
|||
|
||||
|
||||
class CompletionEntry(Gtk.Entry):
|
||||
|
||||
def __init__(self, values, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
CompletionEntry.add_completion_to_entry(self, values)
|
||||
|
@ -748,6 +751,7 @@ class SmartComboBox(Gtk.ComboBox):
|
|||
as soon as the user finishes typing any accepted name.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self, all_values, blank='', completion=False, case_insensitive=False, replace_with_default_name=False, **kwargs
|
||||
):
|
||||
|
@ -949,6 +953,7 @@ class DeviceInfo:
|
|||
|
||||
|
||||
class AllDevicesInfo:
|
||||
|
||||
def __init__(self):
|
||||
self._devices = []
|
||||
self._lock = threading.Lock()
|
||||
|
@ -1965,6 +1970,7 @@ def _from_named_ints(v, all_values):
|
|||
|
||||
|
||||
class SetValueControl(Gtk.HBox):
|
||||
|
||||
def __init__(self, on_change, *args, accept_toggle=True, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.on_change = on_change
|
||||
|
|
Loading…
Reference in New Issue