]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Add timeout option to MODS_ONESHOT #66
authortmk <nobody@nowhere>
Mon, 7 Oct 2013 14:28:17 +0000 (23:28 +0900)
committertmk <nobody@nowhere>
Mon, 7 Oct 2013 14:28:17 +0000 (23:28 +0900)
common/action.c
common/action_util.c
doc/keymap.md
keyboard/hhkb/Makefile
keyboard/hhkb/config.h

index ecd5a7e94f8840d1c54e0a79f72f2669d2b23df4..f7ae85b94182c06b251ab82230a36ad37782ced5 100644 (file)
@@ -100,40 +100,29 @@ void process_action(keyrecord_t *record)
                                                                     action.key.mods<<4;
                 switch (action.layer_tap.code) {
     #ifndef NO_ACTION_ONESHOT
-                    case 0x00:
+                    case MODS_ONESHOT:
                         // Oneshot modifier
                         if (event.pressed) {
                             if (tap_count == 0) {
-                                dprint("MODS_TAP: Oneshot: add_mods\n");
                                 register_mods(mods);
                             }
                             else if (tap_count == 1) {
                                 dprint("MODS_TAP: Oneshot: start\n");
                                 set_oneshot_mods(mods);
                             }
-                            else if (tap_count == TAPPING_TOGGLE) {
-                                dprint("MODS_TAP: Oneshot: toggle\n");
-                                oneshot_toggle();
-                            }
                             else {
-                                dprint("MODS_TAP: Oneshot: cancel&add_mods\n");
-                                // double tap cancels oneshot and works as normal modifier.
-                                clear_oneshot_mods();
                                 register_mods(mods);
                             }
                         } else {
                             if (tap_count == 0) {
-                                dprint("MODS_TAP: Oneshot: cancel/del_mods\n");
-                                // cancel oneshot on hold
                                 clear_oneshot_mods();
                                 unregister_mods(mods);
                             }
                             else if (tap_count == 1) {
-                                // Oneshot
+                                // Retain Oneshot mods
                             }
                             else {
-                                dprint("MODS_TAP: Oneshot: del_mods\n");
-                                // cancel Mods
+                                clear_oneshot_mods();
                                 unregister_mods(mods);
                             }
                         }
index 50d686a07dc31035cf4aceaee4b70b89dbf478b0..99a3adaab63fc2cf8f61fc17c49557d742932622 100644 (file)
@@ -18,6 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "report.h"
 #include "debug.h"
 #include "action_util.h"
+#include "timer.h"
 
 static inline void add_key_byte(uint8_t code);
 static inline void del_key_byte(uint8_t code);
@@ -35,17 +36,28 @@ static uint8_t weak_mods = 0;
 report_keyboard_t *keyboard_report = &(report_keyboard_t){};
 
 #ifndef NO_ACTION_ONESHOT
-static bool oneshot_enabled = true;
 static int8_t oneshot_mods = 0;
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+static int16_t oneshot_time = 0;
 #endif
+#endif
+
 
 void send_keyboard_report(void) {
     keyboard_report->mods  = real_mods;
     keyboard_report->mods |= weak_mods;
 #ifndef NO_ACTION_ONESHOT
-    keyboard_report->mods |= oneshot_mods;
-    if (has_anykey()) {
-        clear_oneshot_mods();
+    if (oneshot_mods) {
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+        if (TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT) {
+            dprintf("Oneshot: timeout\n");
+            clear_oneshot_mods();
+        }
+#endif
+        keyboard_report->mods |= oneshot_mods;
+        if (has_anykey()) {
+            clear_oneshot_mods();
+        }
     }
 #endif
     host_keyboard_send(keyboard_report);
@@ -99,11 +111,20 @@ void clear_weak_mods(void) { weak_mods = 0; }
 
 /* Oneshot modifier */
 #ifndef NO_ACTION_ONESHOT
-void set_oneshot_mods(uint8_t mods) { oneshot_mods = mods; }
-void clear_oneshot_mods(void) { oneshot_mods = 0; }
-void oneshot_toggle(void) { oneshot_enabled = !oneshot_enabled; }
-void oneshot_enable(void) { oneshot_enabled = true; }
-void oneshot_disable(void) { oneshot_enabled = false; }
+void set_oneshot_mods(uint8_t mods)
+{
+    oneshot_mods = mods;
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    oneshot_time = timer_read();
+#endif
+}
+void clear_oneshot_mods(void)
+{
+    oneshot_mods = 0;
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    oneshot_time = 0;
+#endif
+}
 #endif
 
 
index c509651be69324de011eaf57b6630536af02ceee..11e80a9c319b8935520a61f9ac14ac3ca729f587 100644 (file)
@@ -516,13 +516,14 @@ This is a feature to assign both toggle layer and momentary switch layer action
     ACTION_LAYER_TAP_TOGGLE(1)
 
 
-### 4.3 One Shot Modifier
-This adds oneshot feature to modifier key. 'One Shot Modifier' is one time modifier which has effect only on following just one key.
-It works as normal modifier key when holding but oneshot modifier when tapping.
+### 4.3 Oneshot Modifier
+This runs onetime effect swhich modify only on just one following key. It works as normal modifier key when holding down while oneshot modifier when tapping.
 
     ACTION_MODS_ONESHOT(MOD_LSFT)
 
-Say you want to type 'The', you have to push and hold Shift before type 't' then release Shift before type 'h' and 'e' or you'll get 'THe'. With One Shot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here.
+Say you want to type 'The', you have to push and hold Shift key before type 't' then release it before type 'h' and 'e', otherwise you'll get 'THe' or 'the' unintentionally. With Oneshot Modifier you can tap Shift then type 't', 'h' and 'e' normally, you don't need to holding Shift key properly here. This mean you can realease Shift before 't' is pressed down.
+
+Oneshot effect is cancel unless following key is pressed down within `ONESHOT_TIMEOUT` of `config.h`. No timeout when it is `0` or not defined.
 
 
 
index 34bafc24fc00e3c63b06265358c3311e98ec5984..94078702c4e35f83556f823560fc7c0540f49ef2 100644 (file)
@@ -128,6 +128,8 @@ include $(TOP_DIR)/protocol/lufa.mk
 include $(TOP_DIR)/common.mk
 include $(TOP_DIR)/rules.mk
 
-debug-on: EXTRAFLAGS += -DDEBUG
-#debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
+debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
 debug-on: all
+
+debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
+debug-off: all
index 83a911beab19be3d9c28679cc3469fe9f16b1a2a..a8f76ae6b07066802787833718ef1e217e273693 100644 (file)
@@ -40,7 +40,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define TAPPING_TERM    300
 /* tap count needed for toggling a feature */
 #define TAPPING_TOGGLE  5
-
+/* Oneshot timeout(ms) */
+#define ONESHOT_TIMEOUT 300
 
 /* Boot Magic salt key: Space */
 #define BOOTMAGIC_KEY_SALT      KC_FN6