]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - common/action.c
Add NO_ACTION_ONESHOT config option
[max/tmk_keyboard.git] / common / action.c
index 1b84d1e884c7185c61ed514303225b179d5b7d62..49bfc54e7ea61b018c4483442c53bd9ae3419fe4 100644 (file)
@@ -25,19 +25,24 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "led.h"
 #include "layer_switch.h"
+#include "action_oneshot.h"
 #include "action_macro.h"
 #include "action.h"
 
 
 static void process_action(keyrecord_t *record);
+#ifndef NO_ACTION_TAPPING
 static bool process_tapping(keyrecord_t *record);
 static void waiting_buffer_scan_tap(void);
+#endif
 
 static void debug_event(keyevent_t event);
 static void debug_record(keyrecord_t record);
 static void debug_action(action_t action);
+#ifndef NO_ACTION_TAPPING
 static void debug_tapping_key(void);
 static void debug_waiting_buffer(void);
+#endif
 
 
 /*
@@ -53,6 +58,7 @@ static void debug_waiting_buffer(void);
 #define TAPPING_TOGGLE  5
 #endif
 
+#ifndef NO_ACTION_TAPPING
 /* stores a key event of current tap. */
 static keyrecord_t tapping_key = {};
 
@@ -120,45 +126,7 @@ bool waiting_buffer_has_anykey_pressed(void)
     }
     return false;
 }
-
-
-/* Oneshot modifier
- *
- * Problem: Want to capitalize like 'The' but the result tends to be 'THe'.
- * Solution: Oneshot modifier have its effect on only one key coming next.
- *           Tap Shift, then type 't', 'h' and 'e'. Not need to hold Shift key.
- *
- *  Hold:       works as normal modifier.
- *  Tap:        one shot modifier.
- *  2 Tap:      cancel one shot modifier.
- *  5-Tap:      toggles enable/disable oneshot feature.
- */
-static struct {
-    uint8_t mods;
-    uint8_t time;
-    bool    ready;
-    bool    disabled;
-}   oneshot_state;
-
-static void oneshot_start(uint8_t mods, uint16_t time)
-{
-    oneshot_state.mods = mods;
-    oneshot_state.time = time;
-    oneshot_state.ready = true;
-}
-
-static void oneshot_cancel(void)
-{
-    oneshot_state.mods = 0;
-    oneshot_state.time = 0;
-    oneshot_state.ready = false;
-}
-
-static void oneshot_toggle(void)
-{
-    oneshot_state.disabled = !oneshot_state.disabled;
-}
-
+#endif
 
 
 void action_exec(keyevent_t event)
@@ -170,6 +138,7 @@ void action_exec(keyevent_t event)
 
     keyrecord_t record = { .event = event };
 
+#ifndef NO_ACTION_TAPPING
     // pre-process on tapping
     if (process_tapping(&record)) {
         if (!IS_NOEVENT(record.event)) {
@@ -202,6 +171,12 @@ void action_exec(keyevent_t event)
     if (!IS_NOEVENT(event)) {
         debug("\n");
     }
+#else
+    process_action(&record);
+    if (!IS_NOEVENT(record.event)) {
+        debug("processed: "); debug_record(record); debug("\n");
+    }
+#endif
 }
 
 static void process_action(keyrecord_t *record)
@@ -244,12 +219,14 @@ static void process_action(keyrecord_t *record)
                 }
             }
             break;
