Beginnings of basic tap dance
This commit is contained in:
parent
cc1bfc657f
commit
b0f8c58828
@ -28,6 +28,8 @@ class InternalState:
|
|||||||
'leader': None,
|
'leader': None,
|
||||||
}
|
}
|
||||||
timeouts = {}
|
timeouts = {}
|
||||||
|
tapping = False
|
||||||
|
tap_dance_counts = {}
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
@ -45,6 +47,7 @@ class InternalState:
|
|||||||
Keycodes.KMK.KC_LEAD.code: self._kc_lead,
|
Keycodes.KMK.KC_LEAD.code: self._kc_lead,
|
||||||
Keycodes.KMK.KC_NO.code: self._kc_no,
|
Keycodes.KMK.KC_NO.code: self._kc_no,
|
||||||
Keycodes.KMK.KC_DEBUG.code: self._kc_debug_mode,
|
Keycodes.KMK.KC_DEBUG.code: self._kc_debug_mode,
|
||||||
|
RawKeycodes.KC_TAP_DANCE: self._kc_tap_dance,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -57,6 +60,8 @@ class InternalState:
|
|||||||
'leader_mode_history': self.leader_mode_history,
|
'leader_mode_history': self.leader_mode_history,
|
||||||
'leader_mode': self.config.leader_mode,
|
'leader_mode': self.config.leader_mode,
|
||||||
'start_time': self.start_time,
|
'start_time': self.start_time,
|
||||||
|
'tapping': self.tapping,
|
||||||
|
'tap_dance_counts': self.tap_dance_counts,
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
@ -103,24 +108,27 @@ class InternalState:
|
|||||||
print('No key accessible for col, row: {}, {}'.format(row, col))
|
print('No key accessible for col, row: {}, {}'.format(row, col))
|
||||||
return self
|
return self
|
||||||
|
|
||||||
if is_pressed:
|
if self.tapping:
|
||||||
self.keys_pressed.add(kc_changed)
|
self._process_tap_dance(kc_changed, is_pressed)
|
||||||
self.coord_keys_pressed[int_coord] = kc_changed
|
|
||||||
else:
|
else:
|
||||||
self.keys_pressed.discard(kc_changed)
|
if is_pressed:
|
||||||
self.keys_pressed.discard(self.coord_keys_pressed[int_coord])
|
self.keys_pressed.add(kc_changed)
|
||||||
self.coord_keys_pressed[int_coord] = None
|
self.coord_keys_pressed[int_coord] = kc_changed
|
||||||
|
else:
|
||||||
|
self.keys_pressed.discard(kc_changed)
|
||||||
|
self.keys_pressed.discard(self.coord_keys_pressed.get(int_coord, None))
|
||||||
|
self.coord_keys_pressed[int_coord] = None
|
||||||
|
|
||||||
if kc_changed.code >= FIRST_KMK_INTERNAL_KEYCODE:
|
if kc_changed.code >= FIRST_KMK_INTERNAL_KEYCODE:
|
||||||
self._process_internal_key_event(
|
self._process_internal_key_event(
|
||||||
kc_changed,
|
kc_changed,
|
||||||
is_pressed,
|
is_pressed,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.hid_pending = True
|
self.hid_pending = True
|
||||||
|
|
||||||
if self.config.leader_mode % 2 == 1:
|
if self.config.leader_mode % 2 == 1:
|
||||||
self._process_leader_mode()
|
self._process_leader_mode()
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@ -318,6 +326,50 @@ class InternalState:
|
|||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def _kc_tap_dance(self, changed_key, is_pressed):
|
||||||
|
if is_pressed:
|
||||||
|
self._begin_tap_dance(changed_key)
|
||||||
|
else:
|
||||||
|
self._end_tap_dance()
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _begin_tap_dance(self, changed_key):
|
||||||
|
self.tap_dance_counts[changed_key] = 1
|
||||||
|
self.set_timeout(500, self._end_tap_dance)
|
||||||
|
self.tapping = changed_key
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _process_tap_dance(self, changed_key, is_pressed):
|
||||||
|
if is_pressed:
|
||||||
|
if (
|
||||||
|
changed_key not in self.tap_dance_counts or
|
||||||
|
not self.tap_dance_counts[changed_key]
|
||||||
|
):
|
||||||
|
self._end_tap_dance()
|
||||||
|
else:
|
||||||
|
self.tap_dance_counts[changed_key] += 1
|
||||||
|
|
||||||
|
if self.tap_dance_counts[changed_key] == len(changed_key.codes):
|
||||||
|
self._end_tap_dance()
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
|
def _end_tap_dance(self):
|
||||||
|
k = self.tapping
|
||||||
|
|
||||||
|
if not k:
|
||||||
|
# already handled elsewhere?
|
||||||
|
return self
|
||||||
|
|
||||||
|
v = self.tap_dance_counts[k] - 1
|
||||||
|
|
||||||
|
self.pending_keys.append(k.codes[min(v, len(k.codes) - 1)])
|
||||||
|
self.tap_dance_counts[k] = 0
|
||||||
|
self.tapping = False
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
def _begin_leader_mode(self):
|
def _begin_leader_mode(self):
|
||||||
if self.config.leader_mode % 2 == 0:
|
if self.config.leader_mode % 2 == 0:
|
||||||
self.keys_pressed.discard(Keycodes.KMK.KC_LEAD)
|
self.keys_pressed.discard(Keycodes.KMK.KC_LEAD)
|
||||||
|
@ -80,6 +80,7 @@ class RawKeycodes:
|
|||||||
|
|
||||||
KC_MACRO = 1110
|
KC_MACRO = 1110
|
||||||
KC_MACRO_SLEEP_MS = 1111
|
KC_MACRO_SLEEP_MS = 1111
|
||||||
|
KC_TAP_DANCE = 1113
|
||||||
|
|
||||||
|
|
||||||
# These shouldn't have all the fancy shenanigans Keycode allows
|
# These shouldn't have all the fancy shenanigans Keycode allows
|
||||||
@ -184,6 +185,13 @@ class Macro:
|
|||||||
return self.keyup() if self.keyup else None
|
return self.keyup() if self.keyup else None
|
||||||
|
|
||||||
|
|
||||||
|
class TapDanceKeycode:
|
||||||
|
code = RawKeycodes.KC_TAP_DANCE
|
||||||
|
|
||||||
|
def __init__(self, *codes):
|
||||||
|
self.codes = codes
|
||||||
|
|
||||||
|
|
||||||
class KeycodeCategory(type):
|
class KeycodeCategory(type):
|
||||||
@classmethod
|
@classmethod
|
||||||
def to_dict(cls):
|
def to_dict(cls):
|
||||||
@ -551,6 +559,13 @@ class KMK(KeycodeCategory):
|
|||||||
def KC_MACRO_SLEEP_MS(ms):
|
def KC_MACRO_SLEEP_MS(ms):
|
||||||
return MacroSleepKeycode(RawKeycodes.KC_MACRO_SLEEP_MS, ms)
|
return MacroSleepKeycode(RawKeycodes.KC_MACRO_SLEEP_MS, ms)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def KC_TAP_DANCE(*args):
|
||||||
|
return TapDanceKeycode(*args)
|
||||||
|
|
||||||
|
|
||||||
|
KMK.KC_TD = KMK.KC_TAP_DANCE
|
||||||
|
|
||||||
|
|
||||||
class Layers(KeycodeCategory):
|
class Layers(KeycodeCategory):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -61,7 +61,7 @@ keyboard.keymap = [
|
|||||||
[KC.GESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC],
|
[KC.GESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC],
|
||||||
[KC.TAB, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT],
|
[KC.TAB, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT],
|
||||||
[KC.LGUI, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT],
|
[KC.LGUI, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.LALT],
|
||||||
[KC.LCTL, KC.LEAD, KC.LSHIFT(KC.LGUI), KC.MO(2), KC.MO(3), KC.LSFT, KC.SPC, KC.MO(1), KC.LEFT, KC.DOWN, KC.UP, KC.RGHT],
|
[KC.LCTL, KC.TD(KC.A, KC.B), KC.LSHIFT(KC.LGUI), KC.MO(2), KC.MO(3), KC.LSFT, KC.SPC, KC.MO(1), KC.LEFT, KC.DOWN, KC.UP, KC.RGHT],
|
||||||
],
|
],
|
||||||
|
|
||||||
[
|
[
|
||||||
|
Loading…
x
Reference in New Issue
Block a user