77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
from kmk.util import intify_coordinate
|
|
|
|
|
|
class InternalState:
|
|
keys_pressed = set()
|
|
coord_keys_pressed = {}
|
|
|
|
def __init__(self, config):
|
|
self.config = config
|
|
|
|
def __repr__(self):
|
|
return 'InternalState({})'.format(self._to_dict())
|
|
|
|
def _to_dict(self):
|
|
ret = {
|
|
'keys_pressed': self.keys_pressed,
|
|
}
|
|
|
|
return ret
|
|
|
|
def _find_key_in_map(self, row, col):
|
|
# Later-added layers have priority. Sift through the layers
|
|
# in reverse order until we find a valid keycode object
|
|
for layer in self.reversed_active_layers:
|
|
layer_key = self.config.keymap[layer][row][col]
|
|
|
|
if self.config.debug_enabled:
|
|
print('Resolved key: {}'.format(layer_key))
|
|
|
|
return layer_key
|
|
|
|
def matrix_changed(self, row, col, is_pressed):
|
|
if self.config.debug_enabled:
|
|
print('Matrix changed (col, row, pressed?): {}, {}, {}'.format(
|
|
col, row, is_pressed,
|
|
))
|
|
|
|
int_coord = intify_coordinate(row, col)
|
|
kc_changed = self._find_key_in_map(row, col)
|
|
|
|
if kc_changed is None:
|
|
print('No key accessible for col, row: {}, {}'.format(row, col))
|
|
return self
|
|
|
|
return self.process_key(kc_changed, is_pressed, int_coord, (row, col))
|
|
|
|
def process_key(self, key, is_pressed, coord_int=None, coord_raw=None):
|
|
if self.tapping:
|
|
self._process_tap_dance(key, is_pressed)
|
|
else:
|
|
if is_pressed:
|
|
key._on_press(self, coord_int, coord_raw)
|
|
else:
|
|
key._on_release(self, coord_int, coord_raw)
|
|
|
|
if self.config.leader_mode % 2 == 1:
|
|
self._process_leader_mode()
|
|
|
|
return self
|
|
|
|
def remove_key(self, keycode):
|
|
self.keys_pressed.discard(keycode)
|
|
return self.process_key(keycode, False)
|
|
|
|
def add_key(self, keycode):
|
|
self.keys_pressed.add(keycode)
|
|
return self.process_key(keycode, True)
|
|
|
|
def tap_key(self, keycode):
|
|
self.add_key(keycode)
|
|
# On the next cycle, we'll remove the key.
|
|
self.set_timeout(False, lambda: self.remove_key(keycode))
|
|
|
|
return self
|
|
|
|
|