139 lines
2.8 KiB
C
139 lines
2.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
mode.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Shell app "mode"
|
||
|
|
||
|
|
||
|
|
||
|
Revision History
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "shell.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeMode (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
);
|
||
|
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
EFI_DRIVER_ENTRY_POINT(InitializeMode)
|
||
|
|
||
|
EFI_STATUS
|
||
|
InitializeMode (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||
|
)
|
||
|
{
|
||
|
CHAR16 **Argv;
|
||
|
UINTN Argc;
|
||
|
UINTN NewCol, NewRow;
|
||
|
UINTN Col, Row;
|
||
|
UINTN Index;
|
||
|
INTN Mode;
|
||
|
EFI_STATUS Status;
|
||
|
SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut;
|
||
|
|
||
|
/* Check to see if the app is to install as a "internal command"
|
||
|
* to the shell
|
||
|
*/
|
||
|
|
||
|
InstallInternalShellCommand (
|
||
|
ImageHandle, SystemTable, InitializeMode,
|
||
|
L"mode", /* command */
|
||
|
L"mode [col row]", /* command syntax */
|
||
|
L"Set/get current text mode", /* 1 line descriptor */
|
||
|
NULL /* command help page */
|
||
|
);
|
||
|
|
||
|
/*
|
||
|
* Initialize app
|
||
|
*/
|
||
|
|
||
|
InitializeShellApplication (ImageHandle, SystemTable);
|
||
|
Argv = SI->Argv;
|
||
|
Argc = SI->Argc;
|
||
|
|
||
|
/*
|
||
|
* Scan args
|
||
|
*/
|
||
|
|
||
|
NewRow = 0;
|
||
|
NewCol = 0;
|
||
|
|
||
|
for (Index = 1; Index < Argc; Index += 1) {
|
||
|
|
||
|
if (!NewCol) {
|
||
|
NewCol = Atoi (Argv[Index]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (!NewRow) {
|
||
|
NewRow = Atoi (Argv[Index]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
Print (L"%Emode: too many arguments\n");
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
ConOut = ST->ConOut;
|
||
|
|
||
|
/*
|
||
|
* If not setting a new mode, dump the available modes
|
||
|
*/
|
||
|
|
||
|
if (!NewRow && !NewCol) {
|
||
|
|
||
|
Print (L"Available modes on standard output\n");
|
||
|
|
||
|
for (Mode=0; Mode < ConOut->Mode->MaxMode; Mode++) {
|
||
|
Status = ConOut->QueryMode(ConOut, Mode, &Col, &Row);
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print (L"%Emode: failed to query mode: %r\n", Status);
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
Print (L" col %3d row %3d %c\n", Col, Row, Mode == ConOut->Mode->Mode ? '*' : ' ');
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
for (Mode=0; Mode < ConOut->Mode->MaxMode; Mode++) {
|
||
|
Status = ConOut->QueryMode(ConOut, Mode, &Col, &Row);
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
Print (L"%Emode: failed to query mode: %r\n", Status);
|
||
|
goto Done;
|
||
|
}
|
||
|
|
||
|
if (Row == NewRow && Col == NewCol) {
|
||
|
ConOut->SetMode (ConOut, Mode);
|
||
|
ConOut->ClearScreen (ConOut);
|
||
|
goto Done;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Print (L"%Emode: not found (%d,%d)\n", NewCol, NewRow);
|
||
|
}
|
||
|
|
||
|
Done:
|
||
|
return EFI_SUCCESS;
|
||
|
}
|