summaryrefslogtreecommitdiffstats
path: root/users/danielo515/process_records.c
blob: b1a8b92552ed0aec33b349160dd5e65d383f13c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include "process_records.h"
#include "alt_tab.h"
extern bool onMac;
// ======== INCREMENTAL MACROS STUFF =============
#define MAX_INCREMENTAL_MACRO 20
#define TAP_ROTATION_TIMEOUT 400
uint16_t latest_kc = 0;
uint16_t latest_rotation = 0;
int key_count = 0;

const char incremental_macros[][MAX_INCREMENTAL_MACRO] = { "String1"SS_TAP(X_HOME)"X-", "String2"SS_TAP(X_HOME) };

bool process_incremental_macro(uint16_t kc) {
    if (kc < INC_MACROS_START || kc > INC_MACROS_END) {
        return false;
    }
    int  macro_idx     = (int)(kc - INC_MACROS_START) - 1;
    char tempstring[3] = {0};
    tempstring[0]      = incremental_macros[macro_idx][key_count];
    // Special cases of SS_TAP SS_UP and SS_DOWN, they require two characters so get both once and skip on next iteration
    if (tempstring[0] == '\1' || tempstring[0] == '\2' || tempstring[0] == '\3') {
        tempstring[1] = incremental_macros[macro_idx][++key_count];
    }
    if (tempstring[0] == '\0') {
        key_count = 0;
    }
    send_string(tempstring);

    return true;
};

void refresh_incremental_macros(uint16_t kc) {
    if (kc == latest_kc) {
        if ((timer_elapsed(latest_rotation) > TAP_ROTATION_TIMEOUT) || (key_count >= MAX_INCREMENTAL_MACRO))
            key_count = 0;
        else
            key_count++;
    } else {
        key_count = 0;
        latest_kc = kc;
    }

    latest_rotation = timer_read();
}
// Send control or GUI depending if we are on windows or mac
bool CMD(uint16_t kc) {
    if(onMac){ tap_code16(LGUI(kc)); } else { tap_code16(LCTL(kc)); }
    return false;
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    bool pressed = record->event.pressed;
    if(pressed){
        refresh_incremental_macros(keycode);
        if(process_incremental_macro(keycode)){
            return false;
        }
        switch (keycode) {
            case MAC_TGL:
            onMac = !onMac;
            onMac ? SEND_STRING("On mac") : SEND_STRING("Not on MAC");
            return false;
        }
    }

    switch (keycode) {
    case QWERTY:
        if (record->event.pressed) {
        #ifdef AUDIO_ENABLE
        PLAY_SONG(tone_qwerty);
        #endif
        layer_on(_QWERTY);
        }
        return false;
    case LOWER:
        if (record->event.pressed) {
        layer_on(_LOWER);
        } else {
        layer_off(_LOWER);
        }
        return false;
    case RAISE:
        if (record->event.pressed) {
        layer_on(_RAISE);
        } else {
        layer_off(_RAISE);
        }
        return false;
    case ADJUST:
    if (record->event.pressed) {
        layer_on(_ADJUST);
        } else {
        layer_off(_ADJUST);
        }
        return false;
 // == Macros START ===
    case IARROW: if (record->event.pressed) SEND_STRING("<-"); return false;
    case ARROW: if (record->event.pressed) SEND_STRING("->"); return false;
    case F_ARROW: if (record->event.pressed) SEND_STRING("=>"); return false;
    case GREP: if (record->event.pressed) SEND_STRING(" | grep "); return false;
    case CLN_EQ: if (record->event.pressed) SEND_STRING(":="); return false;
 // == Macros END ===
 // == Multi Os START ===
  case KC_HOME:// make the home behave the same on OSX
    if (record->event.pressed && onMac) {
        SEND_STRING(SS_LCTRL("a"));
        return false;
    }
  case KC_END:// make the end behave the same on OSX
    if (record->event.pressed && onMac) {
        tap_code16(C(KC_E));
        return false;
    }
  case AC_A:// Accent á
    if (record->event.pressed) SEND_STRING(SS_LALT("e") "a"); return false;
  case AC_E:// Accent é
    if (record->event.pressed) SEND_STRING(SS_LALT("e") "e"); return false;
  case AC_I:// Accent í
    if (record->event.pressed) SEND_STRING(SS_LALT("e") "i"); return false;
  case AC_O:// Accent ó
    if (record->event.pressed) SEND_STRING(SS_LALT("e") "o"); return false;
  case CUT: if (record->event.pressed) return CMD(KC_X);
  case COPY:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LGUI("c")) : SEND_STRING(SS_LCTRL("c"));
    }
    return false;
  case PASTE:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LGUI("v")) : SEND_STRING(SS_LCTRL("v"));
    }
    return false;
  case SAVE:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LGUI("s")) : SEND_STRING(SS_LCTRL("s"));
    }
    return false;
  case UNDO:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LGUI("z")) : SEND_STRING(SS_LCTRL("z"));
    }
    return false;
  case FIND:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LGUI("f")) : SEND_STRING(SS_LCTRL("f"));
    }
    return false;
  case CHG_LAYOUT:
    if (record->event.pressed) {
     onMac ?  SEND_STRING(SS_LCTRL(" ")) : SEND_STRING(SS_LCTRL("f"));
    }
    return false;
 // == Multi Os END ===
#ifdef RGBLIGHT_ENABLE
  case RGB_SLD:
    if (record->event.pressed) { rgblight_mode(1); }
    return false;
    break;
    //First time alt + tab, and alt stays sticky. Next press we just send tab. Any other key releases the alt
#endif
  }
// =============== ALT_TAB single key handling
  return process_alt_tab(keycode, record);
};