Catch WM mouse events and expose them via the SimplePointer protocol.
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Andrew Fish <afish@apple.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Signed-off-by: Marvin Haeuser <mhaeuser@outlook.de>
\r
#include <Protocol/EmuIoThunk.h>\r
#include <Protocol/EmuGraphicsWindow.h>\r
+#include <Protocol/SimplePointer.h>\r
#include <Protocol/SimpleTextIn.h>\r
#include <Protocol/SimpleTextInEx.h>\r
#include <Protocol/GraphicsOutput.h>\r
BOOLEAN ScrollLock;\r
BOOLEAN CapsLock;\r
BOOLEAN IsPartialKeySupport;\r
+ INT32 PointerPreviousX;\r
+ INT32 PointerPreviousY;\r
+ BOOLEAN PointerStateChanged;\r
+ EFI_SIMPLE_POINTER_STATE PointerState;\r
} GRAPHICS_PRIVATE_DATA;\r
#define GRAPHICS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('g', 'f', 'x', 'd')\r
#define GRAPHICS_PRIVATE_DATA_FROM_THIS(a) \\r
\r
Private = GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo);\r
\r
- return EFI_NOT_READY;\r
-}\r
+ if (!Private->PointerStateChanged) {\r
+ return EFI_NOT_READY;\r
+ }\r
\r
+ return EFI_SUCCESS;\r
+}\r
\r
EFI_STATUS\r
EFIAPI\r
\r
Private = GRAPHICS_PRIVATE_DATA_FROM_THIS (GraphicsIo);\r
\r
- return EFI_NOT_READY;\r
+ if (!Private->PointerStateChanged) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
+ State->RelativeMovementX = Private->PointerState.RelativeMovementX;\r
+ State->RelativeMovementY = Private->PointerState.RelativeMovementY;\r
+ State->RelativeMovementZ = Private->PointerState.RelativeMovementZ;\r
+ State->LeftButton = Private->PointerState.LeftButton;\r
+ State->RightButton = Private->PointerState.RightButton;\r
+\r
+ Private->PointerState.RelativeMovementX = 0;\r
+ Private->PointerState.RelativeMovementY = 0;\r
+ Private->PointerState.RelativeMovementZ = 0;\r
+\r
+ Private->PointerStateChanged = FALSE;\r
+\r
+ return EFI_SUCCESS;\r
}\r
LPARAM Index;\r
EFI_INPUT_KEY Key;\r
BOOLEAN AltIsPress;\r
+ INT32 PosX;\r
+ INT32 PosY;\r
\r
//\r
// Use mTlsIndex global to get a Thread Local Storage version of Private.\r
WinNtGopConvertParamToEfiKeyShiftState (Private, &wParam, &lParam, FALSE);\r
return 0;\r
\r
+ case WM_MOUSEMOVE:\r
+ PosX = GET_X_LPARAM (lParam);\r
+ PosY = GET_Y_LPARAM (lParam);\r
+\r
+ if (Private->PointerPreviousX != PosX) {\r
+ Private->PointerState.RelativeMovementX += (PosX - Private->PointerPreviousX);\r
+ Private->PointerPreviousX = PosX;\r
+ Private->PointerStateChanged = TRUE;\r
+ }\r
+\r
+ if (Private->PointerPreviousY != PosY) {\r
+ Private->PointerState.RelativeMovementY += (PosY - Private->PointerPreviousY);\r
+ Private->PointerPreviousY = PosY;\r
+ Private->PointerStateChanged = TRUE;\r
+ }\r
+\r
+ Private->PointerState.RelativeMovementZ = 0;\r
+ return 0;\r
+\r
+ case WM_LBUTTONDOWN:\r
+ Private->PointerState.LeftButton = TRUE;\r
+ Private->PointerStateChanged = TRUE;\r
+ return 0;\r
+\r
+ case WM_LBUTTONUP:\r
+ Private->PointerState.LeftButton = FALSE;\r
+ Private->PointerStateChanged = TRUE;\r
+ return 0;\r
+\r
+ case WM_RBUTTONDOWN:\r
+ Private->PointerState.RightButton = TRUE;\r
+ Private->PointerStateChanged = TRUE;\r
+ return 0;\r
+\r
+ case WM_RBUTTONUP:\r
+ Private->PointerState.RightButton = FALSE;\r
+ Private->PointerStateChanged = TRUE;\r
+ return 0;\r
+\r
case WM_CLOSE:\r
//\r
// This close message is issued by user, core is not aware of this,\r
#endif\r
\r
#include "windows.h"\r
+#include "windowsx.h"\r
\r
#undef GUID\r
#undef _LIST_ENTRY\r