mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-08 11:06:41 +02:00
ruby/input: Add macOS mouse support
While keyboard and joypad input had already been present for some time, mouse input for macOS remained unimplemented in ruby. Until now, that is.
This commit is contained in:
82
ruby/input/mouse/quartz.cpp
Normal file
82
ruby/input/mouse/quartz.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
#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();
|
||||
}
|
||||
};
|
Reference in New Issue
Block a user