4 #include "action_layer.h"
5 #include "action_util.h"
10 #define KN_HALF KC_GRV // 1/2
11 #define KN_PLUS KC_MINS // +
12 #define KN_ACUT KC_EQL // ´
13 #define KN_AO KC_LBRC // Å
14 #define KN_UMLA KC_RBRC // ¨
15 #define KN_OE KC_SCLN // Ö
16 #define KN_AE KC_QUOT // Ä
17 #define KN_QUOT KC_NUHS // '
18 #define KN_LABK KC_NUBS // <
19 #define KN_MINS KC_SLSH // -
20 #define KN_EXLM LSFT(KC_1) // !
21 #define KN_DQT LSFT(KC_2) // "
22 #define KN_AT RALT(KC_2) // @
23 #define KN_HASH LSFT(KC_3) // #
24 #define KN_DLR RALT(KC_4) // $
25 #define KN_PERC LSFT(KC_5) // %
26 #define KN_AMPR LSFT(KC_6) // &
27 #define KN_SLSH LSFT(KC_7) // /
28 #define KN_LPRN LSFT(KC_8) // (
29 #define KN_RPRN LSFT(KC_9) // )
30 #define KN_EQL LSFT(KC_0) // =
31 #define KN_UNDS LSFT(KN_MINS) // _
32 #define KN_QUES LSFT(KN_PLUS) // ?
33 #define KN_GRAV LSFT(KN_ACUT) // `
34 #define KN_LCBR RALT(KC_7) // {
35 #define KN_RCBR RALT(KC_0) // }
36 #define KN_LBRC RALT(KC_8) // [
37 #define KN_RBRC RALT(KC_9) // ]
38 #define KN_RABK LSFT(KN_LABK) // <
39 #define KN_COLN LSFT(KC_DOT) // :
40 #define KN_SCLN LSFT(KC_COMM) // :
41 #define KN_PIPE RALT(KN_LABK) // |
42 #define KN_QUES LSFT(KN_PLUS) // ?
43 #define KN_CIRC LSFT(KN_UMLA) // ^
44 #define KN_ASTR LSFT(KN_QUOT) // *
45 #define KN_TILD RALT(KN_UMLA) // ~
46 #define KN_BSLS RALT(KN_PLUS) //
48 #define OSM_LCTL OSM(MOD_LCTL)
49 #define OSM_LALT OSM(MOD_LALT)
50 #define OSM_LSFT OSM(MOD_LSFT)
52 #define KC_HYP LSFT(LALT(LCTL(KC_LGUI)))
54 #define KC_COPY LCTL(KC_C)
55 #define KC_PASTE LCTL(KC_V)
56 #define KC_UNDO LCTL(KC_Z)
57 #define KC_REDO LCTL(LSFT(KC_Z))
90 PLACEHOLDER = SAFE_RANGE
94 uint16_t kf_timers[12];
98 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
102 { 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) },
103 { 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 },
104 { 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 },
105 { 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 },
106 { MO(NAV) ,OSM_LCTL ,OSM_LALT ,KC_LGUI ,KC_SPC ,LT(SYM,KC_BSPC) ,KC_HYP ,LT(SYM,KC_ENT) ,KC_SPC ,KC_LEAD ,KC_LALT ,KC_LCTRL ,MO(NAV) }
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_TRNS },
112 { KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_NO ,KC_PGUP ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS },
113 { KC_TRNS ,KC_LSFT ,KC_LCTL ,KC_LALT ,KC_L ,KC_TRNS ,KC_NO ,KC_PGDN ,KC_LEFT ,KC_DOWN ,KC_RIGHT ,KC_TRNS ,KC_TRNS },
114 { 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 },
115 { 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 }
120 { 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 },
121 { 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 },
122 { KC_TRNS ,KN_EXLM ,KN_EQL ,KN_LPRN ,KN_RPRN ,KN_MINS ,KC_NO ,KN_UNDS ,KN_SCLN ,KN_COLN ,KN_AMPR ,KN_PIPE ,KC_TRNS },
123 { KC_TRNS ,KN_DLR ,KN_PERC ,KN_LBRC ,KN_RBRC ,KN_ASTR ,KC_TRNS ,KN_HASH ,KC_COMM ,KC_DOT ,KN_QUES ,KN_BSLS ,KC_TRNS },
124 { 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 }
129 #define TAP_ONCE(code) \
130 register_code (code); \
131 unregister_code (code)
133 static void m_tapn (uint8_t code, ...) {
142 kc = va_arg(ap, int);
147 static void m_handle_kf (keyrecord_t *record, uint8_t id) {
148 uint8_t code = id - KF_1;
150 if (record->event.pressed) {
151 kf_timers[code] = timer_read ();
154 uint8_t long_press = (kf_timers[code] && timer_elapsed (kf_timers[code]) > TAPPING_TERM);
169 code = long_press ? KC_F11 : KC_ESC;
172 code = long_press ? KC_F12 : KN_PLUS;
175 register_code (code);
176 unregister_code (code);
180 const uint16_t PROGMEM fn_actions[] = {
183 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
187 m_handle_kf(record, id);
194 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
197 //Cancle one-shot mods.
200 if (record->event.pressed && get_oneshot_mods() && !has_oneshot_mods_timed_out()) {
201 clear_oneshot_mods();
209 // TAP DANCE SETTINGS
210 void dance_eq (qk_tap_dance_state_t *state, void *user_data) {
211 switch (state->count) {
213 register_code(KC_LSHIFT);
214 m_tapn(KC_0, KC_0, KC_0, 0);
215 unregister_code(KC_LSHIFT);
218 register_code(KC_LSHIFT);
219 m_tapn(KC_1, KC_0, KC_0, 0);
220 unregister_code(KC_LSHIFT);
223 reset_tap_dance(state);
227 void dance_fun (qk_tap_dance_state_t *state, void *user_data) {
228 switch (state->count) {
230 register_code(KC_LSHIFT);
231 m_tapn(KC_0, KN_LABK, 0);
232 unregister_code(KC_LSHIFT);
235 register_code(KC_LSHIFT);
236 m_tapn(KC_8, KC_9, KC_SPC, KC_0, KN_LABK, KC_SPC, 0);
237 unregister_code(KC_LSHIFT);
238 register_code(KC_RALT);
240 unregister_code(KC_RALT);
244 reset_tap_dance(state);
248 qk_tap_dance_action_t tap_dance_actions[] = {
249 [TD_FUN] = ACTION_TAP_DANCE_FN (dance_fun)
250 ,[TD_EQ] = ACTION_TAP_DANCE_FN (dance_eq)
253 // Runs just one time when the keyboard initializes.
254 void matrix_init_user(void) {
255 set_unicode_input_mode(UC_WINC);
259 // Runs constantly in the background, in a loop.
260 void matrix_scan_user(void) {
261 LEADER_DICTIONARY() {
265 register_code(KC_RGUI);
267 unregister_code(KC_RGUI);
271 SEQ_TWO_KEYS (KC_A, KC_W) {
273 register_code (KC_LGUI); TAP_ONCE (KC_1); unregister_code (KC_LGUI);
275 SEQ_TWO_KEYS (KC_A, KC_P) {
277 register_code (KC_LGUI); TAP_ONCE (KC_2); unregister_code (KC_LGUI);
280 SEQ_TWO_KEYS (KC_A, KC_T) {
282 register_code (KC_LGUI); TAP_ONCE (KC_3); unregister_code (KC_LGUI);
285 SEQ_TWO_KEYS (KC_A, KC_A) {
287 register_code (KC_LGUI); TAP_ONCE (KC_4); unregister_code (KC_LGUI);
290 SEQ_TWO_KEYS (KC_A, KC_E) {
292 register_code (KC_LGUI); TAP_ONCE (KC_5); unregister_code (KC_LGUI);
295 SEQ_TWO_KEYS (KC_A, KC_C) {
297 register_code (KC_LGUI); TAP_ONCE (KC_6); unregister_code (KC_LGUI);
300 SEQ_TWO_KEYS (KC_A, KC_S) {
302 register_code (KC_LGUI); TAP_ONCE (KC_7); unregister_code (KC_LGUI);
306 SEQ_TWO_KEYS (KC_S, KC_S) {
308 unicode_input_start(); register_hex(0xaf); unicode_input_finish();
309 register_code (KC_LALT);
310 register_code (KC_LCTL);
312 unregister_code (KC_LCTL);
313 unregister_code (KC_LALT);
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();
321 SEQ_TWO_KEYS (KC_S, KC_F) {
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();
330 SEQ_TWO_KEYS (KC_S, KC_L) {
332 unicode_input_start();
333 register_hex(0x03bb);
334 unicode_input_finish();