2 #include "action_layer.h"
8 extern keymap_config_t keymap_config;
13 enum custom_keycodes {
26 #define _______ KC_TRNS
28 #define KC_SWIN LGUI(KC_TILD) // Switch between windows
29 #define KC_SAPP LGUI(KC_TAB) // Switch between applications
30 #define KC_FN1 MO(_FN)
31 #define KC_LCAG LCAG(KC_NO)
32 #define KC_RTOG RGB_TOG
33 #define KC_RGUP RGB_LEVEL_UP
34 #define KC_RGDN RGB_LEVEL_DOWN
36 #define KC_SSFT STK_SHIFT
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
43 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
45 [_QWERTY] = LAYOUT_kc(
46 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
47 GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL ,BSPC,
48 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
49 TAB , Q , W , E , R , T ,LBRC, Y , U , I , O , P ,BSLS,PGUP,
50 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
51 ESC , A , S , D , F , G ,RBRC, H , J , K , L ,SCLN,QUOT,ENT ,
52 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
53 SSFT, Z , X , C , V , B ,SWIN, N , M ,COMM,DOT , UP ,SLSH,RSFT,
54 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
55 SCTL,SMTA,SALT,SGUI,SPC ,SCLR,SAPP, FN1 ,SPC ,RGUI,LEFT,DOWN,RGHT,PGDN
56 //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----'
60 //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
61 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , ,
62 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
63 , , , ,RST , , , , , , , , , ,
64 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
65 , , , , , , , RTOG, ,RGDN,RGUP, , , ,
66 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
67 , , , , , , , ,MUTE,VOLD,VOLU, , , ,
68 //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
69 , , , , , , , , , , , , ,
70 //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----'
76 float tone_qwerty[][2] = SONG(QWERTY_SOUND);
79 void persistent_default_layer_set(uint16_t default_layer) {
80 eeconfig_update_default_layer(default_layer);
81 default_layer_set(default_layer);
84 bool modifier_already_applied = false;
85 uint8_t physically_held_modifiers = 0;
86 uint8_t last_mods = 0xFF;
87 uint8_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])
90 void update_underglow_level(void) {
91 if (get_mods() == last_mods)
94 last_mods = get_mods();
96 if (get_mods() == 0) {
97 uint8_t level = 0x10 >> rgb_dimming;
98 rgblight_setrgb(level, level, level);
102 uint32_t mod_colors[4] = {0};
103 uint8_t mod_count = 0;
104 rgblight_setrgb(0x00, 0x00, 0x00);
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;
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);
124 void add_sticky_modifier(uint16_t keycode) {
125 add_mods(MOD_BIT(keycode));
126 register_code(keycode);
127 modifier_already_applied = false;
130 void 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();
138 void handle_sticky_modifier_event(uint16_t keycode, bool pressed) {
140 add_sticky_modifier(keycode);
141 physically_held_modifiers |= MOD_BIT(keycode);
143 del_mods(MOD_BIT(keycode));
144 physically_held_modifiers &= ~MOD_BIT(keycode);
145 if (modifier_already_applied) {
146 clear_sticky_modifiers();
148 add_sticky_modifier(keycode);
151 update_underglow_level();
154 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
157 if (record->event.pressed) {
159 PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
161 persistent_default_layer_set(1UL<<_QWERTY);
166 handle_sticky_modifier_event(KC_LSFT, record->event.pressed);
170 handle_sticky_modifier_event(KC_LCTL, record->event.pressed);
174 handle_sticky_modifier_event(KC_LALT, record->event.pressed);
178 handle_sticky_modifier_event(KC_LGUI, record->event.pressed);
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);
188 if (record->event.pressed) {
189 clear_sticky_modifiers();
194 if (record->event.pressed && rgb_dimming < 8) {
200 if (record->event.pressed && rgb_dimming > 0) {
206 if (!record->event.pressed && IS_KEY(keycode)) {
207 modifier_already_applied = true;
208 if (physically_held_modifiers == 0)
209 clear_sticky_modifiers();
214 void matrix_init_user(void) {
215 #ifdef RGBLIGHT_ENABLE
217 #endif //RGBLIGHT_ENABLE
220 void matrix_scan_user(void) {
221 #ifdef RGBLIGHT_ENABLE
222 update_underglow_level();
223 #endif //RGBLIGHT_ENABLE