+#ifndef NO_ACTION_TAPPING
         case ACT_LMODS_TAP:
         case ACT_RMODS_TAP:
             {
                 uint8_t mods = (action.kind.id == ACT_LMODS_TAP) ?  action.key.mods :
                                                                     action.key.mods<<4;
                 switch (action.layer.code) {
+    #ifndef NO_ACTION_ONESHOT
                     case 0x00:
                         // Oneshot modifier
                         if (event.pressed) {
@@ -259,7 +236,7 @@ static void process_action(keyrecord_t *record)
                             }
                             else if (tap_count == 1) {
                                 debug("MODS_TAP: Oneshot: start\n");
-                                oneshot_start(mods, event.time);
+                                oneshot_start(mods);
                             }
                             else if (tap_count == TAPPING_TOGGLE) {
                                 debug("MODS_TAP: Oneshot: toggle\n");
@@ -290,6 +267,7 @@ static void process_action(keyrecord_t *record)
                             }
                         }
                         break;
+    #endif
                     default:
                         if (event.pressed) {
                             if (tap_count > 0) {
@@ -319,10 +297,11 @@ static void process_action(keyrecord_t *record)
                 }
             }
             break;
+#endif
 
+#ifdef EXTRAKEY_ENABLE
         /* other HID usage */
         case ACT_USAGE:
-#ifdef EXTRAKEY_ENABLE
             switch (action.usage.page) {
                 case PAGE_SYSTEM:
                     if (event.pressed) {
@@ -339,12 +318,12 @@ static void process_action(keyrecord_t *record)
                     }
                     break;
             }
-#endif
             break;
+#endif
 
+#ifdef MOUSEKEY_ENABLE
         /* Mouse key */
         case ACT_MOUSEKEY:
-#ifdef MOUSEKEY_ENABLE
             if (event.pressed) {
                 mousekey_on(action.key.code);
                 mousekey_send();
@@ -352,9 +331,10 @@ static void process_action(keyrecord_t *record)
                 mousekey_off(action.key.code);
                 mousekey_send();
             }
-#endif
             break;
+#endif
 
+#ifndef NO_ACTION_KEYMAP
         case ACT_KEYMAP:
             switch (action.layer.code) {
                 /* Keymap clear */
@@ -516,6 +496,7 @@ static void process_action(keyrecord_t *record)
                     break;
             }
             break;
+#endif
 
 #ifndef NO_ACTION_OVERLAY
         case ACT_OVERLAY:
@@ -674,19 +655,24 @@ static void process_action(keyrecord_t *record)
 #endif
 
         /* Extentions */
+#ifndef NO_ACTION_MACRO
         case ACT_MACRO:
             action_macro_play(action_get_macro(record, action.func.id, action.func.opt));
             break;
+#endif
         case ACT_COMMAND:
             break;
+#ifndef NO_ACTION_FUNCTION
         case ACT_FUNCTION:
             action_function(record, action.func.id, action.func.opt);
             break;
+#endif
         default:
             break;
     }
 }
 
+#ifndef NO_ACTION_TAPPING
 /* Tapping
  *
  * Rule: Tap key is typed(pressed and released) within TAPPING_TERM.
@@ -881,6 +867,7 @@ static void waiting_buffer_scan_tap(void)
         }
     }
 }
+#endif
 
 
 
@@ -908,15 +895,19 @@ void register_code(uint8_t code)
         // TODO: should push command_proc out of this block?
         if (command_proc(code)) return;
 
-        if (oneshot_state.mods && oneshot_state.ready && !oneshot_state.disabled) {
+#ifndef NO_ACTION_ONESHOT
+        if (oneshot_state.mods && !oneshot_state.disabled) {
             uint8_t tmp_mods = host_get_mods();
             host_add_mods(oneshot_state.mods);
+
             host_add_key(code);
             host_send_keyboard_report();
 
             host_set_mods(tmp_mods);
-            oneshot_state.ready = false;
-        } else {
+            oneshot_cancel();
+        } else 
+#endif
+        {
             host_add_key(code);
             host_send_keyboard_report();
         }
@@ -1064,6 +1055,7 @@ static void debug_action(action_t action)
     debug_hex8(action.kind.param & 0xff);
     debug("]");
 }
+#ifndef NO_ACTION_TAPPING
 static void debug_tapping_key(void)
 {
     debug("TAPPING_KEY="); debug_record(tapping_key); debug("\n");
@@ -1076,3 +1068,4 @@ static void debug_waiting_buffer(void)
     }
     debug("}\n");
 }
+#endif