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' 'When unset, the F1..F12 keys will activate their standard function,\n'
'and you must hold the FN key to activate their special function.')) '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): def _register_smooth_scroll(register, true_value, mask):
return _settings.register_toggle(_SMOOTH_SCROLL[0], register, true_value=true_value, mask=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 Keyboard K360')
_D('Wireless Touch Keyboard K400') _D('Wireless Touch Keyboard K400')
_D('Wireless Solar Keyboard K750') _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('Zone Touch Mouse T400')
_D('Wireless Rechargeable Touchpad T650') _D('Wireless Rechargeable Touchpad T650')
_D('Logitech Cube', kind='mouse') _D('Logitech Cube', kind='mouse')

View File

@ -121,9 +121,18 @@ class _BooleanValidator(object):
self.mask = mask self.mask = mask
self.write_returns_value = write_returns_value 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): def validate_read(self, reply_bytes):
reply_value = ord(reply_bytes[:1]) & self.mask return self._validate_value(reply_bytes, self.true_value)
return reply_value == self.true_value
def prepare_write(self, value): def prepare_write(self, value):
# FIXME: this does not work right when there is more than one flag in # 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): def validate_write(self, value, reply_bytes):
if self.write_returns_value: if self.write_returns_value:
reply_value = ord(reply_bytes[:1]) & self.mask return self._validate_value(reply_bytes, self.true_value)
return reply_value == self.true_value
# just assume the value was written correctly, otherwise there would not # just assume the value was written correctly, otherwise there would not
# be any reply_bytes to check # be any reply_bytes to check