qmk-dactyl-manuform-a/users/art/art.c

465 lines
12 KiB
C

#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);
}