feat: expose persistent effect lifecycle, wakeup, fade-delay, idle hooks

Core API additions for full parity with darknao fork behaviors:

- ZMK_RGB_EFFECT_PERSISTENT flag: effect persists across RGB on/off
- on_idle(bool awake) callback: effect controls sleep/wake behavior
- is_active() callback: get_state returns on || effect->is_active()
- zmk_rgb_request_refresh_wakeup(bool): conditional wake from sleep
- zmk_rgb_set_tick_delay(int): delayed tick restart for fade-delay
- zmk_rgb_is_on(): exposed state query for modules
- state.layer_enabled restored: persistent effects survive RGB toggle
- auto_state delegates to on_idle for effects that implement it
- select_effect sets layer_enabled for PERSISTENT effects
- transient_off no longer calls on_deselect (only true deselect does)
This commit is contained in:
afiqzudinhadi 2026-07-01 15:16:52 +08:00
parent 8f3c4d3929
commit a36c7f26f8
2 changed files with 86 additions and 14 deletions

View file

@ -19,28 +19,39 @@ struct zmk_rgb_effect_ctx {
typedef void (*zmk_rgb_effect_render_fn)(struct zmk_rgb_effect_ctx *ctx);
typedef void (*zmk_rgb_effect_event_fn)(void);
typedef void (*zmk_rgb_effect_idle_fn)(bool awake);
typedef bool (*zmk_rgb_effect_is_active_fn)(void);
#define ZMK_RGB_EFFECT_STATIC BIT(0)
#define ZMK_RGB_EFFECT_PERSISTENT BIT(1)
struct zmk_rgb_effect {
const char *name;
zmk_rgb_effect_render_fn render;
zmk_rgb_effect_event_fn on_select;
zmk_rgb_effect_event_fn on_deselect;
zmk_rgb_effect_idle_fn on_idle;
zmk_rgb_effect_is_active_fn is_active;
uint8_t flags;
};
#define ZMK_RGB_EFFECT_DEFINE(_sym, _name_str, _render, _flags, _on_select, _on_deselect) \
#define ZMK_RGB_EFFECT_DEFINE(_sym, _name_str, _render, _flags, _on_select, _on_deselect, \
_on_idle, _is_active) \
STRUCT_SECTION_ITERABLE(zmk_rgb_effect, _sym) = { \
.name = _name_str, \
.render = _render, \
.flags = _flags, \
.on_select = _on_select, \
.on_deselect = _on_deselect, \
.on_idle = _on_idle, \
.is_active = _is_active, \
}
void zmk_rgb_request_refresh(void);
void zmk_rgb_request_refresh_wakeup(bool wakeup);
int zmk_rgb_effect_get_count(void);
bool zmk_rgb_is_on(void);
void zmk_rgb_set_tick_delay(int delay_seconds);
struct led_rgb zmk_rgb_hsb_to_rgb(struct zmk_led_hsb hsb);
struct zmk_led_hsb zmk_rgb_hsb_scale_min_max(struct zmk_led_hsb hsb);