mirror of https://github.com/bsnes-emu/bsnes.git
83 lines
2.1 KiB
C++
83 lines
2.1 KiB
C++
#pragma once
|
||
|
||
struct InputMouseQuartz {
|
||
Input& input;
|
||
InputMouseQuartz(Input& input) : input(input) {}
|
||
|
||
shared_pointer<HID::Mouse> hid{new HID::Mouse};
|
||
|
||
bool mouseAcquired = false;
|
||
|
||
auto acquire() -> bool {
|
||
if(!mouseAcquired) {
|
||
CGError error = CGAssociateMouseAndMouseCursorPosition(NO);
|
||
if(error != kCGErrorSuccess) return false;
|
||
[NSCursor hide];
|
||
|
||
mouseAcquired = true;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
auto acquired() -> bool {
|
||
return mouseAcquired;
|
||
}
|
||
|
||
auto release() -> bool {
|
||
if(mouseAcquired) {
|
||
CGError error = CGAssociateMouseAndMouseCursorPosition(YES);
|
||
if(error != kCGErrorSuccess) return false;
|
||
[NSCursor unhide];
|
||
|
||
mouseAcquired = false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
auto assign(uint groupID, uint inputID, int16_t value) -> void {
|
||
auto& group = hid->group(groupID);
|
||
if(group.input(inputID).value() == value) return;
|
||
input.doChange(hid, groupID, inputID, group.input(inputID).value(), value);
|
||
group.input(inputID).setValue(value);
|
||
}
|
||
|
||
auto poll(vector<shared_pointer<HID::Device>>& devices) -> void {
|
||
int deltaX, deltaY;
|
||
CGGetLastMouseDelta(&deltaX, &deltaY);
|
||
|
||
assign(HID::Mouse::GroupID::Axis, 0, deltaX);
|
||
assign(HID::Mouse::GroupID::Axis, 1, deltaY);
|
||
|
||
NSUInteger buttons = [NSEvent pressedMouseButtons];
|
||
|
||
assign(HID::Mouse::GroupID::Button, 0, !!(buttons & (1 << 0)));
|
||
assign(HID::Mouse::GroupID::Button, 2, !!(buttons & (1 << 1)));
|
||
assign(HID::Mouse::GroupID::Button, 1, !!(buttons & (1 << 2)));
|
||
assign(HID::Mouse::GroupID::Button, 4, !!(buttons & (1 << 3)));
|
||
assign(HID::Mouse::GroupID::Button, 3, !!(buttons & (1 << 4)));
|
||
|
||
devices.append(hid);
|
||
}
|
||
|
||
auto initialize() -> bool {
|
||
hid->setVendorID(HID::Mouse::GenericVendorID);
|
||
hid->setProductID(HID::Mouse::GenericProductID);
|
||
hid->setPathID(0);
|
||
|
||
hid->axes().append("X");
|
||
hid->axes().append("Y");
|
||
|
||
hid->buttons().append("Left");
|
||
hid->buttons().append("Middle");
|
||
hid->buttons().append("Right");
|
||
hid->buttons().append("Up");
|
||
hid->buttons().append("Down");
|
||
|
||
return true;
|
||
}
|
||
|
||
auto terminate() -> void {
|
||
release();
|
||
}
|
||
};
|