mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 21:32:31 +01:00 
			
		
		
		
	 8ac9940a76
			
		
	
	
		8ac9940a76
		
			
		
	
	
	
	
		
			
			* chore: pulled the latest from master Bring my redox layout from my latest redox branch Bring my latest user stuff from my redox branch * Update users/danielo515/config.h Co-authored-by: Drashna Jaelre <drashna@live.com> * chore: small cleanup Co-authored-by: Drashna Jaelre <drashna@live.com>
		
			
				
	
	
		
			201 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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 REDO:
 | |
|             if (record->event.pressed) {
 | |
|                 onMac ? SEND_STRING(SS_LGUI(SS_LSFT("z"))) : SEND_STRING(SS_LCTRL("y"));
 | |
|             }
 | |
|             return false;
 | |
|         case FIND:
 | |
|             if (record->event.pressed) {
 | |
|                 onMac ? SEND_STRING(SS_LGUI("f")) : SEND_STRING(SS_LCTRL("f"));
 | |
|             }
 | |
|             return false;
 | |
|         case WIN_TO_RIGHT:
 | |
|             if (record->event.pressed) {
 | |
|                 onMac ? tap_code16(SGUI(A(KC_RIGHT))) : tap_code16(G(KC_RIGHT));
 | |
|             }
 | |
|             return false;
 | |
|         case WIN_TO_LEFT:
 | |
|             if (record->event.pressed) {
 | |
|                 onMac ? tap_code16(SGUI(A(KC_LEFT))) : tap_code16(G(KC_LEFT));
 | |
|             }
 | |
|             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);
 | |
| };
 |