// // Created by Epagris on 2020. 03. 01.. // #include "EventHandler.h" #include "Logger.h" #include 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(key, cbAData)); } void eg3d::EventHandler::regKeyCB(char key, CB_EH* pcbFunction, void* pUser, std::initializer_list 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(cbAData.eventType, cbAData)); } void eg3d::EventHandler::regMouseCB(CB_EH* pcbFunction, void* pUser, std::initializer_list 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((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; }