Add keybind to change RGB effect

This commit is contained in:
2026-03-15 21:17:06 -07:00
parent c15c7a0fcd
commit 025d33b739
3 changed files with 68 additions and 4 deletions

42
keymaps/custom/config.h Normal file
View File

@@ -0,0 +1,42 @@
#pragma once
// Enable framebuffer effects (typing heatmap, digital rain)
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
// Standard effects (no additional defines needed)
#define ENABLE_RGB_MATRIX_ALPHAS_MODS
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_BREATHING
#define ENABLE_RGB_MATRIX_BAND_SAT
#define ENABLE_RGB_MATRIX_BAND_VAL
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
#define ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
#define ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
#define ENABLE_RGB_MATRIX_DUAL_BEACON
#define ENABLE_RGB_MATRIX_RAINBOW_BEACON
#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
#define ENABLE_RGB_MATRIX_HUE_BREATHING
#define ENABLE_RGB_MATRIX_HUE_PENDULUM
#define ENABLE_RGB_MATRIX_HUE_WAVE
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL
#define ENABLE_RGB_MATRIX_PIXEL_FLOW
#define ENABLE_RGB_MATRIX_PIXEL_RAIN
// Framebuffer effects (require RGB_MATRIX_FRAMEBUFFER_EFFECTS)
#define ENABLE_RGB_MATRIX_TYPING_HEATMAP
#define ENABLE_RGB_MATRIX_DIGITAL_RAIN
// Reactive effects (require RGB_MATRIX_KEYPRESSES, already enabled in board config)
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
#define ENABLE_RGB_MATRIX_SOLID_SPLASH
#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH

View File

@@ -3,8 +3,13 @@
#include "dynamic_keymap.h"
#include "os_mode.h"
// System76 per-layer RGB state (defined in system76_ec.c, declared in launch_3.c)
extern rgb_config_t layer_rgb[];
void system76_ec_rgb_eeprom(bool write);
enum custom_keycodes {
CK_OSMODE = SAFE_RANGE, // cycle OS mode
CK_RGBMOD, // cycle RGB animation
};
typedef struct {
@@ -100,8 +105,8 @@ ________________________________________________________________________________
| PRINT | | | | | | | | | | | | | || |
| SCREEN | MUTE | VOL DN | VOL UP | | | | | | | | | | OS MODE || |
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
| | PLAY/ | | | | | | | | | LED | LED | LED | || |
| | PAUSE | PREV | NEXT | | | | | | | TOGGLE | DOWN | UP | || |
| | PLAY/ | | | | | | | | | LED | LED | LED | LED || |
| | PAUSE | PREV | NEXT | | | | | | | TOGGLE | DOWN | UP | MODE || |
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
| | | | | | | | | | | | | | || |
| | | | | | | | | | | | | | || |
@@ -119,7 +124,7 @@ ________________________________________________________________________________
[1] = LAYOUT(
KC_PSCR, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CK_OSMODE, KC_NO,
KC_NO, KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_TOG, RGB_VAD, RGB_VAI, KC_NO, KC_NO,
KC_NO, KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_TOG, RGB_VAD, RGB_VAI, CK_RGBMOD, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP,
@@ -172,6 +177,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return false;
}
// Cycle RGB animation (FN+Backspace)
// Must update layer_rgb for all layers because system76_ec_rgb_layer()
// resets rgb_matrix_config from layer_rgb on every layer change.
if (keycode == CK_RGBMOD) {
if (record->event.pressed) {
uint8_t mode = layer_rgb[0].mode + 1;
if (mode >= RGB_MATRIX_EFFECT_MAX) mode = 1;
layer_rgb[0].mode = mode;
rgb_matrix_mode_noeeprom(mode);
system76_ec_rgb_eeprom(true);
}
return false;
}
// No rewrites in none mode
if (os_mode == OS_MODE_NONE) return true;

View File

@@ -4,6 +4,9 @@
#include "os_mode.h"
// System76 per-layer RGB state (no header available)
void system76_ec_rgb_layer(layer_state_t layer_state);
os_mode_t os_mode = OS_MODE_NONE;
bool os_mode_manual = false;
static bool os_detected = false;
@@ -45,6 +48,6 @@ void matrix_scan_user(void) {
// Restore default RGB animation after 500ms indicator flash
if (flash_start && timer_elapsed32(flash_start) > 500) {
flash_start = 0;
rgb_matrix_reload_from_eeprom();
system76_ec_rgb_layer(layer_state);
}
}