1 /** @file
2 
3 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
5 
6 Module Name:
7 
8   WinGop.h
9 
10 Abstract:
11 
12   Private data for the Gop driver that is bound to the WinNt Thunk protocol
13 
14 
15 **/
16 
17 #ifndef _WIN_GOP_H_
18 #define _WIN_GOP_H_
19 
20 
21 #include "WinHost.h"
22 
23 #include <Protocol/EmuIoThunk.h>
24 #include <Protocol/EmuGraphicsWindow.h>
25 #include <Protocol/SimplePointer.h>
26 #include <Protocol/SimpleTextIn.h>
27 #include <Protocol/SimpleTextInEx.h>
28 #include <Protocol/GraphicsOutput.h>
29 #include <Library/FrameBufferBltLib.h>
30 
31 //
32 // WM_SYSKEYDOWN/WM_SYSKEYUP Notification
33 // lParam
34 // bit 24: Specifies whether the key is an extended key,
35 // such as the right-hand ALT and CTRL keys that appear on
36 // an enhanced 101- or 102-key keyboard.
37 // The value is 1 if it is an extended key; otherwise, it is 0.
38 // bit 29:Specifies the context code.
39 // The value is 1 if the ALT key is down while the key is pressed/released;
40 // it is 0 if the WM_SYSKEYDOWN message is posted to the active window
41 // because no window has the keyboard focus.
42 #define GOP_EXTENDED_KEY         (0x1 << 24)
43 #define GOP_ALT_KEY_PRESSED      (0x1 << 29)
44 
45 #define KEYBOARD_TIMER_INTERVAL         200000  // 0.02s
46 
47 #define MAX_Q 256
48 
49 typedef struct {
50   UINTN             Front;
51   UINTN             Rear;
52   EFI_KEY_DATA      Q[MAX_Q];
53   CRITICAL_SECTION  Cs;
54 } GOP_QUEUE_FIXED;
55 
56 #define WIN_NT_GOP_CLASS_NAME       L"WinNtGopWindow"
57 
58 
59 typedef struct {
60   UINT64                        Signature;
61   EMU_GRAPHICS_WINDOW_PROTOCOL  GraphicsWindowIo;
62 
63   //
64   // GOP Private Data knowing when to start hardware
65   //
66   BOOLEAN                       HardwareNeedsStarting;
67 
68   CHAR16                        *WindowName;
69   CHAR16                        Buffer[160];
70 
71   HANDLE                        ThreadInited; // Semaphore
72   HANDLE                        ThreadHandle; // Thread
73   DWORD                         ThreadId;
74 
75   HWND                          WindowHandle;
76   WNDCLASSEX                    WindowsClass;
77 
78   UINT32                        Width;
79   UINT32                        Height;
80   //
81   // This screen is used to redraw the scree when windows events happen. It's
82   // updated in the main thread and displayed in the windows thread.
83   //
84   BITMAPV4HEADER                *VirtualScreenInfo;
85 
86   FRAME_BUFFER_CONFIGURE        *FrameBufferConfigure;
87 
88   //
89   // Keyboard Queue used by Simple Text In.
90   // QueueForRead:   WinProc thread adds, and main thread removes.
91   //
92   GOP_QUEUE_FIXED               QueueForRead;
93 
94   EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeRegisterdKeyCallback;
95   EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakRegisterdKeyCallback;
96   VOID                                                *RegisterdKeyCallbackContext;
97 
98   EFI_KEY_STATE                     KeyState;
99   BOOLEAN                           LeftShift;
100   BOOLEAN                           RightShift;
101   BOOLEAN                           LeftAlt;
102   BOOLEAN                           RightAlt;
103   BOOLEAN                           LeftCtrl;
104   BOOLEAN                           RightCtrl;
105   BOOLEAN                           LeftLogo;
106   BOOLEAN                           RightLogo;
107   BOOLEAN                           Menu;
108   BOOLEAN                           SysReq;
109   BOOLEAN                           NumLock;
110   BOOLEAN                           ScrollLock;
111   BOOLEAN                           CapsLock;
112   BOOLEAN                           IsPartialKeySupport;
113   INT32                             PointerPreviousX;
114   INT32                             PointerPreviousY;
115   BOOLEAN                           PointerStateChanged;
116   EFI_SIMPLE_POINTER_STATE          PointerState;
117 } GRAPHICS_PRIVATE_DATA;
118 #define GRAPHICS_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('g', 'f', 'x', 'd')
119 #define GRAPHICS_PRIVATE_DATA_FROM_THIS(a)  \
120          CR(a, GRAPHICS_PRIVATE_DATA, GraphicsWindowIo, GRAPHICS_PRIVATE_DATA_SIGNATURE)
121 
122 
123 //
124 // Gop Hardware abstraction internal worker functions
125 //
126 
127 /**
128   TODO: Add function description
129 
130   @param  Private              TODO: add argument description
131   @param  Key                  TODO: add argument description
132 
133   @return TODO: add return values
134 
135 **/
136 EFI_STATUS
137 GopPrivateAddKey (
138   IN  GRAPHICS_PRIVATE_DATA    *Private,
139   IN  EFI_INPUT_KEY            Key
140   );
141 
142 EFI_STATUS
143 EFIAPI
144 WinNtWndGetKey (
145   IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
146   IN  EFI_KEY_DATA                  *KeyData
147   );
148 
149 EFI_STATUS
150 EFIAPI
151 WinNtWndCheckKey (
152   IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
153   );
154 
155 EFI_STATUS
156 EFIAPI
157 WinNtWndKeySetState (
158   IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,
159   IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
160   );
161 
162 EFI_STATUS
163 EFIAPI
164 WinNtWndRegisterKeyNotify (
165   IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,
166   IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeCallBack,
167   IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakCallBack,
168   IN VOID                                                *Context
169   );
170 
171 EFI_STATUS
172 EFIAPI
173 WinNtWndCheckPointer (
174   IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
175   );
176 
177 EFI_STATUS
178 EFIAPI
179 WinNtWndGetPointerState (
180   IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
181   IN  EFI_SIMPLE_POINTER_STATE      *State
182   );
183 EFI_STATUS
184 GopPrivateCreateQ (
185   IN  GRAPHICS_PRIVATE_DATA    *Private,
186   IN GOP_QUEUE_FIXED           *Queue
187   );
188 
189 
190 /**
191   TODO: Add function description
192 
193   @param  Private               TODO: add argument description
194 
195   @retval EFI_SUCCESS           TODO: Add description for return value
196 
197 **/
198 EFI_STATUS
199 GopPrivateDestroyQ (
200   IN  GRAPHICS_PRIVATE_DATA    *Private,
201   IN GOP_QUEUE_FIXED           *Queue
202   );
203 #endif
204 
205