85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 2019, g Heavy Industries
 | |
| // Blessed mother of Christ, please keep this readable
 | |
| // and protect us from segfaults. For thine is the clock,
 | |
| // the slave and the master. Until we return from main.
 | |
| //
 | |
| // Amen.
 | |
| 
 | |
| #include QMK_KEYBOARD_H
 | |
| #include "mousekey.h"
 | |
| #include "keymap.h"
 | |
| #include "keymap_steno.h"
 | |
| #include "wait.h"
 | |
| 
 | |
| extern size_t keymapsCount;			// Total keymaps
 | |
| extern uint32_t cChord;				// Current Chord
 | |
| extern uint32_t stenoLayers[];		// Chords that simulate QMK layers
 | |
| extern size_t stenoLayerCount;		// Number of simulated layers
 | |
| 
 | |
| // Function defs
 | |
| void 			processChord(bool useFakeSteno);
 | |
| uint32_t		processQwerty(bool lookup);
 | |
| uint32_t 		processFakeSteno(bool lookup);
 | |
| void 			saveState(uint32_t cChord);
 | |
| void 			restoreState(void);
 | |
| 
 | |
| // Macros for use in keymap.c
 | |
| void 			SEND(uint8_t kc);
 | |
| void 			REPEAT(void);
 | |
| void 			SET_STICKY(uint32_t);
 | |
| void 			SWITCH_LAYER(int);
 | |
| void 			CLICK_MOUSE(uint8_t);
 | |
| 
 | |
| // Keymap helper
 | |
| #define P(chord, act) if (cChord == (chord)) { if (!lookup) {act;} return chord;}
 | |
| #define PC(chord, act) if (cChord == (chord)) { if (!lookup) {act;} return chord;} \
 | |
| 	for(int i = 0; i < stenoLayerCount; i++) { \
 | |
| 		uint32_t refChord = stenoLayers[i] | chord; \
 | |
| 		if (cChord == (refChord)) { if (!lookup) {act;} return refChord;}; \
 | |
| }
 | |
| 
 | |
| // Shift to internal representation
 | |
| // i.e) S(teno)R(ight)F
 | |
| #define STN(n) (1L<<n)
 | |
| enum ORDER { 
 | |
| 		SFN = 0, SPWR, SST1, SST2, SST3, SST4, SNUML, SNUMR,
 | |
| 		SLSU, SLSD, SLT, SLK, SLP, SLW, SLH, SLR, SLA, SLO, 
 | |
| 		SRE, SRU, SRF, SRR, SRP, SRB, SRL, SRG, SRT, SRS, SRD, SRZ, SRES1, SRES2
 | |
| };
 | |
| 
 | |
| // Break it all out
 | |
| #define FN	STN(SFN)
 | |
| #define PWR	STN(SPWR)
 | |
| #define ST1 STN(SST1)
 | |
| #define ST2 STN(SST2)
 | |
| #define ST3 STN(SST3)
 | |
| #define ST4 STN(SST4)
 | |
| #define LNO STN(SNUML) 	// STN1-6
 | |
| #define RNO STN(SNUMR) 	// STN7-C
 | |
| #define RES1 STN(SRES1) // Use reserved for sticky state
 | |
| #define RES2 STN(SRES2)
 | |
| 
 | |
| #define LSU STN(SLSU)
 | |
| #define LSD STN(SLSD)
 | |
| #define LFT STN(SLT)  	// (L)e(F)t (T), preprocessor conflict
 | |
| #define LK  STN(SLK)
 | |
| #define LP  STN(SLP)
 | |
| #define LW  STN(SLW)
 | |
| #define LH  STN(SLH)
 | |
| #define LR  STN(SLR)
 | |
| #define LA  STN(SLA)
 | |
| #define LO  STN(SLO)
 | |
| 
 | |
| #define RE  STN(SRE)
 | |
| #define RU  STN(SRU)
 | |
| #define RF  STN(SRF)
 | |
| #define RR  STN(SRR)
 | |
| #define RP  STN(SRP)
 | |
| #define RB  STN(SRB)
 | |
| #define RL  STN(SRL)
 | |
| #define RG  STN(SRG)
 | |
| #define RT  STN(SRT)
 | |
| #define RS  STN(SRS)
 | |
| #define RD  STN(SRD)
 | |
| #define RZ  STN(SRZ)
 |