summaryrefslogtreecommitdiff
path: root/users/art/funcs/string_funcs.c
diff options
context:
space:
mode:
authorArtjoms Rizihs <artjomsR@users.noreply.github.com>2022-10-10 01:04:30 -0700
committerGitHub <noreply@github.com>2022-10-10 01:04:30 -0700
commitcd4a265560b45d117ac8296887188015c907e3c8 (patch)
treeb33715262450507840c75b501b559719070e167a /users/art/funcs/string_funcs.c
parent7aab5e4d896606a7731c8adfce41115611df75c2 (diff)
[Keyboard][Keymap] Fix random keys being sent on Mac + userspace changes (#15648)
* qmk art 2020+ * fix compilation * remove functions. translation matrix * fix edgecases * whitespace * fix memory oddity changing the keymap with every string print * return edge cases * support workman layout for git strings * subm * secrets * fix git ignore * rename var * workman HW feature toggle * remember lenght for inserting secrets * blink leds on secret finish * 75:fix LEDs not reflecting state on boot * move common led functions to user file * move common led funcs to separate file * move funcs file to separate folder * capsword * move string functions to a separate file * consolidate led funcs * tidy up variables * email * fix printing random keys on Mac + temp disable dynamic macro * make switch lang shortcut configurable * revert ergodone behaviour * move git ignore to userspace folder * ergodone clean up + saving space * navigation combos * shift caps always turns on caps lock. more combos * convert led funcs into header file * convert string funcs into header file * fix compilation for split75 * remove git cherry pick * update legal headers * more legal headers * home row macros * refactor combo names * redo combos for homerow + f10 11 12 * custom strings implementation (like secrets) * ergodone: more consistent f keys * tweak left right combos to minimise typing interference * ctr z shortcut * ergodone: move del to a more convenient key * rename secrets file to a shorter length * ergodone tweaks * fix after merge * removed included .c files * Update keyboards/ktec/ergodone/keymaps/art/user_config.c.example * Update keyboards/mt/split75/keymaps/art/user_config.c.example * Update users/art/secr.h.example * Update users/art/custom_definitions.h.example * Update users/art/art_user_config.h.example * Update users/art/art.h
Diffstat (limited to 'users/art/funcs/string_funcs.c')
-rw-r--r--users/art/funcs/string_funcs.c309
1 files changed, 309 insertions, 0 deletions
diff --git a/users/art/funcs/string_funcs.c b/users/art/funcs/string_funcs.c
new file mode 100644
index 0000000000..d3a177a1b1
--- /dev/null
+++ b/users/art/funcs/string_funcs.c
@@ -0,0 +1,309 @@
+// Copyright 2022 Artjoms Rizihs (@artjomsR)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "art.h"
+#include "string_funcs.h"
+#include "string.h"
+
+bool mac_ctrl_on;
+
+int char_to_bspace;
+int char_to_del;
+
+enum combo_events {
+ HOMEROW_UP,
+ HOMEROW_LEFT,
+ HOMEROW_RIGHT,
+ HOMEROW_DOWN,
+ HOMEROW_PREV_WORD,
+ HOMEROW_NEXT_WORD,
+ HOMEROW_HOME,
+ HOMEROW_END,
+
+ ED_F1,
+ ED_F2,
+ ED_F3,
+ ED_F4,
+ ED_F5,
+ ED_F6,
+ ED_F7,
+ ED_F8,
+ ED_F9,
+ ED_F10,
+ ED_F11,
+ ED_F12,
+ ED_PSCREEN,
+
+ ED_ENTER,
+
+ ED_CS_ENTER,
+ BSPC_LSFT_CLEAR,
+ COMBO_LENGTH
+};
+uint16_t COMBO_LEN = COMBO_LENGTH; // do not remove - needed for combos to work
+
+const uint16_t PROGMEM combo_up[] = {KC_W, KC_R, COMBO_END};
+const uint16_t PROGMEM combo_left[] = {KC_S, KC_E, COMBO_END};
+const uint16_t PROGMEM combo_right[] = {KC_F, KC_E, COMBO_END};
+const uint16_t PROGMEM combo_down[] = {KC_S, KC_F, COMBO_END};
+const uint16_t PROGMEM combo_prev_word[] = {KC_S, KC_LCTRL, COMBO_END};
+const uint16_t PROGMEM combo_next_word[] = {KC_F, KC_LCTRL, COMBO_END};
+const uint16_t PROGMEM combo_end[] = {KC_W, KC_E, COMBO_END};
+const uint16_t PROGMEM combo_home[] = {KC_E, KC_R, COMBO_END};
+
+const uint16_t PROGMEM combo_enter[] = {KC_BSPC, KC_INS, COMBO_END};
+
+const uint16_t PROGMEM combo_f1[] = {KC_1, KC_Q, COMBO_END};
+const uint16_t PROGMEM combo_f2[] = {KC_2, KC_W, COMBO_END};
+const uint16_t PROGMEM combo_f3[] = {KC_3, KC_E, COMBO_END};
+const uint16_t PROGMEM combo_f4[] = {KC_4, KC_R, COMBO_END};
+const uint16_t PROGMEM combo_f5[] = {KC_5, KC_T, COMBO_END};
+const uint16_t PROGMEM combo_f6[] = {KC_6, KC_Y, COMBO_END};
+const uint16_t PROGMEM combo_f7[] = {KC_7, KC_U, COMBO_END};
+const uint16_t PROGMEM combo_f8[] = {KC_8, KC_I, COMBO_END};
+const uint16_t PROGMEM combo_f9[] = {KC_9, KC_O, COMBO_END};
+const uint16_t PROGMEM combo_f10[] = {KC_0, KC_P, COMBO_END};
+const uint16_t PROGMEM combo_f11[] = {LT(GIT,KC_SLSH), KC_RSFT, COMBO_END};
+const uint16_t PROGMEM combo_f12[] = {KC_RALT, KC_RCTRL, COMBO_END};
+const uint16_t PROGMEM combo_pscreen[] = {TO(WORKMAN), KC_RALT, COMBO_END};
+
+const uint16_t PROGMEM done_sm[] = {KC_LEFT, KC_RIGHT, COMBO_END};
+const uint16_t PROGMEM clear_line_combo[] = {KC_BSPC, KC_LSFT, COMBO_END};
+
+combo_t key_combos[] = {
+ [HOMEROW_UP] = COMBO(combo_up, KC_UP),
+ [HOMEROW_LEFT] = COMBO(combo_left, KC_LEFT),
+ [HOMEROW_RIGHT] = COMBO(combo_right, KC_RIGHT),
+ [HOMEROW_DOWN] = COMBO(combo_down, KC_DOWN),
+ [HOMEROW_PREV_WORD] = COMBO_ACTION(combo_prev_word),
+ [HOMEROW_NEXT_WORD] = COMBO_ACTION(combo_next_word),
+ [HOMEROW_HOME] = COMBO(combo_end, KC_HOME),
+ [HOMEROW_END] = COMBO(combo_home, KC_END),
+
+ #if defined(KEYBOARD_ktec_ergodone)
+ [ED_ENTER] = COMBO(combo_enter, KC_ENTER),
+
+ [ED_F1] = COMBO(combo_f1, KC_F1),
+ [ED_F2] = COMBO(combo_f2, KC_F2),
+ [ED_F3] = COMBO(combo_f3, KC_F3),
+ [ED_F4] = COMBO(combo_f4, KC_F4),
+ [ED_F5] = COMBO(combo_f5, KC_F5),
+ [ED_F6] = COMBO(combo_f6, KC_F6),
+ [ED_F7] = COMBO(combo_f7, KC_F7),
+ [ED_F8] = COMBO(combo_f8, KC_F8),
+ [ED_F9] = COMBO(combo_f9, KC_F9),
+ [ED_F10] = COMBO(combo_f10, KC_F10),
+ [ED_F11] = COMBO(combo_f11, KC_F11),
+ [ED_F12] = COMBO(combo_f12, KC_F12),
+ [ED_PSCREEN] = COMBO(combo_pscreen, KC_PSCREEN),
+
+ [ED_CS_ENTER] = COMBO_ACTION(done_sm),
+ #endif
+
+ [BSPC_LSFT_CLEAR] = COMBO_ACTION(clear_line_combo),
+};
+
+void process_combo_event(uint16_t combo_index, bool pressed) {
+ switch(combo_index) {
+ case HOMEROW_PREV_WORD:
+ if (pressed) {
+ if (is_win) {
+ tap_code16(C(KC_LEFT));
+ } else {
+ tap_code16(A(KC_LEFT));
+ }
+ }
+ break;
+ case HOMEROW_NEXT_WORD:
+ if (pressed) {
+ if (is_win) {
+ tap_code16(C(KC_RIGHT));
+ } else {
+ tap_code16(A(KC_RIGHT));
+ }
+ }
+ break;
+ case BSPC_LSFT_CLEAR:
+ if (pressed) {
+ tap_code16(KC_END);
+ tap_code16(S(KC_HOME));
+ tap_code16(KC_BSPC);
+ }
+ break;
+ case ED_CS_ENTER:
+ if (pressed) {
+ tap_code16(C(S(KC_ENTER)));
+ }
+ break;
+ }
+}
+
+bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
+ return !layer_state_is(BASE);
+}
+
+bool is_mac_with_base_layer_off(void) {
+ return !is_win && !layer_state_is(BASE);
+}
+
+void switch_lang(void) {
+ if (is_win) {
+ SEND_STRING(SS_LALT(SS_TAP(X_LSFT)));
+ } else {
+ send_string(lang_switch_combo);
+ wait_ms(10);
+ }
+}
+
+void press_n_times(int times, uint16_t key) {
+ for (int i=0; i<times; i++) {
+ // wait_ms(TYPING_INTERVAL);
+ tap_code16(key);
+ }
+}
+
+
+bool handle_del_bspace(void) {
+ if (char_to_bspace > 1 || char_to_del > 0) {
+ layer_off(GIT_C);
+ layer_off(GIT_R);
+ layer_off(GIT_S);
+
+ press_n_times(char_to_bspace, KC_BSPACE);
+ char_to_bspace = 1;
+ press_n_times(char_to_del, KC_DEL);
+ char_to_del = 0;
+
+ 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;
+ }
+ }
+ return true;
+}
+
+void send_string_with_translation(char *string) {
+ #if WORKMAN_TO_QWERTY_HW_MAPPING
+ if (layer_state_is(WORKMAN)) {
+ int isUpperCase = 0;
+ for (int i = 0; i < strlen(string); i++) {
+ char toPrint = string[i];
+ if (isupper(toPrint)) {
+ if (toPrint == 'P') {
+ SEND_STRING(":");
+ continue;
+ }
+
+ isUpperCase = 1;
+ toPrint = tolower(toPrint);
+ }
+ switch (toPrint) {
+ case ':':
+ toPrint = 'I';
+ break;
+
+ case 'w':
+ toPrint = 'd';
+ break;
+ case 'e':
+ toPrint = 'r';
+ break;
+ case 'r':
+ toPrint = 'w';
+ break;
+ case 't':
+ toPrint = 'b';
+ break;
+ case 'y':
+ toPrint = 'j';
+ break;
+ case 'u':
+ toPrint = 'f';
+ break;
+ case 'i':
+ toPrint = 'u';
+ break;
+ case 'o':
+ toPrint = 'p';
+ break;
+ case 'p':
+ toPrint = ';';
+ break;
+
+ case 'd':
+ toPrint = 'h';
+ break;
+ case 'f':
+ toPrint = 't';
+ break;
+ case 'h':
+ toPrint = 'y';
+ break;
+ case 'j':
+ toPrint = 'n';
+ break;
+ case 'k':
+ toPrint = 'e';
+ break;
+ case 'l':
+ toPrint = 'o';
+ break;
+ case ';':
+ toPrint = 'i';
+ break;
+
+ case 'b':
+ toPrint = 'm';
+ break;
+ case 'n':
+ toPrint = 'k';
+ break;
+ case 'm':
+ toPrint = 'l';
+ break;
+ }
+ if (isUpperCase) {
+ isUpperCase = 0;
+ toPrint = toupper(toPrint);
+ }
+ send_char(toPrint);
+ }
+ } else {
+ send_string(string);
+ }
+ #else
+ send_string(string);
+ #endif
+}
+
+void send_string_remembering_length(char *string) {
+ send_string_with_translation(string);
+ char_to_bspace = 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_bspace = strlen(string1) + strlen(string2);
+ }
+} \ No newline at end of file