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 */