#ifndef ZACH_COMMON_FUNCTIONS #define ZACH_COMMON_FUNCTIONS #include "eeconfig.h" #include "action_layer.h" #include "keymap_colemak.h" extern keymap_config_t keymap_config; #undef C #define C(n) RCTL(n) #define CADKEY RCTL(RALT(KC_DEL)) void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; void persistent_default_layer_set(uint16_t default_layer){ eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); }; // Automatic number generation of important keywords enum my_keycodes{ // Layer numbers _COLEMAK = 0, _SWCOLE, _RAISE, _LOWER, _ADJUST, _UNICODES, // These use process_record_user() COLEMAK = SAFE_RANGE, SWCOLE, LOWER, RAISE, SHFT_CAP, CTRLB, CPYPST, FACE, UNIWIN, UNILIN, DISFACE, TFLIP, TPUT, SHRUG, RANDIG, // Tap_Dance nums RAI = 0, LOW, SUP }; #ifdef AUDIO_ENABLE #include "audio.h" float tone_startup[][2] = SONG(STARTUP_SOUND); float tone_goodbye[][2] = SONG(GOODBYE_SOUND); float tone_colemak[][2] = SONG(COLEMAK_SOUND); float tone_swcole[][2] = SONG(QWERTY_SOUND); float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND); float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); float tone_ctrl_mod[][2] = SONG(COIN_SOUND); float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND); float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND); float uniwin[][2] = SONG(UNICODE_WINDOWS); float unilin[][2] = SONG(UNICODE_LINUX); #endif #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 200 void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap switch(state->count){ // Only turn the layer on once case 1: layer_off(_UNICODES); layer_on(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); break; } }; void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release switch(state->count){ case 1: // Normal action. Turn off layers layer_off(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); layer_off(_UNICODES); break; } }; ///////////////////////////////////////////////////////////////////// void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap switch(state->count){ case 1: // Turn on lower layer_off(_UNICODES); layer_on(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); break; } }; void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release switch(state->count){ case 1: // Normal action. Turn off layers layer_off(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); layer_off(_UNICODES); break; case 2: // Turn on _UNICODES layer layer_off(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); layer_on(_UNICODES); #ifdef AUDIO_ENABLE PLAY_SONG(tone_ctrl_mod); #endif break; } }; ///////////////////////////////////////////////////////////////////// void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down if(state->count == 1){ register_code(KC_LGUI); } } void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout switch(state->count){ case 2: register_code(KC_LGUI); tap(KC_L); unregister_code(KC_LGUI); break; } } void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up unregister_code(KC_LGUI); } qk_tap_dance_action_t tap_dance_actions[] = { [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift), [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift), [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift) }; #endif //#ifdef UNICODE_ENABLE // Unicode shortcuts #define IBANG X(0x203D) #define RAROW X(0x2192) #define LAROW X(0x2190) #define DEGREE X(0x00B0) #define OMEGA X(0x03A9) #define WOMEGA X(0x03C9) #define MICRO X(0x00B5) #define PLUMIN X(0x00B1) #define SUPA2 X(0x00B2) #define ROMAN1 X(0x2160) #define ROMAN2 X(0x2161) #define ROMAN3 X(0x2162) #define ROMAN4 X(0x2163) #define ROMAN5 X(0x2164) #define ROMAN6 X(0x2165) #define ROMAN7 X(0x2166) #define roman1 X(0x2170) #define roman2 X(0x2171) #define roman3 X(0x2172) #define roman4 X(0x2173) #define roman5 X(0x2174) #define roman6 X(0x2175) #define roman7 X(0x2176) #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X(<unicode>) enum Ext_Unicode{ PENGUIN = 0, BOAR, MONKEY, DRAGON, CHICK, TUMBLER }; const uint32_t PROGMEM unicode_map[] = { [PENGUIN] = 0x1F427, [BOAR] = 0x1F417, [MONKEY] = 0x1F412, [DRAGON] = 0x1F409, [CHICK] = 0x1F425, [TUMBLER] = 0x1F943 }; #define PENGY X(PENGUIN) #define BOARY X(BOAR) #define MNKY X(MONKEY) #define DRGN X(DRAGON) #define DUCK X(CHICK) #define TMBL X(TUMBLER) #endif //#endif static uint16_t key_timer; static uint8_t caps_status = 0; bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case COLEMAK: if(record->event.pressed){ persistent_default_layer_set(1UL<<_COLEMAK); #ifdef AUDIO_ENABLE PLAY_SONG(tone_colemak); #endif } return false; break; case SWCOLE: if(record->event.pressed){ persistent_default_layer_set(1UL<<_SWCOLE); #ifdef AUDIO_ENABLE PLAY_SONG(tone_swcole); #endif } return false; break; case RAISE: if(record->event.pressed){ layer_on(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { layer_off(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); } return false; break; case LOWER: if(record->event.pressed){ layer_on(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); } else { layer_off(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); } return false; break; case SHFT_CAP: if(record->event.pressed){ key_timer = timer_read(); // if the key is being pressed, we start the timer. register_code(KC_LSHIFT); } else { // this means the key was just released (tap or "held down") if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap. tap(KC_CAPS); if(caps_status == 0){ caps_status = 1; #ifdef AUDIO_ENABLE PLAY_SONG(tone_capslock_on); #endif } else { caps_status = 0; #ifdef AUDIO_ENABLE PLAY_SONG(tone_capslock_off); #endif } } unregister_code(KC_LSHIFT); } return false; break; case CTRLB: // Control-B on tap (bold) if(record->event.pressed){ key_timer = timer_read(); // if the key is being pressed, we start the timer. register_code(KC_LCTL); } else { // this means the key was just released (tap or "held down") if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap. tap(KC_B); #ifdef AUDIO_ENABLE PLAY_SONG(tone_ctrl_mod); #endif #ifdef BACKLIGHT_BREATHING breathing_period_set(2); breathing_pulse(); #endif } unregister_code(KC_LCTL); } return false; break; case CPYPST: // One key copy/paste if(record->event.pressed){ key_timer = timer_read(); } else { if (timer_elapsed(key_timer) > 152) { // Hold, copy register_code(KC_LCTL); tap(KC_C); unregister_code(KC_LCTL); #ifdef AUDIO_ENABLE PLAY_SONG(tone_copy); #endif } else { // Tap, paste register_code(KC_LCTL); tap(KC_V); unregister_code(KC_LCTL); #ifdef AUDIO_ENABLE PLAY_SONG(tone_paste); #endif } } return false; break; #ifdef UNICODE_ENABLE case UNIWIN: if(record->event.pressed){ set_unicode_input_mode(UC_WIN); #ifdef AUDIO_ENABLE PLAY_SONG(uniwin); #endif } return false; break; case UNILIN: if(record->event.pressed){ set_unicode_input_mode(UC_LNX); #ifdef AUDIO_ENABLE PLAY_SONG(unilin); #endif } return false; break; case DISFACE: // ಠ_ಠ if(record->event.pressed){ process_unicode((0x0CA0|QK_UNICODE), record); // Eye register_code(KC_RSFT); tap(KC_MINS); unregister_code(KC_RSFT); process_unicode((0x0CA0|QK_UNICODE), record); // Eye } return false; break; case TFLIP: // (╯°□°)╯ ︵ ┻━┻ if(record->event.pressed){ register_code(KC_RSFT); tap(KC_9); unregister_code(KC_RSFT); process_unicode((0x256F|QK_UNICODE), record); // Arm process_unicode((0x00B0|QK_UNICODE), record); // Eye process_unicode((0x25A1|QK_UNICODE), record); // Mouth process_unicode((0x00B0|QK_UNICODE), record); // Eye register_code(KC_RSFT); tap(KC_0); unregister_code(KC_RSFT); process_unicode((0x256F|QK_UNICODE), record); // Arm tap(KC_SPC); process_unicode((0x0361|QK_UNICODE), record); // Flippy tap(KC_SPC); process_unicode((0x253B|QK_UNICODE), record); // Table process_unicode((0x2501|QK_UNICODE), record); // Table process_unicode((0x253B|QK_UNICODE), record); // Table } return false; break; case TPUT: // ┬──┬ ノ( ゜-゜ノ) if(record->event.pressed){ process_unicode((0x252C|QK_UNICODE), record); // Table process_unicode((0x2500|QK_UNICODE), record); // Table process_unicode((0x2500|QK_UNICODE), record); // Table process_unicode((0x252C|QK_UNICODE), record); // Table tap(KC_SPC); process_unicode((0x30CE|QK_UNICODE), record); // Arm register_code(KC_RSFT); tap(KC_9); unregister_code(KC_RSFT); tap(KC_SPC); process_unicode((0x309C|QK_UNICODE), record); // Eye tap(KC_MINS); process_unicode((0x309C|QK_UNICODE), record); // Eye process_unicode((0x30CE|QK_UNICODE), record); // Arm register_code(KC_RSFT); tap(KC_0); unregister_code(KC_RSFT); } return false; break; case SHRUG: // ¯\_(ツ)_/¯ if(record->event.pressed){ process_unicode((0x00AF|QK_UNICODE), record); // Hand tap(KC_BSLS); // Arm register_code(KC_RSFT); tap(KC_UNDS); // Arm tap(KC_LPRN); // Head unregister_code(KC_RSFT); process_unicode((0x30C4|QK_UNICODE), record); // Face register_code(KC_RSFT); tap(KC_RPRN); // Head tap(KC_UNDS); // Arm unregister_code(KC_RSFT); tap(KC_SLSH); // Arm process_unicode((0x00AF|QK_UNICODE), record); // Hand } return false; break; #endif case FACE: // (o_O) if(record->event.pressed){ register_code(KC_RSFT); tap(KC_LPRN); unregister_code(KC_RSFT); tap(KC_O); register_code(KC_RSFT); tap(KC_UNDS); tap(KC_O); tap(KC_RPRN); unregister_code(KC_RSFT); } return false; break; case RANDIG: if (record->event.pressed) { tap_random_base64(); } return false; break; } return true; }; void matrix_init_user(void){ // Run once at startup #ifdef AUDIO_ENABLE _delay_ms(50); // gets rid of tick PLAY_SONG(tone_startup); #endif } #ifdef AUDIO_ENABLE void play_goodbye_tone(void){ PLAY_SONG(tone_goodbye); _delay_ms(150); } void shutdown_user(){ PLAY_SONG(tone_goodbye); _delay_ms(150); stop_all_notes(); } void music_on_user(void){ // Run when the music layer is turned on PLAY_SONG(tone_startup); } void music_off_user(void){ // Run when music is turned off PLAY_SONG(tone_goodbye); } #endif #endif