diff options
Diffstat (limited to 'users/art/art.c')
-rw-r--r-- | users/art/art.c | 464 |
1 files changed, 464 insertions, 0 deletions
diff --git a/users/art/art.c b/users/art/art.c new file mode 100644 index 0000000000..5596e237f8 --- /dev/null +++ b/users/art/art.c @@ -0,0 +1,464 @@ +#include "art.h" +#include "string.h" + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + +__attribute__ ((weak)) +void led_show_current_os(void) { +} + +static bool mac_ctrl_on = false; //for switching tabs +static bool mac_gui_on = false; //for switching languages +static bool mac_alt_tab_on = false; //for switching windows + +static const char *key_up[2] = {SS_UP(X_LALT), SS_UP(X_LCTL)}; +static const char *key_down[2] = {SS_DOWN(X_LALT), SS_DOWN(X_LCTL)}; + +int char_to_del = 1; +static bool sarcasm_on = false; +static bool sarcasm_key = false; + +void backspace_n_times(int times) { + for (int i=0; i<times; i++) { + SEND_STRING(SS_TAP(X_BSPC)); + } +} + +void send_string_remembering_length(char *string) { + send_string(string); + char_to_del = strlen(string); +} + +void send_shifted_strings(char *string1, char *string2) { + if ( get_mods() & MOD_MASK_SHIFT ) { + clear_mods(); + send_string_remembering_length(string2); + } else { + send_string_remembering_length(string1); + } +} + +void send_shifted_strings_add(char *string1, char *string2) { + bool shifted = get_mods() & MOD_MASK_SHIFT; + clear_mods(); + + send_string_remembering_length(string1); + + if (shifted) { + send_string(string2); + char_to_del = strlen(string1) + strlen(string2); + } +} + +bool is_mac_with_base_layer_off(void) { + return !is_win && !layer_state_is(BASE); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (sarcasm_on) { + sarcasm_key = ! sarcasm_key; + if (sarcasm_key) { + SEND_STRING(SS_TAP(X_CAPS)); + } + } + + //Checking all other non-backspace keys to clear the backspace buffer. This is to prevent the bug of deleting N chars sometime after using a macro + if (record->event.pressed && (keycode != KC_BSPACE && keycode != XXXXXXX)) { + char_to_del = 1; + } + + switch (keycode) { + case KC_TAB: + if (record->event.pressed && is_mac_with_base_layer_off()) { + uint8_t mods = get_mods(); + uint8_t mod_state = mods & MOD_MASK_ALT; + if (get_mods() & mod_state) { + del_mods(mod_state); + add_mods(MOD_LCTL); + mac_alt_tab_on = true; + } + + mod_state = mods & MOD_MASK_CTRL; + if (get_mods() & mod_state && !mac_alt_tab_on) { + del_mods(mod_state); + add_mods(MOD_LGUI); + mac_ctrl_on = true; + } + } + break; + case KC_LSFT: + if (record->event.pressed && is_mac_with_base_layer_off()) { + uint8_t mods = get_mods(); + uint8_t mod_state = mods & MOD_MASK_AG; + if (get_mods() & mod_state) { + del_mods(mod_state); + add_mods(MOD_LGUI); + mac_gui_on = true; + SEND_STRING(SS_TAP(X_SPACE)); + return false; + } else { + return true; + } + } + break; + case KC_LEFT: + case KC_RIGHT: + if (record->event.pressed && is_mac_with_base_layer_off()) { + /* && !mac_ctrl_on/!mac_alt_tab_on are required since setting the state while holding the key changes + the modifier from OS's perspective. As a result, just the pressed key cannot be the single source + of truth to determine which state we're in, and a separate bool is required */ + uint8_t mods = get_mods(); + uint8_t mod_state = mods & MOD_MASK_ALT; + //Allows Ctrl <-/-> on Mac if Ctrl Tab is already pressed + if (get_mods() & mod_state && mac_alt_tab_on && !mac_ctrl_on) { + del_mods(mod_state); + add_mods(MOD_LCTL); + } + + mod_state = mods & MOD_MASK_CTRL; + if (get_mods() & mod_state && !mac_alt_tab_on) { + del_mods(mod_state); + add_mods(MOD_LALT); + mac_ctrl_on = true; + } + } + break; + case KC_DEL: + if (record->event.pressed && is_mac_with_base_layer_off()) { + uint8_t mod_state = get_mods() & MOD_MASK_CTRL; + if (get_mods() & mod_state) { + del_mods(mod_state); + add_mods(MOD_LALT); + mac_ctrl_on = true; + } + } + break; + case KC_LALT: + if (!record->event.pressed && is_mac_with_base_layer_off()) { + if (mac_alt_tab_on) { + unregister_mods(MOD_LCTL); + mac_alt_tab_on = false; + return false; + } else if (mac_gui_on) { + SEND_STRING(SS_UP(X_LGUI)); + mac_gui_on = false; + return false; + } + } + break; + case KC_RALT: + if (!record->event.pressed && mac_alt_tab_on && is_mac_with_base_layer_off()) { + unregister_mods(MOD_LCTL); + mac_alt_tab_on = false; + return false; + } + break; + case KC_LCTL: + case KC_RCTL: + if (!record->event.pressed && mac_ctrl_on && is_mac_with_base_layer_off()) { + SEND_STRING(SS_UP(X_LGUI) SS_UP(X_LALT)); + mac_ctrl_on = false; + return false; + } + break; + + case KC_HOME: + if (record->event.pressed && is_mac_with_base_layer_off()) { + SEND_STRING(SS_LCTL(SS_TAP(X_LEFT))); + return false; + } + break; + case KC_END: + if (record->event.pressed && is_mac_with_base_layer_off()) { + SEND_STRING(SS_LCTL(SS_TAP(X_RIGHT))); + return false; + } + break; + case KC_BSPC: + if (record->event.pressed) { + if (char_to_del > 1) { + layer_off(GIT_C); + layer_off(GIT_S); + backspace_n_times(char_to_del); + char_to_del = 1; + return false; + } + + if (is_mac_with_base_layer_off()) { + uint8_t mod_state = get_mods() & MOD_MASK_CTRL; + if (get_mods() & mod_state) { + del_mods(mod_state); + add_mods(MOD_LALT); + mac_ctrl_on = true; + } + } + } + break; + + /* ------------------------------------------------------------------------- + * CUSTOM MACROS + * ------------------------------------------------------------------------ */ + case CTRL_CTV: + if (record->event.pressed) { + if ( get_mods() & MOD_MASK_SHIFT ) { + clear_mods(); + SEND_STRING(SS_LCTL("ctv")); + } else { + SEND_STRING(SS_LCTL("ctv") SS_TAP(X_ENTER)); + } + } + break; + case CTRL_LCTV: + if (record->event.pressed) { + if ( get_mods() & MOD_MASK_SHIFT ) { + //Firefox + clear_mods(); + SEND_STRING(SS_LCTL("lcP")); + wait_ms(200); + SEND_STRING(SS_LCTL("v") SS_TAP(X_ENTER)); + } else if ( get_mods() & MOD_MASK_CTRL ) { + //Chrome + clear_mods(); + SEND_STRING(SS_LCTL("lcNv") SS_TAP(X_ENTER)); + } else { + SEND_STRING(SS_LCTL("lctv")); + } + } + break; + case CTRL_CAV: + if (record->event.pressed) { + SEND_STRING(SS_LCTL("c" SS_TAP(X_TAB))); + wait_ms(50); + SEND_STRING(SS_LCTL("av")); + } + break; + case SARCASM: + if (record->event.pressed) { + sarcasm_on = !sarcasm_on; + } + break; + + /* ------------------------------------------------------------------------- + * OS TOGGLING + * ------------------------------------------------------------------------ */ + case TOG_OS: + if (record->event.pressed) { + is_win = ! is_win; + led_show_current_os(); + } + break; + case CTR_ALT: + if (record->event.pressed) { + send_string(key_down[is_win]); + } else { + send_string(key_up[is_win]); + } + break; + case OS_CTRL: + if (is_win) { + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LCTL)); + } else { + SEND_STRING(SS_UP(X_LCTL)); + } + } else { + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LGUI)); + } else { + SEND_STRING(SS_UP(X_LGUI)); + } + } + break; + case OS_WIN: + if (is_win) { + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LGUI)); + } else { + SEND_STRING(SS_UP(X_LGUI)); + } + } else { + if (record->event.pressed) { + SEND_STRING(SS_DOWN(X_LCTL)); + } else { + SEND_STRING(SS_UP(X_LCTL)); + } + } + break; + + /* ------------------------------------------------------------------------- + * STRING MACROS + * ------------------------------------------------------------------------ */ + // case : + // if (record->event.pressed) { + // send_string_remembering_length(""); + // } + // break; + // case : + // if (record->event.pressed) { + // send_string_remembering_length("", ""); + // } + // break; + case TILD_BLOCK: + if (record->event.pressed) { + SEND_STRING("```" SS_LSFT(SS_TAP(X_ENTER) SS_TAP(X_ENTER)) "```" SS_TAP(X_UP)); + char_to_del = 4; + } + break; + case ADMINS: + if (record->event.pressed) { + send_shifted_strings_add("admin", "/aurora/status"); + } + break; + case PRESCRIPTION: + if (record->event.pressed) { + SEND_STRING("55\t12122019\t"); + char_to_del = 8; + } + break; + case FOURS: + if (record->event.pressed) { + SEND_STRING("4444333322221111\t1\t12\t21\t123\n"); + char_to_del = 16; + } + break; + + case G_ADD: + if (record->event.pressed) { + send_string_remembering_length("git add "); + } + break; + case G_BRCH: + if (record->event.pressed) { + send_shifted_strings_add("git branch ", "-d "); + } + break; + case G_C: + if (record->event.pressed) { + send_string_remembering_length("git c[Heckout/Ommit]"); + layer_on(GIT_C); + } + break; + case G_CHEC: + if (!record->event.pressed) { + bool shifted = get_mods() & MOD_MASK_SHIFT; + clear_mods(); + + backspace_n_times(15); + SEND_STRING("heckout "); + char_to_del = 13; + if (shifted) { + SEND_STRING("-b "); + char_to_del = 16; + } + layer_off(GIT_C); + } + break; + case G_COMM: + if (!record->event.pressed) { + bool shifted = get_mods() & MOD_MASK_SHIFT; + clear_mods(); + + backspace_n_times(15); + SEND_STRING("ommit -"); + char_to_del = 15; + if (shifted) { + SEND_STRING("a"); + char_to_del = 16; + } + SEND_STRING("m \"\"" SS_TAP(X_LEFT)); + layer_off(GIT_C); + } + break; + case G_DEV: + if (record->event.pressed) { + send_shifted_strings("develop", "master"); + } + break; + case G_DIFF: + if (record->event.pressed) { + send_string_remembering_length("git diff "); + } + break; + case G_FTCH: + if (record->event.pressed) { + send_string_remembering_length("git fetch "); + } + break; + case G_LOG: + if (record->event.pressed) { + send_string_remembering_length("git log "); + } + break; + case G_MERG: + if (record->event.pressed) { + send_string_remembering_length("git merge "); + } + break; + case G_P: + if (record->event.pressed) { + send_shifted_strings_add("git pu", "sh -u "); + } + break; + case G_RST: + if (record->event.pressed) { + send_string_remembering_length("git reset "); + } + break; + case G_S: + if (!record->event.pressed) { + send_string_remembering_length("git s[taSh/How/taTus]"); + layer_on(GIT_S); + } + break; + case G_SHOW: + if (!record->event.pressed) { + backspace_n_times(16); + SEND_STRING("how "); + char_to_del = 9; + layer_off(GIT_S); + } + break; + case G_STSH: + if (!record->event.pressed) { + bool shifted = get_mods() & MOD_MASK_SHIFT; + clear_mods(); + + backspace_n_times(16); + SEND_STRING("tash "); + char_to_del = 10; + + if (shifted) { + clear_mods(); + SEND_STRING("apply "); + + char_to_del = 16; + } + + layer_off(GIT_S); + } + break; + case G_STAT: + if (!record->event.pressed) { + backspace_n_times(16); + SEND_STRING("tatus "); + char_to_del = 11; + layer_off(GIT_S); + } + break; + + case CTL_ALT_START ... CTL_ALT_END: + if (record->event.pressed) { + if (is_win) { + tap_code16(LCTL(keycode - CTL_ALT_START)); + } else { + tap_code16(LALT(keycode - CTL_ALT_START)); + } + } + break; + } + + return process_record_keymap(keycode, record); +} |