aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/feature_advanced_keycodes.md10
-rw-r--r--quantum/quantum_keycodes.h88
2 files changed, 48 insertions, 50 deletions
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index f93b8033a..5713234be 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -13,9 +13,11 @@ People often define custom names using `#define`. For example:
13 13
14This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable. 14This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable.
15 15
16### Limits of These Aliases 16### Caveats
17 17
18Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.md), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.md). 18Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored.
19
20Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
19 21
20# Switching and Toggling Layers 22# Switching and Toggling Layers
21 23
@@ -103,10 +105,6 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
103 * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped 105 * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
104 * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. 106 * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
105 107
106?> Due to the way that keycodes are structured, any modifiers specified as part of `kc`, such as `LCTL()` or `KC_LPRN`, will only activate when held instead of tapped.
107
108?> Additionally, if there is at least one right-handed modifier, any other modifiers in a chain of functions will turn into their right-handed equivalents, so it is not possible to "mix and match" the two.
109
110# One Shot Keys 108# One Shot Keys
111 109
112One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys". 110One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys".
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index f2cdb8a3b..0ecc293a8 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -459,27 +459,27 @@ enum quantum_keycodes {
459}; 459};
460 460
461// Ability to use mods in layouts 461// Ability to use mods in layouts
462#define LCTL(kc) (kc | QK_LCTL) 462#define LCTL(kc) (QK_LCTL | (kc))
463#define LSFT(kc) (kc | QK_LSFT) 463#define LSFT(kc) (QK_LSFT | (kc))
464#define LALT(kc) (kc | QK_LALT) 464#define LALT(kc) (QK_LALT | (kc))
465#define LGUI(kc) (kc | QK_LGUI) 465#define LGUI(kc) (QK_LGUI | (kc))
466#define LCMD(kc) LGUI(kc) 466#define LCMD(kc) LGUI(kc)
467#define LWIN(kc) LGUI(kc) 467#define LWIN(kc) LGUI(kc)
468#define RCTL(kc) (kc | QK_RCTL) 468#define RCTL(kc) (QK_RCTL | (kc))
469#define RSFT(kc) (kc | QK_RSFT) 469#define RSFT(kc) (QK_RSFT | (kc))
470#define RALT(kc) (kc | QK_RALT) 470#define RALT(kc) (QK_RALT | (kc))
471#define RGUI(kc) (kc | QK_RGUI) 471#define RGUI(kc) (QK_RGUI | (kc))
472#define RCMD(kc) RGUI(kc) 472#define RCMD(kc) RGUI(kc)
473#define RWIN(kc) RGUI(kc) 473#define RWIN(kc) RGUI(kc)
474 474
475#define HYPR(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI) 475#define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc))
476#define MEH(kc) (kc | QK_LCTL | QK_LSFT | QK_LALT) 476#define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc))
477#define LCAG(kc) (kc | QK_LCTL | QK_LALT | QK_LGUI) 477#define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc))
478#define ALTG(kc) (kc | QK_RCTL | QK_RALT) 478#define ALTG(kc) (QK_RCTL | QK_RALT | (kc))
479#define SGUI(kc) (kc | QK_LGUI | QK_LSFT) 479#define SGUI(kc) (QK_LGUI | QK_LSFT | (kc))
480#define SCMD(kc) SGUI(kc) 480#define SCMD(kc) SGUI(kc)
481#define SWIN(kc) SGUI(kc) 481#define SWIN(kc) SGUI(kc)
482#define LCA(kc) (kc | QK_LCTL | QK_LALT) 482#define LCA(kc) (QK_LCTL | QK_LALT | (kc))
483 483
484#define MOD_HYPR 0xf 484#define MOD_HYPR 0xf
485#define MOD_MEH 0x7 485#define MOD_MEH 0x7
@@ -557,15 +557,15 @@ enum quantum_keycodes {
557#define KC_DELT KC_DELETE // Del key (four letter code) 557#define KC_DELT KC_DELETE // Del key (four letter code)
558 558
559// Alias for function layers than expand past FN31 559// Alias for function layers than expand past FN31
560#define FUNC(kc) (kc | QK_FUNCTION) 560#define FUNC(kc) (QK_FUNCTION | (kc))
561 561
562// Aliases 562// Aliases
563#define S(kc) LSFT(kc) 563#define S(kc) LSFT(kc)
564#define F(kc) FUNC(kc) 564#define F(kc) FUNC(kc)
565 565
566#define M(kc) (kc | QK_MACRO) 566#define M(kc) (QK_MACRO | (kc))
567 567
568#define MACROTAP(kc) (kc | QK_MACRO | FUNC_TAP<<8) 568#define MACROTAP(kc) (QK_MACRO | (FUNC_TAP << 8) | (kc))
569#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE) 569#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
570 570
571#define KC_GESC GRAVE_ESC 571#define KC_GESC GRAVE_ESC
@@ -590,7 +590,7 @@ enum quantum_keycodes {
590#define RGB_M_T RGB_MODE_RGBTEST 590#define RGB_M_T RGB_MODE_RGBTEST
591 591
592// L-ayer, T-ap - 256 keycode max, 16 layer max 592// L-ayer, T-ap - 256 keycode max, 16 layer max
593#define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8)) 593#define LT(layer, kc) (QK_LAYER_TAP | ((layer & 0xF) << 8) | ((kc) & 0xFF))
594 594
595#define AG_SWAP MAGIC_SWAP_ALT_GUI 595#define AG_SWAP MAGIC_SWAP_ALT_GUI
596#define AG_NORM MAGIC_UNSWAP_ALT_GUI 596#define AG_NORM MAGIC_UNSWAP_ALT_GUI
@@ -602,32 +602,32 @@ enum quantum_keycodes {
602// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default. 602// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default.
603// In fact, we changed it to assume ON_PRESS for sanity/simplicity. If needed, you can add your own 603// In fact, we changed it to assume ON_PRESS for sanity/simplicity. If needed, you can add your own
604// keycode modeled after the old version, kept below for this. 604// keycode modeled after the old version, kept below for this.
605/* #define TO(layer, when) (layer | QK_TO | (when << 0x4)) */ 605/* #define TO(layer, when) (QK_TO | (when << 0x4) | (layer & 0xFF)) */
606#define TO(layer) (layer | QK_TO | (ON_PRESS << 0x4)) 606#define TO(layer) (QK_TO | (ON_PRESS << 0x4) | (layer & 0xFF))
607 607
608// Momentary switch layer - 256 layer max 608// Momentary switch layer - 256 layer max
609#define MO(layer) (layer | QK_MOMENTARY) 609#define MO(layer) (QK_MOMENTARY | (layer & 0xFF))
610 610
611// Set default layer - 256 layer max 611// Set default layer - 256 layer max
612#define DF(layer) (layer | QK_DEF_LAYER) 612#define DF(layer) (QK_DEF_LAYER | (layer & 0xFF))
613 613
614// Toggle to layer - 256 layer max 614// Toggle to layer - 256 layer max
615#define TG(layer) (layer | QK_TOGGLE_LAYER) 615#define TG(layer) (QK_TOGGLE_LAYER | (layer & 0xFF))
616 616
617// One-shot layer - 256 layer max 617// One-shot layer - 256 layer max
618#define OSL(layer) (layer | QK_ONE_SHOT_LAYER) 618#define OSL(layer) (QK_ONE_SHOT_LAYER | (layer & 0xFF))
619 619
620// L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max, left mods only 620// L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max, left mods only
621#define LM(layer, mod) (QK_LAYER_MOD | (((layer) & 0xF) << 4) | ((mod) & 0xF)) 621#define LM(layer, mod) (QK_LAYER_MOD | ((layer & 0xF) << 4) | ((mod) & 0xF))
622 622
623// One-shot mod 623// One-shot mod
624#define OSM(mod) ((mod) | QK_ONE_SHOT_MOD) 624#define OSM(mod) (QK_ONE_SHOT_MOD | ((mod) & 0xFF))
625 625
626// Layer tap-toggle 626// Layer tap-toggle
627#define TT(layer) (layer | QK_LAYER_TAP_TOGGLE) 627#define TT(layer) (QK_LAYER_TAP_TOGGLE | (layer & 0xFF))
628 628
629// M-od, T-ap - 256 keycode max 629// M-od, T-ap - 256 keycode max
630#define MT(mod, kc) (kc | QK_MOD_TAP | (((mod) & 0x1F) << 8)) 630#define MT(mod, kc) (QK_MOD_TAP | (((mod) & 0x1F) << 8) | ((kc) & 0xFF))
631 631
632#define CTL_T(kc) MT(MOD_LCTL, kc) 632#define CTL_T(kc) MT(MOD_LCTL, kc)
633#define LCTL_T(kc) MT(MOD_LCTL, kc) 633#define LCTL_T(kc) MT(MOD_LCTL, kc)
@@ -652,15 +652,15 @@ enum quantum_keycodes {
652#define RCMD_T(kc) RGUI_T(kc) 652#define RCMD_T(kc) RGUI_T(kc)
653#define RWIN_T(kc) RGUI_T(kc) 653#define RWIN_T(kc) RGUI_T(kc)
654 654
655#define C_S_T(kc) MT((MOD_LCTL | MOD_LSFT), kc) // Control + Shift e.g. for gnome-terminal 655#define C_S_T(kc) MT(MOD_LCTL | MOD_LSFT, kc) // Control + Shift e.g. for gnome-terminal
656#define MEH_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT), kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl 656#define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc) // Meh is a less hyper version of the Hyper key -- doesn't include Win or Cmd, so just alt+shift+ctrl
657#define LCAG_T(kc) MT((MOD_LCTL | MOD_LALT | MOD_LGUI), kc) // Left control alt and gui 657#define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc) // Left control alt and gui
658#define RCAG_T(kc) MT((MOD_RCTL | MOD_RALT | MOD_RGUI), kc) // Right control alt and gui 658#define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc) // Right control alt and gui
659#define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ 659#define ALL_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/
660#define SGUI_T(kc) MT((MOD_LGUI | MOD_LSFT), kc) 660#define SGUI_T(kc) MT(MOD_LGUI | MOD_LSFT, kc)
661#define SCMD_T(kc) SGUI_T(kc) 661#define SCMD_T(kc) SGUI_T(kc)
662#define SWIN_T(kc) SGUI_T(kc) 662#define SWIN_T(kc) SGUI_T(kc)
663#define LCA_T(kc) MT((MOD_LCTL | MOD_LALT), kc) // Left control and left alt 663#define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc) // Left control and left alt
664 664
665// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap 665// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
666#define KC_HYPR HYPR(KC_NO) 666#define KC_HYPR HYPR(KC_NO)
@@ -670,22 +670,22 @@ enum quantum_keycodes {
670 // For sending unicode codes. 670 // For sending unicode codes.
671 // You may not send codes over 7FFF -- this supports most of UTF8. 671 // You may not send codes over 7FFF -- this supports most of UTF8.
672 // To have a key that sends out Œ, go UC(0x0152) 672 // To have a key that sends out Œ, go UC(0x0152)
673 #define UNICODE(n) (n | QK_UNICODE) 673 #define UNICODE(n) (QK_UNICODE | (n))
674 #define UC(n) UNICODE(n) 674 #define UC(n) UNICODE(n)
675#endif 675#endif
676 676
677#ifdef UNICODEMAP_ENABLE 677#ifdef UNICODEMAP_ENABLE
678 #define X(n) (n | QK_UNICODE_MAP) 678 #define X(n) (QK_UNICODE_MAP | (n))
679#endif 679#endif
680 680
681#ifdef SWAP_HANDS_ENABLE 681#ifdef SWAP_HANDS_ENABLE
682 #define SH_T(key) (QK_SWAP_HANDS | key) 682 #define SH_T(kc) (QK_SWAP_HANDS | (kc))
683 #define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE) 683 #define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE)
684 #define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE) 684 #define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE)
685 #define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF) 685 #define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF)
686 #define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON) 686 #define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON)
687 #define SH_ON (QK_SWAP_HANDS | OP_SH_ON) 687 #define SH_ON (QK_SWAP_HANDS | OP_SH_ON)
688 #define SH_OFF (QK_SWAP_HANDS | OP_SH_OFF) 688 #define SH_OFF (QK_SWAP_HANDS | OP_SH_OFF)
689#endif 689#endif
690 690
691#endif // QUANTUM_KEYCODES_H 691#endif // QUANTUM_KEYCODES_H