59 lines
1.8 KiB
C
59 lines
1.8 KiB
C
/**
|
|
* Copyright 2025 buffybox contributors
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
|
|
#include "keyboard.h"
|
|
#include "theme.h"
|
|
#include "../squeek2lvgl/sq2lv.h"
|
|
|
|
void bbx_keyboard_init_config(bbx_keyboard_config_t *config) {
|
|
config->mode = LV_KEYBOARD_MODE_TEXT_LOWER;
|
|
config->layout_id = 0; /* Default to first layout */
|
|
config->popovers = false;
|
|
config->height = -1; /* Auto-calculate */
|
|
config->value_changed_callback = NULL;
|
|
config->ready_callback = NULL;
|
|
}
|
|
|
|
lv_obj_t *bbx_keyboard_create(lv_obj_t *parent, lv_obj_t *textarea, bbx_keyboard_config_t *config) {
|
|
lv_obj_t *keyboard = lv_keyboard_create(parent);
|
|
|
|
lv_keyboard_set_mode(keyboard, config->mode);
|
|
lv_keyboard_set_textarea(keyboard, textarea);
|
|
|
|
/* Remove default event callback and add custom ones */
|
|
uint32_t num_events = lv_obj_get_event_count(keyboard);
|
|
for(uint32_t i = 0; i < num_events; ++i) {
|
|
if(lv_event_dsc_get_cb(lv_obj_get_event_dsc(keyboard, i)) == lv_keyboard_def_event_cb) {
|
|
lv_obj_remove_event(keyboard, i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (config->value_changed_callback) {
|
|
lv_obj_add_event_cb(keyboard, config->value_changed_callback, LV_EVENT_VALUE_CHANGED, NULL);
|
|
}
|
|
|
|
if (config->ready_callback) {
|
|
lv_obj_add_event_cb(keyboard, config->ready_callback, LV_EVENT_READY, NULL);
|
|
}
|
|
|
|
/* Set size */
|
|
if (config->height > 0) {
|
|
lv_obj_set_size(keyboard, LV_PCT(100), config->height);
|
|
}
|
|
|
|
/* Apply theme preparation */
|
|
bbx_theme_prepare_keyboard(keyboard);
|
|
|
|
/* Set layout */
|
|
sq2lv_switch_layout(keyboard, config->layout_id);
|
|
|
|
/* Enable popovers if requested */
|
|
if (config->popovers) {
|
|
lv_keyboard_set_popovers(keyboard, true);
|
|
}
|
|
|
|
return keyboard;
|
|
}
|