mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-23 08:03:10 +02:00
Update to v093r12a release.
byuu says: Not an official WIP (a WIP WIP? A meta-WIP?), just throwing in the new fullscreen code, and I noticed that OpenGL colors in 30-bit mode are all fucked up now for some strange reason. So I'm just using this snapshot to debug the issue.
This commit is contained in:
123
ruby/input/mouse/rawinput.cpp
Normal file
123
ruby/input/mouse/rawinput.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
#ifndef RUBY_INPUT_MOUSE_RAWINPUT
|
||||
#define RUBY_INPUT_MOUSE_RAWINPUT
|
||||
|
||||
namespace ruby {
|
||||
|
||||
struct InputMouseRawInput {
|
||||
uintptr_t handle = 0;
|
||||
bool mouseAcquired = false;
|
||||
|
||||
struct Mouse {
|
||||
HID::Mouse hid;
|
||||
|
||||
signed relativeX = 0;
|
||||
signed relativeY = 0;
|
||||
signed relativeZ = 0;
|
||||
bool buttons[5] = {0};
|
||||
} ms;
|
||||
|
||||
bool acquire() {
|
||||
if(mouseAcquired == false) {
|
||||
mouseAcquired = true;
|
||||
ShowCursor(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool unacquire() {
|
||||
if(mouseAcquired == true) {
|
||||
mouseAcquired = false;
|
||||
ReleaseCapture();
|
||||
ClipCursor(NULL);
|
||||
ShowCursor(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool acquired() {
|
||||
if(mouseAcquired == true) {
|
||||
SetFocus((HWND)handle);
|
||||
SetCapture((HWND)handle);
|
||||
RECT rc;
|
||||
GetWindowRect((HWND)handle, &rc);
|
||||
ClipCursor(&rc);
|
||||
}
|
||||
return GetCapture() == (HWND)handle;
|
||||
}
|
||||
|
||||
void update(RAWINPUT* input) {
|
||||
if((input->data.mouse.usFlags & 1) == MOUSE_MOVE_RELATIVE) {
|
||||
ms.relativeX += input->data.mouse.lLastX;
|
||||
ms.relativeY += input->data.mouse.lLastY;
|
||||
}
|
||||
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_WHEEL) {
|
||||
ms.relativeZ += (int16_t)input->data.mouse.usButtonData;
|
||||
}
|
||||
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) ms.buttons[0] = 1;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP ) ms.buttons[0] = 0;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) ms.buttons[1] = 1;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP ) ms.buttons[1] = 0;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) ms.buttons[2] = 1;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP ) ms.buttons[2] = 0;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) ms.buttons[3] = 1;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP ) ms.buttons[3] = 0;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) ms.buttons[4] = 1;
|
||||
if(input->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP ) ms.buttons[4] = 0;
|
||||
}
|
||||
|
||||
void assign(unsigned groupID, unsigned inputID, int16_t value) {
|
||||
auto& group = ms.hid.group[groupID];
|
||||
if(group.input[inputID].value == value) return;
|
||||
if(input.onChange) input.onChange(ms.hid, groupID, inputID, group.input[inputID].value, value);
|
||||
group.input[inputID].value = value;
|
||||
}
|
||||
|
||||
void poll(vector<HID::Device*>& devices) {
|
||||
assign(HID::Mouse::GroupID::Axis, 0, ms.relativeX);
|
||||
assign(HID::Mouse::GroupID::Axis, 1, ms.relativeY);
|
||||
assign(HID::Mouse::GroupID::Axis, 2, ms.relativeZ);
|
||||
|
||||
//keys are intentionally reordered below:
|
||||
//in ruby, button order is {left, middle, right, up, down}
|
||||
assign(HID::Mouse::GroupID::Button, 0, ms.buttons[0]);
|
||||
assign(HID::Mouse::GroupID::Button, 2, ms.buttons[1]);
|
||||
assign(HID::Mouse::GroupID::Button, 1, ms.buttons[2]);
|
||||
assign(HID::Mouse::GroupID::Button, 4, ms.buttons[3]);
|
||||
assign(HID::Mouse::GroupID::Button, 3, ms.buttons[4]);
|
||||
|
||||
ms.relativeX = 0;
|
||||
ms.relativeY = 0;
|
||||
ms.relativeZ = 0;
|
||||
|
||||
devices.append(&ms.hid);
|
||||
}
|
||||
|
||||
bool init(uintptr_t handle) {
|
||||
this->handle = handle;
|
||||
|
||||
ms.hid.id = 2;
|
||||
|
||||
ms.hid.axis().append({"X"});
|
||||
ms.hid.axis().append({"Y"});
|
||||
ms.hid.axis().append({"Z"});
|
||||
|
||||
ms.hid.button().append({"Left"});
|
||||
ms.hid.button().append({"Middle"});
|
||||
ms.hid.button().append({"Right"});
|
||||
ms.hid.button().append({"Up"});
|
||||
ms.hid.button().append({"Down"});
|
||||
|
||||
rawinput.updateMouse = {&InputMouseRawInput::update, this};
|
||||
return true;
|
||||
}
|
||||
|
||||
void term() {
|
||||
unacquire();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@@ -81,7 +81,7 @@ struct InputMouseXlib {
|
||||
assign(HID::Mouse::GroupID::Axis, 0, (int16_t)(rootXReturn - screenWidth / 2));
|
||||
assign(HID::Mouse::GroupID::Axis, 1, (int16_t)(rootYReturn - screenHeight / 2));
|
||||
|
||||
if(hid.axis.input[0].value != 0 || hid.axis.input[1].value != 0) {
|
||||
if(hid.axis().input[0].value != 0 || hid.axis().input[1].value != 0) {
|
||||
//if mouse moved, re-center mouse for next poll
|
||||
XWarpPointer(display, None, rootWindow, 0, 0, 0, 0, screenWidth / 2, screenHeight / 2);
|
||||
}
|
||||
@@ -102,45 +102,6 @@ struct InputMouseXlib {
|
||||
devices.append(&hid);
|
||||
}
|
||||
|
||||
bool poll(int16_t* table) {
|
||||
Window rootReturn;
|
||||
Window childReturn;
|
||||
signed rootXReturn = 0;
|
||||
signed rootYReturn = 0;
|
||||
signed windowXReturn = 0;
|
||||
signed windowYReturn = 0;
|
||||
unsigned maskReturn = 0;
|
||||
XQueryPointer(display, handle, &rootReturn, &childReturn, &rootXReturn, &rootYReturn, &windowXReturn, &windowYReturn, &maskReturn);
|
||||
|
||||
if(acquired()) {
|
||||
XWindowAttributes attributes;
|
||||
XGetWindowAttributes(display, handle, &attributes);
|
||||
|
||||
//absolute -> relative conversion
|
||||
table[mouse(0).axis(0)] = (int16_t)(rootXReturn - screenWidth / 2);
|
||||
table[mouse(0).axis(1)] = (int16_t)(rootYReturn - screenHeight / 2);
|
||||
|
||||
if(table[mouse(0).axis(0)] != 0 || table[mouse(0).axis(1)] != 0) {
|
||||
//if mouse moved, re-center mouse for next poll
|
||||
XWarpPointer(display, None, rootWindow, 0, 0, 0, 0, screenWidth / 2, screenHeight / 2);
|
||||
}
|
||||
} else {
|
||||
table[mouse(0).axis(0)] = (int16_t)(rootXReturn - ms.relativeX);
|
||||
table[mouse(0).axis(1)] = (int16_t)(rootYReturn - ms.relativeY);
|
||||
|
||||
ms.relativeX = rootXReturn;
|
||||
ms.relativeY = rootYReturn;
|
||||
}
|
||||
|
||||
table[mouse(0).button(0)] = (bool)(maskReturn & Button1Mask);
|
||||
table[mouse(0).button(1)] = (bool)(maskReturn & Button2Mask);
|
||||
table[mouse(0).button(2)] = (bool)(maskReturn & Button3Mask);
|
||||
table[mouse(0).button(3)] = (bool)(maskReturn & Button4Mask);
|
||||
table[mouse(0).button(4)] = (bool)(maskReturn & Button5Mask);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool init(uintptr_t handle) {
|
||||
this->handle = handle;
|
||||
display = XOpenDisplay(0);
|
||||
@@ -151,6 +112,7 @@ struct InputMouseXlib {
|
||||
screenWidth = attributes.width;
|
||||
screenHeight = attributes.height;
|
||||
|
||||
//Xlib: because XShowCursor(display, false) would just be too easy
|
||||
//create invisible cursor for use when mouse is acquired
|
||||
Pixmap pixmap;
|
||||
XColor black, unused;
|
||||
@@ -168,14 +130,14 @@ struct InputMouseXlib {
|
||||
|
||||
hid.id = 2;
|
||||
|
||||
hid.axis.append({"X"});
|
||||
hid.axis.append({"Y"});
|
||||
hid.axis().append({"X"});
|
||||
hid.axis().append({"Y"});
|
||||
|
||||
hid.button.append({"Left"});
|
||||
hid.button.append({"Middle"});
|
||||
hid.button.append({"Right"});
|
||||
hid.button.append({"Up"});
|
||||
hid.button.append({"Down"});
|
||||
hid.button().append({"Left"});
|
||||
hid.button().append({"Middle"});
|
||||
hid.button().append({"Right"});
|
||||
hid.button().append({"Up"});
|
||||
hid.button().append({"Down"});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user