X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Faction.c;h=49bfc54e7ea61b018c4483442c53bd9ae3419fe4;hb=d44290b91b96f89cfc2dfa85a59cc267ffd13fb4;hp=7ca481fba7ea04586b85f592a0311c8dc09c57c9;hpb=40f1a4930a10ce9253c1215949b497c322db41da;p=max%2Ftmk_keyboard.git diff --git a/common/action.c b/common/action.c index 7ca481fb..49bfc54e 100644 --- a/common/action.c +++ b/common/action.c @@ -23,20 +23,26 @@ along with this program. If not, see . #include "command.h" #include "util.h" #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 /* @@ -52,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 = {}; @@ -119,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) @@ -169,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)) { @@ -201,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) @@ -243,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) { @@ -258,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"); @@ -289,6 +267,7 @@ static void process_action(keyrecord_t *record) } } break; + #endif default: if (event.pressed) { if (tap_count > 0) { @@ -318,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) { @@ -338,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(); @@ -351,15 +331,17 @@ 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 */ case OP_RESET: switch (action.layer.val & 0x03) { case 0: + // NOTE: reserved overlay_clear(); keymap_clear(); break; @@ -379,6 +361,7 @@ static void process_action(keyrecord_t *record) overlay_clear(); keymap_clear(); break; + /* NOTE: 4-7 rserved */ } break; /* Keymap Reset default layer */ @@ -513,12 +496,15 @@ static void process_action(keyrecord_t *record) break; } break; +#endif +#ifndef NO_ACTION_OVERLAY case ACT_OVERLAY: switch (action.layer.code) { // Overlay Invert bit4 case OP_INV4 | 0: if (action.layer.val == 0) { + // NOTE: reserved for future use overlay_clear(); } else { overlay_set(overlay_stat ^ action.layer.val); @@ -526,6 +512,7 @@ static void process_action(keyrecord_t *record) break; case OP_INV4 | 1: if (action.layer.val == 0) { + // on pressed if (event.pressed) overlay_clear(); } else { overlay_set(overlay_stat ^ action.layer.val<<4); @@ -533,6 +520,7 @@ static void process_action(keyrecord_t *record) break; case OP_INV4 | 2: if (action.layer.val == 0) { + // on released if (!event.pressed) overlay_clear(); } else { overlay_set(overlay_stat ^ action.layer.val<<8); @@ -540,6 +528,7 @@ static void process_action(keyrecord_t *record) break; case OP_INV4 | 3: if (action.layer.val == 0) { + // on both overlay_clear(); } else { overlay_set(overlay_stat ^ action.layer.val<<12); @@ -663,21 +652,27 @@ static void process_action(keyrecord_t *record) break; } break; +#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. @@ -872,6 +867,7 @@ static void waiting_buffer_scan_tap(void) } } } +#endif @@ -883,19 +879,35 @@ void register_code(uint8_t code) if (code == KC_NO) { return; } +#ifdef CAPSLOCK_LOCKING_ENABLE + else if (KC_LOCKING_CAPS == code) { +#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE + // Resync: ignore if caps lock already is on + if (host_keyboard_leds() & (1<