diff options
Diffstat (limited to 'common/action.c')
-rw-r--r-- | common/action.c | 356 |
1 files changed, 209 insertions, 147 deletions
diff --git a/common/action.c b/common/action.c index 246fd99d8a..3703b4e8cc 100644 --- a/common/action.c +++ b/common/action.c @@ -202,23 +202,6 @@ void action_exec(keyevent_t event) } } -static action_t get_action(key_t key) -{ - action_t action; - action.code = ACTION_NO; - - /* layer_switch */ - action = layer_switch_get_action(key); - if (action.code != ACTION_TRANSPARENT) { - return action; - } - - /* default layer */ - //debug("get_aciton: default layer: "); debug_dec(default_layer); debug("\n"); - action = action_for_key(default_layer, key); - return action; -} - static void process_action(keyrecord_t *record) { keyevent_t event = record->event; @@ -226,9 +209,11 @@ static void process_action(keyrecord_t *record) if (IS_NOEVENT(event)) { return; } - action_t action = get_action(event.key); - debug("ACTION: "); debug_action(action); debug(" "); - layer_switch_debug(); debug("["); debug_dec(default_layer); debug("]\n"); + action_t action = layer_switch_get_action(event.key); + debug("ACTION: "); debug_action(action); + debug(" overlays: "); overlay_debug(); + debug(" keymaps: "); keymap_debug(); + debug(" default_layer: "); debug_dec(default_layer); debug("\n"); switch (action.kind.id) { /* Key and Mods */ @@ -368,207 +353,292 @@ static void process_action(keyrecord_t *record) #endif break; - /* Layer key */ - case ACT_LAYER_SET: + case ACT_KEYMAP: switch (action.layer.code) { - case LAYER_MOMENTARY: /* momentary */ - if (event.pressed) { - layer_switch_move(action.layer.val); - } - else { - // NOTE: This is needed by legacy keymap support - layer_switch_move(0); - } + /* Keymap Reset */ + case OP_RESET: + default_layer_set(action.layer.val); break; - case LAYER_ON_PRESS: + /* Keymap Reset default layer */ + case (OP_RESET | ON_PRESS): if (event.pressed) { - layer_switch_move(action.layer.val); + default_layer_set(action.layer.val); + overlay_clear(); } break; - case LAYER_ON_RELEASE: + case (OP_RESET | ON_RELEASE): if (!event.pressed) { - layer_switch_move(action.layer.val); + default_layer_set(action.layer.val); + overlay_clear(); } break; - case LAYER_ON_BOTH: - layer_switch_move(action.layer.val); + case (OP_RESET | ON_BOTH): + default_layer_set(action.layer.val); + overlay_clear(); break; - case LAYER_TAP_TOGGLE: /* switch on hold and toggle on several taps */ + + /* Keymap Bit invert */ + case OP_INV: + /* with tap toggle */ if (event.pressed) { if (tap_count < TAPPING_TOGGLE) { - layer_switch_move(action.layer.val); + debug("KEYMAP_INV: tap toggle(press).\n"); + keymap_invert(action.layer.val); } } else { - if (tap_count >= TAPPING_TOGGLE) { - debug("LAYER_PRESSED: tap toggle.\n"); - layer_switch_move(action.layer.val); + if (tap_count <= TAPPING_TOGGLE) { + debug("KEYMAP_INV: tap toggle(release).\n"); + keymap_invert(action.layer.val); } } break; - case LAYER_SET_DEFAULT_ON_PRESS: + case (OP_INV | ON_PRESS): if (event.pressed) { - default_layer = action.layer.val; - layer_switch_move(0); + keymap_invert(action.layer.val); } break; - case LAYER_SET_DEFAULT_ON_RELEASE: + case (OP_INV | ON_RELEASE): if (!event.pressed) { - default_layer = action.layer.val; - layer_switch_move(0); + keymap_invert(action.layer.val); } break; - case LAYER_SET_DEFAULT_ON_BOTH: - default_layer = action.layer.val; - layer_switch_move(0); + case (OP_INV | ON_BOTH): + keymap_invert(action.layer.val); break; - default: - /* tap key */ + + /* Keymap Bit on */ + case OP_ON: if (event.pressed) { - if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_SET: Tap: register_code\n"); - register_code(action.layer.code); - } else { - debug("LAYER_SET: No tap: layer_set(on press)\n"); - layer_switch_move(action.layer.val); - } + keymap_on(action.layer.val); } else { - if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_SET: Tap: unregister_code\n"); - unregister_code(action.layer.code); - } else { - // NOTE: This is needed by legacy keymap support - debug("LAYER_SET: No tap: return to default layer(on release)\n"); - layer_switch_move(0); - } + keymap_off(action.layer.val); } break; - } - break; - case ACT_LAYER_BIT: - switch (action.layer.code) { - case LAYER_MOMENTARY: /* momentary */ + case (OP_ON | ON_PRESS): if (event.pressed) { - layer_switch_move(layer_switch_get_layer() | action.layer.val); + keymap_on(action.layer.val); + } + break; + case (OP_ON | ON_RELEASE): + if (!event.pressed) { + keymap_on(action.layer.val); + } + break; + case (OP_ON | ON_BOTH): + keymap_on(action.layer.val); + break; + + /* Keymap Bit off */ + case OP_OFF: + if (event.pressed) { + keymap_off(action.layer.val); } else { - layer_switch_move(layer_switch_get_layer() & ~action.layer.val); + keymap_on(action.layer.val); } break; - case LAYER_ON_PRESS: + case (OP_OFF | ON_PRESS): if (event.pressed) { - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); + keymap_off(action.layer.val); } break; - case LAYER_ON_RELEASE: + case (OP_OFF | ON_RELEASE): if (!event.pressed) { - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); + keymap_off(action.layer.val); } break; - case LAYER_ON_BOTH: - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); + case (OP_OFF | ON_BOTH): + keymap_off(action.layer.val); break; - case LAYER_TAP_TOGGLE: /* switch on hold and toggle on several taps */ + + /* Keymap Bit set */ + case OP_SET: if (event.pressed) { - if (tap_count < TAPPING_TOGGLE) { - debug("LAYER_BIT: tap toggle(press).\n"); - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); - } + keymap_set(action.layer.val); } else { - if (tap_count <= TAPPING_TOGGLE) { - debug("LAYER_BIT: tap toggle(release).\n"); - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); - } + keymap_clear(); } break; - case LAYER_SET_DEFAULT_ON_PRESS: + case (OP_SET | ON_PRESS): if (event.pressed) { - default_layer = default_layer ^ action.layer.val; - layer_switch_move(default_layer); + keymap_set(action.layer.val); } break; - case LAYER_SET_DEFAULT_ON_RELEASE: + case (OP_SET | ON_RELEASE): if (!event.pressed) { - default_layer = default_layer ^ action.layer.val; - layer_switch_move(default_layer); + keymap_set(action.layer.val); } break; - case LAYER_SET_DEFAULT_ON_BOTH: - default_layer = default_layer ^ action.layer.val; - layer_switch_move(default_layer); + case (OP_SET | ON_BOTH): + keymap_set(action.layer.val); break; + + /* Keymap Bit invert with tap key */ default: - // tap key if (event.pressed) { if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_BIT: Tap: register_code\n"); + debug("KEYMAP_TAP_KEY: Tap: register_code\n"); register_code(action.layer.code); } else { - debug("LAYER_BIT: No tap: layer_bit(on press)\n"); - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); + debug("KEYMAP_TAP_KEY: No tap: invert on press\n"); + keymap_invert(action.layer.val); } } else { if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_BIT: Tap: unregister_code\n"); + debug("KEYMAP_TAP_KEY: Tap: unregister_code\n"); unregister_code(action.layer.code); } else { - debug("LAYER_BIT: No tap: layer_bit(on release)\n"); - layer_switch_move(layer_switch_get_layer() ^ action.layer.val); + debug("KEYMAP_TAP_KEY: No tap: invert on release\n"); + keymap_invert(action.layer.val); } } break; } break; - case ACT_LAYER_SWITCH: + + case ACT_OVERLAY: switch (action.layer.code) { - case LAYER_MOMENTARY: /* momentary */ - if (event.pressed) { - layer_switch_on(action.layer.val); + // Overlay Invert bit4 + case OP_INV4 | 0: + if (action.layer.val == 0) { + overlay_clear(); } else { - layer_switch_off(action.layer.val); + overlay_set(overlay_stat ^ action.layer.val); } break; - case LAYER_ON_PRESS: - if (event.pressed) { - layer_switch_invert(action.layer.val); + case OP_INV4 | 1: + if (action.layer.val == 0) { + if (event.pressed) overlay_clear(); + } else { + overlay_set(overlay_stat ^ action.layer.val<<4); } break; - case LAYER_ON_RELEASE: - if (!event.pressed) { - layer_switch_invert(action.layer.val); + case OP_INV4 | 2: + if (action.layer.val == 0) { + if (!event.pressed) overlay_clear(); + } else { + overlay_set(overlay_stat ^ action.layer.val<<8); } break; - case LAYER_ON_BOTH: - layer_switch_invert(action.layer.val); + case OP_INV4 | 3: + if (action.layer.val == 0) { + overlay_clear(); + } else { + overlay_set(overlay_stat ^ action.layer.val<<12); + } break; - case LAYER_TAP_TOGGLE: /* switch on hold and toggle on several taps */ + + /* Overlay Bit invert */ + case OP_INV: + /* with tap toggle */ if (event.pressed) { if (tap_count < TAPPING_TOGGLE) { - debug("LAYER_SWITCH: tap toggle(press).\n"); - layer_switch_invert(action.layer.val); + debug("OVERLAY_INV: tap toggle(press).\n"); + overlay_invert(action.layer.val); } } else { if (tap_count <= TAPPING_TOGGLE) { - debug("LAYER_SWITCH: tap toggle(release).\n"); - layer_switch_invert(action.layer.val); + debug("OVERLAY_INV: tap toggle(release).\n"); + overlay_invert(action.layer.val); } } break; + case (OP_INV | ON_PRESS): + if (event.pressed) { + overlay_invert(action.layer.val); + } + break; + case (OP_INV | ON_RELEASE): + if (!event.pressed) { + overlay_invert(action.layer.val); + } + break; + case (OP_INV | ON_BOTH): + overlay_invert(action.layer.val); + break; + + /* Overlay Bit on */ + case OP_ON: + if (event.pressed) { + overlay_on(action.layer.val); + } else { + overlay_off(action.layer.val); + } + break; + case (OP_ON | ON_PRESS): + if (event.pressed) { + overlay_on(action.layer.val); + } + break; + case (OP_ON | ON_RELEASE): + if (!event.pressed) { + overlay_on(action.layer.val); + } + break; + case (OP_ON | ON_BOTH): + overlay_on(action.layer.val); + break; + + /* Overlay Bit off */ + case OP_OFF: + if (event.pressed) { + overlay_off(action.layer.val); + } else { + overlay_on(action.layer.val); + } + break; + case (OP_OFF | ON_PRESS): + if (event.pressed) { + overlay_off(action.layer.val); + } + break; + case (OP_OFF | ON_RELEASE): + if (!event.pressed) { + overlay_off(action.layer.val); + } + break; + case (OP_OFF | ON_BOTH): + overlay_off(action.layer.val); + break; + + /* Overlay Bit set */ + case OP_SET: + if (event.pressed) { + overlay_move(action.layer.val); + } else { + overlay_clear(); + } + break; + case (OP_SET | ON_PRESS): + if (event.pressed) { + overlay_move(action.layer.val); + } + break; + case (OP_SET | ON_RELEASE): + if (!event.pressed) { + overlay_move(action.layer.val); + } + break; + case (OP_SET | ON_BOTH): + overlay_move(action.layer.val); + break; + + /* Overlay Bit invert with tap key */ default: - // tap key if (event.pressed) { if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_SWITCH: Tap: register_code\n"); + debug("OVERLAY_TAP_KEY: Tap: register_code\n"); register_code(action.layer.code); } else { - debug("LAYER_SWITCH: No tap: layer_switch on press\n"); - layer_switch_invert(action.layer.val); + debug("OVERLAY_TAP_KEY: No tap: invert on press\n"); + overlay_invert(action.layer.val); } } else { if (IS_TAPPING_KEY(event.key) && tap_count > 0) { - debug("LAYER_SWITCH: Tap: unregister_code\n"); + debug("OVERLAY_TAP_KEY: Tap: unregister_code\n"); unregister_code(action.layer.code); } else { - debug("LAYER_SWITCH: No tap: layer_switch on release\n"); - layer_switch_invert(action.layer.val); + debug("OVERLAY_TAP_KEY: No tap: invert on release\n"); + overlay_invert(action.layer.val); } } break; @@ -877,28 +947,21 @@ bool sending_anykey(void) bool is_tap_key(key_t key) { - action_t action = get_action(key); + action_t action = layer_switch_get_action(key); switch (action.kind.id) { case ACT_LMODS_TAP: case ACT_RMODS_TAP: return true; - case ACT_LAYER_SET: - case ACT_LAYER_BIT: + case ACT_KEYMAP: + case ACT_OVERLAY: switch (action.layer.code) { - case LAYER_MOMENTARY: - case LAYER_ON_PRESS: - case LAYER_ON_RELEASE: - case LAYER_ON_BOTH: - case LAYER_SET_DEFAULT_ON_PRESS: - case LAYER_SET_DEFAULT_ON_RELEASE: - case LAYER_SET_DEFAULT_ON_BOTH: - return false; - case LAYER_TAP_TOGGLE: - default: /* tap key */ + case 0x04 ... 0xEF: /* tap key */ + case OP_INV: return true; + default: + return false; } - return false; case ACT_FUNCTION: if (action.func.opt & FUNC_TAP) { return true; } return false; @@ -929,9 +992,8 @@ static void debug_action(action_t action) case ACT_RMODS_TAP: debug("ACT_RMODS_TAP"); break; case ACT_USAGE: debug("ACT_USAGE"); break; case ACT_MOUSEKEY: debug("ACT_MOUSEKEY"); break; - case ACT_LAYER_SET: debug("ACT_LAYER_SET"); break; - case ACT_LAYER_BIT: debug("ACT_LAYER_BIT"); break; - case ACT_LAYER_SWITCH: debug("ACT_LAYER_SWITCH"); break; + case ACT_KEYMAP: debug("ACT_KEYMAP"); break; + case ACT_OVERLAY: debug("ACT_OVERLAY"); break; case ACT_MACRO: debug("ACT_MACRO"); break; case ACT_COMMAND: debug("ACT_COMMAND"); break; case ACT_FUNCTION: debug("ACT_FUNCTION"); break; |