]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtGopDxe/WinNtGopScreen.c
retire gEfiAlternateFvBlockGuid. All platform FvbRuntimeDxe drivers will not produce...
[mirror_edk2.git] / Nt32Pkg / WinNtGopDxe / WinNtGopScreen.c
index e0270712288a51030739a503fa683583a10dd324..5482fd98a00df6185077c50a6768ae983dd9df27 100644 (file)
@@ -16,42 +16,18 @@ Module Name:
 Abstract:\r
 \r
   This file produces the graphics abstration of GOP. It is called by\r
-  WinNtGopDriver.c file which deals with the EFI 1.1 driver model.\r
+  WinNtGopDriver.c file which deals with the UEFI 2.0 driver model.\r
   This file just does graphics.\r
 \r
 \r
 **/\r
-//\r
-// The package level header files this module uses\r
-//\r
-#include <Uefi.h>\r
-#include <WinNtDxe.h>\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
-//\r
-#include <Guid/EventGroup.h>\r
-#include <Protocol/WinNtIo.h>\r
-#include <Protocol/ComponentName.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/DriverBinding.h>\r
-#include <Protocol/GraphicsOutput.h>\r
-//\r
-// The Library classes this module consumes\r
-//\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
 \r
 #include "WinNtGop.h"\r
 \r
 EFI_WIN_NT_THUNK_PROTOCOL *mWinNt;\r
 DWORD                     mTlsIndex         = TLS_OUT_OF_INDEXES;\r
 DWORD                     mTlsIndexUseCount = 0;  // lets us know when we can free mTlsIndex.\r
