[SLOF] [PATCH 3/4] bootmenu: Implement keyboard handling and boot menu selection
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Mon Jun 5 16:01:04 AEST 2017
Thomas Huth <thuth at redhat.com> writes:
> On 05.06.2017 07:42, Nikunj A Dadhania wrote:
>> Thomas Huth <thuth at redhat.com> writes:
>>
>>> Wait for a key and return the selected boot device on the Forth stack.
>>>
>>> Signed-off-by: Thomas Huth <thuth at redhat.com>
>>> ---
>>> lib/libbootmenu/bootmenu.c | 74 +++++++++++++++++++++++++++++++++++++++++++
>>> lib/libbootmenu/bootmenu.code | 2 +-
>>> 2 files changed, 75 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/lib/libbootmenu/bootmenu.c b/lib/libbootmenu/bootmenu.c
>>> index 649e518..979cdc4 100644
>>> --- a/lib/libbootmenu/bootmenu.c
>>> +++ b/lib/libbootmenu/bootmenu.c
>>> @@ -12,10 +12,12 @@
>>> * Thomas Huth, Red Hat Inc. - initial implementation
>>> *****************************************************************************/
>>>
>>> +#include <stdbool.h>
>>> #include <string.h>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <paflof.h>
>>> +#include <helpers.h>
>>> #include "bootmenu.h"
>>>
>>> #define MAX_DEVS 36 /* Enough for 10 digits + 26 letters */
>>> @@ -93,15 +95,87 @@ static void bootmenu_show_devs(void)
>>> }
>>> }
>>>
>>> +static bool has_key(void)
>>> +{
>>> + forth_eval("key?");
>>> + return forth_pop();
>>> +}
>>> +
>>> +static char get_key(void)
>>> +{
>>> + forth_eval("key");
>>> + return forth_pop();
>>> +}
>>> +
>>> +/* Flush pending key presses */
>>> +static void flush_keys(void)
>>> +{
>>> + uint32_t start;
>>> +
>>> + start = SLOF_GetTimer();
>>> + while (SLOF_GetTimer() - start < 10) {
>>> + if (has_key()) {
>>> + get_key();
>>> + start = SLOF_GetTimer();
>>> + }
>>> + }
>>> +}
>>> +
>>> +static int bootmenu_get_selection(void)
>>> +{
>>> + char key = 0;
>>> + int sel;
>>> +
>>> + do {
>>> + sel = -1;
>>> + if (!has_key())
>>> + continue;
>>> + key = get_key();
>>> + switch (key) {
>>> + case '0':
>>> + return -1;
>>> + case '1' ... '9':
>>> + sel = key - '1';
>>> + break;
>>> + case 'a' ... 'z':
>>> + sel = key - 'a' + 9;
>>> + break;
>>> + case 'A' ... 'Z':
>>> + sel = key - 'A' + 9;
>>> + break;
>>
>> With this we can have 1-9, a-z and A-Z, 10 + 26 + 26 = 62 selection.
>> Though displaying them on one screen is difficult. MAX_DEVS is set to 36
>> though.
>
> Right, currently I treat the letters case-insensitive.
Ah, i missed that part.
> We could increase MAX_DEVS to 62 by treating the letters
> case-sensitive instead ... question is, do we want that, or are 36
> possible boot devices enough (since 62 hardly fit on a screen anyway,
> as you noted)?
36 should be good enough.
Regards,
Nikunj
More information about the SLOF
mailing list