From d05f7ae8204841268e44d4c199416c3c0da4dd33 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 10 May 2015 15:32:15 -0700 Subject: [PATCH] Adding None keyword (0.3b) - Prevents fall-through - Cannot be combined with other result capabilities --- backends/kiibohd.py | 27 +++++++++++++++++---------- examples/simple2.kll | 2 ++ kll.py | 7 ++++++- kll_lib/hid_dict.py | 3 +++ 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/backends/kiibohd.py b/backends/kiibohd.py index 44daad8..c03f853 100644 --- a/backends/kiibohd.py +++ b/backends/kiibohd.py @@ -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 diff --git a/examples/simple2.kll b/examples/simple2.kll index 9183d3f..9e03c46 100644 --- a/examples/simple2.kll +++ b/examples/simple2.kll @@ -39,3 +39,5 @@ S0x45 : SYS[0xA0]; S0x46 : SYS["UnDock"]; S0x47 : SYS0xA2; +S0x48 : None; + diff --git a/kll.py b/kll.py index 95884da..668b816 100755 --- a/kll.py +++ b/kll.py @@ -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 diff --git a/kll_lib/hid_dict.py b/kll_lib/hid_dict.py index d92a6c0..e339570 100644 --- a/kll_lib/hid_dict.py +++ b/kll_lib/hid_dict.py @@ -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 -- 2.39.2