4 #include "action_layer.h"
5 #include "action_util.h"
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) //
52 #define OSM_LCTL OSM(MOD_LCTL)
53 #define OSM_LALT OSM(MOD_LALT)
54 #define OSM_LSFT OSM(MOD_LSFT)
56 #define KC_HYP LSFT(LALT(LCTL(KC_LGUI)))
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))
93 uint16_t kf_timers[12];
96 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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 }
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 }
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 }
127 #define TAP_ONCE(code) \
128 register_code (code); \
129 unregister_code (code)
131 static void m_tapn (uint8_t code, ...) {
140 kc = va_arg(ap, int);
145 static void m_handle_kf (keyrecord_t *record, uint8_t id) {
146 uint8_t code = id - KF_1;
148 if (record->event.pressed) {
149 kf_timers[code] = timer_read ();
152 uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM);
167 code = long_press ? KC_F11 : KC_ESC;
170 code = long_press ? KC_F12 : KN_PLUS;
173 register_code (code);
174 unregister_code (code);
178 const uint16_t PROGMEM fn_actions[] = {
181 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
185 m_handle_kf(record, id);
192 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
195 //Cancle one-shot mods.
198 if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) {
199 clear_oneshot_mods();
207 // TAP DANCE SETTINGS
208 void dance_eq (qk_tap_dance_state_t *state, void *user_data) {
209 switch (state->count) {
211 register_code(KC_LSHIFT);
212 m_tapn(KC_0, KC_0, KC_0, 0);
213 unregister_code(KC_LSHIFT);
216 register_code(KC_LSHIFT);
217 m_tapn(KC_1, KC_0, KC_0, 0);
218 unregister_code(KC_LSHIFT);
221 reset_tap_dance(state);
225 void dance_fun (qk_tap_dance_state_t *state, void *user_data) {
226 switch (state->count) {
228 register_code(KC_LSHIFT);
229 m_tapn(KC_0, KN_LABK, 0);
230 unregister_code(KC_LSHIFT);
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);
238 unregister_code(KC_RALT);
242 reset_tap_dance(state);
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)
251 // Runs just one time when the keyboard initializes.
252 void matrix_init_user(void) {
253 set_unicode_input_mode(UC_WINC);
257 // Runs constantly in the background, in a loop.
258 void matrix_scan_user(void) {
259 LEADER_DICTIONARY() {
263 register_code(KC_RGUI);
265 unregister_code(KC_RGUI);
269 SEQ_TWO_KEYS (KC_A, KC_W) {
271 register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI);
273 SEQ_TWO_KEYS (KC_A, KC_P) {
275 register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI);
278 SEQ_TWO_KEYS (KC_A, KC_T) {
280 register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI);
283 SEQ_TWO_KEYS (KC_A, KC_A) {
285 register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI);
288 SEQ_TWO_KEYS (KC_A, KC_E) {
290 register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI);
293 SEQ_TWO_KEYS (KC_A, KC_C) {
295 register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI);
298 SEQ_TWO_KEYS (KC_A, KC_S) {
300 register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI);
303 SEQ_TWO_KEYS (KC_U, KC_L) {
304 set_unicode_input_mode(UC_LNX);
308 SEQ_TWO_KEYS (KC_U, KC_W) {
309 set_unicode_input_mode(UC_WINC);
313 SEQ_TWO_KEYS (KC_S, KC_S) {
315 unicode_input_start(); register_hex(0xaf); unicode_input_finish();
316 register_code (KC_LALT);
317 register_code (KC_LCTL);
319 unregister_code (KC_LCTL);
320 unregister_code (KC_LALT);
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();
328 SEQ_TWO_KEYS (KC_S, KC_F) {
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();
337 SEQ_TWO_KEYS (KC_S, KC_L) {
339 unicode_input_start();
340 register_hex(0x03bb);
341 unicode_input_finish();