Parent directory

quantum_keycodes.h

8594 bytes
  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
 17#pragma once
 18
 19//  Pull in dd keycodes to maintain header compatibility
 20#include "keycodes.h"
 21
 22// US ANSI shifted keycode aliases
 23#include "keymap_us.h"
 24
 25// TODO: sub-ranges?
 26// clang-format off
 27#define QK_LCTL                0x0100
 28#define QK_LSFT                0x0200
 29#define QK_LALT                0x0400
 30#define QK_LGUI                0x0800
 31#define QK_RMODS_MIN           0x1000
 32#define QK_RCTL                0x1100
 33#define QK_RSFT                0x1200
 34#define QK_RALT                0x1400
 35#define QK_RGUI                0x1800
 36
 37#define SAFE_RANGE             QK_USER
 38// clang-format on
 39
 40// Generic decoding for the whole QK_MODS range
 41#define QK_MODS_GET_MODS(kc) (((kc) >> 8) & 0x1F)
 42#define QK_MODS_GET_BASIC_KEYCODE(kc) ((kc)&0xFF)
 43
 44// Keycode modifiers & aliases
 45#define LCTL(kc) (QK_LCTL | (kc))
 46#define LSFT(kc) (QK_LSFT | (kc))
 47#define LALT(kc) (QK_LALT | (kc))
 48#define LGUI(kc) (QK_LGUI | (kc))
 49#define LOPT(kc) LALT(kc)
 50#define LCMD(kc) LGUI(kc)
 51#define LWIN(kc) LGUI(kc)
 52#define RCTL(kc) (QK_RCTL | (kc))
 53#define RSFT(kc) (QK_RSFT | (kc))
 54#define RALT(kc) (QK_RALT | (kc))
 55#define RGUI(kc) (QK_RGUI | (kc))
 56#define ALGR(kc) RALT(kc)
 57#define ROPT(kc) RALT(kc)
 58#define RCMD(kc) RGUI(kc)
 59#define RWIN(kc) RGUI(kc)
 60
 61#define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc))
 62#define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc))
 63#define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc))
 64#define LSG(kc) (QK_LSFT | QK_LGUI | (kc))
 65#define SGUI(kc) LSG(kc)
 66#define SCMD(kc) LSG(kc)
 67#define SWIN(kc) LSG(kc)
 68#define LAG(kc) (QK_LALT | QK_LGUI | (kc))
 69#define RSG(kc) (QK_RSFT | QK_RGUI | (kc))
 70#define RAG(kc) (QK_RALT | QK_RGUI | (kc))
 71#define LCA(kc) (QK_LCTL | QK_LALT | (kc))
 72#define LSA(kc) (QK_LSFT | QK_LALT | (kc))
 73#define RSA(kc) (QK_RSFT | QK_RALT | (kc))
 74#define RCS(kc) (QK_RCTL | QK_RSFT | (kc))
 75#define SAGR(kc) RSA(kc)
 76
 77// Modified keycode aliases
 78#define C(kc) LCTL(kc)
 79#define S(kc) LSFT(kc)
 80#define A(kc) LALT(kc)
 81#define G(kc) LGUI(kc)
 82
 83// GOTO layer - 32 layer max
 84#define TO(layer) (QK_TO | ((layer)&0x1F))
 85#define QK_TO_GET_LAYER(kc) ((kc)&0x1F)
 86
 87// Momentary switch layer - 32 layer max
 88#define MO(layer) (QK_MOMENTARY | ((layer)&0x1F))
 89#define QK_MOMENTARY_GET_LAYER(kc) ((kc)&0x1F)
 90
 91// Set default layer - 32 layer max
 92#define DF(layer) (QK_DEF_LAYER | ((layer)&0x1F))
 93#define QK_DEF_LAYER_GET_LAYER(kc) ((kc)&0x1F)
 94
 95// Set persistent default layer - 32 layer max
 96#define PDF(layer) (QK_PERSISTENT_DEF_LAYER | ((layer)&0x1F))
 97#define QK_PERSISTENT_DEF_LAYER_GET_LAYER(kc) ((kc)&0x1F)
 98
 99// Toggle to layer - 32 layer max
