totp_input_text.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "totp_input_text.h"
  2. #include <gui/view_dispatcher.h>
  3. #include <gui/modules/text_input.h>
  4. typedef struct {
  5. InputTextResult* result;
  6. ViewDispatcher* view_dispatcher;
  7. } InputTextContext;
  8. static void commit_text_input_callback(void* ctx) {
  9. InputTextContext* context = ctx;
  10. context->result->user_input_length = strnlen(context->result->user_input, INPUT_BUFFER_SIZE);
  11. context->result->success = true;
  12. view_dispatcher_stop(context->view_dispatcher);
  13. }
  14. static bool back_event_callback(void* ctx) {
  15. InputTextContext* context = ctx;
  16. context->result->success = false;
  17. view_dispatcher_stop(context->view_dispatcher);
  18. return false;
  19. }
  20. void totp_input_text(Gui* gui, const char* header_text, InputTextResult* result) {
  21. ViewDispatcher* view_dispatcher = view_dispatcher_alloc();
  22. TextInput* text_input = text_input_alloc();
  23. InputTextContext context = {.result = result, .view_dispatcher = view_dispatcher};
  24. text_input_set_header_text(text_input, header_text);
  25. text_input_set_result_callback(
  26. text_input,
  27. commit_text_input_callback,
  28. &context,
  29. result->user_input,
  30. INPUT_BUFFER_SIZE,
  31. true);
  32. view_dispatcher_enable_queue(view_dispatcher);
  33. view_dispatcher_add_view(view_dispatcher, 0, text_input_get_view(text_input));
  34. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  35. view_dispatcher_set_navigation_event_callback(view_dispatcher, &back_event_callback);
  36. view_dispatcher_set_event_callback_context(view_dispatcher, &context);
  37. view_dispatcher_switch_to_view(view_dispatcher, 0);
  38. view_dispatcher_run(view_dispatcher);
  39. view_dispatcher_remove_view(view_dispatcher, 0);
  40. view_dispatcher_free(view_dispatcher);
  41. text_input_free(text_input);
  42. }