alder_lake_bios/Insyde/InsydeSetupPkg/Drivers/H2ODisplayEngineLocalMetroDxe/MetroUi.c

1293 lines
43 KiB
C

/** @file
Entry point and initial functions for H2O local Metro display engine driver
;******************************************************************************
;* Copyright (c) 2013 - 2021, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "H2ODisplayEngineLocalMetro.h"
#include "UiControls.h"
#include "H2OControls.h"
#include "H2OPanels.h"
#include "H2ODialogs.h"
#include "StatementControls.h"
#include "MetroUi.h"
#include <Guid/ZeroGuid.h>
extern H2O_DISPLAY_ENGINE_METRO_PRIVATE_DATA *mMetroPrivate;
extern HWND gLastFocus;
H2O_LAYOUT_INFO *mLayoutInfo = NULL;
EFI_INPUT_KEY mPrivateHotKeyList[] = {{SCAN_NULL , CHAR_CARRIAGE_RETURN},
{SCAN_UP , CHAR_NULL},
{SCAN_DOWN , CHAR_NULL},
{SCAN_RIGHT, CHAR_NULL},
{SCAN_LEFT , CHAR_NULL},
{SCAN_ESC , CHAR_NULL},
};
typedef struct _DISPLAY_ENGINE_FRAME DISPLAY_ENGINE_FRAME;
struct _DISPLAY_ENGINE_FRAME {
UI_FRAME Frame;
UI_CONTROL *H2OSetupMenuPanel;
UI_CONTROL *H2OSetupPagePanel;
UI_CONTROL *H2OFormTitlePanel;
UI_CONTROL *H2OHelpTextPanel;
UI_CONTROL *H2OHotkeyPanel;
UI_CONTROL *H2OOwnerDrawPanel;
UI_CONTROL **VfcfPanelControlList;
UINTN VfcfPanelControlCount;
};
typedef struct _PANEL_VFCF_DATA {
CHAR16 *PanelName;
UINT32 PanelId;
} PANEL_VFCF_DATA;
PANEL_VFCF_DATA mPanelVfcfData[] = {
{L"H2OOwnerDrawPanel", OWNER_DRAW_PANEL_ID},
{L"H2OSetupMenuPanel", SETUP_MENU_PANEL_ID},
{L"H2OFormTitlePanel", TITLE_PANEL_ID},
{L"H2OSetupPagePanel", SETUP_PAGE_PANEL_ID},
{L"H2OHelpTextPanel" , HELP_TEXT_PANEL_ID},
{L"H2OHotkeyPanel" , HOTKEY_PANEL_ID},
{NULL, 0},
};
typedef struct _DISPLAY_ENGINE_FRAME_CLASS {
UI_FRAME_CLASS ParentClass;
} DISPLAY_ENGINE_FRAME_CLASS;
STATIC DISPLAY_ENGINE_FRAME_CLASS *mDisplayEngineFrameClass = NULL;
#define CURRENT_CLASS mDisplayEngineFrameClass
DISPLAY_ENGINE_FRAME_CLASS *
EFIAPI
GetDisplayEngineFrameClass (
VOID
);
#if FixedPcdGet32(PcdH2OLmdeMultiLayout) == 0
CHAR16 *mDialogPanelChilds = L""
L"<VerticalLayout name='DialogPanel' background-color='0xFF000000'/>";
CHAR16 *mScreenPanelChilds = L""
L"<Control name='background' background-color='0xFF000000'>"
L"<Texture float='true' name='ContextBkg' background-color='0xFFE8E8E8'/>"
L"<H2OOwnerDrawPanel name='H2OOwnerDrawPanel' background-color='0xFF000000' RefreshInterval='100'/>"
L"<H2OSetupMenuPanel name='H2OSetupMenuPanel' background-color='0xFF000000'/>"
L"<H2OSetupPagePanel name='H2OSetupPagePanel' background-color='0x0'/>"
L"<H2OFormTitlePanel name='H2OFormTitlePanel' background-color='0x0'/>"
L"<H2OHelpTextPanel name='H2OHelpTextPanel' background-color='0x0'/>"
L"<H2OHotkeyPanel name='H2OHotkeyPanel' />"
//L"<Texture background-image='@FormHalo' float='true' name='FormHalo' scale9grid='23,26,22,31'/>"
L"<Texture name='overlay' float='true' visibility='false' height='-1' width='-1' background-color='0x80C8C8C8'/>"
L"</Control>";
#endif
EFI_STATUS
GetInformationField (
OUT RECT *InfoField
)
{
EFI_STATUS Status;
RECT SetupPagePanelField;
RECT HelpTextPanelField;
Status = GetRectByName (gWnd, L"H2OSetupPagePanel", &SetupPagePanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&SetupPagePanelField);
}
Status = GetRectByName (gWnd, L"H2OHelpTextPanel", &HelpTextPanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&HelpTextPanelField);
}
if ((SetupPagePanelField.left == SetupPagePanelField.right ||
SetupPagePanelField.top == SetupPagePanelField.bottom) &&
(HelpTextPanelField.left == HelpTextPanelField.right ||
HelpTextPanelField.top == HelpTextPanelField.bottom)){
//
// If two panels' fields are both empty, return screen field
//
InfoField->left = 0;
InfoField->top = 0;
InfoField->right = (INT32) GetSystemMetrics (SM_CXSCREEN);
InfoField->bottom = (INT32) GetSystemMetrics (SM_CYSCREEN);
return EFI_SUCCESS;
}
if (SetupPagePanelField.top == HelpTextPanelField.top &&
SetupPagePanelField.bottom == HelpTextPanelField.bottom) {
if (SetupPagePanelField.right == HelpTextPanelField.left ||
SetupPagePanelField.left == HelpTextPanelField.right) {
UnionRect (InfoField, &SetupPagePanelField, &HelpTextPanelField);
return EFI_SUCCESS;
}
} else if (SetupPagePanelField.left == HelpTextPanelField.left &&
SetupPagePanelField.right == HelpTextPanelField.right) {
if (SetupPagePanelField.bottom == HelpTextPanelField.top ||
SetupPagePanelField.top == HelpTextPanelField.bottom) {
UnionRect (InfoField, &SetupPagePanelField, &HelpTextPanelField);
return EFI_SUCCESS;
}
}
CopyRect (InfoField, &SetupPagePanelField);
return EFI_SUCCESS;
}
EFI_STATUS
DisableHalo (
IN DISPLAY_ENGINE_FRAME *This
)
{
UI_MANAGER *Manager;
UI_CONTROL *Control;
Manager = ((UI_CONTROL *) This)->Manager;
Control = Manager->FindControlByName (Manager, L"FormHalo");
if (Control == NULL) {
return EFI_NOT_FOUND;
}
UiSetAttribute (Control, L"visibility", L"false");
return EFI_SUCCESS;
}
UI_CONTROL *
CreateSubElementControl (
IN UI_CONTROL *Parent,
IN CHAR16 *SubElementName
)
{
UINTN NameLen;
if (SubElementName == NULL) {
return NULL;
}
NameLen = StrLen(SubElementName);
if (STR_MATCH(SubElementName, NameLen, L"form-title") ||
STR_MATCH(SubElementName, NameLen, L"formset-help") ||
STR_MATCH(SubElementName, NameLen, L"formset-title") ||
STR_MATCH(SubElementName, NameLen, L"help") ||
STR_MATCH(SubElementName, NameLen, L"prompt") ||
STR_MATCH(SubElementName, NameLen, L"text2") ||
STR_MATCH(SubElementName, NameLen, L"value") ||
PREFIX_STR_MATCH(SubElementName, NameLen, L"str")) {
return CreateAddControl (L"Label", Parent);
}
return CreateAddControl (L"Control", Parent);
}
VOID
SetSubElementSizeToWarpContent (
IN UI_CONTROL *Control
)
{
UI_CONTROL *Order;
UINTN Index;
UI_CONTROL *Child;
Order = CONTROL_CLASS(Control)->FindChildByName (Control, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Order == NULL) {
return;
}
for (Index = 0; Index < Order->ItemCount; Index++) {
if (!IS_CONTROL_WIDTH_DEFINED(Order->Items[Index])) {
UiSetAttribute (Order->Items[Index], L"width", L"wrap_content");
}
if (!IS_CONTROL_HEIGHT_DEFINED(Order->Items[Index])) {
UiSetAttribute (Order->Items[Index], L"height", L"wrap_content");
}
if (StrCmp (Order->Items[Index]->Name, L"container") == 0) {
Child = CONTROL_CLASS(Order->Items[Index])->FindChildByName (Order->Items[Index], VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Child == NULL) {
continue;
}
SetSubElementSizeToWarpContent (Child);
}
}
}
UI_CONTROL *
GetVfcfTargetControl (
IN UI_CONTROL **OrderList,
IN UINTN OrderCount,
IN OUT CHAR16 **PropertyName
)
{
UINTN OrderIndex;
UINTN ItemIndex;
UI_CONTROL *Order;
UI_CONTROL *Control;
UINTN Length;
CHAR16 *PropertyNameStrPtr;
if (OrderList == NULL || OrderCount == 0) {
return NULL;
}
PropertyNameStrPtr = *PropertyName;
for (OrderIndex = 0; OrderIndex < OrderCount; OrderIndex++) {
Order = OrderList[OrderIndex];
for (ItemIndex = 0; ItemIndex < Order->ItemCount; ItemIndex++) {
Control = Order->Items[ItemIndex];
if (Control->Name == NULL) {
continue;
}
Length = StrLen (Control->Name);
if (StrnCmp (Control->Name, PropertyNameStrPtr, Length) == 0 && PropertyNameStrPtr[Length] == '-') {
*PropertyName = &PropertyNameStrPtr[Length + 1];
return Control;
}
}
}
return NULL;
}
VOID
SetAttributeFromVfcf (
IN UI_CONTROL *Control,
IN H2O_PROPERTY_INFO **PropertyList,
IN UINTN PropertyCount,
IN RECT *ScreenField
)
{
UINTN PropertyIndex;
H2O_PROPERTY_INFO *Property;
H2O_PROPERTY_VALUE Value;
UINTN PropertyNameLen;
CHAR16 *PropertyName;
CHAR16 *AttrName;
CHAR16 NameStrBuf[50];
CHAR16 ValueStrBuf[50];
EFI_STATUS Status;
UI_CONTROL *Target;
UI_CONTROL *Child;
UI_CONTROL *Order;
UI_CONTROL **OrderList;
UINTN OrderCount;
EFI_IMAGE_INPUT *Image;
VOID *Buffer;
UINTN Index;
UINTN StringLength;
OrderList = NULL;
OrderCount = 0;
for (PropertyIndex = 0; PropertyIndex < PropertyCount; PropertyIndex++) {
Property = PropertyList[PropertyIndex];
Status = ParseProperty (ScreenField, Property, &Value);
if (EFI_ERROR (Status)) {
continue;
}
UnicodeSPrint (NameStrBuf, sizeof(NameStrBuf), L"%a", Property->IdentifierStr);
PropertyName = NameStrBuf;
Target = GetVfcfTargetControl (OrderList, OrderCount, &PropertyName);
if (Target == NULL) {
Target = Control;
}
PropertyNameLen = StrLen(PropertyName);
if (STR_MATCH(PropertyName, PropertyNameLen, L"padding") ||
STR_MATCH(PropertyName, PropertyNameLen, L"border-width") ||
STR_MATCH(PropertyName, PropertyNameLen, L"margin")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a,%a,%a,%a", Property->ValueStr, Property->ValueStr, Property->ValueStr, Property->ValueStr);
AttrName = PropertyName;
} else if (PREFIX_STR_MATCH(PropertyName, PropertyNameLen, L"padding-") ||
PREFIX_STR_MATCH(PropertyName, PropertyNameLen, L"margin-")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
AttrName = PropertyName;
} else if (PREFIX_STR_MATCH(PropertyName, PropertyNameLen, L"border-")) {
if (StrCmp (&PropertyName[7], L"top") == 0 ||
StrCmp (&PropertyName[7], L"bottom") == 0 ||
StrCmp (&PropertyName[7], L"left") == 0 ||
StrCmp (&PropertyName[7], L"right") == 0) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
AttrName = PropertyName;
} else {
continue;
}
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"height") ||
STR_MATCH(PropertyName, PropertyNameLen, L"width")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Value.Value.Length.Type == H2O_CSS_LENGTH_TYPE_AUTO ? "wrap_content" : Property->ValueStr);
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"position") ||
STR_MATCH(PropertyName, PropertyNameLen, L"text-align") ||
STR_MATCH(PropertyName, PropertyNameLen, L"background-color") ||
STR_MATCH(PropertyName, PropertyNameLen, L"z-index") ||
STR_MATCH(PropertyName, PropertyNameLen, L"left") ||
STR_MATCH(PropertyName, PropertyNameLen, L"top") ||
STR_MATCH(PropertyName, PropertyNameLen, L"right") ||
STR_MATCH(PropertyName, PropertyNameLen, L"bottom")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"font-size")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%d", Value.H2OValue.Value.U32);
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"color")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"0x%08x", (UINT32) Value.H2OValue.Value.U32);
AttrName = L"textcolor";
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"visibility")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%s", AsciiStrCmp (Property->ValueStr, "visible") == 0 ? L"true" : L"false");
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"text-control")) {
if (AsciiStrCmp (Property->ValueStr, "ellipsis") == 0) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
} else {
continue;
}
AttrName = L"text-overflow";
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"background-image")) {
Image = GetVfcfImage (Value.H2OValue.Value.U16);
if (Image == NULL) {
continue;
}
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"0x%lx", Image);
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"background-size")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
AttrName = PropertyName;
UiSetAttribute (Target, L"scale9grid", L"0,0,1,1");
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"control-type")) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
if (StrCmp (Target->Name, L"value") == 0) {
AttrName = L"value-control-type";
} else {
continue;
}
Target = Control;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"token")) {
Buffer = GetStringById (Value.H2OValue.Value.U16);
if (Buffer == NULL) {
continue;
}
StrCpyS (ValueStrBuf, sizeof(ValueStrBuf) / sizeof(CHAR16), Buffer);
FreePool (Buffer);
AttrName = L"text";
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"filter")) {
if (AsciiStrCmp (Property->ValueStr, "grayscale") == 0) {
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"stretch|gray");
} else {
continue;
}
AttrName = L"background-image-style";
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"display")) {
if (AsciiStrCmp (Property->ValueStr, "inline") == 0) {
if (StrnCmp (Control->Name, L"H2OSetupMenuPanel", StrLen (L"H2OSetupMenuPanel")) == 0) {
UiSetAttribute (Control, L"layout", L"horizontal");
continue;
}
}
Order = CONTROL_CLASS(Target)->FindChildByName (Target, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Order != NULL) {
continue;
}
if (AsciiStrCmp (Property->ValueStr, "block") == 0) {
Order = CreateAddControl (L"VerticalLayout", Target);
} else if (AsciiStrCmp (Property->ValueStr, "inline") == 0) {
Order = CreateAddControl (L"HorizontalLayout", Target);
} else if (AsciiStrCmp (Property->ValueStr, "flex") == 0) {
Order = CreateAddControl (L"FlexLayout", Target);
} else {
ASSERT (FALSE);
continue;
}
UiSetAttribute (Order, L"name", VFCF_PROPERTY_ORDER_CONTROL_NAME);
if (!IS_CONTROL_WIDTH_DEFINED(Order)) {
UiSetAttribute (Order, L"width", L"wrap_content");
}
if (!IS_CONTROL_HEIGHT_DEFINED(Order)) {
UiSetAttribute (Order, L"height", L"wrap_content");
}
OrderList = ReallocatePool(
sizeof (UI_CONTROL *) * OrderCount,
sizeof (UI_CONTROL *) * (OrderCount + 1),
OrderList
);
if (OrderList == NULL) {
OrderCount = 0;
continue;
}
OrderList[OrderCount++] = Order;
continue;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"flex-direction") ||
STR_MATCH(PropertyName, PropertyNameLen, L"align-items") ||
STR_MATCH(PropertyName, PropertyNameLen, L"align-content") ||
STR_MATCH(PropertyName, PropertyNameLen, L"justify-content")) {
Order = CONTROL_CLASS(Target)->FindChildByName (Target, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Order == NULL) {
ASSERT (FALSE);
continue;
}
Target = Order;
UnicodeSPrint (ValueStrBuf, sizeof (ValueStrBuf), L"%a", Property->ValueStr);
AttrName = PropertyName;
} else if (STR_MATCH(PropertyName, PropertyNameLen, L"order")) {
Order = CONTROL_CLASS(Target)->FindChildByName (Target, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Order == NULL) {
ASSERT (FALSE);
continue;
}
Index = 0;
StringLength = 0;
do {
if (Property->ValueStr[Index] == '|' ||
Property->ValueStr[Index] == 0) {
ValueStrBuf[StringLength] = 0;
StringLength = 0;
Child = CONTROL_CLASS(Order)->FindChildByName (Order, ValueStrBuf, UI_SEARCH_TYPE_ONLY_CHILD);
if (Child != NULL) {
continue;
}
Child = CreateSubElementControl (Order, ValueStrBuf);
if (Child != NULL) {
UiSetAttribute (Child, L"name", ValueStrBuf);
}
} else {
ValueStrBuf[StringLength++] = (CHAR16) Property->ValueStr[Index];
}
} while (Property->ValueStr[Index++] != 0);
continue;
} else {
continue;
}
UiSetAttribute (Target, AttrName, ValueStrBuf);
}
SetSubElementSizeToWarpContent (Control);
if (OrderList != NULL) {
FreePool (OrderList);
}
}
EFI_STATUS
SetPanelPosFromVfcf (
IN DISPLAY_ENGINE_FRAME *This
)
{
EFI_STATUS Status;
H2O_LAYOUT_INFO *LayoutInfo;
RECT ScreenField;
RECT PanelField;
UI_MANAGER *Manager;
UI_CONTROL *Control;
UI_CONTROL *Child;
CHAR16 String[20];
PANEL_VFCF_DATA *PanelVfcfDataPtr;
H2O_PANEL_INFO *PanelInfo;
BOOLEAN IsVisible;
UINT32 LayoutId;
EFI_GUID ScuFormSetGuid = {0x9f85453e, 0x2f03, 0x4989, 0xad, 0x3b, 0x4a, 0x84, 0x07, 0x91, 0xaf, 0x3a};
H2O_FORM_BROWSER_SM *SetupMenuData;
EFI_GUID FormSetGuid;
H2O_PROPERTY_INFO **PropertyList;
UINTN PropertyCount;
Manager = ((UI_CONTROL *) This)->Manager;
Status = gFB->GetSMInfo (gFB, &SetupMenuData);
if (EFI_ERROR (Status)) {
return Status;
}
CopyGuid (&FormSetGuid, &SetupMenuData->FormSetGuid);
FreeSetupMenuData (SetupMenuData);
LayoutInfo = NULL;
LayoutId = 0;
Status = EFI_NOT_FOUND;
if (NeedShowSetupMenu ()) {
Status = GetLayoutIdByGuid (&ScuFormSetGuid, &LayoutId);
}
if (EFI_ERROR (Status)) {
Status = GetLayoutIdByGuid (&FormSetGuid, &LayoutId);
if (EFI_ERROR (Status)) {
Status = GetLayoutIdByGuid (&gZeroGuid, &LayoutId);
}
ASSERT_EFI_ERROR (Status);
}
if (EFI_ERROR (Status)) {
return Status;
}
Status = GetLayoutById (LayoutId, &mMetroPrivate->DisplayEngine.Id, &LayoutInfo);
if (EFI_ERROR (Status)) {
Status = GetLayoutIdByGuid (&gZeroGuid, &LayoutId);
ASSERT_EFI_ERROR (Status);
Status = GetLayoutById (LayoutId, &mMetroPrivate->DisplayEngine.Id, &LayoutInfo);
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) {
return Status;
}
}
mLayoutInfo = LayoutInfo;
//DisableHalo (This);
ScreenField.left = 0;
ScreenField.top = 0;
ScreenField.right = (INT32) GetSystemMetrics (SM_CXSCREEN);
ScreenField.bottom = (INT32) GetSystemMetrics (SM_CYSCREEN);
PanelVfcfDataPtr = mPanelVfcfData;
while (PanelVfcfDataPtr->PanelName != NULL) {
Control = Manager->FindControlByName (Manager, PanelVfcfDataPtr->PanelName);
PanelInfo = GetPanelInfo (LayoutInfo, PanelVfcfDataPtr->PanelId);
SetWindowLongPtr (Control->Wnd, GWLP_USERDATA, (INTN)PanelInfo);
IsVisible = FALSE;
SetRectEmpty (&PanelField);
if (PanelInfo != NULL) {
GetPanelField (PanelInfo, NULL, H2O_IFR_STYLE_TYPE_PANEL, H2O_STYLE_PSEUDO_CLASS_NORMAL, &ScreenField, &PanelField);
IsVisible = IsVisibility (PanelInfo, NULL, H2O_IFR_STYLE_TYPE_PANEL, H2O_STYLE_PSEUDO_CLASS_NORMAL);
}
UiSetAttribute (Control, L"visibility", IsVisible ? L"true" : L"false");
if (PcdGet32(PcdH2OLmdeMultiLayout) == 0) {
if (PanelInfo != NULL) {
Status = GetVfcfPanelPropertyList (
PanelInfo,
H2O_IFR_STYLE_TYPE_PANEL,
H2O_STYLE_PSEUDO_CLASS_NORMAL,
&PropertyList,
&PropertyCount
);
if (!EFI_ERROR (Status)) {
SetAttributeFromVfcf (Control, PropertyList, PropertyCount, &ScreenField);
Child = CONTROL_CLASS(Control)->FindChildByName (Control, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Child != NULL) {
UiApplyAttributeList (Child, L"width='0' height='0'");
}
FreePool (PropertyList);
}
if (PanelVfcfDataPtr->PanelId == HOTKEY_PANEL_ID && mHotkeyItemChilds != NULL) {
UiApplyAttributeList (Control, L"background-color='0xFF333333' background-image='@OwnerDrawBkg' background-image-style='stretch' padding='5,5,5,5'");
}
}
} else {
UnicodeSPrint (String, sizeof (String), L"%d", PanelField.left);
UiSetAttribute (Control, L"left", String);
UnicodeSPrint (String, sizeof (String), L"%d", PanelField.top);
UiSetAttribute (Control, L"top", String);
UnicodeSPrint (String, sizeof (String), L"%d", PanelField.right - PanelField.left);
UiSetAttribute (Control, L"width", String);
UnicodeSPrint (String, sizeof (String), L"%d", PanelField.bottom - PanelField.top);
UiSetAttribute (Control, L"height", String);
UiSetAttribute (Control, L"position", L"absolute");
}
PanelVfcfDataPtr++;
}
UiSetAttribute ((UI_CONTROL *) This, L"visibility", L"true");
return Status;
}
EFI_STATUS
CreatePanelControlFromVfcf (
IN DISPLAY_ENGINE_FRAME *This
)
{
RECT ScreenField;
H2O_LAYOUT_INFO *LayoutInfo;
UI_CONTROL *ParentControl;
UI_CONTROL *Control;
UI_MANAGER *Manager;
H2O_PANEL_INFO *PanelInfo;
PANEL_VFCF_DATA *PanelVfcfDataPtr;
H2O_PROPERTY_INFO **PropertyList;
UINTN PropertyCount;
EFI_STATUS Status;
UI_CONTROL *Child;
if (mLayoutInfo == NULL) {
return EFI_NOT_READY;
}
ParentControl = (UI_CONTROL *) This;
Manager = ((UI_CONTROL *) This)->Manager;
LayoutInfo = mLayoutInfo;
ScreenField.left = 0;
ScreenField.top = 0;
ScreenField.right = (INT32) GetSystemMetrics (SM_CXSCREEN);
ScreenField.bottom = (INT32) GetSystemMetrics (SM_CYSCREEN);
PanelInfo = NULL;
while (TRUE) {
PanelInfo = GetNextPanel (LayoutInfo, PanelInfo);
if (PanelInfo == NULL) {
break;
}
Control = NULL;
PanelVfcfDataPtr = mPanelVfcfData;
while (PanelVfcfDataPtr->PanelName != NULL) {
if (PanelVfcfDataPtr->PanelId == PanelInfo->PanelId) {
Control = Manager->FindControlByName (Manager, PanelVfcfDataPtr->PanelName);
break;
}
PanelVfcfDataPtr++;
}
if (Control != NULL) {
continue;
}
if (PanelInfo->PanelType == H2O_PANEL_TYPE_OWNER_DRAW) {
Control = CreateAddControl (L"H2OOwnerDrawPanel", ParentControl);
} else if (PanelInfo->PanelType == H2O_PANEL_TYPE_FORM) {
Control = CreateAddControl (L"FormPanel", ParentControl);
}
if (Control == NULL) {
continue;
}
SetWindowLongPtr (Control->Wnd, GWLP_USERDATA, (INTN)PanelInfo);
Status = GetVfcfPanelPropertyList (
PanelInfo,
H2O_IFR_STYLE_TYPE_PANEL,
H2O_STYLE_PSEUDO_CLASS_NORMAL,
&PropertyList,
&PropertyCount
);
if (!EFI_ERROR (Status)) {
SetAttributeFromVfcf (Control, PropertyList, PropertyCount, &ScreenField);
Child = CONTROL_CLASS(Control)->FindChildByName (Control, VFCF_PROPERTY_ORDER_CONTROL_NAME, UI_SEARCH_TYPE_ONLY_CHILD);
if (Child != NULL) {
UiApplyAttributeList (Child, L"width='0' height='0'");
}
FreePool (PropertyList);
}
This->VfcfPanelControlList = ReallocatePool (
sizeof(UI_CONTROL *) * This->VfcfPanelControlCount,
sizeof(UI_CONTROL *) * (This->VfcfPanelControlCount + 1),
This->VfcfPanelControlList
);
if (This->VfcfPanelControlList == NULL) {
This->VfcfPanelControlCount = 0;
return EFI_OUT_OF_RESOURCES;
}
This->VfcfPanelControlList[This->VfcfPanelControlCount++] = Control;
}
return EFI_SUCCESS;
}
VOID
CallPanelControlProc (
DISPLAY_ENGINE_FRAME *This,
UINT Msg,
WPARAM WParam,
LPARAM LParam
)
{
UINTN Index;
if (This->VfcfPanelControlList == NULL) {
return;
}
for (Index = 0; Index < This->VfcfPanelControlCount; Index++) {
This->VfcfPanelControlList[Index]->Class->WndProc (This->VfcfPanelControlList[Index]->Wnd, Msg, WParam, LParam);
}
}
VOID
LocalMetroSetComponent (
DISPLAY_ENGINE_FRAME *This
)
{
UI_MANAGER *Manager;
Manager = ((UI_CONTROL *) This)->Manager;
This->H2OSetupMenuPanel = Manager->FindControlByName (Manager, L"H2OSetupMenuPanel");
This->H2OSetupPagePanel = Manager->FindControlByName (Manager, L"H2OSetupPagePanel");
This->H2OFormTitlePanel = Manager->FindControlByName (Manager, L"H2OFormTitlePanel");
This->H2OHelpTextPanel = Manager->FindControlByName (Manager, L"H2OHelpTextPanel");
This->H2OHotkeyPanel = Manager->FindControlByName (Manager, L"H2OHotkeyPanel");
This->H2OOwnerDrawPanel = Manager->FindControlByName (Manager, L"H2OOwnerDrawPanel");
}
VOID
LocalMetroProcessUiNotify (
DISPLAY_ENGINE_FRAME *This,
UINT Msg,
UI_CONTROL *Sender
)
{
H2O_STATEMENT_ID StatementId;
H2O_FORM_BROWSER_S *Statement;
HOT_KEY_INFO *HotkeyInfo;
EFI_STATUS Status;
EFI_HII_VALUE HiiValue;
switch (Msg) {
case UI_NOTIFY_CLICK:
case UI_NOTIFY_CARRIAGE_RETURN:
if (StrnCmp (Sender->Name, L"Hotkey", StrLen (L"Hotkey")) == 0) {
HotkeyInfo = (HOT_KEY_INFO *) GetWindowLongPtr (Sender->Wnd, GWLP_USERDATA);
HotKeyFunc (HotkeyInfo);
break;
}
if (StrCmp (Sender->Name, L"CheckBox") == 0) {
StatementId = (H2O_PAGE_ID) GetWindowLongPtr (Sender->Wnd, GWLP_USERDATA);
Status = gFB->GetSInfo (gFB, gFB->CurrentP->PageId, StatementId, &Statement);
ASSERT_EFI_ERROR (Status);
if (EFI_ERROR (Status)) {
break;
}
SendSelectQNotify (Statement->PageId, Statement->QuestionId, Statement->IfrOpCode);
CopyMem (&HiiValue, &Statement->HiiValue, sizeof (EFI_HII_VALUE));
HiiValue.Value.b = !HiiValue.Value.b;
SendChangeQNotify (Statement->PageId, Statement->QuestionId, &HiiValue);
break;
}
DEBUG ((EFI_D_INFO, "Unsuppoert item click: %s", Sender->Name));
ASSERT (FALSE);
break;
}
}
STATIC
VOID
UpdateHaloColor (
IN DISPLAY_ENGINE_FRAME *This
)
{
UI_CONTROL *Control;
HSV_VALUE MenuHsv;
HSV_VALUE HaloHsv;
INT16 HueDiff;
INT8 SaturationDiff;
INT8 ValueDiff;
CHAR16 Str[20];
ASSERT (This != NULL);
GetCurrentHaloHsv (&HaloHsv);
GetCurrentMenuHsv (&MenuHsv);
if (MenuHsv.Hue == 0 && MenuHsv.Saturation == 0 && MenuHsv.Value == 0) {
return;
}
HueDiff = (INT16) (MenuHsv.Hue - HaloHsv.Hue);
SaturationDiff = (INT8) (MenuHsv.Saturation - HaloHsv.Saturation);
ValueDiff = (INT8) (MenuHsv.Value - HaloHsv.Value);
UnicodeSPrint (Str, sizeof (Str), L"%d,%d,%d", HueDiff, SaturationDiff, ValueDiff);
Control = UiFindChildByName (This, L"FormHalo");
UiSetAttribute (Control, L"hsvadjust", Str);
}
EFI_STATUS
UpdateHaloPos (
IN DISPLAY_ENGINE_FRAME *This
)
{
EFI_STATUS Status;
RECT Field;
UI_MANAGER *Manager;
UI_CONTROL *Control;
Status = GetInformationField (&Field);
if (EFI_ERROR (Status)) {
return Status;
}
Manager = ((UI_CONTROL *) This)->Manager;
Control = Manager->FindControlByName (Manager, L"FormHalo");
if (Control == NULL) {
return EFI_NOT_FOUND;
}
UiSetAttributeEx (Control, L"left", L"%d", Field.left);
UiSetAttributeEx (Control, L"top", L"%d", Field.top);
UiSetAttributeEx (Control, L"width", L"%d", (Field.right - Field.left));
UiSetAttributeEx (Control, L"height", L"%d", (Field.bottom - Field.top));
UiSetAttributeEx (Control, L"position", L"absolute");
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
GetContextField (
OUT RECT *ContextField
)
{
EFI_STATUS Status;
RECT SetupMenuPanelField;
RECT FormTitlePanelField;
RECT SetupPagePanelField;
RECT HelpTextPanelField;
RECT HotkeyPanelField;
Status = GetRectByName (gWnd, L"H2OSetupMenuPanel", &SetupMenuPanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&SetupMenuPanelField);
}
Status = GetRectByName (gWnd, L"H2OFormTitlePanel", &FormTitlePanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&FormTitlePanelField);
}
Status = GetRectByName (gWnd, L"H2OSetupPagePanel", &SetupPagePanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&SetupPagePanelField);
}
Status = GetRectByName (gWnd, L"H2OHelpTextPanel", &HelpTextPanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&HelpTextPanelField);
}
Status = GetRectByName (gWnd, L"H2OHotkeyPanel", &HotkeyPanelField);
if (EFI_ERROR (Status)) {
SetRectEmpty (&HotkeyPanelField);
}
UnionRect (ContextField, &SetupMenuPanelField, &FormTitlePanelField);
UnionRect (ContextField, ContextField, &SetupPagePanelField);
UnionRect (ContextField, ContextField, &HelpTextPanelField);
UnionRect (ContextField, ContextField, &HotkeyPanelField);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
UpdateContextPos (
IN VOID *Frame
)
{
EFI_STATUS Status;
RECT Field;
UI_MANAGER *Manager;
UI_CONTROL *Control;
CHAR16 String[20];
Status = GetContextField (&Field);
if (EFI_ERROR (Status)) {
return Status;
}
Manager = ((UI_CONTROL *) Frame)->Manager;
Control = Manager->FindControlByName (Manager, L"ContextBkg");
if (Control == NULL) {
return EFI_NOT_FOUND;
}
UnicodeSPrint (String, sizeof (String), L"%d", Field.left);
UiSetAttribute (Control, L"left", String);
UnicodeSPrint (String, sizeof (String), L"%d", Field.top);
UiSetAttribute (Control, L"top", String);
UnicodeSPrint (String, sizeof (String), L"%d", Field.right - Field.left);
UiSetAttribute (Control, L"width", String);
UnicodeSPrint (String, sizeof (String), L"%d", Field.bottom - Field.top);
UiSetAttribute (Control, L"height", String);
UiSetAttribute (Control, L"position", L"absolute");
return EFI_SUCCESS;
}
BOOLEAN
IsMetroPrivateHotKey (
IN EFI_KEY_DATA *KeyData
)
{
UINTN Index;
if (KeyData == NULL) {
return FALSE;
}
for (Index = 0; Index < sizeof (mPrivateHotKeyList) / sizeof (EFI_INPUT_KEY); Index++) {
if (KeyData->Key.ScanCode == mPrivateHotKeyList[Index].ScanCode &&
KeyData->Key.UnicodeChar == mPrivateHotKeyList[Index].UnicodeChar &&
KeyData->KeyState.KeyShiftState == EFI_SHIFT_STATE_VALID) {
return TRUE;
}
}
return FALSE;
}
VOID
LocalMetroRegisterHotkey (
HWND Wnd
)
{
INT32 Id;
Id = 1;
while (UnregisterHotKey (Wnd, Id)) {
Id++;
}
Id = 1;
MwRegisterHotKey (Wnd, Id++, 0, VK_ESCAPE);
}
LRESULT
CALLBACK
DisplayEngineProc (
HWND Wnd,
UINT Msg,
WPARAM WParam,
LPARAM LParam
)
{
DISPLAY_ENGINE_FRAME *This;
UI_MANAGER *Manager;
UI_CONTROL *Control;
UINTN VKCode;
HOT_KEY_INFO HotKeyInfo;
UI_LIST_VIEW *ListView;
This = (DISPLAY_ENGINE_FRAME *) GetWindowLongPtr (Wnd, 0);
if (This == NULL && Msg != WM_CREATE && Msg != WM_NCCALCSIZE) {
ASSERT (FALSE);
return 0;
}
Control = (UI_CONTROL *) This;
switch ( Msg ) {
case WM_CREATE:
This = (DISPLAY_ENGINE_FRAME *) AllocateZeroPool (sizeof (DISPLAY_ENGINE_FRAME));
if (This != NULL) {
CONTROL_CLASS(This) = (UI_CONTROL_CLASS *) GetClassLongPtr (Wnd, 0);
SetWindowLongPtr (Wnd, 0, (INTN)This);
SendMessage (Wnd, UI_NOTIFY_CREATE, WParam, LParam);
}
break;
case UI_NOTIFY_CREATE:
PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, Msg, WParam,LParam);
//
// create UiContainer as root
//
Manager = Control->Manager;
SetWindowLongPtr (Wnd, GWL_EXSTYLE, GetWindowLongPtr (Control->Wnd, GWL_EXSTYLE) & (~WS_EX_NOACTIVATE));
if (gFB->CurrentP != NULL) {
XmlCreateControl (mScreenPanelChilds, Control);
LocalMetroSetComponent (This);
SetPanelPosFromVfcf (This);
CreatePanelControlFromVfcf (This);
} else {
XmlCreateControl (mDialogPanelChilds, Control);
}
break;
case WM_SETFOCUS:
if (gFB->CurrentP == NULL) {
break;
}
if (gLastFocus != NULL) {
if (gLastFocus == This->H2OSetupMenuPanel->Wnd && IsWindowVisible (This->H2OSetupMenuPanel->Wnd)) {
SetFocus (gLastFocus);
break;
} else if (gLastFocus == This->H2OSetupPagePanel->Wnd) {
SetFocus (gLastFocus);
break;
}
}
ListView = (UI_LIST_VIEW *) This->H2OSetupMenuPanel;
if (IsWindowVisible(This->H2OSetupMenuPanel->Wnd) && ListView->Layout != UiListViewHorizontalLayout) {
SetFocus (This->H2OSetupMenuPanel->Wnd);
} else {
SetFocus (This->H2OSetupPagePanel->Wnd);
}
break;
case WM_HOTKEY:
if (GetWindowLongPtr (Wnd, GWL_STYLE) & WS_DISABLED) {
break;
}
VKCode = (UINTN) HIWORD(LParam);
switch (VKCode) {
case VK_ESCAPE:
ZeroMem (&HotKeyInfo, sizeof (HOT_KEY_INFO));
HotKeyInfo.HotKeyAction = HotKeyDiscardAndExit;
HotKeyFunc (&HotKeyInfo);
break;
}
break;
case FB_NOTIFY_SELECT_Q:
if (gFB->CurrentP != NULL) {
This->H2OSetupMenuPanel->Class->WndProc (This->H2OSetupMenuPanel->Wnd, Msg, WParam, LParam);
This->H2OSetupPagePanel->Class->WndProc (This->H2OSetupPagePanel->Wnd, Msg, WParam, LParam);
This->H2OFormTitlePanel->Class->WndProc (This->H2OFormTitlePanel->Wnd, Msg, WParam, LParam);
This->H2OHelpTextPanel->Class->WndProc (This->H2OHelpTextPanel->Wnd, Msg, WParam, LParam);
This->H2OHotkeyPanel->Class->WndProc (This->H2OHotkeyPanel->Wnd, Msg, WParam, LParam);
This->H2OOwnerDrawPanel->Class->WndProc (This->H2OOwnerDrawPanel->Wnd, Msg, WParam, LParam);
CallPanelControlProc(This, Msg, WParam, LParam);
}
break;
case FB_NOTIFY_REPAINT:
if (gFB->CurrentP != NULL) {
This->H2OSetupMenuPanel->Class->WndProc (This->H2OSetupMenuPanel->Wnd, Msg, WParam, LParam);
This->H2OSetupPagePanel->Class->WndProc (This->H2OSetupPagePanel->Wnd, Msg, WParam, LParam);
This->H2OFormTitlePanel->Class->WndProc (This->H2OFormTitlePanel->Wnd, Msg, WParam, LParam);
This->H2OHelpTextPanel->Class->WndProc (This->H2OHelpTextPanel->Wnd, Msg, WParam, LParam);
This->H2OHotkeyPanel->Class->WndProc (This->H2OHotkeyPanel->Wnd, Msg, WParam, LParam);
This->H2OOwnerDrawPanel->Class->WndProc (This->H2OOwnerDrawPanel->Wnd, Msg, WParam, LParam);
CallPanelControlProc(This, Msg, WParam, LParam);
//UpdateHaloPos (This);
//UpdateHaloColor (This);
UpdateContextPos (This);
LocalMetroRegisterHotkey (Wnd);
SetFocus (Wnd);
}
break;
case FB_NOTIFY_REFRESH_Q:
if (gFB->CurrentP != NULL) {
This->H2OSetupPagePanel->Class->WndProc (This->H2OSetupPagePanel->Wnd, Msg, WParam, LParam);
This->H2OHelpTextPanel->Class->WndProc (This->H2OHelpTextPanel->Wnd, Msg, WParam, LParam);
}
break;
case UI_NOTIFY_CLICK:
case UI_NOTIFY_CARRIAGE_RETURN:
LocalMetroProcessUiNotify (This, Msg, (UI_CONTROL *)WParam);
break;
case WM_DESTROY:
if (This->VfcfPanelControlList != NULL) {
FreePool (This->VfcfPanelControlList);
}
PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, Msg, WParam,LParam);
break;
case WM_CLOSE:
DestroyWindow (Wnd);
break;
default:
return PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, Msg, WParam,LParam);
}
return 0;
}
DISPLAY_ENGINE_FRAME_CLASS *
GetDisplayEngineFrameClass (
VOID
)
{
if (CURRENT_CLASS != NULL) {
return CURRENT_CLASS;
}
InitUiClass ((UI_CONTROL_CLASS **)&CURRENT_CLASS, sizeof (*CURRENT_CLASS), DISPLAY_ENGINE_CLASS_NAME, (UI_CONTROL_CLASS *)GetFrameClass());
if (CURRENT_CLASS == NULL) {
return NULL;
}
((UI_CONTROL_CLASS *)CURRENT_CLASS)->WndProc = DisplayEngineProc;
return CURRENT_CLASS;
}
UI_GET_CLASS mGetClassTable[] = {
(UI_GET_CLASS) GetControlClass ,
(UI_GET_CLASS) GetTextureClass ,
(UI_GET_CLASS) GetLabelClass ,
(UI_GET_CLASS) GetButtonClass ,
(UI_GET_CLASS) GetSwitchClass ,
(UI_GET_CLASS) GetEditClass ,
(UI_GET_CLASS) GetScrollBarClass ,
(UI_GET_CLASS) GetVerticalLayoutClass ,
(UI_GET_CLASS) GetHorizontalLayoutClass ,
(UI_GET_CLASS) GetFlexLayoutClass ,
(UI_GET_CLASS) GetListViewClass,
(UI_GET_CLASS) GetNumberPickerClass ,
(UI_GET_CLASS) GetDialogClass ,
(UI_GET_CLASS) GetFrameClass ,
(UI_GET_CLASS) GetFrontPageItemClass ,
(UI_GET_CLASS) GetSetupPageItemClass ,
(UI_GET_CLASS) GetSetupMenuItemClass ,
(UI_GET_CLASS) GetDateItemClass ,
(UI_GET_CLASS) GetTimeItemClass ,
(UI_GET_CLASS) GetHotkeyItemClass ,
(UI_GET_CLASS) GetDisplayEngineFrameClass,
(UI_GET_CLASS) GetH2OFormTitlePanelClass,
(UI_GET_CLASS) GetH2OHotkeyPanelClass,
(UI_GET_CLASS) GetH2OHelpTextPanelClass,
(UI_GET_CLASS) GetH2OOwnerDrawPanelClass,
(UI_GET_CLASS) GetH2OSetupMenuPanelClass,
(UI_GET_CLASS) GetH2OSetupPagePanelClass,
(UI_GET_CLASS) GetScrollViewClass,
(UI_GET_CLASS) GetFormPanelClass,
(UI_GET_CLASS) GetH2OConfirmPageDialogClass,
(UI_GET_CLASS) GetH2OConfirmPasswordDialogClass,
(UI_GET_CLASS) GetH2ODateTimeDialogClass,
(UI_GET_CLASS) GetH2OFormDialogClass,
(UI_GET_CLASS) GetH2OHelpDialogClass,
(UI_GET_CLASS) GetH2OMsgPopUpDialogClass,
(UI_GET_CLASS) GetH2ONumericDialogClass,
(UI_GET_CLASS) GetH2OOneOfInputDialogClass,
(UI_GET_CLASS) GetH2OOrderedListDialogClass,
(UI_GET_CLASS) GetH2OPasswordDialogClass,
(UI_GET_CLASS) GetH2OPopupDialogClass,
(UI_GET_CLASS) GetH2OStringDialogClass,
(UI_GET_CLASS) GetH2OStatementControlClass,
(UI_GET_CLASS) GetH2OActionButtonClass,
(UI_GET_CLASS) GetH2ODateRollerClass,
(UI_GET_CLASS) GetH2ONumericInputClass,
(UI_GET_CLASS) GetH2OOptionListClass,
(UI_GET_CLASS) GetH2OOrderedListOptionListClass,
(UI_GET_CLASS) GetH2OPasswordInputClass,
(UI_GET_CLASS) GetH2OStringInputClass,
(UI_GET_CLASS) GetH2OTimeRollerClass,
NULL,
};
EFI_STATUS
InitializeGUI (
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput
)
{
EFI_STATUS Status;
Status = gBS->LocateProtocol (
&gSetupMouseProtocolGuid,
NULL,
(VOID **) &mSetupMouse
);
if (EFI_ERROR (Status)) {
mSetupMouse = NULL;
}
AddHiiImagePackage ();
GdAddGopDevice (GraphicsOutput);
if (MwOpen() < 0) {
return EFI_INVALID_PARAMETER;
}
RegisterClassTable (mGetClassTable);
return EFI_SUCCESS;
}
EFI_STATUS
InitializeWindows (
VOID
)
{
MSG Msg;
if (gWnd != NULL) {
return EFI_ALREADY_STARTED;
}
//
// CreateWindow
//
gWnd = CreateWindowEx (
0,
DISPLAY_ENGINE_CLASS_NAME,
L"Insyde H2O",
WS_OVERLAPPED | WS_VISIBLE,
0, 0, GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN),
NULL,
NULL,
NULL,
NULL
);
//
// Process Message
//
while (PeekMessage (&Msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
return EFI_SUCCESS;
}
/**
Destroy window and disconnect server
**/
VOID
ShutdownGUI (
VOID
)
{
MSG Msg;
if (gWnd != NULL) {
DestroyWindow (gWnd);
gWnd = NULL;
//
// remove all message (ex: DeskTop WM_PAINT)
//
while (PeekMessage (&Msg, NULL, 0, 0, PM_REMOVE));
}
MwClose ();
}