Bios upset about custom macropad firmware, qmk buggy

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;
}

Use the fl16-2025 branch.

alr yeah i also just figured out the other issue i was having, it was from the β€œSAFE_RANGE” bit (i had to add +3 after that), but ill use that branch now so that warning on boot will go away.

I know already discovered that you should start your custom_keycodes at SAFE_RANGE +3 to fix the issue. But you didn’t mention the why.

For the benefit of anyone else who runs into this, it’s just that the default Framework firmware is already using the first 3 slots for their own custom_keycodes.

Located in keyboards/framework/framework.h

Then what KC_SCRN does is defined in /keyboards/framework/framework.c

By assigning RGB_CM1 to the start of SAFE_RANGE you assigned it overtop of KC_SCRN. You gave the key two functions, so pressing the key preformed both.

In my opinion, starting your custom_keycodes at SAFE_RANGE +3 is the best way to fix it. It will be easier to merge in any changes from new releases of the official Framework firmware, should there be improvements in the future you wish to get.

2 Likes