diff --git a/main.c b/main.c index c87ba86..68fb9a4 100644 --- a/main.c +++ b/main.c @@ -81,6 +81,13 @@ static void terminal_resize_timer_cb(lv_timer_t *timer); */ static void set_theme(bool is_dark); +/** + * Handle LV_EVENT_DRAW_PART_BEGIN events from the keyboard widget. + * + * @param event the event object + */ +static void keyboard_draw_part_begin_cb(lv_event_t *event); + /** * Handle LV_EVENT_VALUE_CHANGED events from the keyboard widget. * @@ -124,6 +131,38 @@ static void set_theme(bool is_dark) { lv_theme_default_init(NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_CYAN), is_dark, &montserrat_extended_32); } +static void keyboard_draw_part_begin_cb(lv_event_t *event) { + lv_obj_t *obj = lv_event_get_target(event); + lv_btnmatrix_t *btnm = (lv_btnmatrix_t *)obj; + 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 ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_MOD_INACTIVE) == SQ2LV_CTRL_MOD_INACTIVE) { + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_TEAL, 1); + } else if ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_MOD_ACTIVE) == SQ2LV_CTRL_MOD_ACTIVE) { + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_TEAL, 1); + } else if ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_NON_CHAR) == SQ2LV_CTRL_NON_CHAR) { + dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE_GREY, 3); + } else { + dsc->rect_dsc->bg_color = lv_palette_lighten(LV_PALETTE_BLUE_GREY, 1); + } + } else { /* key is not held down */ + if ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_MOD_INACTIVE) == SQ2LV_CTRL_MOD_INACTIVE) { + dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE_GREY, 4); + } else if ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_MOD_ACTIVE) == SQ2LV_CTRL_MOD_ACTIVE) { + dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_TEAL); + } else if ((btnm->ctrl_bits[dsc->id] & SQ2LV_CTRL_NON_CHAR) == SQ2LV_CTRL_NON_CHAR) { + dsc->rect_dsc->bg_color = lv_palette_darken(LV_PALETTE_BLUE_GREY, 4); + } else { + dsc->rect_dsc->bg_color = lv_palette_main(LV_PALETTE_BLUE_GREY); + } + } +} + static void keyboard_value_changed_cb(lv_event_t *event) { lv_obj_t *kb = lv_event_get_target(event); @@ -186,39 +225,6 @@ static void pop_checked_modifier_keys(void) { } } -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 diff --git a/sq2lv_layouts.c b/sq2lv_layouts.c index fe3fef5..fdeadf3 100644 --- a/sq2lv_layouts.c +++ b/sq2lv_layouts.c @@ -25,11 +25,11 @@ static const char * const keycaps_lower_terminal_us[] = { \ }; static const lv_btnmatrix_ctrl_t attributes_lower_terminal_us[] = { \ - LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ + SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, \ - LV_KEYBOARD_CTRL_BTN_FLAGS | 3, 2, 2, 2, 2, 2, 2, 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ - LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 7, LV_KEYBOARD_CTRL_BTN_FLAGS | 3 \ + SQ2LV_CTRL_MOD_INACTIVE | 3, 2, 2, 2, 2, 2, 2, 2, SQ2LV_CTRL_NON_CHAR | 3, \ + SQ2LV_CTRL_NON_CHAR | 3, 7, SQ2LV_CTRL_NON_CHAR | 3 \ }; static const int num_modifiers_lower_terminal_us = 2; @@ -87,11 +87,11 @@ static const char * const keycaps_upper_terminal_us[] = { \ }; static const lv_btnmatrix_ctrl_t attributes_upper_terminal_us[] = { \ - LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ + SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, \ - LV_KEYBOARD_CTRL_BTN_FLAGS | 3, 2, 2, 2, 2, 2, 2, 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ - LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 7, LV_KEYBOARD_CTRL_BTN_FLAGS | 3 \ + SQ2LV_CTRL_MOD_ACTIVE | 3, 2, 2, 2, 2, 2, 2, 2, SQ2LV_CTRL_NON_CHAR | 3, \ + SQ2LV_CTRL_NON_CHAR | 3, 7, SQ2LV_CTRL_NON_CHAR | 3 \ }; static const int num_modifiers_upper_terminal_us = 2; @@ -149,11 +149,11 @@ static const char * const keycaps_numbers_terminal_us[] = { \ }; static const lv_btnmatrix_ctrl_t attributes_numbers_terminal_us[] = { \ - LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | LV_BTNMATRIX_CTRL_CHECKABLE | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ + SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_MOD_INACTIVE | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, SQ2LV_CTRL_NON_CHAR | 3, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ - 2, 2, 2, 2, 2, 2, 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 3, \ - LV_KEYBOARD_CTRL_BTN_FLAGS | 3, LV_KEYBOARD_CTRL_BTN_FLAGS | 7, 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 3 \ + 2, 2, 2, 2, 2, 2, 2, SQ2LV_CTRL_NON_CHAR | 3, \ + SQ2LV_CTRL_NON_CHAR | 3, 7, 2, SQ2LV_CTRL_NON_CHAR | 3 \ }; static const int num_modifiers_numbers_terminal_us = 2; diff --git a/sq2lv_layouts.h b/sq2lv_layouts.h index d2add50..4a02eef 100644 --- a/sq2lv_layouts.h +++ b/sq2lv_layouts.h @@ -9,6 +9,11 @@ #define SQ2LV_SCANCODES_ENABLED 1 +/* Key attributes */ +#define SQ2LV_CTRL_NON_CHAR (LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_CHECKED) +#define SQ2LV_CTRL_MOD_ACTIVE (LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_CHECKABLE) +#define SQ2LV_CTRL_MOD_INACTIVE (LV_BTNMATRIX_CTRL_NO_REPEAT | LV_BTNMATRIX_CTRL_CLICK_TRIG | LV_BTNMATRIX_CTRL_CHECKABLE | LV_BTNMATRIX_CTRL_CHECKED) + /* Layout IDs, values can be used as indexes into the sq2lv_layouts array */ typedef enum { SQ2LV_LAYOUT_TERMINAL_US = 0 @@ -20,7 +25,7 @@ typedef struct { const int num_keys; /* Key caps */ const char ** const keycaps; - /* Button matrix attributes */ + /* Key attributes */ const lv_btnmatrix_ctrl_t * const attributes; /* Number of modifier keys */ const int num_modifiers;