From 83e55164f4f1bbb721c56f2927d8987807bbf29a Mon Sep 17 00:00:00 2001 From: Christian Soffke Date: Sat, 2 May 2026 14:19:29 +0200 Subject: [PATCH] gui: remove SBS lock/unlock redraw lag Stop the lock indicators on the SBS from lagging behind their actual state when lock notifications are disabled. Request immediate skin update in button loop, so the device doesn't feel laggy. Change-Id: I42955f65d9ad4ca9196549d806538d1badb5f79d --- apps/action.c | 20 +++++++++++--------- apps/gui/skin_engine/skin_engine.c | 15 ++++++++++++++- apps/gui/skin_engine/skin_engine.h | 1 + apps/gui/statusbar-skinned.c | 5 +++++ apps/gui/statusbar-skinned.h | 1 + firmware/backlight.c | 4 ++++ 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/apps/action.c b/apps/action.c index bd52e8177a..34af7f30a1 100644 --- a/apps/action.c +++ b/apps/action.c @@ -28,6 +28,7 @@ #if !defined(BOOTLOADER) #include "language.h" +#include "skin_engine/skin_engine.h" #endif #include "appevents.h" @@ -937,19 +938,20 @@ static inline void do_softlock(action_last_t *last, action_cur_t *cur) if (notify_user) { +#ifndef BOOTLOADER + skin_request_update_locked(); +#endif action_handle_backlight(true, false); -#ifdef HAVE_BACKLIGHT - /* If we don't wait for a moment for the backlight queue to process, - * the user will never see the message - */ - if (!is_backlight_on(false)) - { - sleep(HZ/2); - } -#endif if (!has_flag(last->softlock_mask, SEL_ACTION_ALLNONOTIFY)) { +#ifdef HAVE_BACKLIGHT + /* If we don't wait for a moment for the backlight queue to process, + * the user will never see the message + */ + if (!is_backlight_on(false)) + sleep(HZ/2); +#endif if (last->keys_locked) { splash(HZ/2, ID2P(LANG_KEYLOCK_ON)); diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c index bc2f599b4e..99a33caea8 100644 --- a/apps/gui/skin_engine/skin_engine.c +++ b/apps/gui/skin_engine/skin_engine.c @@ -180,7 +180,7 @@ void settings_apply_skins(void) audio_stop(); bool first_run = skin_backdrop_init(); - + if (!first_run) { /* Make sure all skins unloaded */ @@ -342,6 +342,19 @@ void skin_request_full_update(enum skinnable_screens skin) skins[skin][i].needs_full_update = true; } + +/* Request skin update for lock state change */ +void skin_request_update_locked(void) +{ + if (get_current_activity() == ACTIVITY_WPS) + return; + + sb_skin_force_next_update(); +#ifdef HAS_BUTTON_HOLD + button_queue_post(BUTTON_NONE, 0); +#endif +} + bool dbg_skin_engine(void) { struct simplelist_info info; diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h index ce9527ab12..383086a19c 100644 --- a/apps/gui/skin_engine/skin_engine.h +++ b/apps/gui/skin_engine/skin_engine.h @@ -82,6 +82,7 @@ void skin_unload_all(void); bool skin_do_full_update(enum skinnable_screens skin, enum screen_type screen); void skin_request_full_update(enum skinnable_screens skin); +void skin_request_update_locked(void); bool dbg_skin_engine(void); diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 0242016e1e..1aaef617c9 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -224,6 +224,11 @@ void sb_skin_set_update_delay(int delay) update_delay = delay; } +void sb_skin_force_next_update(void) +{ + force_waiting = true; +} + /* This creates and loads a ".sbs" based on the user settings for: * - regular statusbar * - colours diff --git a/apps/gui/statusbar-skinned.h b/apps/gui/statusbar-skinned.h index 905a15b369..323ce7f0d2 100644 --- a/apps/gui/statusbar-skinned.h +++ b/apps/gui/statusbar-skinned.h @@ -38,6 +38,7 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen); void sb_skin_update(enum screen_type screen, bool force); void sb_skin_set_update_delay(int delay); +void sb_skin_force_next_update(void); bool sb_set_title_text(const char* title, enum themable_icons icon, enum screen_type screen); bool sb_set_persistent_title(const char* title, enum themable_icons icon, enum screen_type screen); diff --git a/firmware/backlight.c b/firmware/backlight.c index ee7b147aee..c6bc7d8aba 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -24,6 +24,7 @@ #if !defined(BOOTLOADER) #include "settings.h" #include "action.h" +#include "../apps/gui/skin_engine/skin_engine.h" #endif #include #include "cpu.h" @@ -887,6 +888,9 @@ void backlight_set_timeout_plugged(int value) /* Hold button change event handler. */ void backlight_hold_changed(bool hold_button) { +#ifndef BOOTLOADER + skin_request_update_locked(); +#endif if (!hold_button || (backlight_on_button_hold > 0)) { /* if unlocked or override in effect */