New GUI/View ASCII input API

This commit is contained in:
Willy-JL
2024-01-17 22:41:28 +00:00
parent cc6805891a
commit 9d877eb59d
16 changed files with 326 additions and 1 deletions

View File

@@ -174,6 +174,17 @@ void view_port_input_callback_set(
furi_check(furi_mutex_release(view_port->mutex) == FuriStatusOk);
}
void view_port_ascii_callback_set(
ViewPort* view_port,
ViewPortAsciiCallback callback,
void* context) {
furi_assert(view_port);
furi_check(furi_mutex_acquire(view_port->mutex, FuriWaitForever) == FuriStatusOk);
view_port->ascii_callback = callback;
view_port->ascii_callback_context = context;
furi_check(furi_mutex_release(view_port->mutex) == FuriStatusOk);
}
void view_port_update(ViewPort* view_port) {
furi_assert(view_port);
@@ -228,6 +239,53 @@ void view_port_input(ViewPort* view_port, InputEvent* event) {
furi_check(furi_mutex_release(view_port->mutex) == FuriStatusOk);
}
void view_port_ascii(ViewPort* view_port, AsciiEvent* event) {
furi_assert(view_port);
furi_assert(event);
furi_check(furi_mutex_acquire(view_port->mutex, FuriWaitForever) == FuriStatusOk);
furi_check(view_port->gui);
bool is_consumed = false;
if(view_port->ascii_callback) {
is_consumed = view_port->ascii_callback(event, view_port->ascii_callback_context);
}
if(!is_consumed) {
InputKey fallback_key = InputKeyMAX;
switch(event->value) {
case AsciiValueBS: // Backspace
case AsciiValueESC: // Escape
fallback_key = InputKeyBack;
break;
case AsciiValueDC1: // Up
case AsciiValueDC2: // Down
case AsciiValueDC3: // Right
case AsciiValueDC4: // Left
fallback_key = InputKeyUp + (event->value - AsciiValueDC1);
break;
case AsciiValueCR: // Enter
fallback_key = InputKeyOk;
break;
default:
break;
}
if(fallback_key != InputKeyMAX) {
// Fallback to directional input, needs press-short-release complementarity
InputEvent fallback_event = {
.key = fallback_key,
.type = InputTypePress,
};
view_port_input(view_port, &fallback_event);
fallback_event.type = InputTypeShort;
view_port_input(view_port, &fallback_event);
fallback_event.type = InputTypeRelease;
view_port_input(view_port, &fallback_event);
}
}
furi_check(furi_mutex_release(view_port->mutex) == FuriStatusOk);
}
void view_port_set_orientation(ViewPort* view_port, ViewPortOrientation orientation) {
furi_assert(view_port);
furi_check(furi_mutex_acquire(view_port->mutex, FuriWaitForever) == FuriStatusOk);