diff --git a/loader/include/Geode/utils/Keyboard.hpp b/loader/include/Geode/utils/Keyboard.hpp index 1ed7869d0..80919b52c 100644 --- a/loader/include/Geode/utils/Keyboard.hpp +++ b/loader/include/Geode/utils/Keyboard.hpp @@ -79,9 +79,10 @@ namespace geode { cocos2d::enumKeyCodes key; Action action; KeyboardModifier modifiers = KeyboardModifier::None; + void* physicalDevice = nullptr; - KeyboardInputData(cocos2d::enumKeyCodes key, Action action, Native native, double timestamp, KeyboardModifier mods) noexcept - : native(native), timestamp(timestamp), key(key), action(action), modifiers(mods) {} + KeyboardInputData(cocos2d::enumKeyCodes key, Action action, Native native, double timestamp, KeyboardModifier mods, void* device) noexcept + : native(native), timestamp(timestamp), key(key), action(action), modifiers(mods), physicalDevice(device) {} }; struct KeyboardInputEvent final : GlobalEvent { @@ -106,6 +107,7 @@ namespace geode { Action action; double timestamp; KeyboardModifier modifiers = KeyboardModifier::None; + void* physicalDevice = nullptr; // having this here is incredibly silly but oh well inline static cocos2d::enumKeyCodes buttonToKeyCode(Button button) { @@ -121,8 +123,8 @@ namespace geode { } } - MouseInputData(Button button, Action action, double timestamp, KeyboardModifier mods) noexcept - : timestamp(timestamp), button(button), action(action), modifiers(mods) {} + MouseInputData(Button button, Action action, double timestamp, KeyboardModifier mods, void* device) noexcept + : timestamp(timestamp), button(button), action(action), modifiers(mods), physicalDevice(device) {} }; struct MouseInputEvent final : Event { diff --git a/loader/src/platform/android/input.cpp b/loader/src/platform/android/input.cpp index 26bad3f65..cb6dfcca1 100644 --- a/loader/src/platform/android/input.cpp +++ b/loader/src/platform/android/input.cpp @@ -157,7 +157,8 @@ namespace { timestamp, (isShiftPressed ? KeyboardModifier::Shift : KeyboardModifier::None) | (isCtrlPressed ? KeyboardModifier::Control : KeyboardModifier::None) | - (isAltPressed ? KeyboardModifier::Alt : KeyboardModifier::None) + (isAltPressed ? KeyboardModifier::Alt : KeyboardModifier::None), + nullptr ); if (KeyboardInputEvent(translated_code).send(data) != ListenerResult::Propagate) { @@ -204,7 +205,8 @@ namespace { timestamp, (isShiftPressed ? KeyboardModifier::Shift : KeyboardModifier::None) | (isCtrlPressed ? KeyboardModifier::Control : KeyboardModifier::None) | - (isAltPressed ? KeyboardModifier::Alt : KeyboardModifier::None) + (isAltPressed ? KeyboardModifier::Alt : KeyboardModifier::None), + nullptr ); if (KeyboardInputEvent(translated_code).send(data) != ListenerResult::Propagate) { diff --git a/loader/src/platform/ios/input.mm b/loader/src/platform/ios/input.mm index 1b162d226..02538e3ad 100644 --- a/loader/src/platform/ios/input.mm +++ b/loader/src/platform/ios/input.mm @@ -203,7 +203,8 @@ KeyboardInputData data( keyCode, isRepeat ? KeyboardInputData::Action::Repeat : KeyboardInputData::Action::Press, { nativeCode }, timestamp, - modifiers + modifiers, + nullptr ); if (KeyboardInputEvent(keyCode).send(data) != ListenerResult::Propagate) return; @@ -255,7 +256,8 @@ KeyboardInputData data( keyCode, KeyboardInputData::Action::Release, { nativeCode }, timestamp, - modifiers + modifiers, + nullptr ); if (KeyboardInputEvent(keyCode).send(data) != ListenerResult::Propagate) return; @@ -355,7 +357,8 @@ KeyboardInputData data( [btn isPressed] ? KeyboardInputData::Action::Press : KeyboardInputData::Action::Release, {0}, // Controller buttons don't have native codes. (double) [gamepad lastEventTimestamp], - KeyboardModifier::None + KeyboardModifier::None, + nullptr ); if (KeyboardInputEvent(key).send(data) != ListenerResult::Propagate) return; if (data.key != KEY_Unknown && (!imeDispatcher->hasDelegate() || data.key == KEY_Escape || data.key == KEY_Enter)) { diff --git a/loader/src/platform/mac/input.mm b/loader/src/platform/mac/input.mm index 6615b8ce7..1abe3554f 100644 --- a/loader/src/platform/mac/input.mm +++ b/loader/src/platform/mac/input.mm @@ -263,7 +263,8 @@ KeyboardInputData data( keyCode, isRepeat ? KeyboardInputData::Action::Repeat : KeyboardInputData::Action::Press, { nativeCode }, timestamp, - modifiers + modifiers, + nullptr ); if (KeyboardInputEvent(keyCode).send(data) != ListenerResult::Propagate) return; @@ -327,7 +328,8 @@ KeyboardInputData data( keyCode, KeyboardInputData::Action::Release, { nativeCode }, timestamp, - modifiers + modifiers, + nullptr ); if (KeyboardInputEvent(keyCode).send(data) != ListenerResult::Propagate) return; diff --git a/loader/src/platform/windows/input.cpp b/loader/src/platform/windows/input.cpp index 2902274e0..fc2098ca5 100644 --- a/loader/src/platform/windows/input.cpp +++ b/loader/src/platform/windows/input.cpp @@ -11,6 +11,7 @@ using namespace geode::prelude; struct RawInputEvent { + void* physicalDevice = nullptr; double timestamp = 0.0; KeyboardModifier mods; @@ -36,7 +37,7 @@ struct RawInputEvent { } type; static RawInputEvent makeKeyboard( - bool isDown, uint16_t vk, uint16_t scan, uint16_t flags, bool isRepeat, KeyboardModifier mods + bool isDown, uint16_t vk, uint16_t scan, uint16_t flags, bool isRepeat, KeyboardModifier mods, void* device ) { RawInputEvent evt; evt.type = isDown ? Type::KeyDown : Type::KeyUp; @@ -48,15 +49,17 @@ struct RawInputEvent { evt.keyboard.isE0 = (flags & RI_KEY_E0) != 0; evt.keyboard.isE1 = (flags & RI_KEY_E1) != 0; evt.keyboard.isRepeat = isRepeat; + evt.physicalDevice = device; return evt; } - static RawInputEvent makeMouse(uint16_t btnFlags, KeyboardModifier mods) { + static RawInputEvent makeMouse(uint16_t btnFlags, KeyboardModifier mods, void* device) { RawInputEvent evt; evt.type = Type::MouseButton; evt.timestamp = getInputTimestamp(); evt.mods = mods; evt.mouse.flags = btnFlags; + evt.physicalDevice = device; return evt; } }; @@ -407,7 +410,8 @@ LRESULT CALLBACK GeodeRawInputWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM kb.MakeCode, kb.Flags, isRepeat, - KeyStateTracker::get().getMods() + KeyStateTracker::get().getMods(), + raw->header.hDevice )); } else if (raw->header.dwType == RIM_TYPEMOUSE) { auto const& mouse = raw->data.mouse; @@ -417,7 +421,8 @@ LRESULT CALLBACK GeodeRawInputWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM RawInputQueue::get().push(RawInputEvent::makeMouse( mouse.usButtonFlags, - KeyStateTracker::get().getMods() + KeyStateTracker::get().getMods(), + raw->header.hDevice )); } @@ -484,7 +489,8 @@ struct GeodeRawInput : Modify { isDown ? (evt.keyboard.isRepeat ? Repeat : Press) : Release, {evt.keyboard.vkey, evt.keyboard.scanCode}, evt.timestamp, - mods + mods, + evt.physicalDevice ); auto result = KeyboardInputEvent(keyCode).send(data); @@ -558,7 +564,8 @@ struct GeodeRawInput : Modify { b.btn, isDown ? Press : Release, evt.timestamp, - evt.mods + evt.mods, + evt.physicalDevice ); auto result = MouseInputEvent().send(data); @@ -731,7 +738,8 @@ struct GeodeControllerInput : Modify { isDown ? KeyboardInputData::Action::Press : KeyboardInputData::Action::Release, {}, timestamp, - KeyboardModifier::None + KeyboardModifier::None, + controller ); if (KeyboardInputEvent(data.key).send(data) == ListenerResult::Stop) { @@ -771,7 +779,8 @@ struct GeodeControllerInput : Modify { isADown ? KeyboardInputData::Action::Press : KeyboardInputData::Action::Release, {}, timestamp, - KeyboardModifier::None + KeyboardModifier::None, + controller ); if (KeyboardInputEvent(data.key).send(data) == ListenerResult::Propagate) { @@ -818,7 +827,8 @@ struct GeodeControllerInput : Modify { isBackDown ? KeyboardInputData::Action::Press : KeyboardInputData::Action::Release, {}, timestamp, - KeyboardModifier::None + KeyboardModifier::None, + controller ); if (KeyboardInputEvent(data.key).send(data) == ListenerResult::Propagate) {