aboutsummaryrefslogtreecommitdiff
path: root/keyboards/viterbi/keymaps/dwallace/keymap.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/viterbi/keymaps/dwallace/keymap.c')
-rw-r--r--keyboards/viterbi/keymaps/dwallace/keymap.c159
1 files changed, 149 insertions, 10 deletions
diff --git a/keyboards/viterbi/keymaps/dwallace/keymap.c b/keyboards/viterbi/keymaps/dwallace/keymap.c
index 38d63ffaa..d8f2479d5 100644
--- a/keyboards/viterbi/keymaps/dwallace/keymap.c
+++ b/keyboards/viterbi/keymaps/dwallace/keymap.c
@@ -1,6 +1,9 @@
1#include "viterbi.h" 1#include "viterbi.h"
2#include "action_layer.h" 2#include "action_layer.h"
3#include "eeconfig.h" 3#include "eeconfig.h"
4#ifdef RGBLIGHT_ENABLE
5#include "rgblight.h"
6#endif
4 7
5extern keymap_config_t keymap_config; 8extern keymap_config_t keymap_config;
6 9
@@ -9,7 +12,14 @@ extern keymap_config_t keymap_config;
9 12
10enum custom_keycodes { 13enum custom_keycodes {
11 QWERTY = SAFE_RANGE, 14 QWERTY = SAFE_RANGE,
12 FN, 15 STK_SHIFT,
16 STK_CTRL,
17 STK_ALT,
18 STK_GUI,
19 STK_META,
20 STK_CLEAR,
21 RGB_LEVEL_UP,
22 RGB_LEVEL_DOWN,
13}; 23};
14 24
15#define KC_ KC_TRNS 25#define KC_ KC_TRNS
@@ -20,13 +30,15 @@ enum custom_keycodes {
20#define KC_FN1 MO(_FN) 30#define KC_FN1 MO(_FN)
21#define KC_LCAG LCAG(KC_NO) 31#define KC_LCAG LCAG(KC_NO)
22#define KC_RTOG RGB_TOG 32#define KC_RTOG RGB_TOG
23#define KC_RMOD RGB_MOD 33#define KC_RGUP RGB_LEVEL_UP
24#define KC_RVAD RGB_VAD 34#define KC_RGDN RGB_LEVEL_DOWN
25#define KC_RVAI RGB_VAI
26#define KC_CLRM KC_NO // TODO: Clear sticky modifiers
27#define KC_RST RESET 35#define KC_RST RESET
28 36#define KC_SSFT STK_SHIFT
29// TODO: Make modifiers sticky 37#define KC_SCTL STK_CTRL
38#define KC_SALT STK_ALT
39#define KC_SGUI STK_GUI
40#define KC_SMTA STK_META
41#define KC_SCLR STK_CLEAR
30 42
31const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 43const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
32 44
@@ -38,9 +50,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
38 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 50 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
39 ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT , 51 ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT ,
40 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 52 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
41 LSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT, 53 SSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT,
42 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 54 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
43 LCTL,LCAG,LALT,LGUI,SPC ,CLRM,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN 55 SCTL,SMTA,SALT,SGUI,SPC ,SCLR,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN
44 //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' 56 //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----'
45 ), 57 ),
46 58
@@ -50,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
50 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 62 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
51 , , , ,RST , , , , , , , , , , 63 , , , ,RST , , , , , , , , , ,
52 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 64 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
53 , , , , , , , RTOG,RMOD,RVAD,RVAI, , , , 65 , , , , , , , RTOG, ,RGDN,RGUP, , , ,
54 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 66 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
55 , , , , , , , ,MUTE,VOLD,VOLU, , , , 67 , , , , , , , ,MUTE,VOLD,VOLU, , , ,
56 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| 68 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
@@ -69,6 +81,76 @@ void persistent_default_layer_set(uint16_t default_layer) {
69 default_layer_set(default_layer); 81 default_layer_set(default_layer);
70} 82}
71 83
84bool modifier_already_applied = false;
85uint8_t physically_held_modifiers = 0;
86uint8_t last_mods = 0xFF;
87uint8_t rgb_dimming = 0;
88#define SET_LED_RGB(val, led_num) setrgb(((val >> 16) & 0xFF) >> rgb_dimming, ((val >> 8) & 0xFF) >> rgb_dimming, (val & 0xFF) >> rgb_dimming, (LED_TYPE *)&led[led_num])
89
90void update_underglow_level(void) {
91 if (get_mods() == last_mods)
92 return;
93
94 last_mods = get_mods();
95
96 if (get_mods() == 0) {
97 uint8_t level = 0x10 >> rgb_dimming;
98 rgblight_setrgb(level, level, level);
99 return;
100 }
101
102 uint32_t mod_colors[4] = {0};
103 uint8_t mod_count = 0;
104 rgblight_setrgb(0x00, 0x00, 0x00);
105
106 if (get_mods() & MOD_BIT(KC_LSFT))
107 mod_colors[mod_count++] = 0xFF0000;
108 if (get_mods() & MOD_BIT(KC_LCTL))
109 mod_colors[mod_count++] = 0x00FF00;
110 if (get_mods() & MOD_BIT(KC_LALT))
111 mod_colors[mod_count++] = 0x0000FF;
112 if (get_mods() & MOD_BIT(KC_LGUI))
113 mod_colors[mod_count++] = 0xFFFF00;
114
115 uint8_t led_num = 0;
116 for (int m = 0; m < mod_count; m++) {
117 for (; led_num < RGBLED_NUM*(m+1)/mod_count; led_num++) {
118 SET_LED_RGB(mod_colors[m], led_num);
119 }
120 }
121 rgblight_set();
122}
123
124void add_sticky_modifier(uint16_t keycode) {
125 add_mods(MOD_BIT(keycode));
126 register_code(keycode);
127 modifier_already_applied = false;
128}
129
130void clear_sticky_modifiers(void) {
131 unregister_code(KC_LSFT);
132 unregister_code(KC_LCTL);
133 unregister_code(KC_LALT);
134 unregister_code(KC_LGUI);
135 update_underglow_level();
136}
137
138void handle_sticky_modifier_event(uint16_t keycode, bool pressed) {
139 if (pressed) {
140 add_sticky_modifier(keycode);
141 physically_held_modifiers |= MOD_BIT(keycode);
142 } else {
143 del_mods(MOD_BIT(keycode));
144 physically_held_modifiers &= ~MOD_BIT(keycode);
145 if (modifier_already_applied) {
146 clear_sticky_modifiers();
147 } else {
148 add_sticky_modifier(keycode);
149 }
150 }
151 update_underglow_level();
152}
153
72bool process_record_user(uint16_t keycode, keyrecord_t *record) { 154bool process_record_user(uint16_t keycode, keyrecord_t *record) {
73 switch (keycode) { 155 switch (keycode) {
74 case QWERTY: 156 case QWERTY:
@@ -80,6 +162,63 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
80 } 162 }
81 return false; 163 return false;
82 break; 164 break;
165 case STK_SHIFT:
166 handle_sticky_modifier_event(KC_LSFT, record->event.pressed);
167 return false;
168 break;
169 case STK_CTRL:
170 handle_sticky_modifier_event(KC_LCTL, record->event.pressed);
171 return false;
172 break;
173 case STK_ALT:
174 handle_sticky_modifier_event(KC_LALT, record->event.pressed);
175 return false;
176 break;
177 case STK_GUI:
178 handle_sticky_modifier_event(KC_LGUI, record->event.pressed);
179 return false;
180 break;
181 case STK_META:
182 handle_sticky_modifier_event(KC_LCTL, record->event.pressed);
183 handle_sticky_modifier_event(KC_LALT, record->event.pressed);
184 handle_sticky_modifier_event(KC_LGUI, record->event.pressed);
185 return false;
186 break;
187 case STK_CLEAR:
188 if (record->event.pressed) {
189 clear_sticky_modifiers();
190 }
191 return false;
192 break;
193 case RGB_LEVEL_DOWN:
194 if (record->event.pressed && rgb_dimming < 8) {
195 rgb_dimming++;
196 }
197 return false;
198 break;
199 case RGB_LEVEL_UP:
200 if (record->event.pressed && rgb_dimming > 0) {
201 rgb_dimming--;
202 }
203 return false;
204 break;
205 }
206 if (!record->event.pressed && IS_KEY(keycode)) {
207 modifier_already_applied = true;
208 if (physically_held_modifiers == 0)
209 clear_sticky_modifiers();
83 } 210 }
84 return true; 211 return true;
85} 212}
213
214void matrix_init_user(void) {
215 #ifdef RGBLIGHT_ENABLE
216 rgblight_enable();
217 #endif //RGBLIGHT_ENABLE
218}
219
220void matrix_scan_user(void) {
221 #ifdef RGBLIGHT_ENABLE
222 update_underglow_level();
223 #endif //RGBLIGHT_ENABLE
224}