rodecomp/Source/Client/Input/Mouse.cpp
ragnarok-clanker a47d20f8be Reconstruct readable C++ and organize cohesive source subsystems
Administrative source import: native x86 compilation passed for 423 authored units. Source placement and submission states are migrated separately; this commit does not imply peer acceptance.

Previous head: 35d2a8cb36
Payload SHA256: 592f016d2730c5593bb653aa054c1e5f76a6df72c8f5a09e66f74876e2e33dee
2026-10-25 07:42:41 +00:00

125 lines
3 KiB
C++

#include "Client/Input/Mouse.h"
#include "Render/DeviceContext/DCSurface.h"
#include <windows.h>
#include <timeapi.h>
// OFFSET: 0x006370C0
// FUNCTION: fn_04724
// OFFSET: 0x006370D0
// FUNCTION: fn_04725
CMouse::~CMouse() = default;
// OFFSET: 0x00637100
// FUNCTION: fn_04726
void CMouse::Update() {
if (!this->active) {
return;
}
this->deltaX = this->pendingX - this->x;
this->deltaY = this->pendingY - this->y;
this->x = this->pendingX;
this->y = this->pendingY;
const std::uint32_t now = timeGetTime();
for (unsigned index = 0; index < 2; ++index) {
if (this->deltaX != 0 || this->deltaY != 0) {
this->pressTicks[index] = now - this->doubleClickTime;
}
if (this->pendingButtons[index]) {
if (this->previousButtons[index]) {
this->buttons[index] = 2;
} else if (now >= this->pressTicks[index] + this->doubleClickTime) {
this->pressTicks[index] = now;
this->buttons[index] = 1;
} else {
this->buttons[index] = 4;
this->pressTicks[index] = now - this->doubleClickTime;
}
} else {
this->buttons[index] = this->previousButtons[index] ? 3 : 0;
}
}
this->wheel = this->pendingWheel;
this->pendingWheel = 0;
this->previousButtons[0] = this->pendingButtons[0];
this->previousButtons[1] = this->pendingButtons[1];
}
// OFFSET: 0x006371E0
// FUNCTION: fn_04727
void CMouse::Reset() {
this->buttons[1] = 0;
this->buttons[0] = 0;
this->previousButtons[0] = 0;
this->previousButtons[1] = 0;
this->pendingButtons[0] = 0;
this->pendingButtons[1] = 0;
}
// OFFSET: 0x00637200
// FUNCTION: fn_04728
int CMouse::Center() {
const int halfWidth = static_cast<int>(GetRenderSystemHolder()->Width()) / 2;
this->pendingX = halfWidth;
this->x = halfWidth;
const int halfHeight = static_cast<int>(GetRenderSystemHolder()->Height()) / 2;
this->pendingY = halfHeight;
this->y = halfHeight;
return halfHeight;
}
// OFFSET: 0x00637240
// FUNCTION: fn_04729
void CMouse::SetX(int value) {
this->pendingX = value;
this->x = value;
}
// OFFSET: 0x00637250
// FUNCTION: fn_04730
void CMouse::SetY(int value) {
this->pendingY = value;
this->y = value;
}
// OFFSET: 0x00637260
// FUNCTION: fn_04731
void CMouse::Message(CMouse& global, HWND mainWindow, HWND source, UINT message, WPARAM keys, LPARAM) {
if (global.active != 1) {
global.Reset();
global.active = 1;
}
switch (message) {
case WM_MOUSEMOVE: {
POINT point;
GetCursorPos(&point);
ScreenToClient(mainWindow, &point);
this->pendingX = point.x;
this->pendingY = point.y;
break;
}
case WM_LBUTTONDOWN:
this->pendingButtons[0] = 1;
SetCapture(source);
break;
case WM_LBUTTONUP:
this->pendingButtons[0] = 0;
ReleaseCapture();
break;
case WM_RBUTTONDOWN:
this->pendingButtons[1] = 1;
break;
case WM_RBUTTONUP:
this->pendingButtons[1] = 0;
break;
case WM_MOUSEWHEEL:
this->pendingWheel = GET_WHEEL_DELTA_WPARAM(keys);
break;
}
}