core: Change MOD_* definition to make OR(|) usable

https://github.com/tmk/tmk_keyboard/issues/448#issuecomment-285066234
This commit is contained in:
tmk 2017-04-11 15:50:19 +09:00
parent 44fc56a869
commit a71a0ef9d5
2 changed files with 41 additions and 32 deletions

View file

@ -200,26 +200,26 @@ typedef union {
* bit 4 +----- LR flag(Left:0, Right:1) * bit 4 +----- LR flag(Left:0, Right:1)
*/ */
enum mods_bit { enum mods_bit {
MOD_NONE = 0x00, MOD_NONE = 0x0000,
MOD_LCTL = 0x01, MOD_LCTL = 0x0100,
MOD_LSFT = 0x02, MOD_LSFT = 0x0200,
MOD_LALT = 0x04, MOD_LALT = 0x0400,
MOD_LGUI = 0x08, MOD_LGUI = 0x0800,
MOD_RCTL = 0x11, MOD_RCTL = 0x1100,
MOD_RSFT = 0x12, MOD_RSFT = 0x1200,
MOD_RALT = 0x14, MOD_RALT = 0x1400,
MOD_RGUI = 0x18, MOD_RGUI = 0x1800,
}; };
enum mods_codes { enum mods_codes {
MODS_ONESHOT = 0x00, MODS_ONESHOT = 0x00,
MODS_TAP_TOGGLE = 0x01, MODS_TAP_TOGGLE = 0x01,
}; };
#define ACTION_KEY(key) ACTION(ACT_MODS, (key)) #define ACTION_KEY(key) ACTION(ACT_MODS, (key))
#define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | 0) #define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods)&0x1f00) | 0)
#define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | (key)) #define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods)&0x1f00) | (key))
#define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | (key)) #define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | (key))
#define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_ONESHOT) #define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | MODS_ONESHOT)
#define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_TAP_TOGGLE) #define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | MODS_TAP_TOGGLE)
/* /*
@ -271,7 +271,7 @@ enum layer_pram_tap_op {
#define ACTION_LAYER_ON_OFF(layer) ACTION_LAYER_TAP((layer), OP_ON_OFF) #define ACTION_LAYER_ON_OFF(layer) ACTION_LAYER_TAP((layer), OP_ON_OFF)
#define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) #define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON)
#define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) #define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR)
#define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xc0 | ((mods)&0x1f)) #define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xc0 | ((mods>>8)&0x1f))
/* With Tapping */ /* With Tapping */
#define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) #define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key))
#define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE)

View file

@ -250,21 +250,30 @@ You can define these actions on *'A'* key and *'left shift'* modifier with:
ACTION_KEY(KC_LSFT) ACTION_KEY(KC_LSFT)
#### 2.1.2 Modified key #### 2.1.2 Modified key
This action is comprised of strokes of modifiers and a key. `Macro` action is needed if you want more complex key strokes. This action is comprised of modifiers and a key.
Say you want to assign a key to `Shift + 1` to get character *'!'* or `Alt + Tab` to switch application windows. Modified keys can be defined as below. Say you want to assign a key to `Shift + 1` to get character *'!'* or `Alt + Tab` to switch application windows.
ACTION_MODS_KEY(MOD_LSFT, KC_1) ACTION_MODS_KEY(MOD_LSFT, KC_1)
ACTION_MODS_KEY(MOD_LALT, KC_TAB) ACTION_MODS_KEY(MOD_LALT, KC_TAB)
Or `Alt,Shift + Tab` can be defined. `ACTION_MODS_KEY(mods, key)` requires **4-bit modifier state** and a **keycode** as arguments. See `keycode.h` for `MOD_BIT()` macro.
ACTION_MODS_KEY(MOD_LALT | MOD_LSFT, KC_TAB) ACTION_MODS_KEY(MOD_LALT | MOD_LSFT, KC_TAB)
These are identical to examples above.
ACTION_KEY(MOD_LSFT | KC_1)
ACTION_KEY(MOD_LALT | KC_TAB)
ACTION_KEY(MOD_LSFT | MOD_LALT | KC_TAB)
#### 2.1.3 Multiple Modifiers #### 2.1.3 Multiple Modifiers
Registers multiple modifiers with pressing a key. To specify multiple modifiers use `|`. Registers multiple modifiers with pressing a key. To specify multiple modifiers use `|`.
ACTION_MODS(MOD_ALT | MOD_LSFT) ACTION_MODS(MOD_LALT | MOD_LSFT)
ACTION_MODS(MOD_LALT | MOD_LSFT | MOD_LCTL)
These are identical to examples above.
ACTION_KEY(MOD_LALT | MOD_LSFT, KC_NO)
ACTION_KEY(MOD_LALT | MOD_LSFT | MOD_LCTL, KC_NO)
#### 2.1.3 Modifier with Tap key([Dual role][dual_role]) #### 2.1.3 Modifier with Tap key([Dual role][dual_role])
Works as a modifier key while holding, but registers a key on tap(press and release quickly). Works as a modifier key while holding, but registers a key on tap(press and release quickly).