From fabde150cea6bbdd3f9b85cb994b97d203a1304c Mon Sep 17 00:00:00 2001 From: Johannes Marbach Date: Thu, 16 Sep 2021 13:40:38 +0200 Subject: [PATCH] Use custom colors for keys depending on state --- README.md | 2 +- main.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0277f34..a9da5e4 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ While partially usable, buffyboard currently still is a work in progress. - On-screen keyboard control via mouse, trackpad or touchscreen - Multi-layer keyboard layout including lowercase letters, uppercase letters, numbers and selected symbols (based on top three layers of [squeekboard's US terminal layout]) - Key chords with one or more modifiers terminated by a single non-modifier (e.g. `CTRL-c`) +- Highlighting of active modifiers ## To do @@ -24,7 +25,6 @@ While partially usable, buffyboard currently still is a work in progress. - Add remaining layers from [squeekboard's US terminal layout] (symbols and actions) - Warn about mismatches between on-screen keyboard layout and terminal keyboard layout - Add [squeekboard's FR terminal layout] -- Use better / separate color for active modifiers (currently reuses checked color) - And, and, and ... # Development diff --git a/main.c b/main.c index 14facf4..03aefe3 100644 --- a/main.c +++ b/main.c @@ -157,6 +157,39 @@ static void pop_checked_modifier_keys(lv_obj_t *keyboard) { } } +static void keyboard_draw_part_begin_cb(lv_event_t *event) { + lv_obj_t *obj = lv_event_get_target(event); + lv_obj_draw_part_dsc_t *dsc = lv_event_get_param(event); + + if (dsc->part != LV_PART_ITEMS) { + return; + } + + if (lv_btnmatrix_get_selected_btn(obj) == dsc->id) { /* key is held down */ + if (lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_CHECKED)) { + if (lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_CHECKABLE)) { /* inactive modifiers */ + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_TEAL, 1); + } else { /* non-letters */ + dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE_GREY, 3); + } + } else { + if (lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_CHECKABLE)) { /* active modifiers */ + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_TEAL, 1); + } else { /* letters */ + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_BLUE_GREY, 1); + } + } + } else { /* key is not held down */ + if (lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_CHECKED)) { /* inactive modifiers & non-letters */ + dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE_GREY, 4); + } else if (lv_btnmatrix_has_btn_ctrl(obj, dsc->id, LV_BTNMATRIX_CTRL_CHECKABLE)) { /* active modifiers */ + dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_TEAL); + } else { /* letters */ + dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_BLUE_GREY); + } + } +} + /** * Main @@ -255,6 +288,7 @@ int main(void) /* Set up keyboard event handlers */ lv_obj_remove_event_cb(keyboard, lv_keyboard_def_event_cb); lv_obj_add_event_cb(keyboard, keyboard_value_changed_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_add_event_cb(keyboard, keyboard_draw_part_begin_cb, LV_EVENT_DRAW_PART_BEGIN, NULL); /* Apply default keyboard layout */ bb_layout_switch_layout(keyboard, SQ2LV_LAYOUT_TERMINAL_US);