maybe having two issues in one post is confusing, but ive been having 2 issues i cant figure out with custom qmk firmware on the macropad. i didnt like how via didnt allow custom lighting especially depending on the layer, so i cloned the framework qmk github repo and added a custom layout. either way eventually got it working.
first issue however, every time i boot i get the below warning that the macro pads firmware is out of date. turns out the github repo is stuck on 2.9.0 when it should be 3.0.0, i could manually change it in info.json but not sure if thats a good idea.
either way with the more confusing problem i have absolutely no idea why it happens. for some reason, when pressing the row 2 column one button while on the MEDIA layer (set to RGB_CM1) it does change the rgb mode as it should, but it also inputs win+P??? i havent been able to find anything related to why this would happen. it happens both on windows and linux, and i cant find anything in the code even mentioning that shortcut its pressing. i just dont even know where to look on how to fix that, i sent my custom keymap.c file (still work in progress) below, any help would be seriously appreciated. currently i could just disable whenever pressing win+p for that keyboard with keyd or something, but id much rather find an actual solution that doesnt make this happen at all.
fw16_qmk_firmware/keyboards/framework/macropad/keymaps/custom/keymap.c
// Copyright 2022 Framework Computer
// SPDX-License-Identifier: GPL-2.0-or-later
// Custom keymap with per-key, per-layer RGB lighting
#include QMK_KEYBOARD_H
// Define custom lighting modes
enum custom_lighting_modes {
LIGHTING_CUSTOM_COLORS, // mode 1: Full custom per-key colors
LIGHTING_MINIMAL, // mode 2: Only layer indicators lit
LIGHTING_DEFAULT_EFFECTS // mode 3: Use QMK's built-in RGB effects
};
// Variable to track current lighting mode
static uint8_t current_lighting_mode = LIGHTING_CUSTOM_COLORS;
// Custom keycodes
enum custom_keycodes {
RGB_CM1 = SAFE_RANGE, // switch to custom colors mode
RGB_CM2, // switch to minimal mode
RGB_CM3, // switch to default effects mode
ALT_VOLU, // Alt + Volume Up, for spotify specifically
ALT_VOLD, // Alt + Volume Down
};
// Define your layers
enum layers {
_BASE, // Layer 0: Base layer
_FUNCTION, // Layer 1: function keys
_MEDIA, // Layer 2: Media controls
};
// Define the keymap - customize these to your needs
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* BASE LAYER - General purpose keys
* ββββββ¬βββββ¬βββββ¬βββββ
* Row 1 βlbseβlfncβlmedβ f24β
* ββββββΌβββββΌβββββΌβββββ€
* Row 2 βhomeβ β βend βpgupβ
* ββββββΌβββββΌβββββΌβββββ€
* Row 3 β β β β β β βpgdnβ
* ββββββΌβββββΌβββββΌβββββ€
* Row 4 β 7 β 8 β 9 β 0 β
* ββββββΌβββββΌβββββΌβββββ€
* Row 5 β 4 β 5 β 6 β . β
* ββββββΌβββββΌβββββΌβββββ€
* Row 6 β 1 β 2 β 3 β β² β
* ββββββ΄βββββ΄βββββ΄βββββ
*/
[_BASE] = LAYOUT(
TO(_BASE),TO(_FUNCTION),TO(_MEDIA),KC_F24,
KC_HOME,KC_UP ,KC_END ,KC_PGUP,
KC_LEFT,KC_DOWN,KC_RIGHT,KC_PGDN,
KC_7 ,KC_8 ,KC_9 ,KC_0,
KC_4 ,KC_5 ,KC_6 ,KC_PDOT,
KC_1 ,KC_2 ,KC_3 ,KC_PENT
),
/*
* FUNCTION LAYER
* ββββββ¬βββββ¬βββββ¬βββββ
* Row 1 β ^ β ^ β ^ β f21β
* ββββββΌβββββΌβββββΌβββββ€
* Row 2 β f1 β f2 β f3 β f4 β
* ββββββΌβββββΌβββββΌβββββ€
* Row 3 β f5 β f6 β f7 β f8 β
* ββββββΌβββββΌβββββΌβββββ€
* Row 4 β f9 β f10β f11β f12β
* ββββββΌβββββΌβββββΌβββββ€
* Row 5 β f13β f14β f15β f16β
* ββββββΌβββββΌβββββΌβββββ€
* Row 6 β f17β f18β f19β f20β
* ββββββ΄βββββ΄βββββ΄βββββ
*/
[_FUNCTION] = LAYOUT(
_______, _______, _______, KC_F21,
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_F13 , KC_F14 , KC_F15 , KC_F16,
KC_F17 , KC_F18 , KC_F19 , KC_F20
),
/*
* MEDIA LAYER
* ββββββ¬βββββ¬βββββ¬βββββ
* Row 1 β ^ β ^ β ^ βrgbTβ
* ββββββΌβββββΌβββββΌβββββ€
* Row 2 βrgb1βRGB2βRGB3βRGB β
* β β β βspd+β
* ββββββΌβββββΌβββββΌβββββ€
* Row 3 βRGB βRGB βRGB βRRB β
* βnextβprevβhue+βspd-β
* ββββββΌβββββΌβββββΌβββββ€
* Row 4 βRGB+βbrt+βalt,βVol+β
* βbrt β βvol+β β
* ββββββΌβββββΌβββββΌβββββ€
* Row 5 βRGB-βbrt-βavl-βvol-β
* ββββββΌβββββΌβββββΌβββββ€
* Row 6 βprevβpausβnextβMuteβ
* ββββββ΄βββββ΄βββββ΄βββββ
*/
[_MEDIA] = LAYOUT(
_______, _______ , _______ , RGB_TOG,
RGB_CM1, RGB_CM2 , RGB_CM3 , RGB_SPI,
RGB_MOD, RGB_RMOD, RGB_HUI , RGB_SPD,
RGB_VAI, KC_BRIU , ALT_VOLU, KC_VOLU,
RGB_VAD, KC_BRID , ALT_VOLD, KC_VOLD,
KC_MPRV, KC_MPLY , KC_MNXT , KC_MUTE
),
};
// ============================================================================
// CUSTOM KEYCODE HANDLING
// ============================================================================
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case RGB_CM1:
if (record->event.pressed) {
current_lighting_mode = LIGHTING_CUSTOM_COLORS;
}
return false;
case RGB_CM2:
if (record->event.pressed) {
current_lighting_mode = LIGHTING_MINIMAL;
}
return false;
case RGB_CM3:
if (record->event.pressed) {
current_lighting_mode = LIGHTING_DEFAULT_EFFECTS;
rgb_matrix_enable_noeeprom();
rgb_matrix_mode_noeeprom(RGB_MATRIX_CYCLE_LEFT_RIGHT);
}
return false;
case ALT_VOLU:
if (record->event.pressed) {
register_code(KC_LALT);
tap_code(KC_VOLU);
unregister_code(KC_LALT);
}
return false;
case ALT_VOLD:
if (record->event.pressed) {
register_code(KC_LALT);
tap_code(KC_VOLD);
unregister_code(KC_LALT);
}
return false;
}
return true;
}
// ============================================================================
// RGB LIGHTING CONFIGURATION
// ============================================================================
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// If we're in default effects mode, don't override - let QMK effects run
if (current_lighting_mode == LIGHTING_DEFAULT_EFFECTS) {
return false;
}
// Get current layer
uint8_t layer = get_highest_layer(layer_state);
// Get current RGB color settings
uint8_t current_hue = rgb_matrix_get_hue();
uint8_t current_sat = rgb_matrix_get_sat();
uint8_t current_val = rgb_matrix_get_val();
RGB active_color = hsv_to_rgb((HSV){current_hue, current_sat, current_val});
RGB dim_color = hsv_to_rgb((HSV){current_hue, current_sat, current_val / 4});
// Define your color palette - these will scale with brightness
// Format: HSV (Hue 0-255, Saturation 0-255, Value uses current brightness)
RGB red = hsv_to_rgb((HSV){0, 255, current_val}); // Red
RGB pink = hsv_to_rgb((HSV){222, 175, current_val}); // Pink
RGB light_blue = hsv_to_rgb((HSV){147, 190, current_val}); // Light blue
RGB dark_blue = hsv_to_rgb((HSV){149, 190, current_val}); // Darker light blue
RGB lavender = hsv_to_rgb((HSV){195, 201, current_val}); // Lavender
RGB dark_purple = hsv_to_rgb((HSV){189, 255, current_val}); // Dark purple
RGB light_green = hsv_to_rgb((HSV){81, 230, current_val}); // Light green
RGB orange = hsv_to_rgb((HSV){35, 255, current_val}); // Orange
RGB dark_orange = hsv_to_rgb((HSV){30, 255, current_val}); // Dark orange
//RGB white = hsv_to_rgb((HSV){0, 0, current_val}); // White background
// set background for all keys based on mode
if (current_lighting_mode == LIGHTING_MINIMAL) {
// Minimal mode: Everything off by default
for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
rgb_matrix_set_color(i, 0, 0, 0);
}
} else {
// custom colors mode, white bacscaled to 10% of current brightness)
RGB dim_white = hsv_to_rgb((HSV){0, 0, current_val / 10});
for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; i++) {
rgb_matrix_set_color(i, dim_white.r, dim_white.g, dim_white.b);
}
}
// set active layer keys
switch(layer) {
case _BASE:
rgb_matrix_set_color(5, active_color.r, active_color.g, active_color.b); // Row 1 Col 1 - Active
rgb_matrix_set_color(2, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 2 - Inactive
rgb_matrix_set_color(22, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 3 - Inactive
break;
case _FUNCTION:
rgb_matrix_set_color(5, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 1
rgb_matrix_set_color(2, active_color.r, active_color.g, active_color.b); // Row 1 Col 2 - Active
rgb_matrix_set_color(22, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 3
break;
case _MEDIA:
rgb_matrix_set_color(5, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 1
rgb_matrix_set_color(2, dim_color.r, dim_color.g, dim_color.b); // Row 1 Col 2
rgb_matrix_set_color(22, active_color.r, active_color.g, active_color.b); // Row 1 Col 3 - Active
break;
}
// If on MEDIA layer, set RGB mode indicator buttons
if (layer == _MEDIA) {
if (current_lighting_mode == LIGHTING_CUSTOM_COLORS) {
rgb_matrix_set_color(4, active_color.r, active_color.g, active_color.b); // RGB1 active
rgb_matrix_set_color(0, dim_color.r, dim_color.g, dim_color.b); // Inactive
rgb_matrix_set_color(20, dim_color.r, dim_color.g, dim_color.b); // Inactive
} else if (current_lighting_mode == LIGHTING_MINIMAL) {
rgb_matrix_set_color(4, dim_color.r, dim_color.g, dim_color.b); // Inactive
rgb_matrix_set_color(0, active_color.r, active_color.g, active_color.b); // RGB2 active
rgb_matrix_set_color(20, dim_color.r, dim_color.g, dim_color.b); // Inactive
} else if (current_lighting_mode == LIGHTING_DEFAULT_EFFECTS) {
rgb_matrix_set_color(4, dim_color.r, dim_color.g, dim_color.b); // Inactive
rgb_matrix_set_color(0, dim_color.r, dim_color.g, dim_color.b); // Inactive
rgb_matrix_set_color(20, active_color.r, active_color.g, active_color.b); // RGB3 active
}
}
// if minimal mode, end here
if (current_lighting_mode == LIGHTING_MINIMAL) {
return false;
}
// Step 5: Custom colors mode - set all other keys per layer
// LED mapping:
// Row 1: 5, 2, 22, 17
// Row 2: 4, 0, 20, 18
// Row 3: 7, 1, 21, 16
// Row 4: 6, 3, 23, 19
// Row 5: 9, 11, 15, 13
// Row 6: 8, 10, 14, 12
switch(layer) {
case _BASE:
// Row 1: Layer switches already set, set F24
rgb_matrix_set_color(17, red.r, red.g, red.b);
// Row 2: Navigation
rgb_matrix_set_color(4, light_blue.r, light_blue.g, light_blue.b);
rgb_matrix_set_color(0, pink.r, pink.g, pink.b);
rgb_matrix_set_color(20, light_blue.r, light_blue.g, light_blue.b);
rgb_matrix_set_color(18, dark_blue.r, dark_blue.g, dark_blue.b);
// Row 3: Arrows
rgb_matrix_set_color(7, pink.r, pink.g, pink.b);
rgb_matrix_set_color(1, pink.r, pink.g, pink.b);
rgb_matrix_set_color(21, pink.r, pink.g, pink.b);
rgb_matrix_set_color(16, dark_blue.r, dark_blue.g, dark_blue.b);
// Row 4: Numbers 7-0
rgb_matrix_set_color(6, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(3, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(23, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(19, dark_purple.r, dark_purple.g, dark_purple.b);
// Row 5: Numbers 4-6 and dot
rgb_matrix_set_color(9, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(11, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(15, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(13, red.r, red.g, red.b);
// Row 6: Numbers 1-3 and enter
rgb_matrix_set_color(8, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(10, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(14, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(12, light_green.r, light_green.g, light_green.b);
break;
case _FUNCTION:
// Row 1: Layer switches already set, set F21
rgb_matrix_set_color(17, dark_purple.r, dark_purple.g, dark_purple.b);
// Row 2: F1-F4
rgb_matrix_set_color(4, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(0, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(20, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(18, lavender.r, lavender.g, lavender.b);
// Row 3: F5-F8
rgb_matrix_set_color(7, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(1, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(21, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(16, lavender.r, lavender.g, lavender.b);
// Row 4: F9-F12
rgb_matrix_set_color(6, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(3, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(23, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(19, lavender.r, lavender.g, lavender.b);
// Row 5: F13-F16
rgb_matrix_set_color(9, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(11, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(15, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(13, dark_purple.r, dark_purple.g, dark_purple.b);
// Row 6: F17-F20
rgb_matrix_set_color(8, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(10, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(14, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(12, dark_purple.r, dark_purple.g, dark_purple.b);
break;
case _MEDIA:
// Row 1: Layer switches already set, RGB Toggle
rgb_matrix_set_color(17, red.r, red.g, red.b);
// Row 2: RGB mode buttons already set above, RGB Speed+
rgb_matrix_set_color(18, pink.r, pink.g, pink.b);
// Row 3: RGB controls
rgb_matrix_set_color(7, pink.r, pink.g, pink.b);
rgb_matrix_set_color(1, pink.r, pink.g, pink.b);
rgb_matrix_set_color(21, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(16, pink.r, pink.g, pink.b);
// Row 4: Brightness and volume
rgb_matrix_set_color(6, lavender.r, lavender.g, lavender.b);
rgb_matrix_set_color(3, orange.r, orange.g, orange.b);
rgb_matrix_set_color(23, active_color.r, active_color.g, active_color.b);
rgb_matrix_set_color(19, light_green.r, light_green.g, light_green.b);
// Row 5: Brightness and volume
rgb_matrix_set_color(9, dark_purple.r, dark_purple.g, dark_purple.b);
rgb_matrix_set_color(11, dark_orange.r, dark_orange.g, dark_orange.b);
rgb_matrix_set_color(15, active_color.r, active_color.g, active_color.b);
rgb_matrix_set_color(13, light_green.r, light_green.g, light_green.b);
// Row 6: Media controls
rgb_matrix_set_color(8, light_blue.r, light_blue.g, light_blue.b);
rgb_matrix_set_color(10, light_blue.r, light_blue.g, light_blue.b);
rgb_matrix_set_color(14, light_blue.r, light_blue.g, light_blue.b);
rgb_matrix_set_color(12, red.r, red.g, red.b);
break;
}
return false;
}
