]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/atreus62/keymaps/mneme/keymap.c
Merge pull request #1183 from Rovanion/real-master
[qmk_firmware.git] / keyboards / atreus62 / keymaps / mneme / keymap.c
1 #include <stdarg.h>
2 #include "atreus62.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] = {
99
100    { M(KF_11) ,M(KF_1)  ,M(KF_2)  ,M(KF_3)  ,M(KF_4) ,M(KF_5)  ,KC_NO   ,M(KF_6) ,M(KF_7) ,M(KF_8) ,M(KF_9) ,M(KF_10) ,M(KF_12) },
101    { KC_TAB   ,KC_Q     ,KC_W     ,KC_E     ,KC_R    ,KC_T     ,KC_NO   ,KC_Y    ,KC_U    ,KC_I    ,KC_O    ,KC_P     ,KN_AO },
102    { OSM_LCTL ,KC_A     ,KC_S     ,KC_D     ,KC_F    ,KC_G     ,KC_NO   ,KC_H    ,KC_J    ,KC_K    ,KC_L    ,KN_OE    ,KN_AE },
103    { OSM_LSFT ,KC_Z     ,KC_X     ,KC_C     ,KC_V    ,KC_B     ,KC_DELT ,KC_N    ,KC_M    ,KC_COMM ,KC_DOT  ,KN_MINS  ,OSM_LSFT },
104    { MO(NAV)  ,OSM_LCTL ,OSM_LALT ,KC_LGUI  ,MO(SYM) ,KC_BSPC  ,KC_ENT  ,KC_SPC  ,MO(SYM) ,KC_LEAD ,KC_LALT ,KC_LCTRL ,KC_HYP }
105
106  },
107   [NAV] = {
108
109    { 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 },
110    { KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_NO   ,KC_HOME  ,KC_PGDN  ,KC_PGUP  ,KC_END   ,KC_TRNS  ,KC_TRNS },
111    { KC_TRNS  ,KC_LSFT  ,KC_LCTL  ,KC_LALT  ,KC_L     ,KC_TRNS  ,KC_NO   ,KC_LEFT  ,KC_DOWN  ,KC_UP    ,KC_RIGHT ,KC_TRNS  ,KC_TRNS },
112    { 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 },
113    { 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 }
114
115   },
116   [SYM] = {
117
118    { KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,TD(TD_EQ) ,KC_NO   ,TD(TD_FUN) ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS  ,KC_TRNS },
119    { KC_TRNS  ,KN_LABK  ,KN_RABK  ,KN_LCBR  ,KN_RCBR  ,KN_PLUS   ,KC_NO   ,KN_AT      ,KN_DQT   ,KN_QUOT  ,KN_GRAV  ,KN_SLSH  ,KC_TRNS },
120    { KC_TRNS  ,KN_EXLM  ,KN_EQL   ,KN_LPRN  ,KN_RPRN  ,KN_MINS   ,KC_NO   ,KN_UNDS    ,KN_CIRC  ,KN_DLR   ,KN_AMPR  ,KN_PIPE  ,KC_TRNS },
121    { KC_TRNS  ,KN_EUR   ,KN_PERC  ,KN_LBRC  ,KN_RBRC  ,KN_ASTR   ,KC_TRNS ,KN_HASH    ,KN_SCLN  ,KN_COLN  ,KN_QUES  ,KN_BSLS  ,KC_TRNS },
122    { 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 }
123
124   }
125 };
126
127 #define TAP_ONCE(code)  \
128   register_code (code); \
129   unregister_code (code)
130
131 static void m_tapn (uint8_t code, ...) {
132   uint8_t kc = code;
133   va_list ap;
134
135   va_start(ap, code);
136   do {
137     register_code(kc);
138     unregister_code(kc);
139     wait_ms(50);
140     kc = va_arg(ap, int);
141   } while (kc != 0);
142   va_end(ap);
143 }
144
145 static void m_handle_kf (keyrecord_t *record, uint8_t id) {
146   uint8_t code = id - KF_1;
147
148   if (record->event.pressed) {
149     kf_timers[code] = timer_read ();
150   } else {
151     uint8_t kc_base;
152     uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM);
153
154     kf_timers[code] = 0;
155
156     switch(id){
157       case KF_1 ... KF_10:
158         if (long_press) {
159           // Long press
160           kc_base = KC_F1;
161         } else {
162           kc_base = KC_1;
163         }
164         code += kc_base;
165         break;
166       case KF_11:
167         code = long_press ? KC_F11 : KC_ESC;
168         break;
169       case KF_12:
170         code = long_press ? KC_F12 : KN_PLUS;
171         break;
172     }
173     register_code (code);
174     unregister_code (code);
175   }
176 }
177
178 const uint16_t PROGMEM fn_actions[] = {
179 };
180
181 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
182 {
183   switch (id) {
184     case KF_1 ... KF_12:
185       m_handle_kf(record, id);
186       break;
187   }
188   return MACRO_NONE;
189 };
190
191 // Custom keycodes
192 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
193   bool queue = true;
194
195   //Cancle one-shot mods.
196   switch (keycode) {
197     case KC_ESC:
198       if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) {
199         clear_oneshot_mods();
200         queue = false;
201       }
202       break;
203   }
204   return queue;
205 }
206
207 // TAP DANCE SETTINGS
208 void dance_eq (qk_tap_dance_state_t *state, void *user_data) {
209   switch (state->count) {
210     case 1: // ===
211       register_code(KC_LSHIFT);
212       m_tapn(KC_0, KC_0, KC_0, 0);
213       unregister_code(KC_LSHIFT);
214       break;
215     case 2:
216       register_code(KC_LSHIFT);
217       m_tapn(KC_1, KC_0, KC_0, 0);
218       unregister_code(KC_LSHIFT);
219       break;
220     default:
221       reset_tap_dance(state);
222   }
223 }
224
225 void dance_fun (qk_tap_dance_state_t *state, void *user_data) {
226   switch (state->count) {
227     case 1: // =>
228       register_code(KC_LSHIFT);
229       m_tapn(KC_0, KN_LABK, 0);
230       unregister_code(KC_LSHIFT);
231       break;
232     case 2: // () => {}
233       register_code(KC_LSHIFT);
234       m_tapn(KC_8, KC_9, KC_SPC, KC_0, KN_LABK, KC_SPC, 0);
235       unregister_code(KC_LSHIFT);
236       register_code(KC_RALT);
237       m_tapn(KC_7, 0);
238       unregister_code(KC_RALT);
239       TAP_ONCE(KC_ENT);
240       break;
241     default:
242       reset_tap_dance(state);
243   }
244 }
245
246 qk_tap_dance_action_t tap_dance_actions[] = {
247  [TD_FUN] = ACTION_TAP_DANCE_FN (dance_fun)
248  ,[TD_EQ] = ACTION_TAP_DANCE_FN (dance_eq)
249 };
250
251 // Runs just one time when the keyboard initializes.
252 void matrix_init_user(void) {
253   set_unicode_input_mode(UC_WINC);
254 };
255
256 LEADER_EXTERNS();
257 // Runs constantly in the background, in a loop.
258 void matrix_scan_user(void) {
259   LEADER_DICTIONARY() {
260     leading = false;
261     leader_end();
262     SEQ_ONE_KEY(KC_L){
263       register_code(KC_RGUI);
264       TAP_ONCE(KC_L);
265       unregister_code(KC_RGUI);
266     };
267
268
269     SEQ_TWO_KEYS (KC_A, KC_W) {
270       //Web - chrome
271       register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI);
272     }
273     SEQ_TWO_KEYS (KC_A, KC_P) {
274       //sPotify
275       register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI);
276
277     }
278     SEQ_TWO_KEYS (KC_A, KC_T) {
279       //Total Commander
280       register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI);
281
282     }
283     SEQ_TWO_KEYS (KC_A, KC_A) {
284       //Atom
285       register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI);
286
287     }
288     SEQ_TWO_KEYS (KC_A, KC_E) {
289       //Emacs
290       register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI);
291
292     }
293     SEQ_TWO_KEYS (KC_A, KC_C) {
294       //Cmdr
295       register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI);
296
297     }
298     SEQ_TWO_KEYS (KC_A, KC_S) {
299       //Slack
300       register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI);
301     }
302
303     SEQ_TWO_KEYS (KC_U, KC_L) {
304       set_unicode_input_mode(UC_LNX);
305     }
306
307
308     SEQ_TWO_KEYS (KC_U, KC_W) {
309       set_unicode_input_mode(UC_WINC);
310     }
311
312
313     SEQ_TWO_KEYS (KC_S, KC_S) {
314       // ¯\_(ツ)_/¯
315       unicode_input_start(); register_hex(0xaf); unicode_input_finish();
316       register_code (KC_LALT);
317       register_code (KC_LCTL);
318       TAP_ONCE (KN_PLUS);
319       unregister_code (KC_LCTL);
320       unregister_code (KC_LALT);
321
322       register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
323       unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
324       register_code (KC_RSFT); TAP_ONCE (KC_9); TAP_ONCE(KC_7); unregister_code (KC_RSFT);
325       unicode_input_start (); register_hex(0xaf); unicode_input_finish();
326     }
327
328     SEQ_TWO_KEYS (KC_S, KC_F) {
329       // 凸(ツ)凸
330       unicode_input_start(); register_hex(0x51F8); unicode_input_finish();
331       register_code (KC_RSFT); TAP_ONCE (KC_8); unregister_code (KC_RSFT);
332       unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
333       register_code (KC_RSFT); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
334       unicode_input_start (); register_hex(0x51F8); unicode_input_finish();
335     }
336
337     SEQ_TWO_KEYS (KC_S, KC_L) {
338       // λ
339       unicode_input_start();
340       register_hex(0x03bb);
341       unicode_input_finish();
342     }
343   };
344 };