cedit.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Implementation of configuration editor
  4. *
  5. * Copyright 2023 Google LLC
  6. * Written by Simon Glass <sjg@chromium.org>
  7. */
  8. #include <common.h>
  9. #include <cli.h>
  10. #include <dm.h>
  11. #include <expo.h>
  12. #include <menu.h>
  13. #include <video.h>
  14. #include <linux/delay.h>
  15. #include "scene_internal.h"
  16. int cedit_arange(struct expo *exp, struct video_priv *vpriv, uint scene_id)
  17. {
  18. struct scene_obj_txt *txt;
  19. struct scene_obj *obj;
  20. struct scene *scn;
  21. int y;
  22. scn = expo_lookup_scene_id(exp, scene_id);
  23. if (!scn)
  24. return log_msg_ret("scn", -ENOENT);
  25. txt = scene_obj_find_by_name(scn, "prompt");
  26. if (txt)
  27. scene_obj_set_pos(scn, txt->obj.id, 0, vpriv->ysize - 50);
  28. txt = scene_obj_find_by_name(scn, "title");
  29. if (txt)
  30. scene_obj_set_pos(scn, txt->obj.id, 200, 10);
  31. y = 100;
  32. list_for_each_entry(obj, &scn->obj_head, sibling) {
  33. if (obj->type == SCENEOBJT_MENU) {
  34. scene_obj_set_pos(scn, obj->id, 50, y);
  35. scene_menu_arrange(scn, (struct scene_obj_menu *)obj);
  36. y += 50;
  37. }
  38. }
  39. return 0;
  40. }
  41. int cedit_run(struct expo *exp)
  42. {
  43. struct cli_ch_state s_cch, *cch = &s_cch;
  44. struct video_priv *vid_priv;
  45. uint scene_id;
  46. struct udevice *dev;
  47. struct scene *scn;
  48. bool done;
  49. int ret;
  50. cli_ch_init(cch);
  51. /* For now we only support a video console */
  52. ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
  53. if (ret)
  54. return log_msg_ret("vid", ret);
  55. ret = expo_set_display(exp, dev);
  56. if (ret)
  57. return log_msg_ret("dis", ret);
  58. ret = expo_first_scene_id(exp);
  59. if (ret < 0)
  60. return log_msg_ret("scn", ret);
  61. scene_id = ret;
  62. ret = expo_set_scene_id(exp, scene_id);
  63. if (ret)
  64. return log_msg_ret("sid", ret);
  65. exp->popup = true;
  66. /* This is not supported for now */
  67. if (0)
  68. expo_set_text_mode(exp, true);
  69. vid_priv = dev_get_uclass_priv(dev);
  70. scn = expo_lookup_scene_id(exp, scene_id);
  71. scene_highlight_first(scn);
  72. cedit_arange(exp, vid_priv, scene_id);
  73. ret = expo_calc_dims(exp);
  74. if (ret)
  75. return log_msg_ret("dim", ret);
  76. done = false;
  77. do {
  78. struct expo_action act;
  79. int ichar, key;
  80. ret = expo_render(exp);
  81. if (ret)
  82. break;
  83. ichar = cli_ch_process(cch, 0);
  84. if (!ichar) {
  85. while (!ichar && !tstc()) {
  86. schedule();
  87. mdelay(2);
  88. ichar = cli_ch_process(cch, -ETIMEDOUT);
  89. }
  90. if (!ichar) {
  91. ichar = getchar();
  92. ichar = cli_ch_process(cch, ichar);
  93. }
  94. }
  95. key = 0;
  96. if (ichar) {
  97. key = bootmenu_conv_key(ichar);
  98. if (key == BKEY_NONE)
  99. key = ichar;
  100. }
  101. if (!key)
  102. continue;
  103. ret = expo_send_key(exp, key);
  104. if (ret)
  105. break;
  106. ret = expo_action_get(exp, &act);
  107. if (!ret) {
  108. switch (act.type) {
  109. case EXPOACT_POINT_OBJ:
  110. scene_set_highlight_id(scn, act.select.id);
  111. cedit_arange(exp, vid_priv, scene_id);
  112. break;
  113. case EXPOACT_OPEN:
  114. scene_set_open(scn, act.select.id, true);
  115. cedit_arange(exp, vid_priv, scene_id);
  116. break;
  117. case EXPOACT_CLOSE:
  118. scene_set_open(scn, act.select.id, false);
  119. cedit_arange(exp, vid_priv, scene_id);
  120. break;
  121. case EXPOACT_SELECT:
  122. scene_set_open(scn, scn->highlight_id, false);
  123. cedit_arange(exp, vid_priv, scene_id);
  124. break;
  125. case EXPOACT_QUIT:
  126. log_debug("quitting\n");
  127. done = true;
  128. break;
  129. default:
  130. break;
  131. }
  132. }
  133. } while (!done);
  134. if (ret)
  135. return log_msg_ret("end", ret);
  136. return 0;
  137. }