Boot manager: Niveus window, keys and wells, Instrument Sans, pointer, other systems, working power entries
The F8 menu is redrawn in the Niveus language: a window with three lights, bevelled keys with a lit edge, wells for panels, anti-aliased corners and a soft shadow, set in Instrument Sans rasterised into include/gfx/nvfont.h (tools/python/mknvfont.py, make nvfont). Scale doubles on screens 1400 px tall or more. Lists taller than the screen scroll. The keyboard still drives everything, and a mouse, touchpad or tablet does too: both UEFI pointer protocols are polled, hover moves the highlight, a click activates. The cursor stays hidden until the pointer has really done something, since the firmware installs a pointer protocol with or without a mouse. The 'keep this resolution?' countdown is one ten-second budget however many times the pointer moves. Loaders found at well-known paths on any volume (Windows, Ubuntu, Debian, Fedora, Arch, openSUSE, systemd-boot, rEFInd, other BOOTX64.EFI) are listed and chain-loaded with LoadImage/StartImage. 'Reboot to firmware' used to halt; it now sets OsIndications and restarts, and Restart and Shut Down call ResetSystem. Checked under QEMU+OVMF: menu, resolution list (incl. 2560x1600 at double scale), system information, shut down, firmware setup, chain-loading a copy of the loader from a second disk, and a full boot of the ISO to the login prompt. Pointer hover and click were checked only with synthetic events: in this setup a USB mouse or tablet delivered no event to the loader (one USB I/O handle appeared but no pointer protocol came from it), and why was not established. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EVRhxi9zpdW2uDUN4FVcao
This commit is contained in:
parent
020aa6113c
commit
dee3affa3b
11 changed files with 9304 additions and 208 deletions
|
|
@ -153,17 +153,22 @@ typedef struct {
|
|||
void *LocateDevicePath;
|
||||
void *InstallConfigurationTable;
|
||||
|
||||
void *LoadImage;
|
||||
void *StartImage;
|
||||
EFI_STATUS (*LoadImage)(BOOLEAN BootPolicy, EFI_HANDLE ParentImage,
|
||||
void *DevicePath, void *SourceBuffer,
|
||||
UINTN SourceSize, EFI_HANDLE *ImageHandle);
|
||||
EFI_STATUS (*StartImage)(EFI_HANDLE ImageHandle, UINTN *ExitDataSize,
|
||||
CHAR16 **ExitData);
|
||||
void *Exit;
|
||||
void *UnloadImage;
|
||||
EFI_STATUS (*UnloadImage)(EFI_HANDLE ImageHandle);
|
||||
EFI_STATUS (*ExitBootServices)(EFI_HANDLE ImageHandle, UINTN MapKey);
|
||||
|
||||
void *GetNextMonotonicCount;
|
||||
EFI_STATUS (*Stall)(UINTN Microseconds);
|
||||
void *SetWatchdogTimer;
|
||||
|
||||
void *ConnectController;
|
||||
/* Recursive = TRUE asks for every driver that will bind, down the tree. */
|
||||
EFI_STATUS (*ConnectController)(EFI_HANDLE Controller, EFI_HANDLE *DriverImage,
|
||||
void *RemainingDevicePath, BOOLEAN Recursive);
|
||||
void *DisconnectController;
|
||||
|
||||
void *OpenProtocol;
|
||||
|
|
@ -181,6 +186,43 @@ typedef struct {
|
|||
void **Interface);
|
||||
} EFI_BOOT_SERVICES;
|
||||
|
||||
// --- runtime services -----------------------------------------------------
|
||||
//
|
||||
// Only the two things the boot manager needs: variables, to ask the firmware to
|
||||
// show its own setup on the next start, and ResetSystem, to restart or power
|
||||
// off. The slots before them are spelled out as padding so the offsets hold.
|
||||
|
||||
#define EfiResetCold 0
|
||||
#define EfiResetShutdown 2
|
||||
|
||||
#define EFI_VARIABLE_NON_VOLATILE 0x1
|
||||
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x2
|
||||
#define EFI_VARIABLE_RUNTIME_ACCESS 0x4
|
||||
|
||||
#define EFI_GLOBAL_VARIABLE_GUID \
|
||||
{ 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C } }
|
||||
|
||||
/* OsIndications bit 0: "boot into the firmware's own user interface". */
|
||||
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x1ULL
|
||||
|
||||
typedef struct {
|
||||
char Hdr[24];
|
||||
void *GetTime;
|
||||
void *SetTime;
|
||||
void *GetWakeupTime;
|
||||
void *SetWakeupTime;
|
||||
void *SetVirtualAddressMap;
|
||||
void *ConvertPointer;
|
||||
EFI_STATUS (*GetVariable)(CHAR16 *Name, EFI_GUID *Vendor, UINT32 *Attributes,
|
||||
UINTN *DataSize, void *Data);
|
||||
void *GetNextVariableName;
|
||||
EFI_STATUS (*SetVariable)(CHAR16 *Name, EFI_GUID *Vendor, UINT32 Attributes,
|
||||
UINTN DataSize, void *Data);
|
||||
void *GetNextHighMonotonicCount;
|
||||
void (*ResetSystem)(UINTN ResetType, EFI_STATUS Status, UINTN DataSize,
|
||||
void *ResetData);
|
||||
} EFI_RUNTIME_SERVICES;
|
||||
|
||||
typedef struct {
|
||||
char Hdr[24];
|
||||
CHAR16 *FirmwareVendor;
|
||||
|
|
@ -191,7 +233,7 @@ typedef struct {
|
|||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
|
||||
EFI_HANDLE StandardErrorHandle;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr;
|
||||
void *RuntimeServices;
|
||||
EFI_RUNTIME_SERVICES *RuntimeServices;
|
||||
EFI_BOOT_SERVICES *BootServices;
|
||||
UINTN NumberOfTableEntries;
|
||||
void *ConfigurationTable;
|
||||
|
|
@ -348,4 +390,42 @@ typedef struct EFI_GRAPHICS_OUTPUT_PROTOCOL {
|
|||
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
|
||||
} EFI_GRAPHICS_OUTPUT_PROTOCOL;
|
||||
|
||||
// --- pointers -------------------------------------------------------------
|
||||
//
|
||||
// Two protocols, because firmware offers whichever the device is: a mouse or
|
||||
// touchpad reports movement (SIMPLE_POINTER), a tablet -- QEMU's, and most
|
||||
// touchscreens -- reports where it is (ABSOLUTE_POINTER). Both are polled.
|
||||
|
||||
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID \
|
||||
{ 0x31878C87, 0x0B75, 0x11D5, { 0x9A, 0x4F, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }
|
||||
#define EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \
|
||||
{ 0x8D59D32B, 0xC655, 0x4AE9, { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } }
|
||||
|
||||
#define EFI_NOT_READY ((EFI_STATUS)(0x8000000000000000ULL | 6))
|
||||
|
||||
typedef struct { int RelativeMovementX, RelativeMovementY, RelativeMovementZ;
|
||||
BOOLEAN LeftButton, RightButton; } EFI_SIMPLE_POINTER_STATE;
|
||||
typedef struct { UINT64 ResolutionX, ResolutionY, ResolutionZ;
|
||||
BOOLEAN LeftButton, RightButton; } EFI_SIMPLE_POINTER_MODE;
|
||||
typedef struct EFI_SIMPLE_POINTER_PROTOCOL {
|
||||
EFI_STATUS (*Reset)(struct EFI_SIMPLE_POINTER_PROTOCOL *This, BOOLEAN Extended);
|
||||
EFI_STATUS (*GetState)(struct EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
EFI_SIMPLE_POINTER_STATE *State);
|
||||
void *WaitForInput;
|
||||
EFI_SIMPLE_POINTER_MODE *Mode;
|
||||
} EFI_SIMPLE_POINTER_PROTOCOL;
|
||||
|
||||
typedef struct { UINT64 CurrentX, CurrentY, CurrentZ; UINT32 ActiveButtons; }
|
||||
EFI_ABSOLUTE_POINTER_STATE;
|
||||
typedef struct { UINT64 AbsoluteMinX, AbsoluteMinY, AbsoluteMinZ,
|
||||
AbsoluteMaxX, AbsoluteMaxY, AbsoluteMaxZ;
|
||||
UINT32 Attributes; } EFI_ABSOLUTE_POINTER_MODE;
|
||||
typedef struct EFI_ABSOLUTE_POINTER_PROTOCOL {
|
||||
EFI_STATUS (*Reset)(struct EFI_ABSOLUTE_POINTER_PROTOCOL *This, BOOLEAN Extended);
|
||||
EFI_STATUS (*GetState)(struct EFI_ABSOLUTE_POINTER_PROTOCOL *This,
|
||||
EFI_ABSOLUTE_POINTER_STATE *State);
|
||||
void *WaitForInput;
|
||||
EFI_ABSOLUTE_POINTER_MODE *Mode;
|
||||
} EFI_ABSOLUTE_POINTER_PROTOCOL;
|
||||
|
||||
#endif /* SCHOS_EFI_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue