windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/mode/mode.c
2020-09-26 16:20:57 +08:00

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;
}