]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtGopDxe/WinNtGopScreen.c
Add Doxygen style comments to the EFI_SIZE_TO_PAGES() and EFI_PAGES_TO_SIZE() macros...
[mirror_edk2.git] / Nt32Pkg / WinNtGopDxe / WinNtGopScreen.c
index e0270712288a51030739a503fa683583a10dd324..4d240cffc45e7ce35cc5edf786afc0fd99d3b6d6 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -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    = (BOOLEAN)(!Private->NumLock);\r
+    break;\r
+  case VK_SCROLL:\r
+    Private->ScrollLock = (BOOLEAN)(!Private->ScrollLock);\r
+    break;  \r
+  case VK_CAPITAL:\r
+    Private->CapsLock   = (BOOLEAN)(!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
@@ -169,10 +246,6 @@ WinNtGopSetMode (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  if (ModeNumber == This->Mode->Mode) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
   ModeData = &Private->ModeData[ModeNumber];\r
   This->Mode->Mode = ModeNumber;\r
   Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
@@ -615,6 +688,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 +700,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 +725,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
@@ -725,7 +821,6 @@ WinNtGopThreadWinMain (
 {\r
   MSG               Message;\r
   GOP_PRIVATE_DATA  *Private;\r
-  ATOM              Atom;\r
   RECT              Rect;\r
 \r
   Private = (GOP_PRIVATE_DATA *) lpParameter;\r
@@ -761,7 +856,7 @@ WinNtGopThreadWinMain (
   // Class, including the callback function, unless the Class is unregistered and\r
   // successfully registered again.\r
   //\r
-  Atom = Private->WinNtThunk->RegisterClassEx (&Private->WindowsClass);\r
+  Private->WinNtThunk->RegisterClassEx (&Private->WindowsClass);\r
 \r
   //\r
   // Setting Rect values to allow for the AdjustWindowRect to provide\r
@@ -786,7 +881,7 @@ WinNtGopThreadWinMain (
                                                 NULL,\r
                                                 NULL,\r
                                                 NULL,\r
-                                                &Private\r
+                                                (VOID **)&Private\r
                                                 );\r
 \r
   //\r
@@ -858,11 +953,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 +1024,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
@@ -953,8 +1049,6 @@ WinNtGopDestructor (
   GOP_PRIVATE_DATA     *Private\r
   )\r
 {\r
-  UINT32  UnregisterReturn;\r
-\r
   if (!Private->HardwareNeedsStarting) {\r
     //\r
     // BugBug: Shutdown GOP Hardware and any child devices.\r
@@ -974,10 +1068,10 @@ WinNtGopDestructor (
       Private->WinNtThunk->TlsFree (mTlsIndex);\r
       mTlsIndex = TLS_OUT_OF_INDEXES;\r
 \r
-      UnregisterReturn = Private->WinNtThunk->UnregisterClass (\r
-                                                Private->WindowsClass.lpszClassName,\r
-                                                Private->WindowsClass.hInstance\r
-                                                );\r
+      Private->WinNtThunk->UnregisterClass (\r
+                              Private->WindowsClass.lpszClassName,\r
+                              Private->WindowsClass.hInstance\r
+                              );\r
     }\r
 \r
     WinNtGopDestroySimpleTextInForWindow (Private);\r
@@ -1007,7 +1101,6 @@ WinNtGopDestructor (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 EFIAPI\r
 KillNtGopThread (\r
@@ -1015,6 +1108,5 @@ KillNtGopThread (
   IN VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-  Status = WinNtGopDestructor (Context);\r
+  WinNtGopDestructor (Context);\r
 }\r