- Prevents fall-through - Cannot be combined with other result capabilitiesmaster
@@ -168,16 +168,23 @@ class Backend( BackendBase ): | |||
# Add each of the arguments of the capability | |||
for arg in range( 0, len( resultItem[1] ) ): | |||
# If this is a CONSUMER_ element, needs to be split into 2 elements | |||
if isinstance( resultItem[1][ arg ], str ) and re.match( '^CONSUMER_', resultItem[1][ arg ] ): | |||
tag = resultItem[1][ arg ].split( '_', 1 )[1] | |||
if '_' in tag: | |||
tag = tag.replace( '_', '' ) | |||
lookupNum = kll_hid_lookup_dictionary['ConsCode'][ tag ][1] | |||
byteForm = lookupNum.to_bytes( 2, byteorder='little' ) # XXX Yes, little endian from how the uC structs work | |||
self.fill_dict['ResultMacros'] += "{0}, {1}, ".format( *byteForm ) | |||
else: | |||
self.fill_dict['ResultMacros'] += "{0}, ".format( resultItem[1][ arg ] ) | |||
# Special cases | |||
if isinstance( resultItem[1][ arg ], str ): | |||
# If this is a CONSUMER_ element, needs to be split into 2 elements | |||
if re.match( '^CONSUMER_', resultItem[1][ arg ] ): | |||
tag = resultItem[1][ arg ].split( '_', 1 )[1] | |||
if '_' in tag: | |||
tag = tag.replace( '_', '' ) | |||
lookupNum = kll_hid_lookup_dictionary['ConsCode'][ tag ][1] | |||
byteForm = lookupNum.to_bytes( 2, byteorder='little' ) # XXX Yes, little endian from how the uC structs work | |||
self.fill_dict['ResultMacros'] += "{0}, {1}, ".format( *byteForm ) | |||
continue | |||
# None, fall-through disable | |||
elif resultItem[0] is self.capabilityLookup('NONE'): | |||
continue | |||
self.fill_dict['ResultMacros'] += "{0}, ".format( resultItem[1][ arg ] ) | |||
# If sequence is longer than 1, append a sequence spacer at the end of the sequence | |||
# Required by USB to end at sequence without holding the key down |
@@ -39,3 +39,5 @@ S0x45 : SYS[0xA0]; | |||
S0x46 : SYS["UnDock"]; | |||
S0x47 : SYS0xA2; | |||
S0x48 : None; | |||
@@ -255,6 +255,10 @@ def make_consCode_number( token ): | |||
def make_sysCode_number( token ): | |||
return make_hidCode_number( 'SysCode', token ) | |||
# Replace key-word with None specifier (which indicates a noneOut capability) | |||
def make_none( token ): | |||
return [[[('NONE', 0)]]] | |||
def make_seqString( token ): | |||
# Shifted Characters, and amount to move by to get non-shifted version | |||
# US ANSI | |||
@@ -535,6 +539,7 @@ usbCode = tokenType('USBCode') >> make_usbCode | |||
scanCode = tokenType('ScanCode') >> make_scanCode | |||
consCode = tokenType('ConsCode') >> make_consCode | |||
sysCode = tokenType('SysCode') >> make_sysCode | |||
none = tokenType('None') >> make_none | |||
name = tokenType('Name') | |||
number = tokenType('Number') >> make_number | |||
comma = tokenType('Comma') | |||
@@ -603,7 +608,7 @@ capFunc_sequence = oneplus( ( capFunc_combo | seqString ) + skip( maybe( comma | |||
# Trigger / Result Codes | |||
triggerCode_outerList = scanCode_sequence >> optionExpansion | |||
triggerUSBCode_outerList = usbCode_sequence >> optionExpansion >> hidCodeToCapability | |||
resultCode_outerList = capFunc_sequence >> optionExpansion >> hidCodeToCapability | |||
resultCode_outerList = ( ( capFunc_sequence >> optionExpansion ) | none ) >> hidCodeToCapability | |||
## Main Rules |
@@ -20,6 +20,9 @@ | |||
# Rather than generating tables of hex USB codes for the keymapping tables, readable defines are used (which correspond to usb_hid.h) | |||
hid_lookup_dictionary = dict([ | |||
# Fall-through block | |||
( ('NONE', 0), '' ), # Special case, there are no arguments | |||
# USB HID Keyboard Codes | |||
( ('USB', 0x00), 'KEY_NOEVENT' ), # Event, not a physical key | |||
( ('USB', 0x01), 'KEY_ERRORROLLOVER' ), # Event, not a physical key |