261 lines
5.9 KiB
C++
261 lines
5.9 KiB
C++
//
|
|
// Created by Epagris on 2020. 03. 01..
|
|
//
|
|
|
|
#include "EventHandler.h"
|
|
#include "Logger.h"
|
|
#include <hidusage.h>
|
|
|
|
eg3d::CB_AssignmentData::CB_AssignmentData()
|
|
{
|
|
loadDefaults();
|
|
}
|
|
|
|
void eg3d::CB_AssignmentData::loadDefaults()
|
|
{
|
|
eventType = ET_None;
|
|
pcbFunction = nullptr;
|
|
pUser = nullptr;
|
|
}
|
|
|
|
eg3d::EventHandler::EventHandler() {
|
|
init();
|
|
}
|
|
|
|
void eg3d::EventHandler::init()
|
|
{
|
|
mMouseLocked = false; // nincs befogva az egér
|
|
}
|
|
|
|
void eg3d::EventHandler::regKeyCB(char key, const CB_AssignmentData& cbAData)
|
|
{
|
|
mKeyAssignments.insert(std::pair<char, CB_AssignmentData>(key, cbAData));
|
|
}
|
|
|
|
void eg3d::EventHandler::regKeyCB(char key, CB_EH* pcbFunction, void* pUser,
|
|
std::initializer_list<EventType> eventTypes)
|
|
{
|
|
if (eventTypes.size() == 0) {
|
|
return;
|
|
}
|
|
|
|
// hozzárendelési adatok
|
|
CB_AssignmentData cbAData;
|
|
cbAData.pUser = pUser;
|
|
cbAData.pcbFunction = pcbFunction;
|
|
|
|
// regisztráció minden egyes eseménytípusra
|
|
for (const EventType * pET = eventTypes.begin(); pET <= eventTypes.end(); pET++)
|
|
{
|
|
cbAData.eventType = *pET;
|
|
regKeyCB(key, cbAData);
|
|
}
|
|
}
|
|
|
|
void eg3d::EventHandler::regMouseCB(const CB_AssignmentData& cbAData)
|
|
{
|
|
mMouseAssignments.insert(std::pair<EventType, CB_AssignmentData>(cbAData.eventType, cbAData));
|
|
}
|
|
|
|
void eg3d::EventHandler::regMouseCB(CB_EH* pcbFunction, void* pUser, std::initializer_list<EventType> eventTypes)
|
|
{
|
|
if (eventTypes.size() == 0) {
|
|
return;
|
|
}
|
|
|
|
// hozzárendelési adatok
|
|
CB_AssignmentData cbAData;
|
|
cbAData.pUser = pUser;
|
|
cbAData.pcbFunction = pcbFunction;
|
|
|
|
// regisztráció minden egyes eseménytípusra
|
|
for (const EventType * pET = eventTypes.begin(); pET <= eventTypes.end(); pET++)
|
|
{
|
|
cbAData.eventType = *pET;
|
|
regMouseCB(cbAData);
|
|
}
|
|
}
|
|
|
|
eg3d::MouseDisplacement eg3d::EventHandler::getMouseDisplacement()
|
|
{
|
|
MouseDisplacement md = mMouseDisplacement;
|
|
|
|
mMouseDisplacement.dx = 0;
|
|
mMouseDisplacement.dy = 0;
|
|
|
|
return md;
|
|
}
|
|
|
|
bool eg3d::EventHandler::isMouseLocked() const
|
|
{
|
|
return mMouseLocked;
|
|
}
|
|
|
|
bool eg3d::EventHandler::isKeyPressed(WPARAM vkey) const
|
|
{
|
|
return mPressedKeySet.find(vkey) != mPressedKeySet.end();
|
|
}
|
|
|
|
// -----------------------------------
|
|
|
|
int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
Window * pWindow = static_cast<Window *>((void *)GetWindowLongPtrA(hwnd, GWLP_USERDATA));
|
|
EventHandler * pThis_EH = pWindow->getEventHandler(); // ablakhoz rendelt eseménykezelõ elkérése
|
|
|
|
UINT rawDataLength = 64;
|
|
BYTE pRawData[64];
|
|
|
|
EventType et;
|
|
|
|
switch (message)
|
|
{
|
|
|
|
// ----------------
|
|
// RAW-INPUT KEZELÉSE
|
|
// ----------------
|
|
|
|
case WM_INPUT:
|
|
{
|
|
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, pRawData, &rawDataLength, sizeof(RAWINPUTHEADER));
|
|
|
|
RAWINPUT * pRawInput = (RAWINPUT *)pRawData;
|
|
|
|
if (pRawInput->header.dwType == RIM_TYPEMOUSE)
|
|
{
|
|
int displacementX = pRawInput->data.mouse.lLastX;
|
|
int displacementY = pRawInput->data.mouse.lLastY;
|
|
|
|
pThis_EH->mMouseDisplacement.dx += displacementX;
|
|
pThis_EH->mMouseDisplacement.dy += displacementY;
|
|
|
|
//LOG(std::string("(") + std::to_string(displacementX) + ", " + std::to_string(displacementY) + ")");
|
|
}
|
|
}
|
|
break;
|
|
|
|
// ----------------
|
|
// EGÉRESEMÉNYEK KEZELÉSE
|
|
// ----------------
|
|
|
|
case WM_LBUTTONDOWN:
|
|
et = ET_LMouseDown;
|
|
goto MOUSE_CONT;
|
|
case WM_LBUTTONUP:
|
|
et = ET_LMouseUp;
|
|
goto MOUSE_CONT;
|
|
case WM_RBUTTONDOWN:
|
|
et = ET_RMouseDown;
|
|
goto MOUSE_CONT;
|
|
case WM_RBUTTONUP: {
|
|
et = ET_RMouseUp;
|
|
|
|
MOUSE_CONT:
|
|
|
|
auto assigments = mMouseAssignments.equal_range(et); // hozzárendelések elkérése
|
|
auto rangeBegin = assigments.first;
|
|
auto rangeEnd = assigments.second;
|
|
|
|
if (rangeBegin == rangeEnd) // ha nincs találat, akkor kilépünk
|
|
{
|
|
break;
|
|
}
|
|
|
|
// esemény-adatok kitöltése
|
|
EventHandlerCBData cbData;
|
|
|
|
cbData.pEH = pThis_EH; // eseménykezelõ pointere
|
|
cbData.eventType = et; // esemény típusa
|
|
|
|
cbData.hwnd = hwnd; // ablak fogantyúja
|
|
cbData.message = message; // üzenet
|
|
cbData.wParam = wParam; // ...
|
|
cbData.lParam = lParam; // ...
|
|
|
|
for (auto iter = rangeBegin; iter != rangeEnd; iter++)
|
|
{
|
|
cbData.pUser = iter->second.pUser; // elõre definiált pointer beállítása
|
|
iter->second.pcbFunction(&cbData); // függvény meghívása
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
// ----------------
|
|
// BILLENTYÛZET-KEZELÉS
|
|
// ----------------
|
|
|
|
case WM_KEYDOWN:
|
|
{
|
|
et = ET_KeyDown; // esemény típusának beállítása
|
|
mPressedKeySet.emplace(wParam); // billentyûlenyomás letárolása
|
|
|
|
if (wParam == 'L') {
|
|
pThis_EH->mMouseLocked = !pThis_EH->mMouseLocked;
|
|
|
|
bool locked = pThis_EH->mMouseLocked;
|
|
|
|
LOG(std::string("Mouse ") + (locked ? "" : "un") + "locked");
|
|
|
|
if (locked == true) {
|
|
RECT clipRect = pWindow->getRect();
|
|
|
|
LONG width = clipRect.right - clipRect.left;
|
|
LONG height = clipRect.bottom - clipRect.top;
|
|
|
|
clipRect.top += height / 2;
|
|
clipRect.bottom = clipRect.top + 1;
|
|
clipRect.left += width / 2;
|
|
clipRect.right = clipRect.left + 1;
|
|
|
|
ClipCursor(&clipRect);
|
|
|
|
}
|
|
else {
|
|
ClipCursor(nullptr);
|
|
}
|
|
}
|
|
goto KEYBOARD_CONT;
|
|
} // DIRECT NINCS BREAK
|
|
case WM_KEYUP: {
|
|
et = ET_KeyUp; // esemény típusának beállítása
|
|
mPressedKeySet.erase(wParam); // billentyû törlése a halmazból
|
|
|
|
KEYBOARD_CONT:
|
|
|
|
auto assigments = mKeyAssignments.equal_range(wParam); // hozzárendelések elkérése
|
|
auto rangeBegin = assigments.first;
|
|
auto rangeEnd = assigments.second;
|
|
|
|
if (rangeBegin == rangeEnd) // ha nincs találat, akkor kilépünk
|
|
{
|
|
break;
|
|
}
|
|
|
|
// esemény lekezelése
|
|
EventHandlerCBData cbData;
|
|
|
|
cbData.pEH = pThis_EH; // eseménykezelõ pointere
|
|
cbData.eventType = et; // esemény típusa
|
|
|
|
cbData.hwnd = hwnd; // ablak fogantyúja
|
|
cbData.message = message; // üzenet
|
|
cbData.wParam = wParam; // ...
|
|
cbData.lParam = lParam; // ...
|
|
|
|
for (auto iter = rangeBegin; iter != rangeEnd; iter++)
|
|
{
|
|
if (iter->second.eventType == et) {
|
|
cbData.pUser = iter->second.pUser; // elõre definiált pointer beállítása
|
|
iter->second.pcbFunction(&cbData); // függvény meghívása
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
} |