buffybox/shared/keyboard.c

60 lines
1.8 KiB
C
Raw Permalink Normal View History

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