[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