X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Faction.c;h=49bfc54e7ea61b018c4483442c53bd9ae3419fe4;hb=d44290b91b96f89cfc2dfa85a59cc267ffd13fb4;hp=1b84d1e884c7185c61ed514303225b179d5b7d62;hpb=b057511f45de020c43021f2991569a53c2b929c9;p=max%2Ftmk_keyboard.git diff --git a/common/action.c b/common/action.c index 1b84d1e8..49bfc54e 100644 --- a/common/action.c +++ b/common/action.c @@ -25,19 +25,24 @@ along with this program. If not, see . #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