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