3 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 This file produces the Simple Text In for an Gop window.
20 This stuff is linked at the hip to the Window, since the window
21 processing is done in a thread kicked off in WinNtGopImplementation.c
23 Since the window information is processed in an other thread we need
24 a keyboard Queue to pass data about. The Simple Text In code just
25 takes data off the Queue. The WinProc message loop takes keyboard input
26 and places it in the Queue.
36 TODO: Add function description
38 @param Private TODO: add argument description
40 @retval EFI_SUCCESS TODO: Add description for return value
45 IN GRAPHICS_PRIVATE_DATA
*Private
,
46 IN GOP_QUEUE_FIXED
*Queue
49 InitializeCriticalSection (&Queue
->Cs
);
57 TODO: Add function description
59 @param Private TODO: add argument description
61 @retval EFI_SUCCESS TODO: Add description for return value
66 IN GRAPHICS_PRIVATE_DATA
*Private
,
67 IN GOP_QUEUE_FIXED
*Queue
72 DeleteCriticalSection (&Queue
->Cs
);
78 TODO: Add function description
80 @param Private TODO: add argument description
81 @param Key TODO: add argument description
83 @retval EFI_NOT_READY TODO: Add description for return value
84 @retval EFI_SUCCESS TODO: Add description for return value
89 IN GRAPHICS_PRIVATE_DATA
*Private
,
90 IN GOP_QUEUE_FIXED
*Queue
,
91 IN EFI_KEY_DATA
*KeyData
94 EnterCriticalSection (&Queue
->Cs
);
96 if ((Queue
->Rear
+ 1) % MAX_Q
== Queue
->Front
) {
97 LeaveCriticalSection (&Queue
->Cs
);
101 CopyMem (&Queue
->Q
[Queue
->Rear
], KeyData
, sizeof (EFI_KEY_DATA
));
102 Queue
->Rear
= (Queue
->Rear
+ 1) % MAX_Q
;
104 LeaveCriticalSection (&Queue
->Cs
);
110 TODO: Add function description
112 @param Private TODO: add argument description
113 @param Key TODO: add argument description
115 @retval EFI_NOT_READY TODO: Add description for return value
116 @retval EFI_SUCCESS TODO: Add description for return value
121 IN GRAPHICS_PRIVATE_DATA
*Private
,
122 IN GOP_QUEUE_FIXED
*Queue
,
123 OUT EFI_KEY_DATA
*Key
126 EnterCriticalSection (&Queue
->Cs
);
128 if (Queue
->Front
== Queue
->Rear
) {
129 LeaveCriticalSection (&Queue
->Cs
);
130 return EFI_NOT_READY
;
133 CopyMem (Key
, &Queue
->Q
[Queue
->Front
], sizeof (EFI_KEY_DATA
));
134 Queue
->Front
= (Queue
->Front
+ 1) % MAX_Q
;
136 if (Key
->Key
.ScanCode
== SCAN_NULL
&& Key
->Key
.UnicodeChar
== CHAR_NULL
) {
137 if (!Private
->IsPartialKeySupport
) {
139 // If partial keystrok is not enabled, don't return the partial keystroke.
141 LeaveCriticalSection (&Queue
->Cs
);
142 ZeroMem (Key
, sizeof (EFI_KEY_DATA
));
143 return EFI_NOT_READY
;
146 LeaveCriticalSection (&Queue
->Cs
);
152 TODO: Add function description
154 @param Private TODO: add argument description
156 @retval EFI_NOT_READY TODO: Add description for return value
157 @retval EFI_SUCCESS TODO: Add description for return value
162 IN GOP_QUEUE_FIXED
*Queue
165 if (Queue
->Front
== Queue
->Rear
) {
166 return EFI_NOT_READY
;
173 Initialize the key state.
175 @param Private The GOP_PRIVATE_DATA instance.
176 @param KeyState A pointer to receive the key state information.
180 IN GRAPHICS_PRIVATE_DATA
*Private
,
181 IN EFI_KEY_STATE
*KeyState
184 KeyState
->KeyShiftState
= EFI_SHIFT_STATE_VALID
;
185 KeyState
->KeyToggleState
= EFI_TOGGLE_STATE_VALID
;
188 // Record Key shift state and toggle state
190 if (Private
->LeftCtrl
) {
191 KeyState
->KeyShiftState
|= EFI_LEFT_CONTROL_PRESSED
;
193 if (Private
->RightCtrl
) {
194 KeyState
->KeyShiftState
|= EFI_RIGHT_CONTROL_PRESSED
;
196 if (Private
->LeftAlt
) {
197 KeyState
->KeyShiftState
|= EFI_LEFT_ALT_PRESSED
;
199 if (Private
->RightAlt
) {
200 KeyState
->KeyShiftState
|= EFI_RIGHT_ALT_PRESSED
;
202 if (Private
->LeftShift
) {
203 KeyState
->KeyShiftState
|= EFI_LEFT_SHIFT_PRESSED
;
205 if (Private
->RightShift
) {
206 KeyState
->KeyShiftState
|= EFI_RIGHT_SHIFT_PRESSED
;
208 if (Private
->LeftLogo
) {
209 KeyState
->KeyShiftState
|= EFI_LEFT_LOGO_PRESSED
;
211 if (Private
->RightLogo
) {
212 KeyState
->KeyShiftState
|= EFI_RIGHT_LOGO_PRESSED
;
215 KeyState
->KeyShiftState
|= EFI_MENU_KEY_PRESSED
;
217 if (Private
->SysReq
) {
218 KeyState
->KeyShiftState
|= EFI_SYS_REQ_PRESSED
;
220 if (Private
->CapsLock
) {
221 KeyState
->KeyToggleState
|= EFI_CAPS_LOCK_ACTIVE
;
223 if (Private
->NumLock
) {
224 KeyState
->KeyToggleState
|= EFI_NUM_LOCK_ACTIVE
;
226 if (Private
->ScrollLock
) {
227 KeyState
->KeyToggleState
|= EFI_SCROLL_LOCK_ACTIVE
;
229 if (Private
->IsPartialKeySupport
) {
230 KeyState
->KeyToggleState
|= EFI_KEY_STATE_EXPOSED
;
235 TODO: Add function description
237 @param Private TODO: add argument description
238 @param Key TODO: add argument description
240 @retval EFI_NOT_READY TODO: Add description for return value
241 @retval EFI_SUCCESS TODO: Add description for return value
246 IN GRAPHICS_PRIVATE_DATA
*Private
,
250 EFI_KEY_DATA KeyData
;
253 InitializeKeyState (Private
, &KeyData
.KeyState
);
256 // Convert Ctrl+[1-26] to Ctrl+[A-Z]
258 if ((Private
->LeftCtrl
|| Private
->RightCtrl
) &&
259 (KeyData
.Key
.UnicodeChar
>= 1) && (KeyData
.Key
.UnicodeChar
<= 26)
261 if ((Private
->LeftShift
|| Private
->RightShift
) == Private
->CapsLock
) {
262 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'a' - 1);
264 KeyData
.Key
.UnicodeChar
= (CHAR16
)(KeyData
.Key
.UnicodeChar
+ L
'A' - 1);
269 // Unmask the Shift bit for printable char
271 if (((KeyData
.Key
.UnicodeChar
>= L
'a') && (KeyData
.Key
.UnicodeChar
<= L
'z')) ||
272 ((KeyData
.Key
.UnicodeChar
>= L
'A') && (KeyData
.Key
.UnicodeChar
<= L
'Z'))
274 KeyData
.KeyState
.KeyShiftState
&= ~(EFI_LEFT_SHIFT_PRESSED
| EFI_RIGHT_SHIFT_PRESSED
);
277 GopPrivateAddQ (Private
, &Private
->QueueForRead
, &KeyData
);
278 if (Private
->MakeRegisterdKeyCallback
!= NULL
) {
279 Private
->MakeRegisterdKeyCallback (Private
->RegisterdKeyCallbackContext
, &KeyData
);
289 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
292 GRAPHICS_PRIVATE_DATA
*Private
;
294 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
296 return GopPrivateCheckQ (&Private
->QueueForRead
);
302 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
303 IN EFI_KEY_DATA
*KeyData
308 Reads the next keystroke from the input device. The WaitForKey Event can
309 be used to test for existance of a keystroke via WaitForEvent () call.
312 Private - The private structure of WinNt Gop device.
313 KeyData - A pointer to a buffer that is filled in with the keystroke
314 state data for the key that was pressed.
317 EFI_SUCCESS - The keystroke information was returned.
318 EFI_NOT_READY - There was no keystroke data availiable.
319 EFI_DEVICE_ERROR - The keystroke information was not returned due to
321 EFI_INVALID_PARAMETER - KeyData is NULL.
326 GRAPHICS_PRIVATE_DATA
*Private
;
328 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
330 ZeroMem (&KeyData
->Key
, sizeof (KeyData
->Key
));
331 InitializeKeyState (Private
, &KeyData
->KeyState
);
333 Status
= GopPrivateCheckQ (&Private
->QueueForRead
);
334 if (!EFI_ERROR (Status
)) {
336 // If a Key press exists try and read it.
338 Status
= GopPrivateDeleteQ (Private
, &Private
->QueueForRead
, KeyData
);
339 if (!EFI_ERROR (Status
)) {
341 // If partial keystroke is not enabled, check whether it is value key. If not return
344 if (!Private
->IsPartialKeySupport
) {
345 if (KeyData
->Key
.ScanCode
== SCAN_NULL
&& KeyData
->Key
.UnicodeChar
== CHAR_NULL
) {
346 Status
= EFI_NOT_READY
;
358 WinNtWndKeySetState (
359 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
360 IN EFI_KEY_TOGGLE_STATE
*KeyToggleState
363 GRAPHICS_PRIVATE_DATA
*Private
;
365 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
366 Private
->ScrollLock
= FALSE
;
367 Private
->NumLock
= FALSE
;
368 Private
->CapsLock
= FALSE
;
369 Private
->IsPartialKeySupport
= FALSE
;
371 if ((*KeyToggleState
& EFI_SCROLL_LOCK_ACTIVE
) == EFI_SCROLL_LOCK_ACTIVE
) {
372 Private
->ScrollLock
= TRUE
;
374 if ((*KeyToggleState
& EFI_NUM_LOCK_ACTIVE
) == EFI_NUM_LOCK_ACTIVE
) {
375 Private
->NumLock
= TRUE
;
377 if ((*KeyToggleState
& EFI_CAPS_LOCK_ACTIVE
) == EFI_CAPS_LOCK_ACTIVE
) {
378 Private
->CapsLock
= TRUE
;
380 if ((*KeyToggleState
& EFI_KEY_STATE_EXPOSED
) == EFI_KEY_STATE_EXPOSED
) {
381 Private
->IsPartialKeySupport
= TRUE
;
383 Private
->KeyState
.KeyToggleState
= *KeyToggleState
;
390 WinNtWndRegisterKeyNotify (
391 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
392 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack
,
393 IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack
,
397 GRAPHICS_PRIVATE_DATA
*Private
;
399 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
401 Private
->MakeRegisterdKeyCallback
= MakeCallBack
;
402 Private
->BreakRegisterdKeyCallback
= BreakCallBack
;
403 Private
->RegisterdKeyCallbackContext
= Context
;
410 WinNtWndCheckPointer (
411 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
414 GRAPHICS_PRIVATE_DATA
*Private
;
416 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
418 return EFI_NOT_READY
;
424 WinNtWndGetPointerState (
425 IN EMU_GRAPHICS_WINDOW_PROTOCOL
*GraphicsIo
,
426 IN EFI_SIMPLE_POINTER_STATE
*State
429 GRAPHICS_PRIVATE_DATA
*Private
;
431 Private
= GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo
);
433 return EFI_NOT_READY
;