-static EFI_EVENT          mGopScreenExitBootServicesEvent;\r
+EFI_EVENT          mGopScreenExitBootServicesEvent;\r
 GOP_MODE_DATA mGopModeData[] = {\r
     {800, 600, 0, 0},\r
     {640, 480, 0, 0},\r
@@ -69,7 +45,6 @@ WinNtGopStartWindow (
   IN  UINT32              RefreshRate\r
   );\r
 \r
-STATIC\r
 VOID\r
 EFIAPI\r
 KillNtGopThread (\r
@@ -77,6 +52,108 @@ KillNtGopThread (
   IN VOID       *Context\r
   );\r
 \r
+VOID\r
+WinNtGopConvertParamToEfiKeyShiftState (\r
+  IN  GOP_PRIVATE_DATA  *Private,\r
+  IN  WPARAM            *wParam,\r
+  IN  BOOLEAN           Flag\r
+  )\r
+{\r
+  switch (*wParam) {\r
+  //\r
+  // BUGBUG: Only GetAsyncKeyState() and GetKeyState() can distinguish\r
+  // left and right Ctrl, and Shift key. \r
+  // Neither of the two is defined in EFI_WIN_NT_THUNK_PROTOCOL. \r
+  // Therefor, we can not set the correct Shift state here.\r
+  // \r
+  case VK_SHIFT:  \r
+    Private->LeftShift  = Flag;\r
+    break;  \r
+  case VK_CONTROL:\r
+    Private->LeftCtrl   = Flag;\r
+    break;\r
+  case VK_LWIN:      \r
+    Private->LeftLogo   = Flag;\r
+    break;\r
+  case VK_RWIN:      \r
+    Private->RightLogo  = Flag;\r
+    break;\r
+  case VK_APPS:      \r
+    Private->Menu       = Flag;\r
+    break;\r
+  //\r
+  // BUGBUG: PrintScreen/SysRq can not trigger WM_KEYDOWN message,\r
+  // so SySReq shift state is not supported here.\r
+  //\r
+  case VK_PRINT:  \r
+    Private->SysReq     = Flag;\r
+    break;\r
+  }\r
+}\r
+\r
+VOID\r
+WinNtGopConvertParamToEfiKey (\r
+  IN  GOP_PRIVATE_DATA  *Private,\r
+  IN  WPARAM            *wParam,\r
+  IN  EFI_INPUT_KEY     *Key\r
+  )\r
+{\r
+  switch (*wParam) {\r
+  case VK_HOME:       Key->ScanCode = SCAN_HOME;       break;\r
+  case VK_END:        Key->ScanCode = SCAN_END;        break;\r
+  case VK_LEFT:       Key->ScanCode = SCAN_LEFT;       break;\r
+  case VK_RIGHT:      Key->ScanCode = SCAN_RIGHT;      break;\r
+  case VK_UP:         Key->ScanCode = SCAN_UP;         break;\r
+  case VK_DOWN:       Key->ScanCode = SCAN_DOWN;       break;\r
+  case VK_DELETE:     Key->ScanCode = SCAN_DELETE;     break;\r
+  case VK_INSERT:     Key->ScanCode = SCAN_INSERT;     break;\r
+  case VK_PRIOR:      Key->ScanCode = SCAN_PAGE_UP;    break;\r
+  case VK_NEXT:       Key->ScanCode = SCAN_PAGE_DOWN;  break;\r
+  case VK_ESCAPE:     Key->ScanCode = SCAN_ESC;        break;\r
+                         \r
+  case VK_F1:         Key->ScanCode = SCAN_F1;         break;\r
+  case VK_F2:         Key->ScanCode = SCAN_F2;         break;\r
+  case VK_F3:         Key->ScanCode = SCAN_F3;         break;\r
+  case VK_F4:         Key->ScanCode = SCAN_F4;         break;\r
+  case VK_F5:         Key->ScanCode = SCAN_F5;         break;\r
+  case VK_F6:         Key->ScanCode = SCAN_F6;         break;\r
+  case VK_F7:         Key->ScanCode = SCAN_F7;         break;\r
+  case VK_F8:         Key->ScanCode = SCAN_F8;         break;\r
+  case VK_F9:         Key->ScanCode = SCAN_F9;         break;\r
+  case VK_F11:        Key->ScanCode = SCAN_F11;        break;\r
+  case VK_F12:        Key->ScanCode = SCAN_F12;        break;\r
+\r
+  case VK_F13:        Key->ScanCode = SCAN_F13;        break;\r
+  case VK_F14:        Key->ScanCode = SCAN_F14;        break;\r
+  case VK_F15:        Key->ScanCode = SCAN_F15;        break;\r
+  case VK_F16:        Key->ScanCode = SCAN_F16;        break;\r
+  case VK_F17:        Key->ScanCode = SCAN_F17;        break;\r
+  case VK_F18:        Key->ScanCode = SCAN_F18;        break;\r
+  case VK_F19:        Key->ScanCode = SCAN_F19;        break;\r
+  case VK_F20:        Key->ScanCode = SCAN_F20;        break;\r
+  case VK_F21:        Key->ScanCode = SCAN_F21;        break;\r
+  case VK_F22:        Key->ScanCode = SCAN_F22;        break;\r
+  case VK_F23:        Key->ScanCode = SCAN_F23;        break;\r
+  case VK_F24:        Key->ScanCode = SCAN_F24;        break;\r
+\r
+  //\r
+  // Set toggle state\r
+  //    \r
+  case VK_NUMLOCK:     \r
+    Private->NumLock    = !Private->NumLock;\r
+    break;\r
+  case VK_SCROLL:\r
+    Private->ScrollLock = !Private->ScrollLock;\r
+    break;  \r
+  case VK_CAPITAL:\r
+    Private->CapsLock   = !Private->CapsLock;\r
+    break;  \r
+  }\r
+  \r
+  WinNtGopConvertParamToEfiKeyShiftState (Private, wParam, TRUE);  \r
+}\r
+\r
+\r
 //\r
 // GOP Protocol Member Functions\r
 //\r
@@ -127,7 +204,7 @@ WinNtGopQuerytMode (
   (*Info)->Version = 0;\r
   (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
   (*Info)->VerticalResolution   = Private->ModeData[ModeNumber].VerticalResolution;\r
-  (*Info)->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;\r
+  (*Info)->PixelFormat = PixelBltOnly;\r
   (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;\r
 \r
   return EFI_SUCCESS;\r
@@ -615,6 +692,8 @@ WinNtGopThreadWindowProc (
 \r
   //\r
   // F10 and the ALT key do not create a WM_KEYDOWN message, thus this special case\r
+  // WM_SYSKEYDOWN is posted when F10 is pressed or \r
+  // holds down ALT key and then presses another key.\r
   //\r
   case WM_SYSKEYDOWN:\r
     Key.ScanCode = 0;\r
@@ -625,34 +704,22 @@ WinNtGopThreadWindowProc (
       GopPrivateAddQ (Private, Key);\r
       return 0;\r
     }\r
-    break;\r
 \r
-  case WM_KEYDOWN:\r
-    Key.ScanCode = 0;\r
-    switch (wParam) {\r
-    case VK_HOME:       Key.ScanCode = SCAN_HOME;       break;\r
-    case VK_END:        Key.ScanCode = SCAN_END;        break;\r
-    case VK_LEFT:       Key.ScanCode = SCAN_LEFT;       break;\r
-    case VK_RIGHT:      Key.ScanCode = SCAN_RIGHT;      break;\r
-    case VK_UP:         Key.ScanCode = SCAN_UP;         break;\r
-    case VK_DOWN:       Key.ScanCode = SCAN_DOWN;       break;\r
-    case VK_DELETE:     Key.ScanCode = SCAN_DELETE;     break;\r
-    case VK_INSERT:     Key.ScanCode = SCAN_INSERT;     break;\r
-    case VK_PRIOR:      Key.ScanCode = SCAN_PAGE_UP;    break;\r
-    case VK_NEXT:       Key.ScanCode = SCAN_PAGE_DOWN;  break;\r
-    case VK_ESCAPE:     Key.ScanCode = SCAN_ESC;        break;\r
-\r
-    case VK_F1:   Key.ScanCode = SCAN_F1;   break;\r
-    case VK_F2:   Key.ScanCode = SCAN_F2;   break;\r
-    case VK_F3:   Key.ScanCode = SCAN_F3;   break;\r
-    case VK_F4:   Key.ScanCode = SCAN_F4;   break;\r
-    case VK_F5:   Key.ScanCode = SCAN_F5;   break;\r
-    case VK_F6:   Key.ScanCode = SCAN_F6;   break;\r
-    case VK_F7:   Key.ScanCode = SCAN_F7;   break;\r
-    case VK_F8:   Key.ScanCode = SCAN_F8;   break;\r
-    case VK_F9:   Key.ScanCode = SCAN_F9;   break;\r
-    case VK_F11:  Key.ScanCode = SCAN_F11;  break;\r
-    case VK_F12:  Key.ScanCode = SCAN_F12;  break;\r
+    if ((lParam & GOP_ALT_KEY_PRESSED) == GOP_ALT_KEY_PRESSED) {\r
+      //\r
+      // ALT is pressed with another key pressed\r
+      //\r
+      WinNtGopConvertParamToEfiKey (Private, &wParam, &Key);\r
+\r
+      if ((lParam & GOP_EXTENDED_KEY) == GOP_EXTENDED_KEY) {\r
+        Private->RightAlt = TRUE;\r
+      } else {\r
+        Private->LeftAlt = TRUE;\r
+      }\r
+\r
+      if (Private->RightAlt && Private->LeftAlt) {\r
+        Private->LeftAlt = FALSE;\r
+      }\r
     }\r
 \r
     if (Key.ScanCode != 0) {\r
@@ -662,6 +729,39 @@ WinNtGopThreadWindowProc (
 \r
     return 0;\r
 \r
+  case WM_SYSKEYUP:\r
+    if ((lParam & GOP_ALT_KEY_PRESSED) == GOP_ALT_KEY_PRESSED) {\r
+      //\r
+      // ALT is pressed with another key released\r
+      //\r
+      WinNtGopConvertParamToEfiKeyShiftState (Private, &wParam, FALSE);  \r
+      //\r
+      // Actually ALT key is still held down here.\r
+      // Change the ALT key state when another key is released\r
+      // by user because we did not find a better solution to\r
+      // get a released ALT key. \r
+      //\r
+      Private->RightAlt = FALSE;\r
+      Private->LeftAlt = FALSE;\r
+    }\r
+\r
+    return 0;\r
+\r
+\r
+  case WM_KEYDOWN:\r
+    Key.ScanCode = 0;\r
+    WinNtGopConvertParamToEfiKey (Private, &wParam, &Key);\r
+    if (Key.ScanCode != 0) {\r
+      Key.UnicodeChar = 0;\r
+      GopPrivateAddQ (Private, Key);\r
+    }\r
+\r
+    return 0;\r
+\r
+  case WM_KEYUP:\r
+    WinNtGopConvertParamToEfiKeyShiftState (Private, &wParam, FALSE);  \r
+    return 0;\r
+\r
   case WM_CHAR:\r
     //\r
     // The ESC key also generate WM_CHAR.\r
@@ -858,11 +958,12 @@ WinNtGopStartWindow (
   //\r
   // Register to be notified on exit boot services so we can destroy the window.\r
   //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
                   TPL_CALLBACK,\r
                   KillNtGopThread,\r
                   Private,\r
+                  &gEfiEventExitBootServicesGuid,\r
                   &mGopScreenExitBootServicesEvent\r
                   );\r
 \r
@@ -928,7 +1029,7 @@ WinNtGopConstructor (
   Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;\r
   Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
   Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
-  Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL;\r
+  Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
   Private->GraphicsOutput.Mode->FrameBufferSize = 0;\r
 \r
   Private->HardwareNeedsStarting  = TRUE;\r
@@ -1007,7 +1108,6 @@ WinNtGopDestructor (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 EFIAPI\r
 KillNtGopThread (\r