diff --git a/src/event/Input.cpp b/src/event/Input.cpp index 37e935a..abb984f 100644 --- a/src/event/Input.cpp +++ b/src/event/Input.cpp @@ -47,6 +47,7 @@ C2iVector Input::s_currentMouse; uint32_t Input::s_mouseHoldButton; MOUSEMODE Input::s_mouseMode; int32_t Input::s_numlockState; +OS_MOUSE_MODE Input::s_osMouseMode; int32_t Input::s_simulatedRightButtonClick; uint32_t Input::s_metaKeyState; int32_t Input::s_queueHead; @@ -142,6 +143,10 @@ void PostMouseDown(EvtContext* context, MOUSEBUTTON button, int32_t x, int32_t y IEvtQueueDispatch(context, EVENT_ID_MOUSEDOWN, &data); } +void PostMouseModeChanged(EvtContext* context, MOUSEMODE mode) { + // TODO +} + void PostMouseMove(EvtContext* context, int32_t x, int32_t y, int32_t time) { EVENT_DATA_MOUSE data; @@ -367,7 +372,7 @@ void EventSetMouseMode(MOUSEMODE mode, uint32_t holdButton) { ); if (context) { - IEvtSetMouseMode(context, mode, holdButton); + IEvtInputSetMouseMode(context, mode, holdButton); if (findMask != -1) { TSingletonInstanceId::s_idTable.Unlock( @@ -477,8 +482,20 @@ int32_t IEvtInputProcess(EvtContext* context, int32_t* shutdown) { return v4; } -void IEvtSetMouseMode(EvtContext* context, MOUSEMODE mode, uint32_t holdButton) { - // TODO +void IEvtInputSetMouseMode(EvtContext* context, MOUSEMODE mode, uint32_t holdButton) { + STORM_ASSERT(context); + STORM_VALIDATE(context, ERROR_INVALID_PARAMETER); + + if ((Input::s_buttonState & holdButton) == holdButton) { + Input::s_mouseHoldButton = holdButton; + + if (Input::s_mouseMode != mode) { + OS_MOUSE_MODE osMouseMode = mode == MOUSE_MODE_NORMAL ? OS_MOUSE_MODE_NORMAL : OS_MOUSE_MODE_RELATIVE; + OsInputSetMouseMode(osMouseMode); + + PostMouseModeChanged(context, mode); + } + } } const char* KeyCodeToString(KEY key) { diff --git a/src/event/Input.hpp b/src/event/Input.hpp index 4bc145b..e2b6569 100644 --- a/src/event/Input.hpp +++ b/src/event/Input.hpp @@ -49,7 +49,7 @@ void IEvtInputInitialize(); int32_t IEvtInputProcess(EvtContext* context, int32_t* shutdown); -void IEvtSetMouseMode(EvtContext* context, MOUSEMODE mode, uint32_t holdButton); +void IEvtInputSetMouseMode(EvtContext* context, MOUSEMODE mode, uint32_t holdButton); const char* KeyCodeToString(KEY key); @@ -61,6 +61,8 @@ bool OsInputIsUsingCocoaEventLoop(); void OsInputPostEvent(OSINPUT id, int32_t param0, int32_t param1, int32_t param2, int32_t param3); +void OsInputSetMouseMode(OS_MOUSE_MODE mode); + int32_t OsQueueGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param2, int32_t* param3); void OsQueuePut(OSINPUT id, int32_t param0, int32_t param1, int32_t param2, int32_t param3); diff --git a/src/event/linux/Input.cpp b/src/event/linux/Input.cpp index 38475df..72b06de 100644 --- a/src/event/linux/Input.cpp +++ b/src/event/linux/Input.cpp @@ -4,3 +4,7 @@ int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param // TODO return 0; } + +void OsInputSetMouseMode(OS_MOUSE_MODE mode) { + // TODO +} diff --git a/src/event/mac/Input.cpp b/src/event/mac/Input.cpp index 53b2592..65cf626 100644 --- a/src/event/mac/Input.cpp +++ b/src/event/mac/Input.cpp @@ -21,3 +21,7 @@ int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param return OsQueueGet(id, param0, param1, param2, param3); } + +void OsInputSetMouseMode(OS_MOUSE_MODE mode) { + // TODO +} diff --git a/src/event/win/Input.cpp b/src/event/win/Input.cpp index 7c12e1c..887e774 100644 --- a/src/event/win/Input.cpp +++ b/src/event/win/Input.cpp @@ -1,7 +1,16 @@ #include "event/Input.hpp" #include "event/Window.hpp" +#include #include +void CenterMouse() { + // TODO +} + +void RestoreMouse() { + // TODO +} + int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param2, int32_t* param3) { // TODO window rect comparisons @@ -48,3 +57,20 @@ int32_t OsInputGet(OSINPUT* id, int32_t* param0, int32_t* param1, int32_t* param OsQueueGet(id, param0, param1, param2, param3); return 1; } + +void OsInputSetMouseMode(OS_MOUSE_MODE mode) { + STORM_ASSERT(mode < OS_MOUSE_MODES); + STORM_VALIDATE(mode < OS_MOUSE_MODES, ERROR_INVALID_PARAMETER); + + if (Input::s_osMouseMode == mode) { + return; + } + + if (mode == OS_MOUSE_MODE_NORMAL) { + Input::s_osMouseMode = mode; + RestoreMouse(); + } else if (mode == OS_MOUSE_MODE_RELATIVE) { + Input::s_osMouseMode = mode; + CenterMouse(); + } +}