some update for using pointer and scroll

Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
This commit is contained in:
Sergey Isakov 2020-03-02 22:00:01 +03:00
parent dcdd8cc091
commit c0df0f8787
8 changed files with 284 additions and 264 deletions

View File

@ -94,6 +94,7 @@
A5456D9123FC5B72000BF18C /* globals_ctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8523FC5B6E000BF18C /* globals_ctor.cpp */; }; A5456D9123FC5B72000BF18C /* globals_ctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8523FC5B6E000BF18C /* globals_ctor.cpp */; };
A5456D9323FC5B72000BF18C /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8A23FC5B70000BF18C /* memory.cpp */; }; A5456D9323FC5B72000BF18C /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8A23FC5B70000BF18C /* memory.cpp */; };
A5456D9623FC5B72000BF18C /* operatorNewDelete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8E23FC5B71000BF18C /* operatorNewDelete.cpp */; }; A5456D9623FC5B72000BF18C /* operatorNewDelete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5456D8E23FC5B71000BF18C /* operatorNewDelete.cpp */; };
A570FB0D240D626D0057F26D /* XPointer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A570FB0B240D626C0057F26D /* XPointer.cpp */; };
A5716F83235968BE000CEC60 /* Nasm.inc in Sources */ = {isa = PBXBuildFile; fileRef = A5716F82235968BE000CEC60 /* Nasm.inc */; }; A5716F83235968BE000CEC60 /* Nasm.inc in Sources */ = {isa = PBXBuildFile; fileRef = A5716F82235968BE000CEC60 /* Nasm.inc */; };
A571C28D240574DA00B6A2C5 /* XImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A571C28B240574D900B6A2C5 /* XImage.cpp */; }; A571C28D240574DA00B6A2C5 /* XImage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A571C28B240574D900B6A2C5 /* XImage.cpp */; };
A59CB66921BC14AB0054A7CF /* SmbiosGen.c in Sources */ = {isa = PBXBuildFile; fileRef = A59CB66521BC14AA0054A7CF /* SmbiosGen.c */; }; A59CB66921BC14AB0054A7CF /* SmbiosGen.c in Sources */ = {isa = PBXBuildFile; fileRef = A59CB66521BC14AA0054A7CF /* SmbiosGen.c */; };
@ -2404,6 +2405,8 @@
A570FAFF240BA4DB0057F26D /* screen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = screen.h; sourceTree = "<group>"; }; A570FAFF240BA4DB0057F26D /* screen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = screen.h; sourceTree = "<group>"; };
A570FB02240BA5340057F26D /* menu_items.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = menu_items.h; sourceTree = "<group>"; }; A570FB02240BA5340057F26D /* menu_items.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = menu_items.h; sourceTree = "<group>"; };
A570FB03240BA5340057F26D /* menu_globals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = menu_globals.h; sourceTree = "<group>"; }; A570FB03240BA5340057F26D /* menu_globals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = menu_globals.h; sourceTree = "<group>"; };
A570FB0B240D626C0057F26D /* XPointer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XPointer.cpp; sourceTree = "<group>"; };
A570FB0C240D626D0057F26D /* XPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XPointer.h; sourceTree = "<group>"; };
A5716F82235968BE000CEC60 /* Nasm.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = Nasm.inc; path = ../../Nasm.inc; sourceTree = "<group>"; }; A5716F82235968BE000CEC60 /* Nasm.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = Nasm.inc; path = ../../Nasm.inc; sourceTree = "<group>"; };
A5716FD5235A1576000CEC60 /* InternalIsaBus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InternalIsaBus.h; sourceTree = "<group>"; }; A5716FD5235A1576000CEC60 /* InternalIsaBus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InternalIsaBus.h; sourceTree = "<group>"; };
A5716FD6235A1576000CEC60 /* IsaBusDxeExtra.uni */ = {isa = PBXFileReference; lastKnownFileType = text; path = IsaBusDxeExtra.uni; sourceTree = "<group>"; }; A5716FD6235A1576000CEC60 /* IsaBusDxeExtra.uni */ = {isa = PBXFileReference; lastKnownFileType = text; path = IsaBusDxeExtra.uni; sourceTree = "<group>"; };
@ -6125,6 +6128,8 @@
A5456CF523FC5AB7000BF18C /* VectorGraphics.cpp */, A5456CF523FC5AB7000BF18C /* VectorGraphics.cpp */,
A571C28B240574D900B6A2C5 /* XImage.cpp */, A571C28B240574D900B6A2C5 /* XImage.cpp */,
A571C28C240574D900B6A2C5 /* XImage.h */, A571C28C240574D900B6A2C5 /* XImage.h */,
A570FB0B240D626C0057F26D /* XPointer.cpp */,
A570FB0C240D626D0057F26D /* XPointer.h */,
); );
path = libeg; path = libeg;
sourceTree = "<group>"; sourceTree = "<group>";
@ -17119,6 +17124,7 @@
A5AA060E237F13C1009CD413 /* GccInline.c in Sources */, A5AA060E237F13C1009CD413 /* GccInline.c in Sources */,
A5AAFB8E237F13B3009CD413 /* EdbCmdBranch.c in Sources */, A5AAFB8E237F13B3009CD413 /* EdbCmdBranch.c in Sources */,
A5AAFB9A237F13B3009CD413 /* SmbiosDxe.c in Sources */, A5AAFB9A237F13B3009CD413 /* SmbiosDxe.c in Sources */,
A570FB0D240D626D0057F26D /* XPointer.cpp in Sources */,
A5AAFD11237F13B4009CD413 /* SmmLockBoxDxeLib.c in Sources */, A5AAFD11237F13B4009CD413 /* SmmLockBoxDxeLib.c in Sources */,
A5AA04E0237F13C1009CD413 /* Unaligned.c in Sources */, A5AA04E0237F13C1009CD413 /* Unaligned.c in Sources */,
A5AAFB28237F13B3009CD413 /* DxeMain.c in Sources */, A5AAFB28237F13B3009CD413 /* DxeMain.c in Sources */,

View File

@ -1708,8 +1708,8 @@ extern UINTN gEvent;
extern UINT16 gBacklightLevel; extern UINT16 gBacklightLevel;
extern UINT32 devices_number; extern UINT32 devices_number;
//mouse //mouse
extern ACTION gAction; //extern ACTION gAction;
extern UINTN gItemID; //extern UINTN gItemID;
extern INTN OldChosenTheme; extern INTN OldChosenTheme;
extern INTN OldChosenConfig; extern INTN OldChosenConfig;
extern INTN OldChosenDsdt; extern INTN OldChosenDsdt;
@ -1774,7 +1774,7 @@ FindBin (
UINT8 *Pattern, UINT8 *Pattern,
UINT32 PatternLen UINT32 PatternLen
); );
/*
EFI_STATUS EFI_STATUS
MouseBirth (VOID); MouseBirth (VOID);
@ -1783,7 +1783,7 @@ KillMouse (VOID);
VOID VOID
HidePointer (VOID); HidePointer (VOID);
*/
VOID VOID
InitBooterLog (VOID); InitBooterLog (VOID);

View File

@ -395,7 +395,7 @@ public:
ACTION mAction; ACTION mAction;
UINTN mItemID; UINTN mItemID;
XPointer *mPointer; XPointer *mPointer;
bool PointerLive; SCROLL_STATE *ScrollState,
REFIT_MENU_SCREEN() REFIT_MENU_SCREEN()
: ID(0), Title(0), TitleImage(0), : ID(0), Title(0), TitleImage(0),
@ -484,6 +484,12 @@ public:
Entries.AddReference(entry1, false); Entries.AddReference(entry1, false);
Entries.AddReference(entry2, false); Entries.AddReference(entry2, false);
}; };
//Scroll functions
VOID InitScroll(IN INTN ItemCount, IN UINTN MaxCount,
IN UINTN VisibleSpace, IN INTN Selected);
VOID UpdateScroll(IN OUT SCROLL_STATE *State, IN UINTN Movement);
VOID HidePointer();
EFI_STATUS MouseBirth();
}; };
#endif #endif

View File

@ -1,14 +1,14 @@
/* /*
* a class for mouse support * a class for mouse support
*/ */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "Library/BaseLib.h" #include "Library/BaseLib.h"
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#include "XPointer.h" #include "XPointer.h"
#include "libegint.h" //this includes platform.h #include "libegint.h" //this includes platform.h
#include "../refit/screen.h" #include "../refit/screen.h"
@ -28,33 +28,33 @@ extern "C" {
// make them theme dependent? No, 32 is good value for all. // make them theme dependent? No, 32 is good value for all.
#define POINTER_WIDTH 32 #define POINTER_WIDTH 32
#define POINTER_HEIGHT 32 #define POINTER_HEIGHT 32
XPointer::XPointer() XPointer::XPointer()
{ {
PointerImage = new XImage(BuiltinIcon(BUILTIN_ICON_POINTER)); PointerImage = new XImage(BuiltinIcon(BUILTIN_ICON_POINTER));
oldImage = new XImage(POINTER_WIDTH, POINTER_HEIGHT); oldImage = new XImage(POINTER_WIDTH, POINTER_HEIGHT);
newImage = new XImage(POINTER_WIDTH, POINTER_HEIGHT); newImage = new XImage(POINTER_WIDTH, POINTER_HEIGHT);
} }
XPointer::~XPointer() XPointer::~XPointer()
{ {
delete PointerImage; delete PointerImage;
delete newImage; delete newImage;
delete oldImage; delete oldImage;
} }
void XPointer::Hide() void XPointer::Hide()
{ {
if (SimplePointerProtocol) { if (SimplePointerProtocol) {
oldImage->Draw(oldPlace.XPos, oldPlace.YPos, 1.f); oldImage->Draw(oldPlace.XPos, oldPlace.YPos, 1.f);
} }
} }
EFI_STATUS XPointer::MouseBirth() EFI_STATUS XPointer::MouseBirth()
{ {
EFI_STATUS Status = EFI_UNSUPPORTED; EFI_STATUS Status = EFI_UNSUPPORTED;
if (!gSettings.PointerEnabled) { if (!gSettings.PointerEnabled) {
@ -66,7 +66,7 @@ EFI_STATUS XPointer::MouseBirth()
DrawPointer(); DrawPointer();
return EFI_SUCCESS; return EFI_SUCCESS;
} }
// Try first to use mouse from System Table // Try first to use mouse from System Table
Status = gBS->HandleProtocol(gST->ConsoleInHandle, &gEfiSimplePointerProtocolGuid, (VOID**)&SimplePointerProtocol); Status = gBS->HandleProtocol(gST->ConsoleInHandle, &gEfiSimplePointerProtocolGuid, (VOID**)&SimplePointerProtocol);
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
@ -103,9 +103,9 @@ EFI_STATUS XPointer::MouseBirth()
// POINTER_WIDTH, POINTER_HEIGHT); // DrawPointer repeats it // POINTER_WIDTH, POINTER_HEIGHT); // DrawPointer repeats it
DrawPointer(); DrawPointer();
MouseEvent = NoEvents; MouseEvent = NoEvents;
return Status; return Status;
} }
VOID XPointer::DrawPointer() VOID XPointer::DrawPointer()
{ {
@ -199,8 +199,8 @@ VOID XPointer::UpdatePointer()
if (newPlace.YPos < 0) newPlace.YPos = 0; if (newPlace.YPos < 0) newPlace.YPos = 0;
if (newPlace.YPos > UGAHeight - 1) newPlace.YPos = UGAHeight - 1; if (newPlace.YPos > UGAHeight - 1) newPlace.YPos = UGAHeight - 1;
HidePointer(); Hide();
DrawPointer(); Draw();
} }
} }

View File

@ -13,16 +13,16 @@ public:
~XPointer(); ~XPointer();
protected: protected:
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol; EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
XImage *PointerImage; XImage *PointerImage;
XImage *newImage; XImage *newImage;
XImage *oldImage; XImage *oldImage;
EG_RECT newPlace; EG_RECT newPlace;
EG_RECT oldPlace; EG_RECT oldPlace;
UINT64 LastClickTime; //not EFI_TIME UINT64 LastClickTime; //not EFI_TIME
EFI_SIMPLE_POINTER_STATE State; EFI_SIMPLE_POINTER_STATE State;
MOUSE_EVENT MouseEvent; MOUSE_EVENT MouseEvent;
public: public:
@ -35,6 +35,6 @@ public:
EFI_STATUS CheckMouseEvent(REFIT_MENU_SCREEN *Screen); EFI_STATUS CheckMouseEvent(REFIT_MENU_SCREEN *Screen);
protected: protected:
VOID DrawPointer(); VOID Draw();
}; };

View File

@ -126,7 +126,7 @@
Platform/Platform.h Platform/Platform.h
Platform/platformdata.cpp Platform/platformdata.cpp
Platform/plist.cpp Platform/plist.cpp
Platform/Pointer.cpp # Platform/Pointer.cpp
Platform/Settings.cpp Platform/Settings.cpp
Platform/smbios.cpp Platform/smbios.cpp
# Platform/SmBios.h # Platform/SmBios.h

View File

