Skip to content

Commit b06d9d8

Browse files
committed
Merge remote-tracking branch 'origin/master' into develop
2 parents 4fc9614 + 3f33362 commit b06d9d8

File tree

14 files changed

+800
-0
lines changed

14 files changed

+800
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/* Copyright 2021 @ Mike Killewald
2+
*
3+
* This program is free software: you can redistribute it and/or modify
4+
* it under the terms of the GNU General Public License as published by
5+
* the Free Software Foundation, either version 2 of the License, or
6+
* (at your option) any later version.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License
14+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
#pragma once
18+
19+
#ifdef RGB_MATRIX_ENABLE
20+
# define RGB_DISABLE_WHEN_USB_SUSPENDED
21+
# define CAPS_LOCK_INDICATOR_COLOR RGB_RED
22+
# define FN_LAYER_COLOR RGB_ORANGE
23+
#endif
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
/* Copyright 2021 @ Mike Killewald
2+
*
3+
* This program is free software: you can redistribute it and/or modify
4+
* it under the terms of the GNU General Public License as published by
5+
* the Free Software Foundation, either version 2 of the License, or
6+
* (at your option) any later version.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License
14+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
#include QMK_KEYBOARD_H
18+
#include "keymap_user.h"
19+
#ifdef RGB_MATRIX_ENABLE
20+
# include "rgb_matrix_user.h"
21+
#endif
22+
23+
// clang-format off
24+
25+
typedef union {
26+
uint32_t raw;
27+
struct {
28+
bool caps_lock_light_tab :1;
29+
bool caps_lock_light_alphas :1;
30+
bool fn_layer_transparent_keys_off :1;
31+
bool fn_layer_color_enable :1;
32+
};
33+
} user_config_t;
34+
35+
user_config_t user_config;
36+
37+
enum custom_keycodes {
38+
#ifdef VIA_ENABLE
39+
KC_MISSION_CONTROL = USER00,
40+
#else
41+
KC_MISSION_CONTROL = SAFE_RANGE,
42+
#endif
43+
KC_LAUNCHPAD,
44+
KC_LIGHT_TAB_TOGGLE,
45+
KC_LIGHT_ALPHAS_TOGGLE,
46+
KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE,
47+
KC_FN_LAYER_COLOR_TOGGLE
48+
};
49+
50+
#define KC_MCTL KC_MISSION_CONTROL
51+
#define KC_LPAD KC_LAUNCHPAD
52+
#define KC_LTTOG KC_LIGHT_TAB_TOGGLE
53+
#define KC_LATOG KC_LIGHT_ALPHAS_TOGGLE
54+
#define KC_TKTOG KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE
55+
#define KC_FCTOG KC_FN_LAYER_COLOR_TOGGLE
56+
#define KC_TASK LGUI(KC_TAB)
57+
#define KC_FLXP LGUI(KC_E)
58+
59+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
60+
61+
[MAC_BASE] = LAYOUT_ansi_82(
62+
KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS,
63+
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
64+
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
65+
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
66+
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
67+
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
68+
69+
[MAC_FN] = LAYOUT_ansi_82(
70+
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
71+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
72+
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
73+
KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
74+
KC_TRNS, KC_LTTOG, KC_LATOG, KC_TKTOG, KC_FCTOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
75+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
76+
77+
[WIN_BASE] = LAYOUT_ansi_82(
78+
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS,
79+
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP,
80+
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN,
81+
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
82+
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
83+
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
84+
85+
[WIN_FN] = LAYOUT_ansi_82(
86+
KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS,
87+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
88+
RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
89+
KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
90+
KC_TRNS, KC_LTTOG, KC_LATOG, KC_TKTOG, KC_FCTOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
91+
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
92+
93+
};
94+
95+
// clang-format on
96+
97+
void matrix_init_user(void) {
98+
#ifdef RGB_MATRIX_ENABLE
99+
rgb_matrix_init_user();
100+
#endif
101+
}
102+
103+
void keyboard_post_init_user(void) {
104+
user_config.raw = eeconfig_read_user();
105+
}
106+
107+
void eeconfig_init_user(void) {
108+
user_config.raw = 0;
109+
user_config.caps_lock_light_tab = false;
110+
user_config.caps_lock_light_alphas = false;
111+
user_config.fn_layer_transparent_keys_off = true;
112+
user_config.fn_layer_color_enable = false;
113+
eeconfig_update_user(user_config.raw);
114+
}
115+
116+
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
117+
switch (keycode) {
118+
case KC_MISSION_CONTROL:
119+
if (record->event.pressed) {
120+
host_consumer_send(0x29F);
121+
} else {
122+
host_consumer_send(0);
123+
}
124+
return false; // Skip all further processing of this key
125+
case KC_LAUNCHPAD:
126+
if (record->event.pressed) {
127+
host_consumer_send(0x2A0);
128+
} else {
129+
host_consumer_send(0);
130+
}
131+
return false; // Skip all further processing of this key
132+
case KC_LIGHT_TAB_TOGGLE:
133+
if (record->event.pressed) {
134+
user_config.caps_lock_light_tab ^= 1; // bitwise xor to toggle status bit
135+
eeconfig_update_user(user_config.raw);
136+
}
137+
return false; // Skip all further processing of this key
138+
case KC_LIGHT_ALPHAS_TOGGLE:
139+
if (record->event.pressed) {
140+
user_config.caps_lock_light_alphas ^= 1;
141+
eeconfig_update_user(user_config.raw);
142+
}
143+
return false; // Skip all further processing of this key
144+
case KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE:
145+
if (record->event.pressed) {
146+
user_config.fn_layer_transparent_keys_off ^= 1;
147+
eeconfig_update_user(user_config.raw);
148+
}
149+
return false; // Skip all further processing of this key
150+
case KC_FN_LAYER_COLOR_TOGGLE:
151+
if (record->event.pressed) {
152+
user_config.fn_layer_color_enable ^= 1;
153+
eeconfig_update_user(user_config.raw);
154+
}
155+
return false; // Skip all further processing of this key
156+
default:
157+
return true; // Process all other keycodes normally
158+
}
159+
}
160+
161+
bool get_caps_lock_light_tab(void) {
162+
return user_config.caps_lock_light_tab;
163+
}
164+
165+
bool get_caps_lock_light_alphas(void) {
166+
return user_config.caps_lock_light_alphas;
167+
}
168+
169+
bool get_fn_layer_transparent_keys_off(void) {
170+
return user_config.fn_layer_transparent_keys_off;
171+
}
172+
173+
bool get_fn_layer_color_enable(void) {
174+
return user_config.fn_layer_color_enable;
175+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* Copyright 2021 @ Mike Killewald
2+
*
3+
* This program is free software: you can redistribute it and/or modify
4+
* it under the terms of the GNU General Public License as published by
5+
* the Free Software Foundation, either version 2 of the License, or
6+
* (at your option) any later version.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License
14+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
#pragma once
18+
19+
// clang-format off
20+
21+
enum layers {
22+
MAC_BASE,
23+
MAC_FN,
24+
WIN_BASE,
25+
WIN_FN
26+
};
27+
28+
// clang-format on
29+
30+
bool get_caps_lock_light_tab(void);
31+
bool get_caps_lock_light_alphas(void);
32+
bool get_fn_layer_transparent_keys_off(void);
33+
bool get_fn_layer_color_enable(void);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
## mkillewald's Keychron Q1 keymap (ANSI rev_0100) v1.0.4
2+
3+
This keymap builds on the keymap by Grayson Carr (gtg465x) but adds a couple options.
4+
5+
## Features:
6+
- On macOS, F3 opens Mission Control and F4 opens Launchpad without needing to configure shortcuts in System Preferences
7+
- RGB lighting turns off when the computer sleeps
8+
- Caps Lock RGB indicator
9+
- the Caps Lock key will light when Caps Lock is enabled with the following options:
10+
- #define CAPS_LOCK_INDICATOR_COLOR [color] in config.h to set the backlight color used for the indicator when Caps Lock is enabled (default: red)
11+
- Fn+Z will toggle lighting the TAB key when Caps Lock is enabled. This is useful with non backlit keycaps/legends. (default: off)
12+
- Fn+X will toggle lighting all the alpha keys when Caps Lock is enabled. (default: off)
13+
14+
- Dynamic Fn layer RGB indicator
15+
- When the Fn key is held down, any keys defined on the Fn layer in this firmware or in VIA will be highlighted with the following options:
16+
- #define FN_LAYER_COLOR [color] in config.h to set a static color for defined keys (default: orange)
17+
- Fn+C will toggle turning off RGB for keys with no definition (default: RGB off)
18+
- Fn+V will toggle lighting the defined Fn layer keys with the static color set with FN_LAYER_COLOR (default: static color off)
19+
20+
- All custom keycodes can be moved to different keys in VIA by using the ANY key with the following keycodes:
21+
- USER00 (default: F3) macOS Mission Control
22+
- USER01 (default: F4) macOS Launchpad
23+
- USER02 (default: Fn+Z) Caps Lock light Tab toggle
24+
- USER03 (default: Fn+X) Caps Lock light alphas toggle
25+
- USER04 (default: Fn+C) Fn layer non-defined keys RGB toggle
26+
- USER05 (default: Fn+V) Fn layer defined keys static color toggle
27+
28+
RGB must be toggled on for all indicators to function. If you do not want an RGB mode active but still want the indicators, toggle RGB on and turn the brightness all the way off. The indicators will remain at full brightness.
29+
30+
Please make sure to save any customizations you have made in VIA to a .json file before flashing the firmware. Sometimes it has been necessary to re-apply those changes in VIA after flashing the firmware. If that is the case, you will most likely need to manually add the USER00 through USER05 custom keycodes after loading your customizations from the saved .json file. Then re-save a new .json file which will have your previous customizations and the custom keycodes for future use as needed.
31+
32+
#### USE AT YOUR OWN RISK
33+
34+
## Changelog:
35+
36+
v1.0.4 October 9, 2021
37+
- Caps Lock and Fn layer toggles are now stored in eeprom so settings will remain when Q1 is unplugged
38+
39+
v1.0.3 October 8, 2021
40+
- now using keycode toggles instead of preprocessor directive to set the various Caps Lock and Fn Layer RGB lighting options. This allows for setting the options from user space without having to recompile.
41+
42+
v1.0.2 October 7, 2021
43+
- adapted Grayson Carr's (gtg465x) Caps Lock alphas and dynamic Fn layer RGB routines
44+
- added CAPS_LOCK_INDICATOR_LIGHT_TAB config option to enable/disable lighting Tab with Caps Lock indicator
45+
- added FN_LAYER_COLOR config option to set FN layer static color
46+
47+
v1.0.1 October 7, 2021
48+
- Mission Control and Launchpad custom keycodes are now defined using the VIA user keycodes range so thay can be labeled properly in VIA (adopted change from gtg465x)
49+
50+
v1.0.0 September 30, 2021
51+
- Initial release built upon keymap by Grayson Carr (gtg465x)
52+
- defined Mission Control (F3) and Launchpad (F4) keycodes for macOs
53+
- RGB backlight turns off when computer sleeps
54+
- added Caps Lock indicator lighting both the Caps Lock and Tab LEDs for better effect on non-backlit keycaps
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/* Copyright 2021 @ Mike Killewald
2+
*
3+
* This program is free software: you can redistribute it and/or modify
4+
* it under the terms of the GNU General Public License as published by
5+
* the Free Software Foundation, either version 2 of the License, or
6+
* (at your option) any later version.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License
14+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
#include QMK_KEYBOARD_H
18+
#include "rgb_matrix_user.h"
19+
#include "keymap_user.h"
20+
21+
keypos_t led_index_key_position[DRIVER_LED_TOTAL];
22+
23+
void rgb_matrix_init_user(void) {
24+
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
25+
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
26+
uint8_t led_index = g_led_config.matrix_co[row][col];
27+
if (led_index != NO_LED) {
28+
led_index_key_position[led_index] = (keypos_t){.row = row, .col = col};
29+
}
30+
}
31+
}
32+
}
33+
34+
void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
35+
uint8_t current_layer = get_highest_layer(layer_state);
36+
switch (current_layer) {
37+
case MAC_BASE:
38+
case WIN_BASE:
39+
#ifdef CAPS_LOCK_INDICATOR_COLOR
40+
if (host_keyboard_led_state().caps_lock) {
41+
rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_caps_lock_indicator, CAPS_LOCK_INDICATOR_COLOR);
42+
}
43+
#endif
44+
break;
45+
case MAC_FN:
46+
case WIN_FN:
47+
#ifdef FN_LAYER_COLOR
48+
if (get_fn_layer_color_enable()) {
49+
rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, FN_LAYER_COLOR);
50+
}
51+
#endif
52+
if (get_fn_layer_transparent_keys_off()) {
53+
rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_transparent, RGB_OFF);
54+
}
55+
break;
56+
}
57+
}
58+
59+
void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue) {
60+
for (uint8_t i = led_min; i < led_max; i++) {
61+
uint16_t keycode = keymap_key_to_keycode(layer, led_index_key_position[i]);
62+
if ((*is_keycode)(keycode)) {
63+
rgb_matrix_set_color(i, red, green, blue);
64+
}
65+
}
66+
}
67+
68+
bool is_caps_lock_indicator(uint16_t keycode) {
69+
bool indicator = keycode == KC_CAPS;
70+
71+
if (get_caps_lock_light_tab()) {
72+
indicator = keycode == KC_TAB || keycode == KC_CAPS;
73+
}
74+
75+
if (get_caps_lock_light_alphas()) {
76+
return (KC_A <= keycode && keycode <= KC_Z) || indicator;
77+
} else {
78+
return indicator;
79+
}
80+
}
81+
82+
bool is_transparent(uint16_t keycode) { return keycode == KC_TRNS; }
83+
bool is_not_transparent(uint16_t keycode) { return keycode != KC_TRNS; }

0 commit comments

Comments
 (0)