- // 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)
|