012-bootmenu-add-reprint-check.patch 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. From 702752cfae954648d6133bdff19283343b3339ef Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Tue, 29 Oct 2024 17:47:22 +0800
  4. Subject: [PATCH 3/3] bootmenu: add reprint check
  5. Record the last active menu item and check if it equals to the
  6. current selected item before reprint.
  7. Signed-off-by: Weijie Gao <[email protected]>
  8. ---
  9. cmd/bootmenu.c | 16 +++++++++++++++-
  10. include/menu.h | 1 +
  11. 2 files changed, 16 insertions(+), 1 deletion(-)
  12. --- a/cmd/bootmenu.c
  13. +++ b/cmd/bootmenu.c
  14. @@ -103,11 +103,13 @@ static char *bootmenu_choice_entry(void
  15. switch (key) {
  16. case BKEY_UP:
  17. + menu->last_active = menu->active;
  18. if (menu->active > 0)
  19. --menu->active;
  20. /* no menu key selected, regenerate menu */
  21. return NULL;
  22. case BKEY_DOWN:
  23. + menu->last_active = menu->active;
  24. if (menu->active < menu->count - 1)
  25. ++menu->active;
  26. /* no menu key selected, regenerate menu */
  27. @@ -133,6 +135,17 @@ static char *bootmenu_choice_entry(void
  28. return NULL;
  29. }
  30. +static bool bootmenu_need_reprint(void *data)
  31. +{
  32. + struct bootmenu_data *menu = data;
  33. + bool need_reprint;
  34. +
  35. + need_reprint = menu->last_active != menu->active;
  36. + menu->last_active = menu->active;
  37. +
  38. + return need_reprint;
  39. +}
  40. +
  41. static void bootmenu_destroy(struct bootmenu_data *menu)
  42. {
  43. struct bootmenu_entry *iter = menu->first;
  44. @@ -332,6 +345,7 @@ static struct bootmenu_data *bootmenu_cr
  45. menu->delay = delay;
  46. menu->active = 0;
  47. + menu->last_active = -1;
  48. menu->first = NULL;
  49. default_str = env_get("bootmenu_default");
  50. @@ -506,7 +520,7 @@ static enum bootmenu_ret bootmenu_show(i
  51. menu = menu_create(NULL, bootmenu->delay, 1, menu_display_statusline,
  52. bootmenu_print_entry, bootmenu_choice_entry,
  53. - NULL, bootmenu);
  54. + bootmenu_need_reprint, bootmenu);
  55. if (!menu) {
  56. bootmenu_destroy(bootmenu);
  57. return BOOTMENU_RET_FAIL;
  58. --- a/include/menu.h
  59. +++ b/include/menu.h
  60. @@ -40,6 +40,7 @@ int menu_show(int bootdelay);
  61. struct bootmenu_data {
  62. int delay; /* delay for autoboot */
  63. int active; /* active menu entry */
  64. + int last_active; /* last active menu entry */
  65. int count; /* total count of menu entries */
  66. struct bootmenu_entry *first; /* first menu entry */
  67. };