100#define TG(layer) (QK_TOGGLE_LAYER | ((layer)&0x1F))
101#define QK_TOGGLE_LAYER_GET_LAYER(kc) ((kc)&0x1F)
102
103// One-shot layer - 32 layer max
104#define OSL(layer) (QK_ONE_SHOT_LAYER | ((layer)&0x1F))
105#define QK_ONE_SHOT_LAYER_GET_LAYER(kc) ((kc)&0x1F)
106
107// L-ayer M-od: Momentary switch layer with modifiers active - 16 layer max
108#define LM(layer, mod) (QK_LAYER_MOD | (((layer)&0xF) << 5) | ((mod)&0x1F))
109#define QK_LAYER_MOD_GET_LAYER(kc) (((kc) >> 5) & 0xF)
110#define QK_LAYER_MOD_GET_MODS(kc) ((kc)&0x1F)
111
112// One-shot mod
113#define OSM(mod) (QK_ONE_SHOT_MOD | ((mod)&0x1F))
114#define QK_ONE_SHOT_MOD_GET_MODS(kc) ((kc)&0x1F)
115
116// Layer tap-toggle - 32 layer max
117#define TT(layer) (QK_LAYER_TAP_TOGGLE | ((layer)&0x1F))
118#define QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) ((kc)&0x1F)
119
120// L-ayer, T-ap - 256 keycode max, 16 layer max
121#define LT(layer, kc) (QK_LAYER_TAP | (((layer)&0xF) << 8) | ((kc)&0xFF))
122#define QK_LAYER_TAP_GET_LAYER(kc) (((kc) >> 8) & 0xF)
123#define QK_LAYER_TAP_GET_TAP_KEYCODE(kc) ((kc)&0xFF)
124
125// M-od, T-ap - 256 keycode max
126#define MT(mod, kc) (QK_MOD_TAP | (((mod)&0x1F) << 8) | ((kc)&0xFF))
127#define QK_MOD_TAP_GET_MODS(kc) (((kc) >> 8) & 0x1F)
128#define QK_MOD_TAP_GET_TAP_KEYCODE(kc) ((kc)&0xFF)
129
130#define LCTL_T(kc) MT(MOD_LCTL, kc)
131#define RCTL_T(kc) MT(MOD_RCTL, kc)
132#define CTL_T(kc) LCTL_T(kc)
133
134#define LSFT_T(kc) MT(MOD_LSFT, kc)
135#define RSFT_T(kc) MT(MOD_RSFT, kc)
136#define SFT_T(kc) LSFT_T(kc)
137
138#define LALT_T(kc) MT(MOD_LALT, kc)
139#define RALT_T(kc) MT(MOD_RALT, kc)
140#define LOPT_T(kc) LALT_T(kc)
141#define ROPT_T(kc) RALT_T(kc)
142#define ALGR_T(kc) RALT_T(kc)
143#define ALT_T(kc) LALT_T(kc)
144#define OPT_T(kc) LOPT_T(kc)
145
146#define LGUI_T(kc) MT(MOD_LGUI, kc)
147#define RGUI_T(kc) MT(MOD_RGUI, kc)
148#define LCMD_T(kc) LGUI_T(kc)
149#define LWIN_T(kc) LGUI_T(kc)
150#define RCMD_T(kc) RGUI_T(kc)
151#define RWIN_T(kc) RGUI_T(kc)
152#define GUI_T(kc) LGUI_T(kc)
153#define CMD_T(kc) LCMD_T(kc)
154#define WIN_T(kc) LWIN_T(kc)
155
156#define C_S_T(kc) MT(MOD_LCTL | MOD_LSFT, kc)                        // Left Control + Shift e.g. for gnome-terminal
157#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 GUI, so just Left Control + Shift + Alt
158#define LCAG_T(kc) MT(MOD_LCTL | MOD_LALT | MOD_LGUI, kc)            // Left Control + Alt + GUI
159#define RCAG_T(kc) MT(MOD_RCTL | MOD_RALT | MOD_RGUI, kc)            // Right Control + Alt + GUI
160#define HYPR_T(kc) MT(MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI, kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/
161#define LSG_T(kc) MT(MOD_LSFT | MOD_LGUI, kc)                        // Left Shift + GUI
162#define SGUI_T(kc) LSG_T(kc)
163#define SCMD_T(kc) LSG_T(kc)
164#define SWIN_T(kc) LSG_T(kc)
165#define LAG_T(kc) MT(MOD_LALT | MOD_LGUI, kc) // Left Alt + GUI
166#define RSG_T(kc) MT(MOD_RSFT | MOD_RGUI, kc) // Right Shift + GUI
167#define RAG_T(kc) MT(MOD_RALT | MOD_RGUI, kc) // Right Alt + GUI
168#define LCA_T(kc) MT(MOD_LCTL | MOD_LALT, kc) // Left Control + Alt
169#define LSA_T(kc) MT(MOD_LSFT | MOD_LALT, kc) // Left Shift + Alt
170#define RSA_T(kc) MT(MOD_RSFT | MOD_RALT, kc) // Right Shift + Alt
171#define RCS_T(kc) MT(MOD_RCTL | MOD_RSFT, kc) // Right Control + Shift
172#define SAGR_T(kc) RSA_T(kc)
173
174#define ALL_T(kc) HYPR_T(kc)
175
176// Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap
177#define KC_HYPR HYPR(KC_NO)
178#define KC_MEH MEH(KC_NO)
179
180// Unicode aliases
181// UNICODE_ENABLE - Allows Unicode input up to 0x7FFF
182#define UC(c) (QK_UNICODE | (c))
183#define QK_UNICODE_GET_CODE_POINT(kc) ((kc)&0x7FFF)
184
185// UNICODEMAP_ENABLE - Allows Unicode input up to 0x10FFFF, requires unicode_map
186#define UM(i) (QK_UNICODEMAP | ((i)&0x3FFF))
187#define QK_UNICODEMAP_GET_INDEX(kc) ((kc)&0x3FFF)
188
189#define UP(i, j) (QK_UNICODEMAP_PAIR | ((i)&0x7F) | (((j)&0x7F) << 7)) // 127 max i and j
190#define QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(kc) ((kc)&0x7F)
191#define QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(kc) (((kc) >> 7) & 0x7F)
192
193// Swap Hands
194#define SH_T(kc) (QK_SWAP_HANDS | ((kc)&0xFF))
195#define QK_SWAP_HANDS_GET_TAP_KEYCODE(kc) ((kc)&0xFF)
196
197// Tap dance
198#define TD(i) (QK_TAP_DANCE | ((i)&0xFF))
199#define QK_TAP_DANCE_GET_INDEX(kc) ((kc)&0xFF)
200
201// MIDI aliases
202#define MIDI_TONE_MIN QK_MIDI_NOTE_C_0
203#define MIDI_TONE_MAX QK_MIDI_NOTE_B_5
204#define MIDI_OCTAVE_MIN QK_MIDI_OCTAVE_N2
205#define MIDI_OCTAVE_MAX QK_MIDI_OCTAVE_7
206#define MIDI_TRANSPOSE_MIN QK_MIDI_TRANSPOSE_N6
207#define MIDI_TRANSPOSE_MAX QK_MIDI_TRANSPOSE_6
208#define MIDI_VELOCITY_MIN QK_MIDI_VELOCITY_0
209#define MIDI_VELOCITY_MAX QK_MIDI_VELOCITY_10
210#define MIDI_CHANNEL_MIN QK_MIDI_CHANNEL_1
211#define MIDI_CHANNEL_MAX QK_MIDI_CHANNEL_16
212
213// TODO: somehow migrate sequencer to DD?
214#include "sequencer.h"
215
216#define SEQUENCER_STEP_MIN (QK_SEQUENCER + 0xF)
217#define SEQUENCER_STEP_MAX (SEQUENCER_STEP_MIN + SEQUENCER_STEPS)
218
219#define SEQUENCER_RESOLUTION_MIN (SEQUENCER_STEP_MAX + 1)
220#define SEQUENCER_RESOLUTION_MAX (SEQUENCER_RESOLUTION_MIN + SEQUENCER_RESOLUTIONS)
221
222#define SEQUENCER_TRACK_MIN (SEQUENCER_RESOLUTION_MAX + 1)
223#define SEQUENCER_TRACK_MAX (SEQUENCER_TRACK_MIN + SEQUENCER_TRACKS)
224
225#define SQ_S(n) (n < SEQUENCER_STEPS ? SEQUENCER_STEP_MIN + n : KC_NO)
226#define SQ_R(n) (n < SEQUENCER_RESOLUTIONS ? SEQUENCER_RESOLUTION_MIN + n : KC_NO)
227#define SQ_T(n) (n < SEQUENCER_TRACKS ? SEQUENCER_TRACK_MIN + n : KC_NO)
228
229#include "quantum_keycodes_legacy.h"