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.
28 TODO: Add function description
30 @param Private TODO: add argument description
32 @retval EFI_SUCCESS TODO: Add description for return value
37 IN GRAPHICS_PRIVATE_DATA
*Private
,
38 IN GOP_QUEUE_FIXED
*Queue
41 InitializeCriticalSection (&Queue
->Cs
);
48 TODO: Add function description
50 @param Private TODO: add argument description
52 @retval EFI_SUCCESS TODO: Add description for return value
57 IN GRAPHICS_PRIVATE_DATA
*Private
,
58 IN GOP_QUEUE_FIXED
*Queue
63 DeleteCriticalSection (&Queue
->Cs
);
68 TODO: Add function description
70 @param Private TODO: add argument description
71 @param Key TODO: add argument description
73 @retval EFI_NOT_READY TODO: Add description for return value
74 @retval EFI_SUCCESS TODO: Add description for return value
79 IN GRAPHICS_PRIVATE_DATA
*Private
,
80 IN GOP_QUEUE_FIXED
*Queue
,
81 IN EFI_KEY_DATA
*KeyData
84 EnterCriticalSection (&Queue
->Cs
);
86 if ((Queue
->Rear
+ 1) % MAX_Q
== Queue
->Front
) {
87 LeaveCriticalSection (&Queue
->Cs
);
91 CopyMem (&Queue
->Q
[Queue
->Rear
], KeyData
, sizeof (EFI_KEY_DATA
));
92 Queue
->Rear
= (Queue
->Rear
+ 1) % MAX_Q
;
94 LeaveCriticalSection (&Queue
->Cs
);
99 TODO: Add function description
101 @param Private TODO: add argument description
102 @param Key TODO: add argument description
104 @retval EFI_NOT_READY TODO: Add description for return value
105 @retval EFI_SUCCESS TODO: Add description for return value
110 IN GRAPHICS_PRIVATE_DATA
*Private
,
111 IN GOP_QUEUE_FIXED
*Queue
,
112 OUT EFI_KEY_DATA
*Key
115 EnterCriticalSection (&Queue
->Cs
);
117 if (Queue
->Front
== Queue
->Rear
) {
118 LeaveCriticalSection (&Queue
->Cs
);
119 return EFI_NOT_READY
;
122 CopyMem (Key
, &Queue
->Q
[Queue
->Front
], sizeof (EFI_KEY_DATA
));
123 Queue
->Front
= (Queue
->Front
+ 1) % MAX_Q
;
125 if ((Key
->Key
.ScanCode
== SCAN_NULL
) && (Key
->Key
.UnicodeChar
== CHAR_NULL
)) {
126 if (!Private
->IsPartialKeySupport
) {
128 // If partial keystrok is not enabled, don't return the partial keystroke.
130 LeaveCriticalSection (&Queue
->Cs
);
131 ZeroMem (Key
, sizeof (EFI_KEY_DATA
));
132 return EFI_NOT_READY
;
136 LeaveCriticalSection (&Queue
->Cs
);
141 TODO: Add function description
143 @param Private TODO: add argument description
145 @retval EFI_NOT_READY TODO: Add description for return value
146 @retval EFI_SUCCESS TODO: Add description for return value
151 IN GOP_QUEUE_FIXED
*Queue
154 if (Queue
->Front
== Queue
->Rear
) {
155 return EFI_NOT_READY
;
162 Initialize the key state.
164 @param Private The GOP_PRIVATE_DATA instance.
165 @param KeyState A pointer to receive the key state information.
169 IN GRAPHICS_PRIVATE_DATA
*Private
,
170 IN EFI_KEY_STATE
*KeyState
173 KeyState
->KeyShiftState
= EFI_SHIFT_STATE_VALID
;
174 KeyState
->KeyToggleState
= EFI_TOGGLE_STATE_VALID
;
177 // Record Key shift state and toggle state
179 if (Private
->LeftCtrl
) {
180 KeyState
->KeyShiftState
|= EFI_LEFT_CONTROL_PRESSED
;
183 if (Private
->RightCtrl
) {
184 KeyState
->KeyShiftState
|= EFI_RIGHT_CONTROL_PRESSED
;
187 if (Private
->LeftAlt
) {
188 KeyState
->KeyShiftState
|= EFI_LEFT_ALT_PRESSED
;
191 if (Private
->RightAlt
) {
192 KeyState
->KeyShiftState
|= EFI_RIGHT_ALT_PRESSED
;
195 if (Private
->LeftShift
) {
196 KeyState
->KeyShiftState
|= EFI_LEFT_SHIFT_PRESSED
;
199 if (Private
->RightShift
) {
200 KeyState
->KeyShiftState
|= EFI_RIGHT_SHIFT_PRESSED
;
203 if (Private
->LeftLogo
) {
204 KeyState
->KeyShiftState
|= EFI_LEFT_LOGO_PRESSED
;
207 if (Private
->RightLogo
) {
208 KeyState
->KeyShiftState
|= EFI_RIGHT_LOGO_PRESSED
;
212 KeyState
->KeyShiftState
|= EFI_MENU_KEY_PRESSED
;
215 if (Private
->SysReq
) {
216 KeyState
->KeyShiftState
|= EFI_SYS_REQ_PRESSED
;
219 if (Private
->CapsLock
) {
220 KeyState
->KeyToggleState
|= EFI_CAPS_LOCK_ACTIVE
;
223 if (Private
->NumLock
) {
224 KeyState
->KeyToggleState
|= EFI_NUM_LOCK_ACTIVE
;
227 if (Private
->ScrollLock
) {
228 KeyState
->KeyToggleState
|= EFI_SCROLL_LOCK_ACTIVE
;
231 if (Private
->IsPartialKeySupport
) {
232 KeyState
->KeyToggleState
|= EFI_KEY_STATE_EXPOSED
;
237 TODO: Add function description
239 @param Private TODO: add argument description
240 @param Key TODO: add argument description
242 @retval EFI_NOT_READY TODO: Add description for return value
243 @retval EFI_SUCCESS TODO: Add description for return value
248 IN GRAPHICS_PRIVATE_DATA
*Private
,
252 EFI_KEY_DATA KeyData
;
255 InitializeKeyState (Private
, &KeyData
.KeyState
);
258 // Convert Ctrl+[1-26] to Ctrl+[A-Z]
260 if ((Private
->LeftCtrl
|| Private
->RightCtrl
) &&
261 (KeyData
.Key
.UnicodeChar
>= 1) && (KeyData
.Key
.UnicodeChar
<= 26)
264 if ((Private
->LeftShift
|| Private
->RightShift
) == Private
->CapsLock
) {
265 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'a' - 1);
267 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'A' - 1);
272 // Unmask the Shift bit for printable char
274 if (((KeyData
.Key
.UnicodeChar
>= L
'a') && (KeyData
.Key
.UnicodeChar
<= L
'z')) ||
275 ((KeyData
.Key
.UnicodeChar
>= L
'A') && (KeyData
.Key
.UnicodeChar
<= L
'Z'))
278 KeyData
.KeyState
.KeyShiftState
&= ~(EFI_LEFT_SHIFT_PRESSED
| EFI_RIGHT_SHIFT_PRESSED
);
281 GopPrivateAddQ (Private
, &Private
->QueueForRead
, &KeyData
);
282 if (Private
->MakeRegisterdKeyCallback
!= NULL
) {
283 Private
->MakeRegisterdKeyCallback (Private
->RegisterdKeyCallbackContext
, &KeyData
);
292 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
295 GRAPHICS_PRIVATE_DATA
*Private
;
297 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
299 return GopPrivateCheckQ (&Private
->QueueForRead
);
305 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
306 IN EFI_KEY_DATA
*KeyData
312 Reads the next keystroke from the input device. The WaitForKey Event can
313 be used to test for existence of a keystroke via WaitForEvent () call.
316 Private - The private structure of WinNt Gop device.
317 KeyData - A pointer to a buffer that is filled in with the keystroke
318 state data for the key that was pressed.
321 EFI_SUCCESS - The keystroke information was returned.
322 EFI_NOT_READY - There was no keystroke data available.
323 EFI_DEVICE_ERROR - The keystroke information was not returned due to
325 EFI_INVALID_PARAMETER - KeyData is NULL.
330 GRAPHICS_PRIVATE_DATA
*Private
;
332 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
334 ZeroMem (&KeyData
->Key
, sizeof (KeyData
->Key
));
335 InitializeKeyState (Private
, &KeyData
->KeyState
);
337 Status
= GopPrivateCheckQ (&Private
->QueueForRead
);
338 if (!EFI_ERROR (Status
)) {
340 // If a Key press exists try and read it.
342 Status
= GopPrivateDeleteQ (Private
, &Private
->QueueForRead
, KeyData
);
343 if (!EFI_ERROR (Status
)) {
345 // If partial keystroke is not enabled, check whether it is value key. If not return
348 if (!Private
->IsPartialKeySupport
) {
349 if ((KeyData
->Key
.ScanCode
== SCAN_NULL
) && (KeyData
->Key
.UnicodeChar
== CHAR_NULL
)) {
350 Status
= EFI_NOT_READY
;
361 WinNtWndKeySetState (
362 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
363 IN EFI_KEY_TOGGLE_STATE
*KeyToggleState
366 GRAPHICS_PRIVATE_DATA
*Private
;
368 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
369 Private
->ScrollLock
= FALSE
;
370 Private
->NumLock
= FALSE
;
371 Private
->CapsLock
= FALSE
;
372 Private
->IsPartialKeySupport
= FALSE
;
374 if ((*KeyToggleState
& EFI_SCROLL_LOCK_ACTIVE
) == EFI_SCROLL_LOCK_ACTIVE
) {
375 Private
->ScrollLock
= TRUE
;
378 if ((*KeyToggleState
& EFI_NUM_LOCK_ACTIVE
) == EFI_NUM_LOCK_ACTIVE
) {
379 Private
->NumLock
= TRUE
;
382 if ((*KeyToggleState
& EFI_CAPS_LOCK_ACTIVE
) == EFI_CAPS_LOCK_ACTIVE
) {
383 Private
->CapsLock
= TRUE
;
386 if ((*KeyToggleState
& EFI_KEY_STATE_EXPOSED
) == EFI_KEY_STATE_EXPOSED
) {
387 Private
->IsPartialKeySupport
= TRUE
;
390 Private
->KeyState
.KeyToggleState
= *KeyToggleState
;
396 WinNtWndRegisterKeyNotify (
397 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
398 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack
,
399 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack
,
403 GRAPHICS_PRIVATE_DATA
*Private
;
405 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
407 Private
->MakeRegisterdKeyCallback
= MakeCallBack
;
408 Private
->BreakRegisterdKeyCallback
= BreakCallBack
;
409 Private
->RegisterdKeyCallbackContext
= Context
;
416 WinNtWndCheckPointer (
417 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
420 GRAPHICS_PRIVATE_DATA
*Private
;
422 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
424 if (!Private
->PointerStateChanged
) {
425 return EFI_NOT_READY
;
433 WinNtWndGetPointerState (
434 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
435 IN EFI_SIMPLE_POINTER_STATE
*State
438 GRAPHICS_PRIVATE_DATA
*Private
;
440 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
442 if (!Private
->PointerStateChanged
) {
443 return EFI_NOT_READY
;
446 State
->RelativeMovementX
= Private
->PointerState
.RelativeMovementX
;
447 State
->RelativeMovementY
= Private
->PointerState
.RelativeMovementY
;
448 State
->RelativeMovementZ
= Private
->PointerState
.RelativeMovementZ
;
449 State
->LeftButton
= Private
->PointerState
.LeftButton
;
450 State
->RightButton
= Private
->PointerState
.RightButton
;
452 Private
->PointerState
.RelativeMovementX
= 0;
453 Private
->PointerState
.RelativeMovementY
= 0;
454 Private
->PointerState
.RelativeMovementZ
= 0;
456 Private
->PointerStateChanged
= FALSE
;