3 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
4 SPDX-License-Identifier: BSD-2-Clause-Patent
12 This file produces the Simple Text In for an Gop window.
14 This stuff is linked at the hip to the Window, since the window
15 processing is done in a thread kicked off in WinNtGopImplementation.c
17 Since the window information is processed in an other thread we need
18 a keyboard Queue to pass data about. The Simple Text In code just
19 takes data off the Queue. The WinProc message loop takes keyboard input
20 and places it in the Queue.
30 TODO: Add function description
32 @param Private TODO: add argument description
34 @retval EFI_SUCCESS TODO: Add description for return value
39 IN GRAPHICS_PRIVATE_DATA
*Private
,
40 IN GOP_QUEUE_FIXED
*Queue
43 InitializeCriticalSection (&Queue
->Cs
);
51 TODO: Add function description
53 @param Private TODO: add argument description
55 @retval EFI_SUCCESS TODO: Add description for return value
60 IN GRAPHICS_PRIVATE_DATA
*Private
,
61 IN GOP_QUEUE_FIXED
*Queue
66 DeleteCriticalSection (&Queue
->Cs
);
72 TODO: Add function description
74 @param Private TODO: add argument description
75 @param Key TODO: add argument description
77 @retval EFI_NOT_READY TODO: Add description for return value
78 @retval EFI_SUCCESS TODO: Add description for return value
83 IN GRAPHICS_PRIVATE_DATA
*Private
,
84 IN GOP_QUEUE_FIXED
*Queue
,
85 IN EFI_KEY_DATA
*KeyData
88 EnterCriticalSection (&Queue
->Cs
);
90 if ((Queue
->Rear
+ 1) % MAX_Q
== Queue
->Front
) {
91 LeaveCriticalSection (&Queue
->Cs
);
95 CopyMem (&Queue
->Q
[Queue
->Rear
], KeyData
, sizeof (EFI_KEY_DATA
));
96 Queue
->Rear
= (Queue
->Rear
+ 1) % MAX_Q
;
98 LeaveCriticalSection (&Queue
->Cs
);
104 TODO: Add function description
106 @param Private TODO: add argument description
107 @param Key TODO: add argument description
109 @retval EFI_NOT_READY TODO: Add description for return value
110 @retval EFI_SUCCESS TODO: Add description for return value
115 IN GRAPHICS_PRIVATE_DATA
*Private
,
116 IN GOP_QUEUE_FIXED
*Queue
,
117 OUT EFI_KEY_DATA
*Key
120 EnterCriticalSection (&Queue
->Cs
);
122 if (Queue
->Front
== Queue
->Rear
) {
123 LeaveCriticalSection (&Queue
->Cs
);
124 return EFI_NOT_READY
;
127 CopyMem (Key
, &Queue
->Q
[Queue
->Front
], sizeof (EFI_KEY_DATA
));
128 Queue
->Front
= (Queue
->Front
+ 1) % MAX_Q
;
130 if (Key
->Key
.ScanCode
== SCAN_NULL
&& Key
->Key
.UnicodeChar
== CHAR_NULL
) {
131 if (!Private
->IsPartialKeySupport
) {
133 // If partial keystrok is not enabled, don't return the partial keystroke.
135 LeaveCriticalSection (&Queue
->Cs
);
136 ZeroMem (Key
, sizeof (EFI_KEY_DATA
));
137 return EFI_NOT_READY
;
140 LeaveCriticalSection (&Queue
->Cs
);
146 TODO: Add function description
148 @param Private TODO: add argument description
150 @retval EFI_NOT_READY TODO: Add description for return value
151 @retval EFI_SUCCESS TODO: Add description for return value
156 IN GOP_QUEUE_FIXED
*Queue
159 if (Queue
->Front
== Queue
->Rear
) {
160 return EFI_NOT_READY
;
167 Initialize the key state.
169 @param Private The GOP_PRIVATE_DATA instance.
170 @param KeyState A pointer to receive the key state information.
174 IN GRAPHICS_PRIVATE_DATA
*Private
,
175 IN EFI_KEY_STATE
*KeyState
178 KeyState
->KeyShiftState
= EFI_SHIFT_STATE_VALID
;
179 KeyState
->KeyToggleState
= EFI_TOGGLE_STATE_VALID
;
182 // Record Key shift state and toggle state
184 if (Private
->LeftCtrl
) {
185 KeyState
->KeyShiftState
|= EFI_LEFT_CONTROL_PRESSED
;
187 if (Private
->RightCtrl
) {
188 KeyState
->KeyShiftState
|= EFI_RIGHT_CONTROL_PRESSED
;
190 if (Private
->LeftAlt
) {
191 KeyState
->KeyShiftState
|= EFI_LEFT_ALT_PRESSED
;
193 if (Private
->RightAlt
) {
194 KeyState
->KeyShiftState
|= EFI_RIGHT_ALT_PRESSED
;
196 if (Private
->LeftShift
) {
197 KeyState
->KeyShiftState
|= EFI_LEFT_SHIFT_PRESSED
;
199 if (Private
->RightShift
) {
200 KeyState
->KeyShiftState
|= EFI_RIGHT_SHIFT_PRESSED
;
202 if (Private
->LeftLogo
) {
203 KeyState
->KeyShiftState
|= EFI_LEFT_LOGO_PRESSED
;
205 if (Private
->RightLogo
) {
206 KeyState
->KeyShiftState
|= EFI_RIGHT_LOGO_PRESSED
;
209 KeyState
->KeyShiftState
|= EFI_MENU_KEY_PRESSED
;
211 if (Private
->SysReq
) {
212 KeyState
->KeyShiftState
|= EFI_SYS_REQ_PRESSED
;
214 if (Private
->CapsLock
) {
215 KeyState
->KeyToggleState
|= EFI_CAPS_LOCK_ACTIVE
;
217 if (Private
->NumLock
) {
218 KeyState
->KeyToggleState
|= EFI_NUM_LOCK_ACTIVE
;
220 if (Private
->ScrollLock
) {
221 KeyState
->KeyToggleState
|= EFI_SCROLL_LOCK_ACTIVE
;
223 if (Private
->IsPartialKeySupport
) {
224 KeyState
->KeyToggleState
|= EFI_KEY_STATE_EXPOSED
;
229 TODO: Add function description
231 @param Private TODO: add argument description
232 @param Key TODO: add argument description
234 @retval EFI_NOT_READY TODO: Add description for return value
235 @retval EFI_SUCCESS TODO: Add description for return value
240 IN GRAPHICS_PRIVATE_DATA
*Private
,
244 EFI_KEY_DATA KeyData
;
247 InitializeKeyState (Private
, &KeyData
.KeyState
);
250 // Convert Ctrl+[1-26] to Ctrl+[A-Z]
252 if ((Private
->LeftCtrl
|| Private
->RightCtrl
) &&
253 (KeyData
.Key
.UnicodeChar
>= 1) && (KeyData
.Key
.UnicodeChar
<= 26)
255 if ((Private
->LeftShift
|| Private
->RightShift
) == Private
->CapsLock
) {
256 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'a' - 1);
258 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'A' - 1);
263 // Unmask the Shift bit for printable char
265 if (((KeyData
.Key
.UnicodeChar
>= L
'a') && (KeyData
.Key
.UnicodeChar
<= L
'z')) ||
266 ((KeyData
.Key
.UnicodeChar
>= L
'A') && (KeyData
.Key
.UnicodeChar
<= L
'Z'))
268 KeyData
.KeyState
.KeyShiftState
&= ~(EFI_LEFT_SHIFT_PRESSED
| EFI_RIGHT_SHIFT_PRESSED
);
271 GopPrivateAddQ (Private
, &Private
->QueueForRead
, &KeyData
);
272 if (Private
->MakeRegisterdKeyCallback
!= NULL
) {
273 Private
->MakeRegisterdKeyCallback (Private
->RegisterdKeyCallbackContext
, &KeyData
);
283 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
286 GRAPHICS_PRIVATE_DATA
*Private
;
288 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
290 return GopPrivateCheckQ (&Private
->QueueForRead
);
296 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
297 IN EFI_KEY_DATA
*KeyData
302 Reads the next keystroke from the input device. The WaitForKey Event can
303 be used to test for existence of a keystroke via WaitForEvent () call.
306 Private - The private structure of WinNt Gop device.
307 KeyData - A pointer to a buffer that is filled in with the keystroke
308 state data for the key that was pressed.
311 EFI_SUCCESS - The keystroke information was returned.
312 EFI_NOT_READY - There was no keystroke data available.
313 EFI_DEVICE_ERROR - The keystroke information was not returned due to
315 EFI_INVALID_PARAMETER - KeyData is NULL.
320 GRAPHICS_PRIVATE_DATA
*Private
;
322 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
324 ZeroMem (&KeyData
->Key
, sizeof (KeyData
->Key
));
325 InitializeKeyState (Private
, &KeyData
->KeyState
);
327 Status
= GopPrivateCheckQ (&Private
->QueueForRead
);
328 if (!EFI_ERROR (Status
)) {
330 // If a Key press exists try and read it.
332 Status
= GopPrivateDeleteQ (Private
, &Private
->QueueForRead
, KeyData
);
333 if (!EFI_ERROR (Status
)) {
335 // If partial keystroke is not enabled, check whether it is value key. If not return
338 if (!Private
->IsPartialKeySupport
) {
339 if (KeyData
->Key
.ScanCode
== SCAN_NULL
&& KeyData
->Key
.UnicodeChar
== CHAR_NULL
) {
340 Status
= EFI_NOT_READY
;
352 WinNtWndKeySetState (
353 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
354 IN EFI_KEY_TOGGLE_STATE
*KeyToggleState
357 GRAPHICS_PRIVATE_DATA
*Private
;
359 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
360 Private
->ScrollLock
= FALSE
;
361 Private
->NumLock
= FALSE
;
362 Private
->CapsLock
= FALSE
;
363 Private
->IsPartialKeySupport
= FALSE
;
365 if ((*KeyToggleState
& EFI_SCROLL_LOCK_ACTIVE
) == EFI_SCROLL_LOCK_ACTIVE
) {
366 Private
->ScrollLock
= TRUE
;
368 if ((*KeyToggleState
& EFI_NUM_LOCK_ACTIVE
) == EFI_NUM_LOCK_ACTIVE
) {
369 Private
->NumLock
= TRUE
;
371 if ((*KeyToggleState
& EFI_CAPS_LOCK_ACTIVE
) == EFI_CAPS_LOCK_ACTIVE
) {
372 Private
->CapsLock
= TRUE
;
374 if ((*KeyToggleState
& EFI_KEY_STATE_EXPOSED
) == EFI_KEY_STATE_EXPOSED
) {
375 Private
->IsPartialKeySupport
= TRUE
;
377 Private
->KeyState
.KeyToggleState
= *KeyToggleState
;
384 WinNtWndRegisterKeyNotify (
385 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
386 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack
,
387 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack
,
391 GRAPHICS_PRIVATE_DATA
*Private
;
393 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
395 Private
->MakeRegisterdKeyCallback
= MakeCallBack
;
396 Private
->BreakRegisterdKeyCallback
= BreakCallBack
;
397 Private
->RegisterdKeyCallbackContext
= Context
;
404 WinNtWndCheckPointer (
405 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
408 GRAPHICS_PRIVATE_DATA
*Private
;
410 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
412 if (!Private
->PointerStateChanged
) {
413 return EFI_NOT_READY
;
421 WinNtWndGetPointerState (
422 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
423 IN EFI_SIMPLE_POINTER_STATE
*State
426 GRAPHICS_PRIVATE_DATA
*Private
;
428 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
430 if (!Private
->PointerStateChanged
) {
431 return EFI_NOT_READY
;
434 State
->RelativeMovementX
= Private
->PointerState
.RelativeMovementX
;
435 State
->RelativeMovementY
= Private
->PointerState
.RelativeMovementY
;
436 State
->RelativeMovementZ
= Private
->PointerState
.RelativeMovementZ
;
437 State
->LeftButton
= Private
->PointerState
.LeftButton
;
438 State
->RightButton
= Private
->PointerState
.RightButton
;
440 Private
->PointerState
.RelativeMovementX
= 0;
441 Private
->PointerState
.RelativeMovementY
= 0;
442 Private
->PointerState
.RelativeMovementZ
= 0;
444 Private
->PointerStateChanged
= FALSE
;