From 007447cc614eb4a0a03cd3be66bfc2d8e1f2d70c Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:12:48 +0000 Subject: [PATCH] Add experimental dark mode setting --- .../xtreme_app/scenes/xtreme_app_scene_misc.c | 22 +++++++++++++++++-- applications/services/gui/canvas.c | 14 +++++++++++- applications/services/xtreme/settings.c | 3 ++- applications/services/xtreme/settings.h | 5 +++-- firmware/targets/f7/api_symbols.csv | 1 + lib/u8g2/u8g2.h | 1 + lib/u8g2/u8g2_buffer.c | 8 +++++++ 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index c9b5e9d5e..83608c0bd 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -2,6 +2,7 @@ enum VarItemListIndex { VarItemListIndexSortDirsFirst, + VarItemListIndexDarkMode, VarItemListIndexChangeDeviceName, }; @@ -10,7 +11,7 @@ void xtreme_app_scene_misc_var_item_list_callback(void* context, uint32_t index) view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_misc_sort_folders_before_changed(VariableItem* item) { +static void xtreme_app_scene_misc_sort_dirs_first_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -18,6 +19,14 @@ static void xtreme_app_scene_misc_sort_folders_before_changed(VariableItem* item app->save_settings = true; } +static void xtreme_app_scene_misc_dark_mode_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->dark_mode = value; + app->save_settings = true; +} + void xtreme_app_scene_misc_on_enter(void* context) { XtremeApp* app = context; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); @@ -28,11 +37,20 @@ void xtreme_app_scene_misc_on_enter(void* context) { var_item_list, "Sort Dirs First", 2, - xtreme_app_scene_misc_sort_folders_before_changed, + xtreme_app_scene_misc_sort_dirs_first_changed, app); variable_item_set_current_value_index(item, xtreme_settings->sort_dirs_first); variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); + item = variable_item_list_add( + var_item_list, + "Dark Mode (Exp.)", + 2, + xtreme_app_scene_misc_dark_mode_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->dark_mode); + variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); + variable_item_list_add(var_item_list, "Change Device Name", 0, NULL, app); variable_item_list_set_enter_callback( diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index ee472138e..47366e2a2 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -6,6 +6,7 @@ #include #include #include +#include const CanvasFontParameters canvas_font_params[FontTotalNumber] = { [FontPrimary] = {.leading_default = 12, .leading_min = 11, .height = 8, .descender = 2}, @@ -105,11 +106,22 @@ CanvasFontParameters* canvas_get_font_params(Canvas* canvas, Font font) { void canvas_clear(Canvas* canvas) { furi_assert(canvas); - u8g2_ClearBuffer(&canvas->fb); + if(XTREME_SETTINGS()->dark_mode) { + u8g2_FillBuffer(&canvas->fb); + } else { + u8g2_ClearBuffer(&canvas->fb); + } } void canvas_set_color(Canvas* canvas, Color color) { furi_assert(canvas); + if(XTREME_SETTINGS()->dark_mode) { + if(color == ColorBlack) { + color = ColorWhite; + } else if(color == ColorWhite) { + color = ColorBlack; + } + } u8g2_SetDrawColor(&canvas->fb, color); } diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 05d0892dd..cb9e1bb2b 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -39,8 +39,9 @@ void XTREME_SETTINGS_LOAD() { xtreme_settings->bar_borders = true; // ON xtreme_settings->bar_background = false; // OFF xtreme_settings->bad_bt = false; // USB - xtreme_settings->sort_dirs_first = true; // ON xtreme_settings->butthurt_timer = 43200; // 12 H + xtreme_settings->sort_dirs_first = true; // ON + xtreme_settings->dark_mode = false; // OFF } } } diff --git a/applications/services/xtreme/settings.h b/applications/services/xtreme/settings.h index 44ad37abf..f1ddfd9a6 100644 --- a/applications/services/xtreme/settings.h +++ b/applications/services/xtreme/settings.h @@ -11,7 +11,7 @@ #define MAX_PACK_NAME_LEN 32 -#define XTREME_SETTINGS_VERSION (3) +#define XTREME_SETTINGS_VERSION (4) #define XTREME_SETTINGS_PATH INT_PATH(XTREME_SETTINGS_FILE_NAME) #define XTREME_SETTINGS_MAGIC (0x69) @@ -28,8 +28,9 @@ typedef struct { bool bar_borders; bool bar_background; bool bad_bt; - bool sort_dirs_first; int32_t butthurt_timer; + bool sort_dirs_first; + bool dark_mode; } XtremeSettings; XtremeSettings* XTREME_SETTINGS(); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 2db05fc50..7d2804b3b 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -3431,6 +3431,7 @@ Function,-,u8g2_DrawUTF8Lines,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8 Function,-,u8g2_DrawVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_DrawXBM,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" Function,-,u8g2_DrawXBMP,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" +Function,-,u8g2_FillBuffer,void,u8g2_t* Function,-,u8g2_FirstPage,void,u8g2_t* Function,-,u8g2_GetFontSize,size_t,const uint8_t* Function,-,u8g2_GetGlyphWidth,int8_t,"u8g2_t*, uint16_t" diff --git a/lib/u8g2/u8g2.h b/lib/u8g2/u8g2.h index 68611d482..0068ea61d 100644 --- a/lib/u8g2/u8g2.h +++ b/lib/u8g2/u8g2.h @@ -3548,6 +3548,7 @@ void u8g2_Setup_a2printer_384x240_f( void u8g2_SendBuffer(u8g2_t* u8g2); void u8g2_ClearBuffer(u8g2_t* u8g2); +void u8g2_FillBuffer(u8g2_t* u8g2); void u8g2_SetBufferCurrTileRow(u8g2_t* u8g2, uint8_t row) U8G2_NOINLINE; diff --git a/lib/u8g2/u8g2_buffer.c b/lib/u8g2/u8g2_buffer.c index 45855bd5d..06686b79b 100644 --- a/lib/u8g2/u8g2_buffer.c +++ b/lib/u8g2/u8g2_buffer.c @@ -45,6 +45,14 @@ void u8g2_ClearBuffer(u8g2_t* u8g2) { memset(u8g2->tile_buf_ptr, 0, cnt); } +void u8g2_FillBuffer(u8g2_t* u8g2) { + size_t cnt; + cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; + cnt *= u8g2->tile_buf_height; + cnt *= 8; + memset(u8g2->tile_buf_ptr, 255, cnt); +} + /*============================================*/ static void u8g2_send_tile_row(u8g2_t* u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) {