diff options
Diffstat (limited to 'common/action.h')
-rw-r--r-- | common/action.h | 221 |
1 files changed, 133 insertions, 88 deletions
diff --git a/common/action.h b/common/action.h index b9a6cb5b40..4892cc7fd9 100644 --- a/common/action.h +++ b/common/action.h @@ -76,11 +76,6 @@ typedef union { -/* layer used currently */ -extern uint8_t current_layer; -/* layer to return or start with */ -extern uint8_t default_layer; - /* Execute action per keyevent */ void action_exec(keyevent_t event); @@ -155,32 +150,41 @@ bool waiting_buffer_has_anykey_pressed(void); * * Mouse Keys * ---------- - * TODO: can be combined with 'Other HID Usage'? to save action kind id. * ACT_MOUSEKEY(0110): * 0101|XXXX| keycode Mouse key * * * Layer Actions * ------------- - * ACT_LAYER(1000): Set layer - * ACT_LAYER_BIT(1001): Bit-op layer - * - * 1000|LLLL|0000 0000 set L to layer on press and set default on release(momentary) - * 1000|LLLL|0000 0001 set L to layer on press - * 1000|LLLL|0000 0010 set L to layer on release - * 1000|----|0000 0011 set default to layer on both(return to default layer) - * 1000|LLLL| keycode set L to layer while hold and send key on tap - * 1000|LLLL|1111 0000 set L to layer while hold and toggle on several taps - * 1000|LLLL|1111 1111 set L to default and layer(on press) - * - * 1001|BBBB|0000 0000 (not used) - * 1001|BBBB|0000 0001 bit-xor layer with B on press - * 1001|BBBB|0000 0010 bit-xor layer with B on release - * 1001|BBBB|0000 0011 bit-xor layer with B on both(momentary) - * 1001|BBBB| keycode bit-xor layer with B while hold and send key on tap - * 1001|BBBB|1111 0000 bit-xor layer with B while hold and toggle on several taps - * 1001|BBBB|1111 1111 bit-xor default with B and set layer(on press) + * ACT_KEYMAP: + * 1000|--xx|0000 0000 Clear keyamp and overlay + * 1000|LLLL|0000 00xx Reset default layer and clear keymap and overlay + * 1000|LLLL| keycode Invert with tap key + * 1000|LLLL|1111 0000 Invert with tap toggle + * 1000|LLLL|1111 00xx Invert[^= 1<<L] + * 1000|LLLL|1111 0100 On/Off + * 1000|LLLL|1111 01xx On[|= 1<<L] + * 1000|LLLL|1111 1000 Off/On + * 1000|LLLL|1111 10xx Off[&= ~(1<<L)] + * 1000|LLLL|1111 1100 Set/Clear + * 1000|LLLL|1111 11xx Set[= 1<<L] + * default layer: 0-15(4bit) + * xx: On {00:for special use, 01:press, 10:release, 11:both} * + * ACT_OVERLAY: + * 1011|0000|0000 0000 Clear overlay + * 1011|LLLL|0000 00ss Invert 4-bit chunk [^= L<<(4*ss)] + * 1011|LLLL| keycode Invert with tap key + * 1011|LLLL|1111 0000 Invert with tap toggle + * 1011|LLLL|1111 00xx Invert[^= 1<<L] + * 1011|LLLL|1111 0100 On/Off(momentary) + * 1011|LLLL|1111 01xx On[|= 1<<L] + * 1011|LLLL|1111 1000 Off/On + * 1011|LLLL|1111 10xx Off[&= ~(1<<L)] + * 1011|LLLL|1111 1100 Set/Clear + * 1011|LLLL|1111 11xx Set[= 1<<L] + * overlays: 16-layer on/off status(16bit) + * xx: On {00:for special use, 01:press, 10:release, 11:both} * * * Extensions(11XX) @@ -208,8 +212,8 @@ enum action_kind_id { ACT_USAGE = 0b0100, ACT_MOUSEKEY = 0b0101, - ACT_LAYER = 0b1000, - ACT_LAYER_BIT = 0b1001, + ACT_KEYMAP = 0b1000, + ACT_OVERLAY = 0b1001, ACT_MACRO = 0b1100, ACT_COMMAND = 0b1110, @@ -223,20 +227,20 @@ enum action_kind_id { #define ACTION(kind, param) ((kind)<<12 | (param)) #define MODS4(mods) (((mods)>>4 | (mods)) & 0x0F) -/* Key */ +/* + * Key + */ #define ACTION_KEY(key) ACTION(ACT_LMODS, key) /* Mods & key */ #define ACTION_LMODS(mods) ACTION(ACT_LMODS, MODS4(mods)<<8 | 0x00) #define ACTION_LMODS_KEY(mods, key) ACTION(ACT_LMODS, MODS4(mods)<<8 | (key)) #define ACTION_RMODS(mods) ACTION(ACT_RMODS, MODS4(mods)<<8 | 0x00) #define ACTION_RMODS_KEY(mods, key) ACTION(ACT_RMODS, MODS4(mods)<<8 | (key)) -/* Mod & key */ #define ACTION_LMOD(mod) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | 0x00) #define ACTION_LMOD_KEY(mod, key) ACTION(ACT_LMODS, MODS4(MOD_BIT(mod))<<8 | (key)) #define ACTION_RMOD(mod) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | 0x00) #define ACTION_RMOD_KEY(mod, key) ACTION(ACT_RMODS, MODS4(MOD_BIT(mod))<<8 | (key)) - -/* Mods + Tap key */ +/* Tap key */ enum mods_codes { MODS_ONESHOT = 0x00, }; @@ -244,81 +248,122 @@ enum mods_codes { #define ACTION_LMODS_ONESHOT(mods) ACTION(ACT_LMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT) #define ACTION_RMODS_TAP_KEY(mods, key) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | (key)) #define ACTION_RMODS_ONESHOT(mods) ACTION(ACT_RMODS_TAP, MODS4(mods)<<8 | MODS_ONESHOT) -/* Mod + Tap key */ #define ACTION_LMOD_TAP_KEY(mod, key) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) #define ACTION_LMOD_ONESHOT(mod) ACTION(ACT_LMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT) #define ACTION_RMOD_TAP_KEY(mod, key) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | (key)) #define ACTION_RMOD_ONESHOT(mod) ACTION(ACT_RMODS_TAP, MODS4(MOD_BIT(mod))<<8 | MODS_ONESHOT) -/* - * Switch layer +/* Layer Operation: + * Invert layer ^= (1<<layer) + * On layer |= (1<<layer) + * Off layer &= ~(1<<layer) + * Set layer = (1<<layer) + * Clear layer = 0 */ -enum layer_codes { - LAYER_MOMENTARY = 0, - LAYER_ON_PRESS = 1, - LAYER_ON_RELEASE = 2, - LAYER_DEFAULT =3, - LAYER_TAP_TOGGLE = 0xF0, - LAYER_CHANGE_DEFAULT = 0xFF -}; -enum layer_vals_default { - DEFAULT_ON_PRESS = 1, - DEFAULT_ON_RELEASE = 2, - DEFAULT_ON_BOTH = 3, +enum layer_params { + ON_PRESS = 1, + ON_RELEASE = 2, + ON_BOTH = 3, + + OP_RESET = 0x00, + OP_INV4 = 0x00, + OP_INV = 0xF0, + OP_ON = 0xF4, + OP_OFF = 0xF8, + OP_SET = 0xFC, }; +/* + * Default Layer + */ +#define ACTION_DEFAULT_LAYER ACTION(ACT_KEYMAP, 0<<8 | OP_RESET | 0) +#define ACTION_SET_DEFAULT_LAYER(layer) ACTION_KEYMAP_RESET(layer) +#define ACTION_SET_DEFAULT_LAYER_P(layer) ACTION_KEYMAP_RESET_P(layer) +#define ACTION_SET_DEFAULT_LAYER_R(layer) ACTION_KEYMAP_RESET_R(layer) +#define ACTION_SET_DEFAULT_LAYER_B(layer) ACTION_KEYMAP_RESET_B(layer) /* - * return to default layer + * Keymap Layer */ -#define ACTION_LAYER_DEFAULT ACTION_LAYER_DEFAULT_R -/* set default layer on press */ -#define ACTION_LAYER_DEFAULT_P ACTION(ACT_LAYER, DEFAULT_ON_PRESS<<8 | LAYER_DEFAULT) -/* set default layer on release */ -#define ACTION_LAYER_DEFAULT_R ACTION(ACT_LAYER, DEFAULT_ON_RELEASE<<8 | LAYER_DEFAULT) -/* change default layer and set layer */ +#define ACTION_KEYMAP(layer) ACTION_KEYMAP_MOMENTARY(layer) +#define ACTION_KEYMAP_MOMENTARY(layer) ACTION_KEYMAP_ON_OFF(layer) +#define ACTION_KEYMAP_TOGGLE(layer) ACTION_KEYMAP_INV_R(layer) +/* Keymap Set and clear overaly */ +#define ACTION_KEYMAP_RESET(layer) ACTION_KEYMAP_RESET_R(layer) +#define ACTION_KEYMAP_RESET_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_PRESS) +#define ACTION_KEYMAP_RESET_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_RELEASE) +#define ACTION_KEYMAP_RESET_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_RESET | ON_BOTH) +/* Keymap Invert */ +#define ACTION_KEYMAP_INV(layer) ACTION_KEYMAP_INV_B(layer) +#define ACTION_KEYMAP_TAP_TOGGLE(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | 0) +#define ACTION_KEYMAP_INV_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_PRESS) +#define ACTION_KEYMAP_INV_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_RELEASE) +#define ACTION_KEYMAP_INV_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_INV | ON_BOTH) +/* Keymap On */ +#define ACTION_KEYMAP_ON(layer) ACTION_KEYMAP_ON_OFF(layer) +#define ACTION_KEYMAP_ON_OFF(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | 0) +#define ACTION_KEYMAP_ON_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_PRESS) +#define ACTION_KEYMAP_ON_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_RELEASE) +#define ACTION_KEYMAP_ON_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_ON | ON_BOTH) +/* Keymap Off */ +#define ACTION_KEYMAP_OFF(layer) ACTION_KEYMAP_OFF_ON(layer) +#define ACTION_KEYMAP_OFF_ON(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | 0) +#define ACTION_KEYMAP_OFF_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_PRESS) +#define ACTION_KEYMAP_OFF_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_RELEASE) +#define ACTION_KEYMAP_OFF_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_OFF | ON_BOTH) +/* Keymap Set */ +#define ACTION_KEYMAP_SET(layer) ACTION_KEYMAP_SET_CLEAR(layer) +#define ACTION_KEYMAP_SET_CLEAR(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | 0) +#define ACTION_KEYMAP_SET_P(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_PRESS) +#define ACTION_KEYMAP_SET_R(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_RELEASE) +#define ACTION_KEYMAP_SET_B(layer) ACTION(ACT_KEYMAP, (layer)<<8 | OP_SET | ON_BOTH) +/* Keymap Invert with tap key */ +#define ACTION_KEYMAP_TAP_KEY(layer, key) ACTION(ACT_KEYMAP, (layer)<<8 | (key)) /* - * Set layer + * Overlay Layer */ -/* set layer on press and none on release */ -#define ACTION_LAYER_SET(layer) ACTION_LAYER_SET_P(layer) -/* set layer on press and set default on release (This is needed by legacy keymap support.) */ -#define ACTION_LAYER_SET_MOMENTARY(layer) ACTION(ACT_LAYER, (layer)<<8 | LAYER_MOMENTARY) -/* set layer on press and none on release */ -#define ACTION_LAYER_SET_TOGGLE(layer) ACTION_LAYER_SET_R(layer) -/* set layer while hold and send key on tap */ -#define ACTION_LAYER_SET_TAP_KEY(layer, key) ACTION(ACT_LAYER, (layer)<<8 | (key)) -/* set layer on press */ -#define ACTION_LAYER_SET_P(layer) ACTION(ACT_LAYER, (layer)<<8 | LAYER_ON_PRESS) -/* set layer on release */ -#define ACTION_LAYER_SET_R(layer) ACTION(ACT_LAYER, (layer)<<8 | LAYER_ON_RELEASE) -/* set layer on hold and toggle on several taps */ -#define ACTION_LAYER_SET_TAP_TOGGLE(layer) ACTION(ACT_LAYER, (layer)<<8 | LAYER_TAP_TOGGLE) -/* set default layer on both press and release */ -#define ACTION_LAYER_SET_DEFAULT(layer) ACTION(ACT_LAYER, (layer)<<8 | LAYER_CHANGE_DEFAULT) +#define ACTION_OVERLAY(layer) ACTION_OVERLAY_MOMENTARY(layer) +#define ACTION_OVERLAY_MOMENTARY(layer) ACTION_OVERLAY_ON_OFF(layer) +#define ACTION_OVERLAY_TOGGLE(layer) ACTION_OVERLAY_INV_R(layer) +/* Overlay Clear */ +#define ACTION_OVERLAY_CLEAR ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | 0) +#define ACTION_OVERLAY_CLEAR_P ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_PRESS) +#define ACTION_OVERLAY_CLEAR_R ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_RELEASE) +#define ACTION_OVERLAY_CLEAR_B ACTION(ACT_OVERLAY, 0<<8 | OP_INV4 | ON_BOTH) +/* Overlay Invert 4-bit chunk */ +#define ACTION_OVERLAY_INV4(bits, shift) ACTION(ACT_OVERLAY, (bits)<<8 | OP_INV4 | shift) +/* Overlay Invert */ +#define ACTION_OVERLAY_INV(layer) ACTION_OVERLAY_INV_B(layer) +#define ACTION_OVERLAY_TAP_TOGGLE(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | 0) +#define ACTION_OVERLAY_INV_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_PRESS) +#define ACTION_OVERLAY_INV_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_RELEASE) +#define ACTION_OVERLAY_INV_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_INV | ON_BOTH) +/* Overlay On */ +#define ACTION_OVERLAY_ON(layer) ACTION_OVERLAY_ON_OFF(layer) +#define ACTION_OVERLAY_ON_OFF(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | 0) +#define ACTION_OVERLAY_ON_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_PRESS) +#define ACTION_OVERLAY_ON_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_RELEASE) +#define ACTION_OVERLAY_ON_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_ON | ON_BOTH) +/* Overlay Off */ +#define ACTION_OVERLAY_OFF(layer) ACTION_OVERLAY_OFF_ON(layer) +#define ACTION_OVERLAY_OFF_ON(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | 0) +#define ACTION_OVERLAY_OFF_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_PRESS) +#define ACTION_OVERLAY_OFF_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_RELEASE) +#define ACTION_OVERLAY_OFF_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_OFF | ON_BOTH) +/* Overlay Set */ +#define ACTION_OVERLAY_SET(layer) ACTION_OVERLAY_SET_CLEAR(layer) +#define ACTION_OVERLAY_SET_CLEAR(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | 0) +#define ACTION_OVERLAY_SET_P(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_PRESS) +#define ACTION_OVERLAY_SET_R(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_RELEASE) +#define ACTION_OVERLAY_SET_B(layer) ACTION(ACT_OVERLAY, (layer)<<8 | OP_SET | ON_BOTH) +/* Overlay Invert with tap key */ +#define ACTION_OVERLAY_TAP_KEY(layer, key) ACTION(ACT_OVERLAY, (layer)<<8 | (key)) + /* - * Bit-op layer + * HID Usage */ -/* bit-xor on both press and release */ -#define ACTION_LAYER_BIT(bits) ACTION_LAYER_BIT_MOMENTARY(bits) -#define ACTION_LAYER_BIT_MOMENTARY(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | LAYER_MOMENTARY) -/* bit-xor on press */ -#define ACTION_LAYER_BIT_TOGGLE(bits) ACTION_LAYER_BIT_R(bits) -/* bit-xor while hold and send key on tap */ -#define ACTION_LAYER_BIT_TAP_KEY(bits, key) ACTION(ACT_LAYER_BIT, (bits)<<8 | (key)) -/* bit-xor on press */ -#define ACTION_LAYER_BIT_P(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | LAYER_ON_PRESS) -/* bit-xor on release */ -#define ACTION_LAYER_BIT_R(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | LAYER_ON_RELEASE) -/* bit-xor while hold and toggle on several taps */ -#define ACTION_LAYER_BIT_TAP_TOGGLE(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | LAYER_TAP_TOGGLE) -/* bit-xor default layer and set layer */ -#define ACTION_LAYER_BIT_DEFAULT(bits) ACTION(ACT_LAYER, (bits)<<8 | LAYER_CHANGE_DEFAULT) - - -/* HID Usage */ enum usage_pages { PAGE_SYSTEM, PAGE_CONSUMER |