From be308d516fca6544f3a0a7acbafa731dd5c76217 Mon Sep 17 00:00:00 2001
From: Syed Hussaini <masiullah@gmail.com>
Date: Sat, 9 Apr 2022 15:02:49 -0500
Subject: [PATCH] added docs

---
 docs/capsword.md        | 27 +++++++++++++++++++++++++++
 kmk/modules/capsword.py | 40 ++++++++++++++++++++--------------------
 2 files changed, 47 insertions(+), 20 deletions(-)
 create mode 100644 docs/capsword.md

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()