# HG changeset patch # User Jacob Alexander # Date 1431297135 25200 # Node ID 159d6ede7ed39f1fef4c1416194fadf92d3a17ac # Parent b242f1b264d6cf946b0a7a9c1614e22820c273d1 Adding None keyword (0.3b) - Prevents fall-through - Cannot be combined with other result capabilities diff -r b242f1b264d6 -r 159d6ede7ed3 backends/kiibohd.py --- a/backends/kiibohd.py Sun May 10 14:52:07 2015 -0700 +++ b/backends/kiibohd.py Sun May 10 15:32:15 2015 -0700 @@ -168,16 +168,23 @@ # 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 diff -r b242f1b264d6 -r 159d6ede7ed3 examples/simple2.kll --- a/examples/simple2.kll Sun May 10 14:52:07 2015 -0700 +++ b/examples/simple2.kll Sun May 10 15:32:15 2015 -0700 @@ -39,3 +39,5 @@ S0x46 : SYS["UnDock"]; S0x47 : SYS0xA2; +S0x48 : None; + diff -r b242f1b264d6 -r 159d6ede7ed3 kll.py --- a/kll.py Sun May 10 14:52:07 2015 -0700 +++ b/kll.py Sun May 10 15:32:15 2015 -0700 @@ -255,6 +255,10 @@ 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 @@ 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 @@ # 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 diff -r b242f1b264d6 -r 159d6ede7ed3 kll_lib/hid_dict.py --- a/kll_lib/hid_dict.py Sun May 10 14:52:07 2015 -0700 +++ b/kll_lib/hid_dict.py Sun May 10 15:32:15 2015 -0700 @@ -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