1 #ifndef ZACH_COMMON_FUNCTIONS
2 #define ZACH_COMMON_FUNCTIONS
4 #include "action_layer.h"
5 #include "keymap_colemak.h"
6 extern keymap_config_t keymap_config;
8 // Fillers to make layering more clear
9 #define _______ KC_TRNS
12 #define CADKEY RCTL(RALT(KC_DEL))
14 void tap(uint16_t keycode){
15 register_code(keycode);
16 unregister_code(keycode);
19 void persistent_default_layer_set(uint16_t default_layer){
20 eeconfig_update_default_layer(default_layer);
21 default_layer_set(default_layer);
24 // Automatic number generation of important keywords
33 // These use process_record_user()
57 float tone_startup[][2] = SONG(STARTUP_SOUND);
58 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
59 float tone_colemak[][2] = SONG(COLEMAK_SOUND);
60 float tone_swcole[][2] = SONG(QWERTY_SOUND);
61 float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
62 float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
63 float tone_ctrl_mod[][2] = SONG(COIN_SOUND);
64 float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND);
65 float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
66 float uniwin[][2] = SONG(UNICODE_WINDOWS);
67 float unilin[][2] = SONG(UNICODE_LINUX);
70 #ifdef TAP_DANCE_ENABLE
71 #define TAPPING_TERM 200
73 void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap
74 switch(state->count){ // Only turn the layer on once
78 update_tri_layer(_LOWER, _RAISE, _ADJUST);
82 void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release
84 case 1: // Normal action. Turn off layers
86 update_tri_layer(_LOWER, _RAISE, _ADJUST);
91 /////////////////////////////////////////////////////////////////////
92 void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap
94 case 1: // Turn on lower
97 update_tri_layer(_LOWER, _RAISE, _ADJUST);
101 void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release
102 switch(state->count){
103 case 1: // Normal action. Turn off layers
105 update_tri_layer(_LOWER, _RAISE, _ADJUST);
106 layer_off(_UNICODES);
108 case 2: // Turn on _UNICODES layer
110 update_tri_layer(_LOWER, _RAISE, _ADJUST);
113 PLAY_SONG(tone_ctrl_mod);
118 /////////////////////////////////////////////////////////////////////
119 void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down
120 if(state->count == 1){
121 register_code(KC_LGUI);
124 void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout
125 switch(state->count){
127 register_code(KC_LGUI);
129 unregister_code(KC_LGUI);
133 void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up
134 unregister_code(KC_LGUI);
137 qk_tap_dance_action_t tap_dance_actions[] = {
138 [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift),
139 [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift),
140 [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift)
144 //#ifdef UNICODE_ENABLE
146 #define IBANG X(0x203D)
147 #define RAROW X(0x2192)
148 #define LAROW X(0x2190)
149 #define DEGREE X(0x00B0)
150 #define OMEGA X(0x03A9)
151 #define WOMEGA X(0x03C9)
152 #define MICRO X(0x00B5)
153 #define PLUMIN X(0x00B1)
154 #define SUPA2 X(0x00B2)
155 #define ROMAN1 X(0x2160)
156 #define ROMAN2 X(0x2161)
157 #define ROMAN3 X(0x2162)
158 #define ROMAN4 X(0x2163)
159 #define ROMAN5 X(0x2164)
160 #define ROMAN6 X(0x2165)
161 #define ROMAN7 X(0x2166)
162 #define roman1 X(0x2170)
163 #define roman2 X(0x2171)
164 #define roman3 X(0x2172)
165 #define roman4 X(0x2173)
166 #define roman5 X(0x2174)
167 #define roman6 X(0x2175)
168 #define roman7 X(0x2176)
170 #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X(<unicode>)
179 const uint32_t PROGMEM unicode_map[] = {
187 #define PENGY X(PENGUIN)
188 #define BOARY X(BOAR)
189 #define MNKY X(MONKEY)
190 #define DRGN X(DRAGON)
191 #define DUCK X(CHICK)
192 #define TMBL X(TUMBLER)
197 static uint16_t key_timer;
198 static uint8_t caps_status = 0;
199 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
202 if(record->event.pressed){
203 persistent_default_layer_set(1UL<<_COLEMAK);
205 PLAY_SONG(tone_colemak);
211 if(record->event.pressed){
212 persistent_default_layer_set(1UL<<_SWCOLE);
214 PLAY_SONG(tone_swcole);
220 if(record->event.pressed){
222 update_tri_layer(_LOWER, _RAISE, _ADJUST);
225 update_tri_layer(_LOWER, _RAISE, _ADJUST);
230 if(record->event.pressed){
232 update_tri_layer(_LOWER, _RAISE, _ADJUST);
235 update_tri_layer(_LOWER, _RAISE, _ADJUST);
240 if(record->event.pressed){
241 key_timer = timer_read(); // if the key is being pressed, we start the timer.
242 register_code(KC_LSHIFT);
243 } else { // this means the key was just released (tap or "held down")
244 if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap.
246 if(caps_status == 0){
249 PLAY_SONG(tone_capslock_on);
254 PLAY_SONG(tone_capslock_off);
258 unregister_code(KC_LSHIFT);
262 case CTRLB: // Control-B on tap (bold)
263 if(record->event.pressed){
264 key_timer = timer_read(); // if the key is being pressed, we start the timer.
265 register_code(KC_LCTL);
266 } else { // this means the key was just released (tap or "held down")
267 if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap.
270 PLAY_SONG(tone_ctrl_mod);
272 #ifdef BACKLIGHT_BREATHING
273 breathing_speed_set(2);
277 unregister_code(KC_LCTL);
281 case CPYPST: // One key copy/paste
282 if(record->event.pressed){
283 key_timer = timer_read();
285 if (timer_elapsed(key_timer) > 152) { // Hold, copy
286 register_code(KC_LCTL);
288 unregister_code(KC_LCTL);
290 PLAY_SONG(tone_copy);
292 } else { // Tap, paste
293 register_code(KC_LCTL);
295 unregister_code(KC_LCTL);
297 PLAY_SONG(tone_paste);
303 #ifdef UNICODE_ENABLE
305 if(record->event.pressed){
306 set_unicode_input_mode(UC_WIN);
314 if(record->event.pressed){
315 set_unicode_input_mode(UC_LNX);
323 if(record->event.pressed){
324 process_unicode((0x0CA0|QK_UNICODE), record); // Eye
325 register_code(KC_RSFT);
327 unregister_code(KC_RSFT);
328 process_unicode((0x0CA0|QK_UNICODE), record); // Eye
332 case TFLIP: // (╯°□°)╯ ︵ ┻━┻
333 if(record->event.pressed){
334 register_code(KC_RSFT);
336 unregister_code(KC_RSFT);
337 process_unicode((0x256F|QK_UNICODE), record); // Arm
338 process_unicode((0x00B0|QK_UNICODE), record); // Eye
339 process_unicode((0x25A1|QK_UNICODE), record); // Mouth
340 process_unicode((0x00B0|QK_UNICODE), record); // Eye
341 register_code(KC_RSFT);
343 unregister_code(KC_RSFT);
344 process_unicode((0x256F|QK_UNICODE), record); // Arm
346 process_unicode((0x0361|QK_UNICODE), record); // Flippy
348 process_unicode((0x253B|QK_UNICODE), record); // Table
349 process_unicode((0x2501|QK_UNICODE), record); // Table
350 process_unicode((0x253B|QK_UNICODE), record); // Table
354 case TPUT: // ┬──┬ ノ( ゜-゜ノ)
355 if(record->event.pressed){
356 process_unicode((0x252C|QK_UNICODE), record); // Table
357 process_unicode((0x2500|QK_UNICODE), record); // Table
358 process_unicode((0x2500|QK_UNICODE), record); // Table
359 process_unicode((0x252C|QK_UNICODE), record); // Table
361 process_unicode((0x30CE|QK_UNICODE), record); // Arm
362 register_code(KC_RSFT);
364 unregister_code(KC_RSFT);
366 process_unicode((0x309C|QK_UNICODE), record); // Eye
368 process_unicode((0x309C|QK_UNICODE), record); // Eye
369 process_unicode((0x30CE|QK_UNICODE), record); // Arm
370 register_code(KC_RSFT);
372 unregister_code(KC_RSFT);
376 case SHRUG: // ¯\_(ツ)_/¯
377 if(record->event.pressed){
378 process_unicode((0x00AF|QK_UNICODE), record); // Hand
380 register_code(KC_RSFT);
382 tap(KC_LPRN); // Head
383 unregister_code(KC_RSFT);
384 process_unicode((0x30C4|QK_UNICODE), record); // Face
385 register_code(KC_RSFT);
386 tap(KC_RPRN); // Head
388 unregister_code(KC_RSFT);
390 process_unicode((0x00AF|QK_UNICODE), record); // Hand
396 if(record->event.pressed){
397 register_code(KC_RSFT);
399 unregister_code(KC_RSFT);
401 register_code(KC_RSFT);
405 unregister_code(KC_RSFT);
410 if (record->event.pressed) {
419 void matrix_init_user(void){ // Run once at startup
421 _delay_ms(50); // gets rid of tick
422 PLAY_SONG(tone_startup);
427 void play_goodbye_tone(void){
428 PLAY_SONG(tone_goodbye);
432 void shutdown_user(){
433 PLAY_SONG(tone_goodbye);
438 void music_on_user(void){ // Run when the music layer is turned on
439 PLAY_SONG(tone_startup);
442 void music_off_user(void){ // Run when music is turned off
443 PLAY_SONG(tone_goodbye);