quantum_keycodes.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /* Copyright 2016-2017 Jack Humbert
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #pragma once
  17. // Pull in dd keycodes to maintain header compatibility
  18. #include "keycodes.h"
  19. // US ANSI shifted keycode aliases
  20. #include "keymap_us.h"
  21. // TODO: sub-ranges?
  22. // clang-format off
  23. #define QK_LCTL 0x0100
  24. #define QK_LSFT 0x0200
  25. #define QK_LALT 0x0400
  26. #define QK_LGUI 0x0800
  27. #define QK_RMODS_MIN 0x1000
  28. #define QK_RCTL 0x1100
  29. #define QK_RSFT 0x1200
  30. #define QK_RALT 0x1400
  31. #define QK_RGUI 0x1800
  32. #define SAFE_RANGE QK_USER
  33. // clang-format on
  34. // Generic decoding for the whole QK_MODS range
  35. #define QK_MODS_GET_MODS(kc) (((kc) >> 8) & 0x1F)
  36. #define QK_MODS_GET_BASIC_KEYCODE(kc) ((kc) & 0xFF)
  37. // Modified keycodes
  38. #define LCTL(kc) (QK_LCTL | (kc))
  39. #define LSFT(kc) (QK_LSFT | (kc))
  40. #define LALT(kc) (QK_LALT | (kc))
  41. #define LGUI(kc) (QK_LGUI | (kc))
  42. #define LOPT(kc) LALT(kc)
  43. #define LCMD(kc) LGUI(kc)
  44. #define LWIN(kc) LGUI(kc)
  45. #define C(kc) LCTL(kc)
  46. #define S(kc) LSFT(kc)
  47. #define A(kc) LALT(kc)
  48. #define G(kc) LGUI(kc)
  49. #define LCS(kc) (QK_LCTL | QK_LSFT | (kc))
  50. #define LCA(kc) (QK_LCTL | QK_LALT | (kc))
  51. #define LCG(kc) (QK_LCTL | QK_LGUI | (kc))
  52. #define LSA(kc) (QK_LSFT | QK_LALT | (kc))
  53. #define LSG(kc) (QK_LSFT | QK_LGUI | (kc))
  54. #define LAG(kc) (QK_LALT | QK_LGUI | (kc))
  55. #define LCSG(kc) (QK_LCTL | QK_LSFT | QK_LGUI | (kc))
  56. #define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc))
  57. #define LSAG(kc) (QK_LSFT | QK_LALT | QK_LGUI | (kc))
  58. #define RCTL(kc) (QK_RCTL | (kc))
  59. #define RSFT(kc) (QK_RSFT | (kc))
  60. #define RALT(kc) (QK_RALT | (kc))
  61. #define RGUI(kc) (QK_RGUI | (kc))
  62. #define ALGR(kc) RALT(kc)
  63. #define ROPT(kc) RALT(kc)
  64. #define RCMD(kc) RGUI(kc)
  65. #define RWIN(kc) RGUI(kc)
  66. #define RCA(kc) (QK_RCTL | QK_RALT | (kc))
  67. #define RCS(kc) (QK_RCTL | QK_RSFT | (kc))
  68. #define RCG(kc) (QK_RCTL | QK_RGUI | (kc))
  69. #define RSA(kc) (QK_RSFT | QK_RALT | (kc))
  70. #define RSG(kc) (QK_RSFT | QK_RGUI | (kc))
  71. #define RAG(kc) (QK_RALT | QK_RGUI | (kc))
  72. #define RCSG(kc) (QK_RCTL | QK_RSFT | QK_RGUI | (kc))
  73. #define RCAG(kc) (QK_RCTL | QK_RALT | QK_RGUI | (kc))
  74. #define RSAG(kc) (QK_RSFT | QK_RALT | QK_RGUI | (kc))
  75. #define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc))
  76. #define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc))
  77. // GOTO layer - 32 layer max
  78. #define TO(layer) (QK_TO | ((layer) & 0x1F))
  79. #define QK_TO_GET_LAYER(kc) ((kc) & 0x1F)
  80. // Momentary switch layer - 32 layer max
  81. #define MO(layer) (QK_MOMENTARY | ((layer) & 0x1F))
  82. #define QK_MOMENTARY_GET_LAYER(kc) ((kc) & 0x1F)
  83. // Set default layer - 32 layer max
  84. #define DF(layer) (QK_DEF_LAYER | ((layer) & 0x1F))
  85. #define QK_DEF_LAYER_GET_LAYER(kc) ((kc) & 0x1F)
  86. // Set persistent default layer - 32 layer max
  87. #define PDF(layer) (QK_PERSISTENT_DEF_LAYER | ((layer) & 0x1F))
  88. #define QK_PERSISTENT_DEF_LAYER_GET_LAYER(kc) ((kc) & 0x1F)
  89. // Toggle to layer - 32 layer max
  90. #define TG(layer) (QK_TOGGLE_LAYER | ((layer) & 0x1F))
  91. #define QK_TOGGLE_LAYER_GET_LAYER(kc) ((kc) & 0x1F)
  92. // One-shot layer - 32 layer max
  93. #define OSL(layer) (QK_ONE_SHOT_LAYER | ((layer) & 0x1F))
  94. #define QK_ONE_SHOT_LAYER_GET_LAYER(kc) ((kc) & 0x1F)
  95. // L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max
  96. #define LM(layer, mod) (QK_LAYER_MOD | (((layer) & 0xF) << 5) | ((mod) & 0x1F))
  97. #define QK_LAYER_MOD_GET_LAYER(kc) (((kc) >> 5) & 0xF)
  98. #define QK_LAYER_MOD_GET_MODS(kc) ((kc) & 0x1F)
  99. // One-shot mod
  100. #define OSM(mod) (QK_ONE_SHOT_MOD | ((mod) & 0x1F))
  101. #define QK_ONE_SHOT_MOD_GET_MODS(kc) ((kc) & 0x1F)
  102. #define OS_LCTL OSM(MOD_LCTL)
  103. #define OS_LSFT OSM(MOD_LSFT)
  104. #define OS_LALT OSM(MOD_LALT)
  105. #define OS_LGUI OSM(MOD_LGUI)
  106. #define OS_LCS OSM(MOD_LCTL | MOD_LSFT)
  107. #define OS_LCA OSM(MOD_LCTL | MOD_LALT)
  108. #define OS_LCG OSM(MOD_LCTL | MOD_LGUI)
  109. #define OS_LSA OSM(MOD_LSFT | MOD_LALT)
  110. #define OS_LSG OSM(MOD_LSFT | MOD_LGUI)
  111. #define OS_LAG OSM(MOD_LALT | MOD_LGUI)
  112. #define OS_LCSG OSM(MOD_LCTL | MOD_LSFT | MOD_LGUI)
  113. #define OS_LCAG OSM(MOD_LCTL | MOD_LALT | MOD_LGUI)
  114. #define OS_LSAG OSM(MOD_LSFT | MOD_LALT | MOD_LGUI)
  115. #define OS_RCTL OSM(MOD_RCTL)
  116. #define OS_RSFT OSM(MOD_RSFT)
  117. #define OS_RALT OSM(MOD_RALT)
  118. #define OS_RGUI OSM(MOD_RGUI)
  119. #define OS_RCS OSM(MOD_RCTL | MOD_RSFT)
  120. #define OS_RCA OSM(MOD_RCTL | MOD_RALT)
  121. #define OS_RCG OSM(MOD_RCTL | MOD_RGUI)
  122. #define OS_RSA OSM(MOD_RSFT | MOD_RALT)
  123. #define OS_RSG OSM(MOD_RSFT | MOD_RGUI)
  124. #define OS_RAG OSM(MOD_RALT | MOD_RGUI)
  125. #define OS_RCSG OSM(MOD_RCTL | MOD_RSFT | MOD_RGUI)
  126. #define OS_RCAG OSM(MOD_RCTL | MOD_RALT | MOD_RGUI)
  127. #define OS_RSAG OSM(MOD_RSFT | MOD_RALT | MOD_RGUI)
  128. #define OS_MEH OSM(MOD_LCTL | MOD_LSFT | MOD_LALT)
  129. #define OS_HYPR OSM(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI)
  130. // Layer tap-toggle - 32 layer max
  131. #define TT(layer) (QK_LAYER_TAP_TOGGLE | ((layer) & 0x1F))
  132. #define QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) ((kc) & 0x1F)
  133. // L-ayer, T-ap - 256 keycode max, 16 layer max
  134. #define LT(layer, kc) (QK_LAYER_TAP | (((layer) & 0xF) << 8) | ((kc) & 0xFF))
  135. #define QK_LAYER_TAP_GET_LAYER(kc) (((kc) >> 8) & 0xF)
  136. #define QK_LAYER_TAP_GET_TAP_KEYCODE(kc) ((kc) & 0xFF)
  137. // M-od, T-ap - 256 keycode max
  138. #define MT(mod, kc) (QK_MOD_TAP | (((mod) & 0x1F) << 8) | ((kc) & 0xFF))
  139. #define QK_MOD_TAP_GET_MODS(kc) (((kc) >> 8) & 0x1F)
  140. #define QK_MOD_TAP_GET_TAP_KEYCODE(kc) ((kc) & 0xFF)
  141. // Mod-Tap shortcuts
  142. #define LCTL_T(kc) MT(MOD_LCTL, kc)
  143. #define LSFT_T(kc) MT(MOD_LSFT, kc)
  144. #define LALT_T(kc) MT(MOD_LALT, kc)
  145. #define LGUI_T(kc) MT(MOD_LGUI, kc)
  146. #define CTL_T(kc) LCTL_T(kc)
  147. #define SFT_T(kc) LSFT_T(kc)
  148. #define ALT_T(kc) LALT_T(kc)
  149. #define GUI_T(kc) LGUI_T(kc)
  150. #define LOPT_T(kc) LALT_T(kc)
  151. #define LCMD_T(kc) LGUI_T(kc)
  152. #define LWIN_T(kc) LGUI_T(kc)
  153. #define OPT_T(kc) LOPT_T(kc)
  154. #define CMD_T(kc) LCMD_T(kc)
  155. #define WIN_T(kc) LWIN_T(kc)
  156. #define LCS_T(kc) MT(MOD_LCTL | MOD_LSFT, kc)
  157. #define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc)
  158. #define LCG_T(kc) MT(MOD_LCTL | MOD_LGUI, kc)
  159. #define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc)
  160. #define LSG_T(kc) MT(MOD_LSFT | MOD_LGUI, kc)
  161. #define LAG_T(kc) MT(MOD_LALT | MOD_LGUI, kc)
  162. #define LCSG_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LGUI, kc)
  163. #define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc)
  164. #define LSAG_T(kc) MT(MOD_LSFT | MOD_LALT | MOD_LGUI, kc)
  165. #define RCTL_T(kc) MT(MOD_RCTL, kc)
  166. #define RSFT_T(kc) MT(MOD_RSFT, kc)
  167. #define RALT_T(kc) MT(MOD_RALT, kc)
  168. #define RGUI_T(kc) MT(MOD_RGUI, kc)
  169. #define ROPT_T(kc) RALT_T(kc)
  170. #define ALGR_T(kc) RALT_T(kc)
  171. #define RCMD_T(kc) RGUI_T(kc)
  172. #define RWIN_T(kc) RGUI_T(kc)
  173. #define RCS_T(kc) MT(MOD_RCTL | MOD_RSFT, kc)
  174. #define RCA_T(kc) MT(MOD_RCTL | MOD_RALT, kc)
  175. #define RCG_T(kc) MT(MOD_RCTL | MOD_RGUI, kc)
  176. #define RSA_T(kc) MT(MOD_RSFT | MOD_RALT, kc)
  177. #define RSG_T(kc) MT(MOD_RSFT | MOD_RGUI, kc)
  178. #define RAG_T(kc) MT(MOD_RALT | MOD_RGUI, kc)
  179. #define RCSG_T(kc) MT(MOD_RCTL | MOD_RSFT | MOD_RGUI, kc)
  180. #define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc)
  181. #define RSAG_T(kc) MT(MOD_RSFT | MOD_RALT | MOD_RGUI, kc)
  182. #define MEH_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT, kc)
  183. #define HYPR_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc)
  184. // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
  185. #define KC_HYPR HYPR(KC_NO)
  186. #define KC_MEH MEH(KC_NO)
  187. // Unicode aliases
  188. // UNICODE_ENABLE - Allows Unicode input up to 0x7FFF
  189. #define UC(c) (QK_UNICODE | (c))
  190. #define QK_UNICODE_GET_CODE_POINT(kc) ((kc) & 0x7FFF)
  191. // UNICODEMAP_ENABLE - Allows Unicode input up to 0x10FFFF, requires unicode_map
  192. #define UM(i) (QK_UNICODEMAP | ((i) & 0x3FFF))
  193. #define QK_UNICODEMAP_GET_INDEX(kc) ((kc) & 0x3FFF)
  194. #define UP(i, j) (QK_UNICODEMAP_PAIR | ((i) & 0x7F) | (((j) & 0x7F) << 7)) // 127 max i and j
  195. #define QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(kc) ((kc) & 0x7F)
  196. #define QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(kc) (((kc) >> 7) & 0x7F)
  197. // Swap Hands
  198. #define SH_T(kc) (QK_SWAP_HANDS | ((kc) & 0xFF))
  199. #define QK_SWAP_HANDS_GET_TAP_KEYCODE(kc) ((kc) & 0xFF)
  200. // Tap dance
  201. #define TD(i) (QK_TAP_DANCE | ((i) & 0xFF))
  202. #define QK_TAP_DANCE_GET_INDEX(kc) ((kc) & 0xFF)
  203. // MIDI aliases
  204. #define MIDI_TONE_MIN QK_MIDI_NOTE_C_0
  205. #define MIDI_TONE_MAX QK_MIDI_NOTE_B_5
  206. #define MIDI_OCTAVE_MIN QK_MIDI_OCTAVE_N2
  207. #define MIDI_OCTAVE_MAX QK_MIDI_OCTAVE_7
  208. #define MIDI_TRANSPOSE_MIN QK_MIDI_TRANSPOSE_N6
  209. #define MIDI_TRANSPOSE_MAX QK_MIDI_TRANSPOSE_6
  210. #define MIDI_VELOCITY_MIN QK_MIDI_VELOCITY_0
  211. #define MIDI_VELOCITY_MAX QK_MIDI_VELOCITY_10
  212. #define MIDI_CHANNEL_MIN QK_MIDI_CHANNEL_1
  213. #define MIDI_CHANNEL_MAX QK_MIDI_CHANNEL_16
  214. // TODO: somehow migrate sequencer to DD?
  215. #include "sequencer.h"
  216. #define SEQUENCER_STEP_MIN (QK_SEQUENCER + 0xF)
  217. #define SEQUENCER_STEP_MAX (SEQUENCER_STEP_MIN + SEQUENCER_STEPS)
  218. #define SEQUENCER_RESOLUTION_MIN (SEQUENCER_STEP_MAX + 1)
  219. #define SEQUENCER_RESOLUTION_MAX (SEQUENCER_RESOLUTION_MIN + SEQUENCER_RESOLUTIONS)
  220. #define SEQUENCER_TRACK_MIN (SEQUENCER_RESOLUTION_MAX + 1)
  221. #define SEQUENCER_TRACK_MAX (SEQUENCER_TRACK_MIN + SEQUENCER_TRACKS)
  222. #define SQ_S(n) (n < SEQUENCER_STEPS ? SEQUENCER_STEP_MIN + n : KC_NO)
  223. #define SQ_R(n) (n < SEQUENCER_RESOLUTIONS ? SEQUENCER_RESOLUTION_MIN + n : KC_NO)
  224. #define SQ_T(n) (n < SEQUENCER_TRACKS ? SEQUENCER_TRACK_MIN + n : KC_NO)
  225. #include "quantum_keycodes_legacy.h"