@ -1062,17 +1062,14 @@ WaitFor2EventWithTsc (
// TimeoutDefault for a wait in seconds // TimeoutDefault for a wait in seconds
// return EFI_TIMEOUT if no inputs // return EFI_TIMEOUT if no inputs
//the function must be in menu class //the function must be in menu class
//so UpdatePointer(); => mPointer.Update(&gItemID, &gAction); //so UpdatePointer(); => mPointer.Update(&gItemID, &Screen->mAction);
EFI_STATUS WaitForInputEventPoll(REFIT_MENU_SCREEN *Screen, UINTN TimeoutDefault) EFI_STATUS WaitForInputEventPoll(REFIT_MENU_SCREEN *Screen, UINTN TimeoutDefault)
{ {
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
UINTN TimeoutRemain = TimeoutDefault * 100; UINTN TimeoutRemain = TimeoutDefault * 100;
while (TimeoutRemain != 0) { while (TimeoutRemain != 0) {
// Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_MSECOND * 10);
Status = WaitFor2EventWithTsc (gST->ConIn->WaitForKey, NULL, 10); Status = WaitFor2EventWithTsc (gST->ConIn->WaitForKey, NULL, 10);
if (Status != EFI_TIMEOUT) { if (Status != EFI_TIMEOUT) {
break; break;
} }
@ -1080,11 +1077,8 @@ EFI_STATUS WaitForInputEventPoll(REFIT_MENU_SCREEN *Screen, UINTN TimeoutDefault
if (gSettings.PlayAsync) { if (gSettings.PlayAsync) {
CheckSyncSound(); CheckSyncSound();
} }
/* if ((INTN)gItemID < Screen->Entries.size()) {
UpdateAnime(Screen->Entries[gItemID].SubScreen, &(Screen->Entries[gItemID].Place));
} */
TimeoutRemain--; TimeoutRemain--;
if (Screen->PointerLive) { if (Screen->mPointer) {
Screen->mPointer->UpdatePointer(); Screen->mPointer->UpdatePointer();
Status = Screen->mPointer->CheckMouseEvent(Screen); //out: gItemID, gAction Status = Screen->mPointer->CheckMouseEvent(Screen); //out: gItemID, gAction
if (Status != EFI_TIMEOUT) { //this check should return timeout if no mouse events occured if (Status != EFI_TIMEOUT) { //this check should return timeout if no mouse events occured

View File

@ -46,7 +46,7 @@
#include "HdaCodecDump.h" #include "HdaCodecDump.h"
#include "menu.h" #include "menu.h"
#include "screen.h" #include "screen.h"
#include "../Platform/Pointer.h" //#include "../Platform/Pointer.h"
#ifndef DEBUG_ALL #ifndef DEBUG_ALL
#define DEBUG_MENU 1 #define DEBUG_MENU 1
@ -117,7 +117,7 @@ BOOLEAN SavePreBootLog = FALSE;
#define MENU_FUNCTION_PAINT_SELECTION (3) #define MENU_FUNCTION_PAINT_SELECTION (3)
#define MENU_FUNCTION_PAINT_TIMEOUT (4) #define MENU_FUNCTION_PAINT_TIMEOUT (4)
typedef VOID (*MENU_STYLE_FUNC)(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CONST CHAR16 *ParamText); typedef VOID (*MENU_STYLE_FUNC)(IN REFIT_MENU_SCREEN *Screen, IN UINTN Function, IN CONST CHAR16 *ParamText);
static CHAR16 ArrowUp[2] = { ARROW_UP, 0 }; static CHAR16 ArrowUp[2] = { ARROW_UP, 0 };
static CHAR16 ArrowDown[2] = { ARROW_DOWN, 0 }; static CHAR16 ArrowDown[2] = { ARROW_DOWN, 0 };
@ -1948,178 +1948,178 @@ VOID InitSelection(VOID)
#define CONSTRAIN_MIN(Variable, MinValue) if (Variable < MinValue) Variable = MinValue #define CONSTRAIN_MIN(Variable, MinValue) if (Variable < MinValue) Variable = MinValue
#define CONSTRAIN_MAX(Variable, MaxValue) if (Variable > MaxValue) Variable = MaxValue #define CONSTRAIN_MAX(Variable, MaxValue) if (Variable > MaxValue) Variable = MaxValue
static VOID InitScroll(OUT SCROLL_STATE *State, IN INTN ItemCount, IN UINTN MaxCount, VOID REFIT_MENU_SCREEN::InitScroll(IN INTN ItemCount, IN UINTN MaxCount,
IN UINTN VisibleSpace, IN INTN Selected) IN UINTN VisibleSpace, IN INTN Selected)
{ {
//ItemCount - a number to scroll (Row0) //ItemCount - a number to scroll (Row0)
//MaxCount - total number (Row0 + Row1) //MaxCount - total number (Row0 + Row1)
//VisibleSpace - a number to fit //VisibleSpace - a number to fit
State->LastSelection = State->CurrentSelection = Selected; ScrollState->LastSelection = ScrollState->CurrentSelection = Selected;
//MaxIndex, MaxScroll, MaxVisible are indexes, 0..N-1 //MaxIndex, MaxScroll, MaxVisible are indexes, 0..N-1
State->MaxIndex = (INTN)MaxCount - 1; ScrollState->MaxIndex = (INTN)MaxCount - 1;
State->MaxScroll = ItemCount - 1; ScrollState->MaxScroll = ItemCount - 1;
if (VisibleSpace == 0) { if (VisibleSpace == 0) {
State->MaxVisible = State->MaxScroll; ScrollState->MaxVisible = ScrollState->MaxScroll;
} else { } else {
State->MaxVisible = (INTN)VisibleSpace - 1; ScrollState->MaxVisible = (INTN)VisibleSpace - 1;
} }
if (State->MaxVisible >= ItemCount) { if (ScrollState->MaxVisible >= ItemCount) {
State->MaxVisible = ItemCount - 1; ScrollState->MaxVisible = ItemCount - 1;
} }
State->MaxFirstVisible = State->MaxScroll - State->MaxVisible; ScrollState->MaxFirstVisible = ScrollState->MaxScroll - ScrollState->MaxVisible;
CONSTRAIN_MIN(State->MaxFirstVisible, 0); CONSTRAIN_MIN(ScrollState->MaxFirstVisible, 0);
State->FirstVisible = MIN(Selected, State->MaxFirstVisible); ScrollState->FirstVisible = MIN(Selected, ScrollState->MaxFirstVisible);
State->IsScrolling = (State->MaxFirstVisible > 0); ScrollState->IsScrolling = (ScrollState->MaxFirstVisible > 0);
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->PaintSelection = FALSE; ScrollState->PaintSelection = FALSE;
State->LastVisible = State->FirstVisible + State->MaxVisible; ScrollState->LastVisible = ScrollState->FirstVisible + ScrollState->MaxVisible;
} }
static VOID UpdateScroll(IN OUT SCROLL_STATE *State, IN UINTN Movement) VOID REFIT_MENU_SCREEN::UpdateScroll(IN UINTN Movement)
{ {
INTN Lines; INTN Lines;
UINTN ScrollMovement = SCROLL_SCROLL_DOWN; UINTN ScrollMovement = SCROLL_SCROLL_DOWN;
INTN i; INTN i;
State->LastSelection = State->CurrentSelection; ScrollState->LastSelection = ScrollState->CurrentSelection;
switch (Movement) { switch (Movement) {
case SCROLL_SCROLLBAR_MOVE: case SCROLL_SCROLLBAR_MOVE:
ScrollbarYMovement += ScrollbarNewPointerPlace.YPos - ScrollbarOldPointerPlace.YPos; ScrollbarYMovement += ScrollbarNewPointerPlace.YPos - ScrollbarOldPointerPlace.YPos;
ScrollbarOldPointerPlace.XPos = ScrollbarNewPointerPlace.XPos; ScrollbarOldPointerPlace.XPos = ScrollbarNewPointerPlace.XPos;
ScrollbarOldPointerPlace.YPos = ScrollbarNewPointerPlace.YPos; ScrollbarOldPointerPlace.YPos = ScrollbarNewPointerPlace.YPos;
Lines = ScrollbarYMovement * State->MaxIndex / ScrollbarBackground.Height; Lines = ScrollbarYMovement * ScrollState->MaxIndex / ScrollbarBackground.Height;
ScrollbarYMovement = ScrollbarYMovement - Lines * (State->MaxVisible * TextHeight - 16 - 1) / State->MaxIndex; ScrollbarYMovement = ScrollbarYMovement - Lines * (ScrollState->MaxVisible * TextHeight - 16 - 1) / ScrollState->MaxIndex;
if (Lines < 0) { if (Lines < 0) {
Lines = -Lines; Lines = -Lines;
ScrollMovement = SCROLL_SCROLL_UP; ScrollMovement = SCROLL_SCROLL_UP;
} }
for (i = 0; i < Lines; i++) for (i = 0; i < Lines; i++)
UpdateScroll(State, ScrollMovement); UpdateScroll(ScrollMovement);
break; break;
case SCROLL_LINE_UP: //of left = decrement case SCROLL_LINE_UP: //of left = decrement
if (State->CurrentSelection > 0) { if (ScrollState->CurrentSelection > 0) {
State->CurrentSelection --; ScrollState->CurrentSelection --;
if (State->CurrentSelection < State->FirstVisible) { if (ScrollState->CurrentSelection < ScrollState->FirstVisible) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = State->CurrentSelection; ScrollState->FirstVisible = ScrollState->CurrentSelection;
} }
if (State->CurrentSelection == State->MaxScroll) { if (ScrollState->CurrentSelection == ScrollState->MaxScroll) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
} }
if ((State->CurrentSelection < State->MaxScroll) && if ((ScrollState->CurrentSelection < ScrollState->MaxScroll) &&
(State->CurrentSelection > State->LastVisible)) { (ScrollState->CurrentSelection > ScrollState->LastVisible)) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->LastVisible = State->CurrentSelection; ScrollState->LastVisible = ScrollState->CurrentSelection;
State->FirstVisible = State->LastVisible - State->MaxVisible; ScrollState->FirstVisible = ScrollState->LastVisible - ScrollState->MaxVisible;
} }
} }
break; break;
case SCROLL_LINE_DOWN: //or right -- increment case SCROLL_LINE_DOWN: //or right -- increment
if (State->CurrentSelection < State->MaxIndex) { if (ScrollState->CurrentSelection < ScrollState->MaxIndex) {
State->CurrentSelection++; ScrollState->CurrentSelection++;
if ((State->CurrentSelection > State->LastVisible) && if ((ScrollState->CurrentSelection > ScrollState->LastVisible) &&
(State->CurrentSelection <= State->MaxScroll)){ (ScrollState->CurrentSelection <= ScrollState->MaxScroll)){
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible++; ScrollState->FirstVisible++;
CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); CONSTRAIN_MAX(ScrollState->FirstVisible, ScrollState->MaxFirstVisible);
} }
if (State->CurrentSelection == State->MaxScroll + 1) { if (ScrollState->CurrentSelection == ScrollState->MaxScroll + 1) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
} }
} }
break; break;
case SCROLL_SCROLL_DOWN: case SCROLL_SCROLL_DOWN:
if (State->FirstVisible < State->MaxFirstVisible) { if (ScrollState->FirstVisible < ScrollState->MaxFirstVisible) {
if (State->CurrentSelection == State->FirstVisible) if (ScrollState->CurrentSelection == ScrollState->FirstVisible)
State->CurrentSelection++; ScrollState->CurrentSelection++;
State->FirstVisible++; ScrollState->FirstVisible++;
State->LastVisible++; ScrollState->LastVisible++;
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
} }
break; break;
case SCROLL_SCROLL_UP: case SCROLL_SCROLL_UP:
if (State->FirstVisible > 0) { if (ScrollState->FirstVisible > 0) {
if (State->CurrentSelection == State->LastVisible) if (ScrollState->CurrentSelection == ScrollState->LastVisible)
State->CurrentSelection--; ScrollState->CurrentSelection--;
State->FirstVisible--; ScrollState->FirstVisible--;
State->LastVisible--; ScrollState->LastVisible--;
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
} }
break; break;
case SCROLL_PAGE_UP: case SCROLL_PAGE_UP:
if (State->CurrentSelection > 0) { if (ScrollState->CurrentSelection > 0) {
if (State->CurrentSelection == State->MaxIndex) { // currently at last entry, special treatment if (ScrollState->CurrentSelection == ScrollState->MaxIndex) { // currently at last entry, special treatment
if (State->IsScrolling) if (ScrollState->IsScrolling)
State->CurrentSelection -= State->MaxVisible - 1; // move to second line without scrolling ScrollState->CurrentSelection -= ScrollState->MaxVisible - 1; // move to second line without scrolling
else else
State->CurrentSelection = 0; // move to first entry ScrollState->CurrentSelection = 0; // move to first entry
} else { } else {
if (State->FirstVisible > 0) if (ScrollState->FirstVisible > 0)
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->CurrentSelection -= State->MaxVisible; // move one page and scroll synchronously ScrollState->CurrentSelection -= ScrollState->MaxVisible; // move one page and scroll synchronously
State->FirstVisible -= State->MaxVisible; ScrollState->FirstVisible -= ScrollState->MaxVisible;
} }
CONSTRAIN_MIN(State->CurrentSelection, 0); CONSTRAIN_MIN(ScrollState->CurrentSelection, 0);
CONSTRAIN_MIN(State->FirstVisible, 0); CONSTRAIN_MIN(ScrollState->FirstVisible, 0);
if (State->CurrentSelection < State->FirstVisible) { if (ScrollState->CurrentSelection < ScrollState->FirstVisible) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = State->CurrentSelection; ScrollState->FirstVisible = ScrollState->CurrentSelection;
} }
} }
break; break;
case SCROLL_PAGE_DOWN: case SCROLL_PAGE_DOWN:
if (State->CurrentSelection < State->MaxIndex) { if (ScrollState->CurrentSelection < ScrollState->MaxIndex) {
if (State->CurrentSelection == 0) { // currently at first entry, special treatment if (ScrollState->CurrentSelection == 0) { // currently at first entry, special treatment
if (State->IsScrolling) if (ScrollState->IsScrolling)
State->CurrentSelection += State->MaxVisible - 1; // move to second-to-last line without scrolling ScrollState->CurrentSelection += ScrollState->MaxVisible - 1; // move to second-to-last line without scrolling
else else
State->CurrentSelection = State->MaxIndex; // move to last entry ScrollState->CurrentSelection = ScrollState->MaxIndex; // move to last entry
} else { } else {
if (State->FirstVisible < State->MaxFirstVisible) if (ScrollState->FirstVisible < ScrollState->MaxFirstVisible)
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->CurrentSelection += State->MaxVisible; // move one page and scroll synchronously ScrollState->CurrentSelection += ScrollState->MaxVisible; // move one page and scroll synchronously
State->FirstVisible += State->MaxVisible; ScrollState->FirstVisible += ScrollState->MaxVisible;
} }
CONSTRAIN_MAX(State->CurrentSelection, State->MaxIndex); CONSTRAIN_MAX(ScrollState->CurrentSelection, ScrollState->MaxIndex);
CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); CONSTRAIN_MAX(ScrollState->FirstVisible, ScrollState->MaxFirstVisible);
if ((State->CurrentSelection > State->LastVisible) && if ((ScrollState->CurrentSelection > ScrollState->LastVisible) &&
(State->CurrentSelection <= State->MaxScroll)){ (ScrollState->CurrentSelection <= ScrollState->MaxScroll)){
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible+= State->MaxVisible; ScrollState->FirstVisible+= ScrollState->MaxVisible;
CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); CONSTRAIN_MAX(ScrollState->FirstVisible, ScrollState->MaxFirstVisible);
} }
} }
break; break;
case SCROLL_FIRST: case SCROLL_FIRST:
if (State->CurrentSelection > 0) { if (ScrollState->CurrentSelection > 0) {
State->CurrentSelection = 0; ScrollState->CurrentSelection = 0;
if (State->FirstVisible > 0) { if (ScrollState->FirstVisible > 0) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = 0; ScrollState->FirstVisible = 0;
} }
} }
break; break;
case SCROLL_LAST: case SCROLL_LAST:
if (State->CurrentSelection < State->MaxIndex) { if (ScrollState->CurrentSelection < ScrollState->MaxIndex) {
State->CurrentSelection = State->MaxIndex; ScrollState->CurrentSelection = ScrollState->MaxIndex;
if (State->FirstVisible < State->MaxFirstVisible) { if (ScrollState->FirstVisible < ScrollState->MaxFirstVisible) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = State->MaxFirstVisible; ScrollState->FirstVisible = ScrollState->MaxFirstVisible;
} }
} }
break; break;
@ -2127,29 +2127,43 @@ static VOID UpdateScroll(IN OUT SCROLL_STATE *State, IN UINTN Movement)
case SCROLL_NONE: case SCROLL_NONE:
// The caller has already updated CurrentSelection, but we may // The caller has already updated CurrentSelection, but we may
// have to scroll to make it visible. // have to scroll to make it visible.
if (State->CurrentSelection < State->FirstVisible) { if (ScrollState->CurrentSelection < ScrollState->FirstVisible) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = State->CurrentSelection; // - (State->MaxVisible >> 1); ScrollState->FirstVisible = ScrollState->CurrentSelection; // - (ScrollState->MaxVisible >> 1);
CONSTRAIN_MIN(State->FirstVisible, 0); CONSTRAIN_MIN(ScrollState->FirstVisible, 0);
} else if ((State->CurrentSelection > State->LastVisible) && } else if ((ScrollState->CurrentSelection > ScrollState->LastVisible) &&
(State->CurrentSelection <= State->MaxScroll)) { (ScrollState->CurrentSelection <= ScrollState->MaxScroll)) {
State->PaintAll = TRUE; ScrollState->PaintAll = TRUE;
State->FirstVisible = State->CurrentSelection - State->MaxVisible; ScrollState->FirstVisible = ScrollState->CurrentSelection - ScrollState->MaxVisible;
CONSTRAIN_MAX(State->FirstVisible, State->MaxFirstVisible); CONSTRAIN_MAX(ScrollState->FirstVisible, ScrollState->MaxFirstVisible);
} }
break; break;
} }
if (!State->PaintAll && State->CurrentSelection != State->LastSelection) if (!ScrollState->PaintAll && ScrollState->CurrentSelection != ScrollState->LastSelection)
State->PaintSelection = TRUE; ScrollState->PaintSelection = TRUE;
State->LastVisible = State->FirstVisible + State->MaxVisible; ScrollState->LastVisible = ScrollState->FirstVisible + ScrollState->MaxVisible;
//ycr.ru //ycr.ru
if ((State->PaintAll) && (Movement != SCROLL_NONE)) if ((ScrollState->PaintAll) && (Movement != SCROLL_NONE))
HidePointer(); HidePointer();
} }
VOID REFIT_MENU_SCREEN::HidePointer()
{
mPointer->Hide();
}
EFI_STATUS REFIT_MENU_SCREEN::MouseBirth();
{
return mPointer->MouseBirth();
}
VOID REFIT_MENU_SCREEN::KillMouse()
{
mPointer->KillMouse();
}
// //
// menu helper functions // menu helper functions
// //
@ -2229,7 +2243,7 @@ static INTN FindMenuShortcutEntry(IN REFIT_MENU_SCREEN *Screen, IN CHAR16 Shortc
// generic input menu function // generic input menu function
// usr-sse2 // usr-sse2
// //
static UINTN InputDialog(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc, IN SCROLL_STATE *State) static UINTN InputDialog(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc)
{ {
if ( !Screen->Entries[State->CurrentSelection].getREFIT_MENU_ITEM_IEM_ABSTRACT() ) { if ( !Screen->Entries[State->CurrentSelection].getREFIT_MENU_ITEM_IEM_ABSTRACT() ) {
DebugLog(2, "BUG : InputDialog called with !Screen->Entries[State->CurrentSelection].REFIT_MENU_ITEM_IEM_ABSTRACT()\n"); DebugLog(2, "BUG : InputDialog called with !Screen->Entries[State->CurrentSelection].REFIT_MENU_ITEM_IEM_ABSTRACT()\n");
@ -2405,8 +2419,8 @@ static UINTN InputDialog(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Style
} }
} }
// Redraw the field // Redraw the field
(Screen->Entries[State->CurrentSelection]).Row = Pos; (Screen->Entries[Screen->ScrollState->CurrentSelection]).Row = Pos;
StyleFunc(Screen, State, MENU_FUNCTION_PAINT_SELECTION, NULL); StyleFunc(Screen, MENU_FUNCTION_PAINT_SELECTION, NULL);
} while (!MenuExit); } while (!MenuExit);
switch (MenuExit) { switch (MenuExit) {
@ -2420,9 +2434,9 @@ static UINTN InputDialog(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Style
UnicodeSPrint(Item->SValue, SVALUE_MAX_SIZE, L"%s", Backup); UnicodeSPrint(Item->SValue, SVALUE_MAX_SIZE, L"%s", Backup);
if (Item->ItemType != BoolValue) { if (Item->ItemType != BoolValue) {
Item->LineShift = BackupShift; Item->LineShift = BackupShift;
(Screen->Entries[State->CurrentSelection]).Row = BackupPos; (Screen->Entries[Screen->ScrollState->CurrentSelection]).Row = BackupPos;
} }
StyleFunc(Screen, State, MENU_FUNCTION_PAINT_SELECTION, NULL); StyleFunc(Screen, MENU_FUNCTION_PAINT_SELECTION, NULL);
} }
break; break;
} }
@ -2437,7 +2451,7 @@ static UINTN InputDialog(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC Style
UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc, IN OUT INTN *DefaultEntryIndex, OUT REFIT_ABSTRACT_MENU_ENTRY **ChosenEntry) UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc, IN OUT INTN *DefaultEntryIndex, OUT REFIT_ABSTRACT_MENU_ENTRY **ChosenEntry)
{ {
SCROLL_STATE State; // SCROLL_STATE State;
EFI_STATUS Status; EFI_STATUS Status;
EFI_INPUT_KEY key; EFI_INPUT_KEY key;
// UINTN Index; // UINTN Index;
@ -2481,12 +2495,12 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
} }
MenuExit = 0; MenuExit = 0;
StyleFunc(Screen, &State, MENU_FUNCTION_INIT, NULL); StyleFunc(Screen, MENU_FUNCTION_INIT, NULL);
// DBG("scroll inited\n"); // DBG("scroll inited\n");
// override the starting selection with the default index, if any // override the starting selection with the default index, if any
if (*DefaultEntryIndex >= 0 && *DefaultEntryIndex <= State.MaxIndex) { if (*DefaultEntryIndex >= 0 && *DefaultEntryIndex <= Screen->ScrollState.MaxIndex) {
State.CurrentSelection = *DefaultEntryIndex; Screen->ScrollState.CurrentSelection = *DefaultEntryIndex;
UpdateScroll(&State, SCROLL_NONE); Screen->UpdateScroll(SCROLL_NONE);
} }
// DBG("RunGenericMenu CurrentSelection=%d MenuExit=%d\n", // DBG("RunGenericMenu CurrentSelection=%d MenuExit=%d\n",
// State.CurrentSelection, MenuExit); // State.CurrentSelection, MenuExit);
@ -2496,23 +2510,23 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
while (ReadAllKeyStrokes()) gBS->Stall(500 * 1000); while (ReadAllKeyStrokes()) gBS->Stall(500 * 1000);
while (!MenuExit) { while (!MenuExit) {
// update the screen // update the screen
if (State.PaintAll) { if (Screen->ScrollState.PaintAll) {
StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_ALL, NULL); StyleFunc(Screen, MENU_FUNCTION_PAINT_ALL, NULL);
State.PaintAll = FALSE; Screen->ScrollState.PaintAll = FALSE;
} else if (State.PaintSelection) { } else if (Screen->ScrollState.PaintSelection) {
StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_SELECTION, NULL); StyleFunc(Screen, MENU_FUNCTION_PAINT_SELECTION, NULL);
State.PaintSelection = FALSE; Screen->ScrollState.PaintSelection = FALSE;
} }
if (HaveTimeout) { if (HaveTimeout) {
TimeoutMessage = PoolPrint(L"%s in %d seconds", Screen->TimeoutText, TimeoutCountdown); TimeoutMessage = PoolPrint(L"%s in %d seconds", Screen->TimeoutText, TimeoutCountdown);
StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_TIMEOUT, TimeoutMessage); StyleFunc(Screen, MENU_FUNCTION_PAINT_TIMEOUT, TimeoutMessage);
FreePool(TimeoutMessage); FreePool(TimeoutMessage);
} }
if (gEvent) { //for now used at CD eject. if (gEvent) { //for now used at CD eject.
MenuExit = MENU_EXIT_ESCAPE; MenuExit = MENU_EXIT_ESCAPE;
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
gEvent = 0; //to prevent looping gEvent = 0; //to prevent looping
break; break;
} }
@ -2537,23 +2551,23 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
continue; continue;
} }
switch (gAction) { switch (Screen->mAction) {
case ActionSelect: case ActionSelect:
State.LastSelection = State.CurrentSelection; Screen->ScrollState.LastSelection = Screen->ScrollState.CurrentSelection;
State.CurrentSelection = gItemID; Screen->ScrollState.CurrentSelection = Screen->mItemID;
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
HidePointer(); Screen->HidePointer();
break; break;
case ActionEnter: case ActionEnter:
State.LastSelection = State.CurrentSelection; Screen->ScrollState.LastSelection = Screen->ScrollState.CurrentSelection;
State.CurrentSelection = gItemID; Screen->ScrollState.CurrentSelection = Screen->mItemID;
if ( Screen->Entries[gItemID].getREFIT_INPUT_DIALOG() || Screen->Entries[gItemID].getREFIT_MENU_CHECKBIT() ) { if ( Screen->Entries[Screen->mItemID].getREFIT_INPUT_DIALOG() || Screen->Entries[Screen->mItemID].getREFIT_MENU_CHECKBIT() ) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
} else if (Screen->Entries[gItemID].getREFIT_MENU_SWITCH()) { } else if (Screen->Entries[Screen->mItemID].getREFIT_MENU_SWITCH()) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
HidePointer(); Screen->HidePointer();
} else if (!Screen->Entries[gItemID].getREFIT_INFO_DIALOG()) { } else if (!Screen->Entries[Screen->mItemID].getREFIT_INFO_DIALOG()) {
MenuExit = MENU_EXIT_ENTER; MenuExit = MENU_EXIT_ENTER;
} }
break; break;
@ -2561,41 +2575,41 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
MenuExit = MENU_EXIT_HELP; MenuExit = MENU_EXIT_HELP;
break; break;
case ActionOptions: case ActionOptions:
State.LastSelection = State.CurrentSelection; Screen->ScrollState.LastSelection = Screen->ScrollState.CurrentSelection;
State.CurrentSelection = gItemID; Screen->ScrollState.CurrentSelection = Screen->mItemID;
MenuExit = MENU_EXIT_OPTIONS; MenuExit = MENU_EXIT_OPTIONS;
break; break;
case ActionDetails: case ActionDetails:
State.LastSelection = State.CurrentSelection; Screen->ScrollState.LastSelection = Screen->ScrollState.CurrentSelection;
// Index = State.CurrentSelection; // Index = State.CurrentSelection;
State.CurrentSelection = gItemID; Screen->ScrollState.CurrentSelection = Screen->mItemID;
if ((Screen->Entries[gItemID].getREFIT_INPUT_DIALOG()) || if ((Screen->Entries[Screen->mItemID].getREFIT_INPUT_DIALOG()) ||
(Screen->Entries[gItemID].getREFIT_MENU_CHECKBIT())) { (Screen->Entries[Screen->mItemID].getREFIT_MENU_CHECKBIT())) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
} else if (Screen->Entries[gItemID].getREFIT_MENU_SWITCH()) { } else if (Screen->Entries[Screen->mItemID].getREFIT_MENU_SWITCH()) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
HidePointer(); Screen->HidePointer();
} else if (!Screen->Entries[gItemID].getREFIT_INFO_DIALOG()) { } else if (!Screen->Entries[Screen->mItemID].getREFIT_INFO_DIALOG()) {
MenuExit = MENU_EXIT_DETAILS; MenuExit = MENU_EXIT_DETAILS;
} }
break; break;
case ActionDeselect: case ActionDeselect:
State.LastSelection = State.CurrentSelection; Screen->ScrollState.LastSelection = Screen->ScrollState.CurrentSelection;
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
HidePointer(); Screen->HidePointer();
break; break;
case ActionFinish: case ActionFinish:
MenuExit = MENU_EXIT_ESCAPE; MenuExit = MENU_EXIT_ESCAPE;
break; break;
case ActionScrollDown: case ActionScrollDown:
UpdateScroll(&State, SCROLL_SCROLL_DOWN); Screen->UpdateScroll(SCROLL_SCROLL_DOWN);
break; break;
case ActionScrollUp: case ActionScrollUp:
UpdateScroll(&State, SCROLL_SCROLL_UP); Screen->UpdateScroll(SCROLL_SCROLL_UP);
break; break;
case ActionMoveScrollbar: case ActionMoveScrollbar:
UpdateScroll(&State, SCROLL_SCROLLBAR_MOVE); Screen->UpdateScroll(SCROLL_SCROLLBAR_MOVE);
break; break;
default: default:
break; break;
@ -2604,45 +2618,45 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
// read key press (and wait for it if applicable) // read key press (and wait for it if applicable)
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &key); Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &key);
if ((Status == EFI_NOT_READY) && (gAction == ActionNone)) { if ((Status == EFI_NOT_READY) && (Screen->mAction == ActionNone)) {
continue; continue;
} }
if (gAction == ActionNone) { if (Screen->mAction == ActionNone) {
ReadAllKeyStrokes(); //clean to avoid doubles ReadAllKeyStrokes(); //clean to avoid doubles
} }
if (HaveTimeout) { if (HaveTimeout) {
// the user pressed a key, cancel the timeout // the user pressed a key, cancel the timeout
StyleFunc(Screen, &State, MENU_FUNCTION_PAINT_TIMEOUT, L""); StyleFunc(Screen, MENU_FUNCTION_PAINT_TIMEOUT, L"");
HidePointer(); //ycr.ru Screen->HidePointer(); //ycr.ru
HaveTimeout = FALSE; HaveTimeout = FALSE;
} }
gAction = ActionNone; //do action once Screen->mAction = ActionNone; //do action once
// react to key press // react to key press
switch (key.ScanCode) { switch (key.ScanCode) {
case SCAN_UP: case SCAN_UP:
case SCAN_LEFT: case SCAN_LEFT:
UpdateScroll(&State, SCROLL_LINE_UP); Screen->UpdateScroll(SCROLL_LINE_UP);
break; break;
case SCAN_DOWN: case SCAN_DOWN:
case SCAN_RIGHT: case SCAN_RIGHT:
UpdateScroll(&State, SCROLL_LINE_DOWN); Screen->UpdateScroll(SCROLL_LINE_DOWN);
break; break;
case SCAN_HOME: case SCAN_HOME:
UpdateScroll(&State, SCROLL_FIRST); Screen->UpdateScroll(SCROLL_FIRST);
break; break;
case SCAN_END: case SCAN_END:
UpdateScroll(&State, SCROLL_LAST); Screen->UpdateScroll(SCROLL_LAST);
break; break;
case SCAN_PAGE_UP: case SCAN_PAGE_UP:
UpdateScroll(&State, SCROLL_PAGE_UP); Screen->UpdateScroll(SCROLL_PAGE_UP);
// SetNextScreenMode(1); // SetNextScreenMode(1);
StyleFunc(Screen, &State, MENU_FUNCTION_INIT, NULL); StyleFunc(Screen, MENU_FUNCTION_INIT, NULL);
break; break;
case SCAN_PAGE_DOWN: case SCAN_PAGE_DOWN:
UpdateScroll(&State, SCROLL_PAGE_DOWN); Screen->UpdateScroll(&State, SCROLL_PAGE_DOWN);
// SetNextScreenMode(-1); // SetNextScreenMode(-1);
StyleFunc(Screen, &State, MENU_FUNCTION_INIT, NULL); StyleFunc(Screen, MENU_FUNCTION_INIT, NULL);
break; break;
case SCAN_ESC: case SCAN_ESC:
MenuExit = MENU_EXIT_ESCAPE; MenuExit = MENU_EXIT_ESCAPE;
@ -2722,27 +2736,27 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
switch (key.UnicodeChar) { switch (key.UnicodeChar) {
case CHAR_LINEFEED: case CHAR_LINEFEED:
case CHAR_CARRIAGE_RETURN: case CHAR_CARRIAGE_RETURN:
if ((Screen->Entries[State.CurrentSelection].getREFIT_INPUT_DIALOG()) || if ((Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_INPUT_DIALOG()) ||
(Screen->Entries[State.CurrentSelection].getREFIT_MENU_CHECKBIT())) { (Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_MENU_CHECKBIT())) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
} else if (Screen->Entries[State.CurrentSelection].getREFIT_MENU_SWITCH()){ } else if (Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_MENU_SWITCH()){
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
State.PaintAll = TRUE; State.PaintAll = TRUE;
} else if (Screen->Entries[State.CurrentSelection].getREFIT_MENU_ENTRY_CLOVER()){ } else if (Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_MENU_ENTRY_CLOVER()){
MenuExit = MENU_EXIT_DETAILS; MenuExit = MENU_EXIT_DETAILS;
} else if (!Screen->Entries[State.CurrentSelection].getREFIT_INFO_DIALOG()) { } else if (!Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_INFO_DIALOG()) {
MenuExit = MENU_EXIT_ENTER; MenuExit = MENU_EXIT_ENTER;
} }
break; break;
case ' ': //CHAR_SPACE case ' ': //CHAR_SPACE
if ((Screen->Entries[State.CurrentSelection].getREFIT_INPUT_DIALOG()) || if ((Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_INPUT_DIALOG()) ||
(Screen->Entries[State.CurrentSelection].getREFIT_MENU_CHECKBIT())) { (Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_MENU_CHECKBIT())) {
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
} else if (Screen->Entries[State.CurrentSelection].getREFIT_MENU_SWITCH()){ } else if (Screen->Entries[State.CurrentSelection].getREFIT_MENU_SWITCH()){
MenuExit = InputDialog(Screen, StyleFunc, &State); MenuExit = InputDialog(Screen, StyleFunc);
State.PaintAll = TRUE; Screen->ScrollState.PaintAll = TRUE;
HidePointer(); Screen->HidePointer();
} else if (!Screen->Entries[State.CurrentSelection].getREFIT_INFO_DIALOG()) { } else if (!Screen->Entries[Screen->ScrollState.CurrentSelection].getREFIT_INFO_DIALOG()) {
MenuExit = MENU_EXIT_DETAILS; MenuExit = MENU_EXIT_DETAILS;
} }
break; break;
@ -2750,20 +2764,20 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
default: default:
ShortcutEntry = FindMenuShortcutEntry(Screen, key.UnicodeChar); ShortcutEntry = FindMenuShortcutEntry(Screen, key.UnicodeChar);
if (ShortcutEntry >= 0) { if (ShortcutEntry >= 0) {
State.CurrentSelection = ShortcutEntry; Screen->ScrollState.CurrentSelection = ShortcutEntry;
MenuExit = MENU_EXIT_ENTER; MenuExit = MENU_EXIT_ENTER;
} }
break; break;
} }
} }
StyleFunc(Screen, &State, MENU_FUNCTION_CLEANUP, NULL); StyleFunc(Screen, MENU_FUNCTION_CLEANUP, NULL);
if (ChosenEntry) { if (ChosenEntry) {
*ChosenEntry = &Screen->Entries[State.CurrentSelection]; *ChosenEntry = &Screen->Entries[Screen->ScrollState.CurrentSelection];
} }
*DefaultEntryIndex = State.CurrentSelection; *DefaultEntryIndex = Screen->ScrollState.CurrentSelection;
return MenuExit; return MenuExit;
} }
@ -2771,7 +2785,7 @@ UINTN RunGenericMenu(IN REFIT_MENU_SCREEN *Screen, IN MENU_STYLE_FUNC StyleFunc,
/** /**
* Text Mode menu. * Text Mode menu.
*/ */
static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CONST CHAR16 *ParamText) static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN UINTN Function, IN CONST CHAR16 *ParamText)
{ {
INTN i = 0, j = 0; INTN i = 0, j = 0;
static UINTN TextMenuWidth = 0,ItemWidth = 0, MenuHeight = 0; static UINTN TextMenuWidth = 0,ItemWidth = 0, MenuHeight = 0;
@ -2797,11 +2811,11 @@ static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
MenuHeight -= 2; MenuHeight -= 2;
} }
InitScroll(State, Screen->Entries.size(), Screen->Entries.size(), MenuHeight, 0); InitScroll(Screen->ScrollState, Screen->Entries.size(), Screen->Entries.size(), MenuHeight, 0);
// determine width of the menu // determine width of the menu
TextMenuWidth = 50; // minimum TextMenuWidth = 50; // minimum
for (i = 0; i <= State->MaxIndex; i++) { for (i = 0; i <= Screen->ScrollState->MaxIndex; i++) {
ItemWidth = StrLen(Screen->Entries[i].Title); ItemWidth = StrLen(Screen->Entries[i].Title);
if (TextMenuWidth < ItemWidth) { if (TextMenuWidth < ItemWidth) {
@ -2853,7 +2867,7 @@ static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
for (i = State->FirstVisible; i <= State->LastVisible && i <= State->MaxIndex; i++) { for (i = State->FirstVisible; i <= State->LastVisible && i <= State->MaxIndex; i++) {
gST->ConOut->SetCursorPosition (gST->ConOut, 2, MenuPosY + (i - State->FirstVisible)); gST->ConOut->SetCursorPosition (gST->ConOut, 2, MenuPosY + (i - State->FirstVisible));
if (i == State->CurrentSelection) { if (i == Screen->ScrollState->CurrentSelection) {
gST->ConOut->SetAttribute (gST->ConOut, ATTR_CHOICE_CURRENT); gST->ConOut->SetAttribute (gST->ConOut, ATTR_CHOICE_CURRENT);
} else { } else {
gST->ConOut->SetAttribute (gST->ConOut, ATTR_CHOICE_BASIC); gST->ConOut->SetAttribute (gST->ConOut, ATTR_CHOICE_BASIC);
@ -3441,7 +3455,7 @@ VOID ScrollingBar(IN SCROLL_STATE *State)
/** /**
* Graphical menu. * Graphical menu.
*/ */
VOID GraphicsMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CONST CHAR16 *ParamText) VOID GraphicsMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN UINTN Function, IN CONST CHAR16 *ParamText)
{ {
INTN i; INTN i;
INTN j = 0; INTN j = 0;
@ -3457,7 +3471,7 @@ VOID GraphicsMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN
// clovy // clovy
INTN ctrlX, ctrlY, ctrlTextX; INTN ctrlX, ctrlY, ctrlTextX;
HidePointer(); Screen->HidePointer();
switch (Function) { switch (Function) {
@ -3536,7 +3550,7 @@ VOID GraphicsMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN
break; break;
case MENU_FUNCTION_CLEANUP: case MENU_FUNCTION_CLEANUP:
HidePointer(); Screen->HidePointer();
break; break;
case MENU_FUNCTION_PAINT_ALL: case MENU_FUNCTION_PAINT_ALL:
@ -4065,7 +4079,7 @@ VOID MainMenuVerticalStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
itemPosX = NULL; itemPosX = NULL;
FreePool(itemPosY); FreePool(itemPosY);
itemPosY = NULL; itemPosY = NULL;
HidePointer(); Screen->HidePointer();
break; break;
case MENU_FUNCTION_PAINT_ALL: case MENU_FUNCTION_PAINT_ALL:
@ -4094,7 +4108,7 @@ VOID MainMenuVerticalStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
break; break;
case MENU_FUNCTION_PAINT_SELECTION: case MENU_FUNCTION_PAINT_SELECTION:
HidePointer(); Screen->HidePointer();
if (Screen->Entries[State->LastSelection].Row == 0) { if (Screen->Entries[State->LastSelection].Row == 0) {
DrawMainMenuEntry(&Screen->Entries[State->LastSelection], FALSE, DrawMainMenuEntry(&Screen->Entries[State->LastSelection], FALSE,
itemPosX[State->LastSelection - State->FirstVisible], itemPosX[State->LastSelection - State->FirstVisible],
@ -4127,7 +4141,7 @@ VOID MainMenuVerticalStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
case MENU_FUNCTION_PAINT_TIMEOUT: case MENU_FUNCTION_PAINT_TIMEOUT:
i = (GlobalConfig.HideBadges & HDBADGES_INLINE)?3:1; i = (GlobalConfig.HideBadges & HDBADGES_INLINE)?3:1;
HidePointer(); Screen->HidePointer();
if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)){ if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)){
FillRectAreaOfScreen((UGAWidth >> 1), textPosY + MessageHeight * i, FillRectAreaOfScreen((UGAWidth >> 1), textPosY + MessageHeight * i,
OldTimeoutTextWidth, TextHeight, &MenuBackgroundPixel, X_IS_CENTER); OldTimeoutTextWidth, TextHeight, &MenuBackgroundPixel, X_IS_CENTER);
@ -4142,7 +4156,7 @@ VOID MainMenuVerticalStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
/** /**
* Main screen text. * Main screen text.
*/ */
VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINTN Function, IN CONST CHAR16 *ParamText) VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN UINTN Function, IN CONST CHAR16 *ParamText)
{ {
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
INTN i = 0; INTN i = 0;
@ -4233,7 +4247,7 @@ VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINT
case MENU_FUNCTION_CLEANUP: case MENU_FUNCTION_CLEANUP:
FreePool(itemPosX); FreePool(itemPosX);
itemPosX = NULL; itemPosX = NULL;
HidePointer(); Screen->HidePointer();
break; break;
case MENU_FUNCTION_PAINT_ALL: case MENU_FUNCTION_PAINT_ALL:
@ -4294,7 +4308,7 @@ VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINT
break; break;
case MENU_FUNCTION_PAINT_SELECTION: case MENU_FUNCTION_PAINT_SELECTION:
HidePointer(); Screen->HidePointer();
if (Screen->Entries[State->LastSelection].Row == 0) { if (Screen->Entries[State->LastSelection].Row == 0) {
DrawMainMenuEntry(&Screen->Entries[State->LastSelection], FALSE, DrawMainMenuEntry(&Screen->Entries[State->LastSelection], FALSE,
itemPosX[State->LastSelection - State->FirstVisible], row0PosY); itemPosX[State->LastSelection - State->FirstVisible], row0PosY);
@ -4335,7 +4349,7 @@ VOID MainMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State, IN UINT
case MENU_FUNCTION_PAINT_TIMEOUT: case MENU_FUNCTION_PAINT_TIMEOUT:
i = (GlobalConfig.HideBadges & HDBADGES_INLINE)?3:1; i = (GlobalConfig.HideBadges & HDBADGES_INLINE)?3:1;
HidePointer(); Screen->HidePointer();
if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)){ if (!(GlobalConfig.HideUIFlags & HIDEUI_FLAG_LABEL)){
FillRectAreaOfScreen((UGAWidth >> 1), FunctextPosY + MessageHeight * i, FillRectAreaOfScreen((UGAWidth >> 1), FunctextPosY + MessageHeight * i,
OldTimeoutTextWidth, MessageHeight, &MenuBackgroundPixel, X_IS_CENTER); OldTimeoutTextWidth, MessageHeight, &MenuBackgroundPixel, X_IS_CENTER);