Merge pull request #24 from Lekensteyn/hid10-fnkey

Add FN key swap support for K800 (and presumably K710)
This commit is contained in:
Daniel Pavel 2013-04-28 02:03:33 -07:00
commit c4dc49ac5e
2 changed files with 28 additions and 5 deletions

View File

@ -23,6 +23,12 @@ _FN_SWAP = ('fn-swap', 'Swap Fx function', ('When set, the F1..F12 keys will act
'When unset, the F1..F12 keys will activate their standard function,\n'
'and you must hold the FN key to activate their special function.'))
# this register is only applicable to HID++ 1.0 devices, it should not exist with HID++ 2.0 devices
# using Features
def _register_fn_swap(register, true_value, mask):
return _settings.register_toggle(_FN_SWAP[0], register, true_value=true_value, mask=mask,
label=_FN_SWAP[1], description=_FN_SWAP[2])
def _register_smooth_scroll(register, true_value, mask):
return _settings.register_toggle(_SMOOTH_SCROLL[0], register, true_value=true_value, mask=mask,
@ -85,7 +91,16 @@ _D('Wireless Keyboard K350')
_D('Wireless Keyboard K360')
_D('Wireless Touch Keyboard K400')
_D('Wireless Solar Keyboard K750')
_D('Wireless Illuminated Keyboard K800')
_D('Wireless Keyboard K710',
settings=[
_register_fn_swap(0x09, true_value=b'\x00\x01', mask=b'\x00\x01'),
],
)
_D('Wireless Illuminated Keyboard K800',
settings=[
_register_fn_swap(0x09, true_value=b'\x00\x01', mask=b'\x00\x01'),
],
)
_D('Zone Touch Mouse T400')
_D('Wireless Rechargeable Touchpad T650')
_D('Logitech Cube', kind='mouse')

View File

@ -121,9 +121,18 @@ class _BooleanValidator(object):
self.mask = mask
self.write_returns_value = write_returns_value
def _validate_value(self, reply_bytes, expected_value):
if isinstance(expected_value, int):
return ord(reply_bytes[:1]) & self.mask == expected_value
else:
for i in range(0, len(self.mask)):
masked_value = ord(reply_bytes[i:i+1]) & ord(self.mask[i:i+1])
if masked_value != ord(expected_value[i:i+1]):
return False
return True
def validate_read(self, reply_bytes):
reply_value = ord(reply_bytes[:1]) & self.mask
return reply_value == self.true_value
return self._validate_value(reply_bytes, self.true_value)
def prepare_write(self, value):
# FIXME: this does not work right when there is more than one flag in
@ -132,8 +141,7 @@ class _BooleanValidator(object):
def validate_write(self, value, reply_bytes):
if self.write_returns_value:
reply_value = ord(reply_bytes[:1]) & self.mask
return reply_value == self.true_value
return self._validate_value(reply_bytes, self.true_value)
# just assume the value was written correctly, otherwise there would not
# be any reply_bytes to check