feat(event): add os-specific mouse mode handling

This commit is contained in:
fallenoak 2023-03-17 17:54:02 -05:00 committed by GitHub
parent 73859890b1
commit c2a5dd0568
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 4 deletions

View File

@ -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<EvtContext, offsetof(EvtContext, m_id)>::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) {

View File

@ -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);

View File

@ -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
}

View File

@ -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
}

View File

@ -1,7 +1,16 @@
#include "event/Input.hpp"
#include "event/Window.hpp"
#include <storm/Error.hpp>
#include <windows.h>
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();
}
}