diff --git a/docs/capsword.md b/docs/capsword.md new file mode 100644 index 0000000..b7c7a1b --- /dev/null +++ b/docs/capsword.md @@ -0,0 +1,27 @@ +# CapsWord +The CapsWord module makes a key available that will function similar to caps lock but will deactive automatically when its encounters a key that breaks the word or after inactivity timeout. +By default it will not deactive capsword on numbers, alphabets, underscore, modifiers, minus, backspace and other keys like modtap, layers, etc +Add it to your keyboard's modules list with: + +```python +from kmk.modules.capsword import CapsWord +# default inactivity timeout is 8s +caps_word=CapsWord() +# change inactivity timeout +# caps_word=CapsWord(timeout=5000) +# for no inactivity timeout +# caps_word=CapsWord(timeout=0) +# add additional ignored keys +# caps_word.keys_ignored.append(KC.COMMA) +keyboard.modules.append(caps_word) +keyboard.keymap = [ + [ + KC.CW, + ], +] +``` +## Keycodes + +|Key |Aliases |Description | +|-----------------------|--------------------|-----------------------------------------------| +|`KC.CW` |`KC.CAPSWORD` |Enables/disables capsword | \ No newline at end of file diff --git a/kmk/modules/capsword.py b/kmk/modules/capsword.py index 2b08fee..d88ffa4 100755 --- a/kmk/modules/capsword.py +++ b/kmk/modules/capsword.py @@ -1,4 +1,4 @@ -from kmk.keys import KC, ModifierKey, make_key +from kmk.keys import FIRST_KMK_INTERNAL_KEY, KC, ModifierKey, make_key from kmk.modules import Module @@ -6,13 +6,13 @@ class CapsWord(Module): # default timeout is 8000 # alphabets, numbers and few more keys will not disable capsword def __init__(self, timeout=8000): - self.alphabets = range(KC.A.code, KC.Z.code) - self.numbers = range(KC.N1.code, KC.N0.code) - self.keys_ignored = ( + self._alphabets = range(KC.A.code, KC.Z.code) + self._numbers = range(KC.N1.code, KC.N0.code) + self.keys_ignored = [ KC.MINS, KC.BSPC, KC.UNDS, - ) + ] self._timeout_key = False self._cw_active = False self.timeout = timeout @@ -21,14 +21,12 @@ class CapsWord(Module): 'CAPSWORD', 'CW', ), + on_press=self.cw_pressed, ) def during_bootup(self, keyboard): return - def matrix_detected_press(self, keyboard): - return keyboard.matrix_update is None - def before_matrix_scan(self, keyboard): return @@ -36,14 +34,14 @@ class CapsWord(Module): if self._cw_active and key != KC.CW: continue_cw = False # capitalize alphabets - if key.code in self.alphabets: + if key.code in self._alphabets: continue_cw = True keyboard.process_key(KC.LSFT, is_pressed) elif ( - key.code in self.numbers + key.code in self._numbers or isinstance(key, ModifierKey) or key in self.keys_ignored - or key.code >= 1000 # user defined keys are also ignored + or key.code >= FIRST_KMK_INTERNAL_KEY # user defined keys are also ignored ): continue_cw = True # requests and cancels existing timeouts @@ -54,15 +52,6 @@ class CapsWord(Module): else: self.process_timeout() - # enables/disables capsword - if key == KC.CW and is_pressed: - if not self._cw_active: - self._cw_active = True - self.discard_timeout(keyboard) - self.request_timeout(keyboard) - else: - self.discard_timeout(keyboard) - self.process_timeout() return key def before_hid_send(self, keyboard): @@ -96,3 +85,14 @@ class CapsWord(Module): if self.timeout: keyboard.cancel_timeout(self._timeout_key) self._timeout_key = False + + def cw_pressed(self, key, keyboard, *args, **kwargs): + # enables/disables capsword + if key == KC.CW: + if not self._cw_active: + self._cw_active = True + self.discard_timeout(keyboard) + self.request_timeout(keyboard) + else: + self.discard_timeout(keyboard) + self.process_timeout()