]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/planck/keymaps/callum/keymap.c
[Keymap] the results of some experiments and radically simplify keymap.c (#6172)
[qmk_firmware.git] / keyboards / planck / keymaps / callum / keymap.c
1 #include "planck.h"
2 #include "action_layer.h"
3
4 #define a KC_A
5 #define b KC_B
6 #define c KC_C
7 #define d KC_D
8 #define e KC_E
9 #define f KC_F
10 #define g KC_G
11 #define h KC_H
12 #define i KC_I
13 #define j KC_J
14 #define k KC_K
15 #define l KC_L
16 #define m KC_M
17 #define n KC_N
18 #define o KC_O
19 #define p KC_P
20 #define q KC_Q
21 #define r KC_R
22 #define s KC_S
23 #define t KC_T
24 #define u KC_U
25 #define v KC_V
26 #define w KC_W
27 #define x KC_X
28 #define y KC_Y
29 #define z KC_Z
30
31 #define lalt KC_LALT
32 #define lctl KC_LCTL
33 #define lsft KC_LSFT
34 #define ralt KC_RALT
35 #define rctl KC_RCTL
36 #define rsft KC_RSFT
37
38 #define n0 KC_0
39 #define n1 KC_1
40 #define n2 KC_2
41 #define n3 KC_3
42 #define n4 KC_4
43 #define n5 KC_5
44 #define n6 KC_6
45 #define n7 KC_7
46 #define n8 KC_8
47 #define n9 KC_9
48
49 #define bspc KC_BSPC
50 #define caps KC_CAPS
51 #define comm KC_COMM
52 #define dash A(KC_MINS)
53 #define scln KC_SCLN
54 #define slsh KC_SLSH
55 #define spc KC_SPC
56 #define tab KC_TAB
57 #define del KC_DEL
58 #define dot KC_DOT
59 #define ent KC_ENT
60 #define mins KC_MINS
61 #define quot KC_QUOT
62 #define esc KC_ESC
63 #define gbp A(KC_3)
64
65 #define down KC_DOWN
66 #define home KC_HOME
67 #define end KC_END
68 #define up KC_UP
69 #define pgdn KC_PGDN
70 #define pgup KC_PGUP
71 #define left KC_LEFT
72 #define rght KC_RGHT
73
74 #define tabl S(C(KC_TAB))
75 #define tabr C(KC_TAB)
76 #define fwd G(KC_RBRC)
77 #define back G(KC_LBRC)
78 #define dtl C(KC_LEFT)
79 #define dtr C(KC_RGHT)
80 #define slup S(A(KC_UP))
81 #define sldn S(A(KC_DOWN))
82
83 #define f1 KC_F1
84 #define f2 KC_F2
85 #define f3 KC_F3
86 #define f4 KC_F4
87 #define f5 KC_F5
88 #define f6 KC_F6
89 #define f7 KC_F7
90 #define f8 KC_F8
91 #define f9 KC_F9
92 #define f10 KC_F10
93 #define f11 KC_F11
94 #define f12 KC_F12
95 #define f13 KC_F13
96 #define f14 KC_F14
97 #define f15 KC_F15
98 #define f16 KC_F16
99 #define f17 KC_F17
100 #define f18 KC_F18
101 #define f19 KC_F19
102 #define f20 KC_F20
103
104 #define mute KC_MUTE
105 #define next KC_MNXT
106 #define play KC_MPLY
107 #define prev KC_MPRV
108 #define vold KC_F11
109 #define volu KC_F12
110
111 #define symb MO(SYMB)
112 #define move MO(MOVE)
113 #define func MO(FUNC)
114
115 #define rset RESET
116 #define powr KC_POWER
117
118 #define ____ KC_TRNS
119 #define xxxx KC_NO
120
121 extern keymap_config_t keymap_config;
122
123 enum planck_layers {
124     BASE,
125     SYMB,
126     MOVE,
127     FUNC,
128 };
129
130 enum planck_keycodes {
131     ampr = SAFE_RANGE,
132     astr,
133     at,
134     bsls,
135     circ,
136     dlr,
137     eql,
138     exlm,
139     grv,
140     hash,
141     lbrc,
142     lcbr,
143     lprn,
144     perc,
145     pipe,
146     plus,
147     rbrc,
148     rcbr,
149     rprn,
150     tild,
151
152     cmd,
153 };
154
155 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
156     [BASE] = LAYOUT_planck_grid(
157          tab,    q,    w,    f,    p,    g,    j,    l,    u,    y, scln, mins,
158         bspc,    a,    r,    s,    t,    d,    h,    n,    e,    i,    o, quot,
159         lsft,    z,    x,    c,    v,    b,    k,    m, comm,  dot, slsh, rsft,
160         func, lctl, lalt,  cmd, move,  ent,  spc, symb,  cmd, ralt, rctl, func
161     ),
162
163     [SYMB] = LAYOUT_planck_grid(
164          esc,   n7,   n5,   n3,   n1,   n9,   n8,   n0,   n2,   n4,   n6, dash,
165          del, bsls, hash, astr,  eql, pipe,   at, rprn, lprn,  dlr, ampr,  gbp,
166         caps,  grv, exlm, lbrc, rbrc, circ, tild, rcbr, lcbr, plus, perc, caps,
167         ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
168     ),
169
170     [MOVE] = LAYOUT_planck_grid(
171          esc, xxxx, slup,  dtl,  dtr, xxxx, xxxx, home,   up,  end, xxxx, xxxx,
172          del, xxxx, sldn, tabl, tabr, xxxx, xxxx, left, down, rght, xxxx, xxxx,
173         ____, xxxx, xxxx, back,  fwd, xxxx, xxxx, pgdn, pgup, xxxx, xxxx, ____,
174         ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
175     ),
176
177     [FUNC] = LAYOUT_planck_grid(
178         rset,   f1,   f2,   f3,   f4,   f5,   f6,   f7,   f8,   f9,  f10, volu,
179         powr,  f11,  f12,  f13,  f14,  f15,  f16,  f17,  f18,  f19,  f20, vold,
180         ____, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, xxxx, ____,
181         ____, ____, ____, ____, prev, mute, play, next, ____, ____, ____, ____
182     ),
183 };
184
185 bool send_string_if_keydown(keyrecord_t *record, const char *s) {
186     if (record->event.pressed) {
187         SEND_STRING(s);
188     }
189     return true;
190 }
191
192 int cmd_keys_down = 0;
193
194 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
195     switch (keycode) {
196         // Override the defualt auto shifted symbols to use SEND_STRING See
197         // https://github.com/qmk/qmk_firmware/issues/4072
198         case ampr:
199             return send_string_if_keydown(record, "&");
200         case astr:
201             return send_string_if_keydown(record, "*");
202         case at:
203             return send_string_if_keydown(record, "@");
204         case bsls:
205             return send_string_if_keydown(record, "\\");
206         case circ:
207             return send_string_if_keydown(record, "^");
208         case dlr:
209             return send_string_if_keydown(record, "$");
210         case eql:
211             return send_string_if_keydown(record, "=");
212         case exlm:
213             return send_string_if_keydown(record, "!");
214         case grv:
215             return send_string_if_keydown(record, "`");
216         case hash:
217             return send_string_if_keydown(record, "#");
218         case lbrc:
219             return send_string_if_keydown(record, "[");
220         case lcbr:
221             return send_string_if_keydown(record, "{");
222         case lprn:
223             return send_string_if_keydown(record, "(");
224         case perc:
225             return send_string_if_keydown(record, "%");
226         case pipe:
227             return send_string_if_keydown(record, "|");
228         case plus:
229             return send_string_if_keydown(record, "+");
230         case rbrc:
231             return send_string_if_keydown(record, "]");
232         case rcbr:
233             return send_string_if_keydown(record, "}");
234         case rprn:
235             return send_string_if_keydown(record, ")");
236         case tild:
237             return send_string_if_keydown(record, "~");
238
239         // cmd + cmd -> cmd + ctl
240         case cmd:
241             if (record->event.pressed) {
242                 if (cmd_keys_down == 0) {
243                     register_code(KC_LCMD);
244                 } else {
245                     register_code(KC_LCTL);
246                 }
247                 cmd_keys_down++;
248             } else {
249                 if (cmd_keys_down == 1) {
250                     unregister_code(KC_LCMD);
251                 } else {
252                     unregister_code(KC_LCTL);
253                 }
254                 cmd_keys_down--;
255             }
256             return true;
257     }
258     return true;
259 }