diff options
Diffstat (limited to 'keyboards/keebio/viterbi/keymaps/dwallace/keymap.c')
-rw-r--r-- | keyboards/keebio/viterbi/keymaps/dwallace/keymap.c | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c b/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c new file mode 100644 index 000000000..5a797cb0b --- /dev/null +++ b/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c | |||
@@ -0,0 +1,223 @@ | |||
1 | #include "viterbi.h" | ||
2 | #include "action_layer.h" | ||
3 | #include "eeconfig.h" | ||
4 | #ifdef RGBLIGHT_ENABLE | ||
5 | #include "rgblight.h" | ||
6 | #endif | ||
7 | |||
8 | extern keymap_config_t keymap_config; | ||
9 | |||
10 | #define _QWERTY 0 | ||
11 | #define _FN 1 | ||
12 | |||
13 | enum custom_keycodes { | ||
14 | QWERTY = SAFE_RANGE, | ||
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, | ||
23 | }; | ||
24 | |||
25 | #define KC_ KC_TRNS | ||
26 | |||
27 | #define KC_SWIN LGUI(KC_TILD) // Switch between windows | ||
28 | #define KC_SAPP LGUI(KC_TAB) // Switch between applications | ||
29 | #define KC_FN1 MO(_FN) | ||
30 | #define KC_LCAG LCAG(KC_NO) | ||
31 | #define KC_RTOG RGB_TOG | ||
32 | #define KC_RGUP RGB_LEVEL_UP | ||
33 | #define KC_RGDN RGB_LEVEL_DOWN | ||
34 | #define KC_RST RESET | ||
35 | #define KC_SSFT STK_SHIFT | ||
36 | #define KC_SCTL STK_CTRL | ||
37 | #define KC_SALT STK_ALT | ||
38 | #define KC_SGUI STK_GUI | ||
39 | #define KC_SMTA STK_META | ||
40 | #define KC_SCLR STK_CLEAR | ||
41 | |||
42 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
43 | |||
44 | [_QWERTY] = LAYOUT_kc( | ||
45 | //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. | ||
46 | GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL ,BSPC, | ||
47 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
48 | TAB , Q , W , E , R , T ,LBRC, Y , U , I , O , P ,BSLS,PGUP, | ||
49 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
50 | ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT , | ||
51 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
52 | SSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT, | ||
53 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
54 | SCTL,SMTA,SALT,SGUI,SPC ,SCLR,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN | ||
55 | //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' | ||
56 | ), | ||
57 | |||
58 | [_FN] = LAYOUT_kc( | ||
59 | //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. | ||
60 | , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , , | ||
61 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
62 | , , , ,RST , , , , , , , , , , | ||
63 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
64 | , , , , , , , RTOG, ,RGDN,RGUP, , , , | ||
65 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
66 | , , , , , , , ,MUTE,VOLD,VOLU, , , , | ||
67 | //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| | ||
68 | , , , , , , , , , , , , , | ||
69 | //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' | ||
70 | ) | ||
71 | |||
72 | }; | ||
73 | |||
74 | #ifdef AUDIO_ENABLE | ||
75 | float tone_qwerty[][2] = SONG(QWERTY_SOUND); | ||
76 | #endif | ||
77 | |||
78 | void persistent_default_layer_set(uint16_t default_layer) { | ||
79 | eeconfig_update_default_layer(default_layer); | ||
80 | default_layer_set(default_layer); | ||
81 | } | ||
82 | |||
83 | bool modifier_already_applied = false; | ||
84 | uint8_t physically_held_modifiers = 0; | ||
85 | uint8_t last_mods = 0xFF; | ||
86 | uint8_t rgb_dimming = 0; | ||
87 | #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]) | ||
88 | |||
89 | void update_underglow_level(void) { | ||
90 | if (get_mods() == last_mods) | ||
91 | return; | ||
92 | |||
93 | last_mods = get_mods(); | ||
94 | |||
95 | if (get_mods() == 0) { | ||
96 | uint8_t level = 0x10 >> rgb_dimming; | ||
97 | rgblight_setrgb(level, level, level); | ||
98 | return; | ||
99 | } | ||
100 | |||
101 | uint32_t mod_colors[4] = {0}; | ||
102 | uint8_t mod_count = 0; | ||
103 | rgblight_setrgb(0x00, 0x00, 0x00); | ||
104 | |||
105 | if (get_mods() & MOD_BIT(KC_LSFT)) | ||
106 | mod_colors[mod_count++] = 0xFF0000; | ||
107 | if (get_mods() & MOD_BIT(KC_LCTL)) | ||
108 | mod_colors[mod_count++] = 0x00FF00; | ||
109 | if (get_mods() & MOD_BIT(KC_LALT)) | ||
110 | mod_colors[mod_count++] = 0x0000FF; | ||
111 | if (get_mods() & MOD_BIT(KC_LGUI)) | ||
112 | mod_colors[mod_count++] = 0xFFFF00; | ||
113 | |||
114 | uint8_t led_num = 0; | ||
115 | for (int m = 0; m < mod_count; m++) { | ||
116 | for (; led_num < RGBLED_NUM*(m+1)/mod_count; led_num++) { | ||
117 | SET_LED_RGB(mod_colors[m], led_num); | ||
118 | } | ||
119 | } | ||
120 | rgblight_set(); | ||
121 | } | ||
122 | |||
123 | void add_sticky_modifier(uint16_t keycode) { | ||
124 | add_mods(MOD_BIT(keycode)); | ||
125 | register_code(keycode); | ||
126 | modifier_already_applied = false; | ||
127 | } | ||
128 | |||
129 | void clear_sticky_modifiers(void) { | ||
130 | unregister_code(KC_LSFT); | ||
131 | unregister_code(KC_LCTL); | ||
132 | unregister_code(KC_LALT); | ||
133 | unregister_code(KC_LGUI); | ||
134 | update_underglow_level(); | ||
135 | } | ||
136 | |||
137 | void handle_sticky_modifier_event(uint16_t keycode, bool pressed) { | ||
138 | if (pressed) { | ||
139 | add_sticky_modifier(keycode); | ||
140 | physically_held_modifiers |= MOD_BIT(keycode); | ||
141 | } else { | ||
142 | del_mods(MOD_BIT(keycode)); | ||
143 | physically_held_modifiers &= ~MOD_BIT(keycode); | ||
144 | if (modifier_already_applied) { | ||
145 | clear_sticky_modifiers(); | ||
146 | } else { | ||
147 | add_sticky_modifier(keycode); | ||
148 | } | ||
149 | } | ||
150 | update_underglow_level(); | ||
151 | } | ||
152 | |||
153 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
154 | switch (keycode) { | ||
155 | case QWERTY: | ||
156 | if (record->event.pressed) { | ||
157 | #ifdef AUDIO_ENABLE | ||
158 | PLAY_NOTE_ARRAY(tone_qwerty, false, 0); | ||
159 | #endif | ||
160 | persistent_default_layer_set(1UL<<_QWERTY); | ||
161 | } | ||
162 | return false; | ||
163 | break; | ||
164 | case STK_SHIFT: | ||
165 | handle_sticky_modifier_event(KC_LSFT, record->event.pressed); | ||
166 | return false; | ||
167 | break; | ||
168 | case STK_CTRL: | ||
169 | handle_sticky_modifier_event(KC_LCTL, record->event.pressed); | ||
170 | return false; | ||
171 | break; | ||
172 | case STK_ALT: | ||
173 | handle_sticky_modifier_event(KC_LALT, record->event.pressed); | ||
174 | return false; | ||
175 | break; | ||
176 | case STK_GUI: | ||
177 | handle_sticky_modifier_event(KC_LGUI, record->event.pressed); | ||
178 | return false; | ||
179 | break; | ||
180 | case STK_META: | ||
181 | handle_sticky_modifier_event(KC_LCTL, record->event.pressed); | ||
182 | handle_sticky_modifier_event(KC_LALT, record->event.pressed); | ||
183 | handle_sticky_modifier_event(KC_LGUI, record->event.pressed); | ||
184 | return false; | ||
185 | break; | ||
186 | case STK_CLEAR: | ||
187 | if (record->event.pressed) { | ||
188 | clear_sticky_modifiers(); | ||
189 | } | ||
190 | return false; | ||
191 | break; | ||
192 | case RGB_LEVEL_DOWN: | ||
193 | if (record->event.pressed && rgb_dimming < 8) { | ||
194 | rgb_dimming++; | ||
195 | } | ||
196 | return false; | ||
197 | break; | ||
198 | case RGB_LEVEL_UP: | ||
199 | if (record->event.pressed && rgb_dimming > 0) { | ||
200 | rgb_dimming--; | ||
201 | } | ||
202 | return false; | ||
203 | break; | ||
204 | } | ||
205 | if (!record->event.pressed && IS_KEY(keycode)) { | ||
206 | modifier_already_applied = true; | ||
207 | if (physically_held_modifiers == 0) | ||
208 | clear_sticky_modifiers(); | ||
209 | } | ||
210 | return true; | ||
211 | } | ||
212 | |||
213 | void matrix_init_user(void) { | ||
214 | #ifdef RGBLIGHT_ENABLE | ||
215 | rgblight_enable(); | ||
216 | #endif //RGBLIGHT_ENABLE | ||
217 | } | ||
218 | |||
219 | void matrix_scan_user(void) { | ||
220 | #ifdef RGBLIGHT_ENABLE | ||
221 | update_underglow_level(); | ||
222 | #endif //RGBLIGHT_ENABLE | ||
223 | } | ||