]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/atreus62/keymaps/mneme/keymap.c
Remove empty fn_actions[]
[qmk_firmware.git] / keyboards / atreus62 / keymaps / mneme / keymap.c
1 #include <stdarg.h>
2 #include QMK_KEYBOARD_H
3 #include "led.h"
4 #include "action_layer.h"
5 #include "action_util.h"
6
7 /*
8  *WINDOWS SWEDISH
9  */
10  /*
11   *WINDOWS SWEDISH
12   */
13  #define KN_HALF KC_GRV          // 1/2
14  #define KN_PLUS KC_MINS         // +
15  #define KN_ACUT KC_EQL          // ´
16  #define KN_AO   KC_LBRC         // Å
17  #define KN_UMLA KC_RBRC         // ¨
18  #define KN_OE   KC_SCLN         // Ö
19  #define KN_AE   KC_QUOT         // Ä
20  #define KN_QUOT KC_NUHS         // '
21  #define KN_LABK KC_NUBS         // <
22  #define KN_MINS KC_SLSH         // -
23  #define KN_EXLM LSFT(KC_1)      // !
24  #define KN_DQT  LSFT(KC_2)      // "
25  #define KN_AT   RALT(KC_2)      // @
26  #define KN_HASH LSFT(KC_3)      // #
27  #define KN_EUR  LSFT(KC_4)      // €
28  #define KN_DLR  RALT(KC_4)      // $
29  #define KN_PERC LSFT(KC_5)      // %
30  #define KN_AMPR LSFT(KC_6)      // &
31  #define KN_SLSH LSFT(KC_7)      // /
32  #define KN_LPRN LSFT(KC_8)      // (
33  #define KN_RPRN LSFT(KC_9)      // )
34  #define KN_EQL  LSFT(KC_0)      // =
35  #define KN_UNDS LSFT(KN_MINS)   // _
36  #define KN_QUES LSFT(KN_PLUS)   // ?
37  #define KN_GRAV LSFT(KN_ACUT)   // `
38  #define KN_LCBR RALT(KC_7)      // {
39  #define KN_RCBR RALT(KC_0)      // }
40  #define KN_LBRC RALT(KC_8)      // [
41  #define KN_RBRC RALT(KC_9)      // ]
42  #define KN_RABK LSFT(KN_LABK)   // <
43  #define KN_COLN LSFT(KC_DOT)    // :
44  #define KN_SCLN LSFT(KC_COMM)   // :
45  #define KN_PIPE RALT(KN_LABK)   // |
46  #define KN_QUES LSFT(KN_PLUS)   // ?
47  #define KN_CIRC LSFT(KN_UMLA)   // ^
48  #define KN_ASTR LSFT(KN_QUOT)   // *
49  #define KN_TILD RALT(KN_UMLA)   // ~
50  #define KN_BSLS RALT(KN_PLUS)   //
51
52 #define OSM_LCTL OSM(MOD_LCTL)
53 #define OSM_LALT OSM(MOD_LALT)
54 #define OSM_LSFT OSM(MOD_LSFT)
55
56 #define KC_HYP LSFT(LALT(LCTL(KC_LGUI)))
57
58 #define KC_COPY LCTL(KC_C)
59 #define KC_PASTE LCTL(KC_V)
60 #define KC_UNDO LCTL(KC_Z)
61 #define KC_REDO LCTL(LSFT(KC_Z))
62
63 // Layers
64 enum {
65   BASE = 0,
66   NAV,
67   SYM
68 };
69
70 //Macros
71 enum {
72   KF_1 = 0, // 1, F1
73   KF_2, // ...
74   KF_3,
75   KF_4,
76   KF_5,
77   KF_6,
78   KF_7,
79   KF_8,
80   KF_9,
81   KF_10,
82   KF_11,
83   KF_12
84 };
85
86 // Tapdance
87 enum {
88   TD_FUN = 0,
89   TD_EQ
90 };
91
92 //State and timers
93 uint16_t kf_timers[12];
94
95
96 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
97
98   [BASE] = LAYOUT(
99     M(KF_11), M(KF_1),  M(KF_2),  M(KF_3),  M(KF_4), M(KF_5),                    M(KF_6), M(KF_7), M(KF_8), M(KF_9), M(KF_10), M(KF_12),
100     KC_TAB,   KC_Q,     KC_W,     KC_E,     KC_R,    KC_T,                       KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,     KN_AO,
101     OSM_LCTL, KC_A,     KC_S,     KC_D,     KC_F,    KC_G,                       KC_H,    KC_J,    KC_K,    KC_L,    KN_OE,    KN_AE,
102     OSM_LSFT, KC_Z,     KC_X,     KC_C,     KC_V,    KC_B,                       KC_N,    KC_M,    KC_COMM, KC_DOT,  KN_MINS,  OSM_LSFT,
103     MO(NAV),  OSM_LCTL, OSM_LALT, KC_LGUI,  MO(SYM), KC_BSPC,  KC_DELT, KC_ENT,  KC_SPC,  MO(SYM), KC_LEAD, KC_LALT, KC_LCTRL, KC_HYP
104   ),
105
106   [NAV] = LAYOUT(
107     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
108     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                    KC_HOME,  KC_PGDN,  KC_PGUP,  KC_END,   KC_TRNS,  KC_TRNS,
109     KC_TRNS,  KC_LSFT,  KC_LCTL,  KC_LALT,  KC_L,     KC_TRNS,                    KC_LEFT,  KC_DOWN,  KC_UP,    KC_RIGHT, KC_TRNS,  KC_TRNS,
110     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,                    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
111     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_VOLD,  KC_VOLU
112   ),
113
114   [SYM] = LAYOUT(
115     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  TD(TD_EQ),                   TD(TD_FUN), KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
116     KC_TRNS,  KN_LABK,  KN_RABK,  KN_LCBR,  KN_RCBR,  KN_PLUS,                     KN_AT,      KN_DQT,   KN_QUOT,  KN_GRAV,  KN_SLSH,  KC_TRNS,
117     KC_TRNS,  KN_EXLM,  KN_EQL,   KN_LPRN,  KN_RPRN,  KN_MINS,                     KN_UNDS,    KN_CIRC,  KN_DLR,   KN_AMPR,  KN_PIPE,  KC_TRNS,
118     KC_TRNS,  KN_EUR,   KN_PERC,  KN_LBRC,  KN_RBRC,  KN_ASTR,                     KN_HASH,    KN_SCLN,  KN_COLN,  KN_QUES,  KN_BSLS,  KC_TRNS,
119     KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,   KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS
120   )
121 };
122
123 #define TAP_ONCE(code)  \
124   register_code (code); \
125   unregister_code (code)
126
127 static void m_tapn (uint8_t code, ...) {
128   uint8_t kc = code;
129   va_list ap;
130
131   va_start(ap, code);
132   do {
133     register_code(kc);
134     unregister_code(kc);
135     wait_ms(50);
136     kc = va_arg(ap, int);
137   } while (kc != 0);
138   va_end(ap);
139 }
140
141 static void m_handle_kf (keyrecord_t *record, uint8_t id) {
142   uint8_t code = id - KF_1;
143
144   if (record->event.pressed) {
145     kf_timers[code] = timer_read ();
146   } else {
147     uint8_t kc_base;
148     uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM);
149
150     kf_timers[code] = 0;
151
152     switch(id){
153       case KF_1 ... KF_10:
154         if (long_press) {
155           // Long press
156           kc_base = KC_F1;
157         } else {
158           kc_base = KC_1;
159         }
160         code += kc_base;
161         break;
162       case KF_11:
163         code = long_press ? KC_F11 : KC_ESC;
164         break;
165       case KF_12:
166         code = long_press ? KC_F12 : KN_PLUS;
167         break;
168     }
169     register_code (code);
170     unregister_code (code);
171   }
172 }
173
174 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
175 {
176   switch (id) {
177     case KF_1 ... KF_12:
178       m_handle_kf(record, id);
179       break;
180   }
181   return MACRO_NONE;
182 };
183
184 // Custom keycodes
185 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
186   bool queue = true;
187
188   //Cancle one-shot mods.
189   switch (keycode) {
190     case KC_ESC:
191       if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) {
192         clear_oneshot_mods();
193         queue = false;
194       }
195       break;
196   }
197   return queue;
198 }
199
200 // TAP DANCE SETTINGS
201 void dance_eq (qk_tap_dance_state_t *state, void *user_data) {
202   switch (state->count) {
203     case 1: // ===
204       register_code(KC_LSHIFT);
205       m_tapn(KC_0, KC_0, KC_0, 0);
206       unregister_code(KC_LSHIFT);
207       break;
208     case 2:
209       register_code(KC_LSHIFT);
210       m_tapn(KC_1, KC_0, KC_0, 0);
211       unregister_code(KC_LSHIFT);
212       break;
213     default:
214       reset_tap_dance(state);
215   }
216 }
217
218 void dance_fun (qk_tap_dance_state_t *state, void *user_data) {
219   switch (state->count) {
220     case 1: // =>
221       register_code(KC_LSHIFT);
222       m_tapn(KC_0, KN_LABK, 0);
223       unregister_code(KC_LSHIFT);
224       break;
225     case 2: // () => {}
226       register_code(KC_LSHIFT);
227       m_tapn(KC_8, KC_9, KC_SPC, KC_0, KN_LABK, KC_SPC, 0);
228       unregister_code(KC_LSHIFT);
229       register_code(KC_RALT);
230       m_tapn(KC_7, 0);
231       unregister_code(KC_RALT);
232       TAP_ONCE(KC_ENT);
233       break;
234     default:
235       reset_tap_dance(state);
236   }
237 }
238
239 qk_tap_dance_action_t tap_dance_actions[] = {
240   [TD_FUN] = ACTION_TAP_DANCE_FN (dance_fun),
241   [TD_EQ] = ACTION_TAP_DANCE_FN (dance_eq)
242 };
243
244 // Runs just one time when the keyboard initializes.
245 void matrix_init_user(void) {
246   set_unicode_input_mode(UC_WINC);
247 };
248
249 LEADER_EXTERNS();
250 // Runs constantly in the background, in a loop.
251 void matrix_scan_user(void) {
252   LEADER_DICTIONARY() {
253     leading = false;
254     leader_end();
255     SEQ_ONE_KEY(KC_L){
256       register_code(KC_RGUI);
257       TAP_ONCE(KC_L);
258       unregister_code(KC_RGUI);
259     };
260
261
262     SEQ_TWO_KEYS (KC_A, KC_W) {
263       //Web - chrome
264       register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI);
265     }
266     SEQ_TWO_KEYS (KC_A, KC_P) {
267       //sPotify
268       register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI);
269
270     }
271     SEQ_TWO_KEYS (KC_A, KC_T) {
272       //Total Commander
273       register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI);
274
275     }
276     SEQ_TWO_KEYS (KC_A, KC_A) {
277       //Atom
278       register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI);
279
280     }
281     SEQ_TWO_KEYS (KC_A, KC_E) {
282       //Emacs
283       register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI);
284
285     }
286     SEQ_TWO_KEYS (KC_A, KC_C) {
287       //Cmdr
288       register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI);
289
290     }
291     SEQ_TWO_KEYS (KC_A, KC_S) {
292       //Slack
293       register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI);
294     }
295
296     SEQ_TWO_KEYS (KC_U, KC_L) {
297       set_unicode_input_mode(UC_LNX);
298     }
299
300
301     SEQ_TWO_KEYS (KC_U, KC_W) {
302       set_unicode_input_mode(UC_WINC);
303     }
304
305
306     SEQ_TWO_KEYS (KC_S, KC_S) {
307       // ¯\_(ツ)_/¯
308       unicode_input_start(); register_hex(0xaf); unicode_input_finish();
309       register_code (KC_LALT);
310       register_code (KC_LCTL);
311       TAP_ONCE (KN_PLUS);
312       unregister_code (KC_LCTL);
313       unregister_code (KC_LALT);
314
315       register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
316       unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
317       register_code (KC_RSFT); TAP_ONCE (KC_9); TAP_ONCE(KC_7); unregister_code (KC_RSFT);
318       unicode_input_start (); register_hex(0xaf); unicode_input_finish();
319     }
320
321     SEQ_TWO_KEYS (KC_S, KC_F) {
322       // 凸(ツ)凸
323       unicode_input_start(); register_hex(0x51F8); unicode_input_finish();
324       register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
325       unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
326       register_code (KC_RSFT); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
327       unicode_input_start (); register_hex(0x51F8); unicode_input_finish();
328     }
329
330     SEQ_TWO_KEYS (KC_S, KC_L) {
331       // λ
332       unicode_input_start();
333       register_hex(0x03bb);
334       unicode_input_finish();
335     }
336   };
337 };