Merge pull request #5954 from khg8m3r/OSXKeyboard
Clean up OSX input selection
This commit is contained in:
commit
8e9857d3cd
|
@ -38,7 +38,6 @@ elseif(APPLE)
|
||||||
find_library(COCOA_LIBRARY Cocoa)
|
find_library(COCOA_LIBRARY Cocoa)
|
||||||
set(SRCS ${SRCS}
|
set(SRCS ${SRCS}
|
||||||
ControllerInterface/OSX/OSX.mm
|
ControllerInterface/OSX/OSX.mm
|
||||||
ControllerInterface/OSX/OSXKeyboard.mm
|
|
||||||
ControllerInterface/OSX/OSXJoystick.mm
|
ControllerInterface/OSX/OSXJoystick.mm
|
||||||
ControllerInterface/Quartz/Quartz.mm
|
ControllerInterface/Quartz/Quartz.mm
|
||||||
ControllerInterface/Quartz/QuartzKeyboardAndMouse.mm
|
ControllerInterface/Quartz/QuartzKeyboardAndMouse.mm
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include "InputCommon/ControllerInterface/ControllerInterface.h"
|
#include "InputCommon/ControllerInterface/ControllerInterface.h"
|
||||||
#include "InputCommon/ControllerInterface/OSX/OSX.h"
|
#include "InputCommon/ControllerInterface/OSX/OSX.h"
|
||||||
#include "InputCommon/ControllerInterface/OSX/OSXJoystick.h"
|
#include "InputCommon/ControllerInterface/OSX/OSXJoystick.h"
|
||||||
#include "InputCommon/ControllerInterface/OSX/OSXKeyboard.h"
|
|
||||||
#include "InputCommon/ControllerInterface/OSX/RunLoopStopper.h"
|
#include "InputCommon/ControllerInterface/OSX/RunLoopStopper.h"
|
||||||
|
|
||||||
namespace ciface
|
namespace ciface
|
||||||
|
@ -155,10 +154,6 @@ static void DeviceRemovalCallback(void* inContext, IOReturn inResult, void* inSe
|
||||||
if (joystick && joystick->IsSameDevice(inIOHIDDeviceRef))
|
if (joystick && joystick->IsSameDevice(inIOHIDDeviceRef))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const Keyboard* keyboard = dynamic_cast<const Keyboard*>(device);
|
|
||||||
if (keyboard && keyboard->IsSameDevice(inIOHIDDeviceRef))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
g_controller_interface.InvokeHotplugCallbacks();
|
g_controller_interface.InvokeHotplugCallbacks();
|
||||||
|
@ -172,19 +167,10 @@ static void DeviceMatchingCallback(void* inContext, IOReturn inResult, void* inS
|
||||||
std::string name = GetDeviceRefName(inIOHIDDeviceRef);
|
std::string name = GetDeviceRefName(inIOHIDDeviceRef);
|
||||||
|
|
||||||
// Add a device if it's of a type we want
|
// Add a device if it's of a type we want
|
||||||
if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard))
|
if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick) ||
|
||||||
{
|
IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_GamePad) ||
|
||||||
if (g_window)
|
IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop,
|
||||||
g_controller_interface.AddDevice(
|
kHIDUsage_GD_MultiAxisController))
|
||||||
std::make_shared<Keyboard>(inIOHIDDeviceRef, name, g_window));
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
else if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Mouse))
|
|
||||||
{
|
|
||||||
g_controller_interface.AddDevice(new Mouse(inIOHIDDeviceRef, name));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
g_controller_interface.AddDevice(std::make_shared<Joystick>(inIOHIDDeviceRef, name));
|
g_controller_interface.AddDevice(std::make_shared<Joystick>(inIOHIDDeviceRef, name));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
// Copyright 2010 Dolphin Emulator Project
|
|
||||||
// Licensed under GPLv2+
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <IOKit/hid/IOHIDLib.h>
|
|
||||||
|
|
||||||
#include "InputCommon/ControllerInterface/Device.h"
|
|
||||||
|
|
||||||
namespace ciface
|
|
||||||
{
|
|
||||||
namespace OSX
|
|
||||||
{
|
|
||||||
class Keyboard : public Core::Device
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
class Key : public Input
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Key(IOHIDElementRef element, IOHIDDeviceRef device);
|
|
||||||
std::string GetName() const override;
|
|
||||||
ControlState GetState() const override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
const IOHIDElementRef m_element;
|
|
||||||
const IOHIDDeviceRef m_device;
|
|
||||||
std::string m_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Cursor : public Input
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Cursor(u8 index, const float& axis, const bool positive)
|
|
||||||
: m_axis(axis), m_index(index), m_positive(positive)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
std::string GetName() const override;
|
|
||||||
bool IsDetectable() override { return false; }
|
|
||||||
ControlState GetState() const override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
const float& m_axis;
|
|
||||||
const u8 m_index;
|
|
||||||
const bool m_positive;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Button : public Input
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Button(u8 index, const unsigned char& button) : m_button(button), m_index(index) {}
|
|
||||||
std::string GetName() const override;
|
|
||||||
ControlState GetState() const override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
const unsigned char& m_button;
|
|
||||||
const u8 m_index;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
void UpdateInput() override;
|
|
||||||
|
|
||||||
Keyboard(IOHIDDeviceRef device, std::string name, void* window);
|
|
||||||
|
|
||||||
std::string GetName() const override;
|
|
||||||
std::string GetSource() const override;
|
|
||||||
bool IsSameDevice(const IOHIDDeviceRef) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
float x, y;
|
|
||||||
} m_cursor;
|
|
||||||
|
|
||||||
const IOHIDDeviceRef m_device;
|
|
||||||
const std::string m_device_name;
|
|
||||||
uint32_t m_windowid;
|
|
||||||
unsigned char m_mousebuttons[3];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,272 +0,0 @@
|
||||||
// Copyright 2014 Dolphin Emulator Project
|
|
||||||
// Licensed under GPLv2+
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include <Cocoa/Cocoa.h>
|
|
||||||
#include <Foundation/Foundation.h>
|
|
||||||
#include <IOKit/hid/IOHIDLib.h>
|
|
||||||
|
|
||||||
#include "InputCommon/ControllerInterface/OSX/OSXKeyboard.h"
|
|
||||||
|
|
||||||
namespace ciface
|
|
||||||
{
|
|
||||||
namespace OSX
|
|
||||||
{
|
|
||||||
Keyboard::Keyboard(IOHIDDeviceRef device, std::string name, void* window)
|
|
||||||
: m_device(device), m_device_name(name)
|
|
||||||
{
|
|
||||||
// This class should only receive Keyboard or Keypad devices
|
|
||||||
// Now, filter on just the buttons we can handle sanely
|
|
||||||
NSDictionary* matchingElements = @{
|
|
||||||
@kIOHIDElementTypeKey : @(kIOHIDElementTypeInput_Button),
|
|
||||||
@kIOHIDElementMinKey : @0,
|
|
||||||
@kIOHIDElementMaxKey : @1
|
|
||||||
};
|
|
||||||
|
|
||||||
CFArrayRef elements = IOHIDDeviceCopyMatchingElements(m_device, (CFDictionaryRef)matchingElements,
|
|
||||||
kIOHIDOptionsTypeNone);
|
|
||||||
|
|
||||||
if (elements)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < CFArrayGetCount(elements); i++)
|
|
||||||
{
|
|
||||||
IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i);
|
|
||||||
// DeviceElementDebugPrint(e, nullptr);
|
|
||||||
|
|
||||||
AddInput(new Key(e, m_device));
|
|
||||||
}
|
|
||||||
CFRelease(elements);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_windowid = [[reinterpret_cast<NSView*>(window) window] windowNumber];
|
|
||||||
|
|
||||||
// cursor, with a hax for-loop
|
|
||||||
for (unsigned int i = 0; i < 4; ++i)
|
|
||||||
AddInput(new Cursor(!!(i & 2), (&m_cursor.x)[i / 2], !!(i & 1)));
|
|
||||||
|
|
||||||
for (u8 i = 0; i < sizeof(m_mousebuttons) / sizeof(m_mousebuttons[0]); ++i)
|
|
||||||
AddInput(new Button(i, m_mousebuttons[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Keyboard::UpdateInput()
|
|
||||||
{
|
|
||||||
CGRect bounds = CGRectZero;
|
|
||||||
uint32_t windowid[1] = {m_windowid};
|
|
||||||
CFArrayRef windowArray = CFArrayCreate(nullptr, (const void**)windowid, 1, nullptr);
|
|
||||||
CFArrayRef windowDescriptions = CGWindowListCreateDescriptionFromArray(windowArray);
|
|
||||||
CFDictionaryRef windowDescription =
|
|
||||||
(CFDictionaryRef)CFArrayGetValueAtIndex((CFArrayRef)windowDescriptions, 0);
|
|
||||||
|
|
||||||
if (CFDictionaryContainsKey(windowDescription, kCGWindowBounds))
|
|
||||||
{
|
|
||||||
CFDictionaryRef boundsDictionary =
|
|
||||||
(CFDictionaryRef)CFDictionaryGetValue(windowDescription, kCGWindowBounds);
|
|
||||||
|
|
||||||
if (boundsDictionary != nullptr)
|
|
||||||
CGRectMakeWithDictionaryRepresentation(boundsDictionary, &bounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFRelease(windowDescriptions);
|
|
||||||
CFRelease(windowArray);
|
|
||||||
|
|
||||||
CGEventRef event = CGEventCreate(nil);
|
|
||||||
CGPoint loc = CGEventGetLocation(event);
|
|
||||||
CFRelease(event);
|
|
||||||
|
|
||||||
loc.x -= bounds.origin.x;
|
|
||||||
loc.y -= bounds.origin.y;
|
|
||||||
m_cursor.x = loc.x / bounds.size.width * 2 - 1.0;
|
|
||||||
m_cursor.y = loc.y / bounds.size.height * 2 - 1.0;
|
|
||||||
|
|
||||||
m_mousebuttons[0] =
|
|
||||||
CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonLeft);
|
|
||||||
m_mousebuttons[1] =
|
|
||||||
CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonRight);
|
|
||||||
m_mousebuttons[2] =
|
|
||||||
CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Keyboard::GetName() const
|
|
||||||
{
|
|
||||||
return m_device_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Keyboard::GetSource() const
|
|
||||||
{
|
|
||||||
return "Keyboard";
|
|
||||||
}
|
|
||||||
|
|
||||||
Keyboard::Key::Key(IOHIDElementRef element, IOHIDDeviceRef device)
|
|
||||||
: m_element(element), m_device(device)
|
|
||||||
{
|
|
||||||
static const struct PrettyKeys
|
|
||||||
{
|
|
||||||
const uint32_t code;
|
|
||||||
const char* const name;
|
|
||||||
} named_keys[] = {
|
|
||||||
{kHIDUsage_KeyboardA, "A"},
|
|
||||||
{kHIDUsage_KeyboardB, "B"},
|
|
||||||
{kHIDUsage_KeyboardC, "C"},
|
|
||||||
{kHIDUsage_KeyboardD, "D"},
|
|
||||||
{kHIDUsage_KeyboardE, "E"},
|
|
||||||
{kHIDUsage_KeyboardF, "F"},
|
|
||||||
{kHIDUsage_KeyboardG, "G"},
|
|
||||||
{kHIDUsage_KeyboardH, "H"},
|
|
||||||
{kHIDUsage_KeyboardI, "I"},
|
|
||||||
{kHIDUsage_KeyboardJ, "J"},
|
|
||||||
{kHIDUsage_KeyboardK, "K"},
|
|
||||||
{kHIDUsage_KeyboardL, "L"},
|
|
||||||
{kHIDUsage_KeyboardM, "M"},
|
|
||||||
{kHIDUsage_KeyboardN, "N"},
|
|
||||||
{kHIDUsage_KeyboardO, "O"},
|
|
||||||
{kHIDUsage_KeyboardP, "P"},
|
|
||||||
{kHIDUsage_KeyboardQ, "Q"},
|
|
||||||
{kHIDUsage_KeyboardR, "R"},
|
|
||||||
{kHIDUsage_KeyboardS, "S"},
|
|
||||||
{kHIDUsage_KeyboardT, "T"},
|
|
||||||
{kHIDUsage_KeyboardU, "U"},
|
|
||||||
{kHIDUsage_KeyboardV, "V"},
|
|
||||||
{kHIDUsage_KeyboardW, "W"},
|
|
||||||
{kHIDUsage_KeyboardX, "X"},
|
|
||||||
{kHIDUsage_KeyboardY, "Y"},
|
|
||||||
{kHIDUsage_KeyboardZ, "Z"},
|
|
||||||
{kHIDUsage_Keyboard1, "1"},
|
|
||||||
{kHIDUsage_Keyboard2, "2"},
|
|
||||||
{kHIDUsage_Keyboard3, "3"},
|
|
||||||
{kHIDUsage_Keyboard4, "4"},
|
|
||||||
{kHIDUsage_Keyboard5, "5"},
|
|
||||||
{kHIDUsage_Keyboard6, "6"},
|
|
||||||
{kHIDUsage_Keyboard7, "7"},
|
|
||||||
{kHIDUsage_Keyboard8, "8"},
|
|
||||||
{kHIDUsage_Keyboard9, "9"},
|
|
||||||
{kHIDUsage_Keyboard0, "0"},
|
|
||||||
{kHIDUsage_KeyboardReturnOrEnter, "Return"},
|
|
||||||
{kHIDUsage_KeyboardEscape, "Escape"},
|
|
||||||
{kHIDUsage_KeyboardDeleteOrBackspace, "Backspace"},
|
|
||||||
{kHIDUsage_KeyboardTab, "Tab"},
|
|
||||||
{kHIDUsage_KeyboardSpacebar, "Space"},
|
|
||||||
{kHIDUsage_KeyboardHyphen, "-"},
|
|
||||||
{kHIDUsage_KeyboardEqualSign, "="},
|
|
||||||
{kHIDUsage_KeyboardOpenBracket, "["},
|
|
||||||
{kHIDUsage_KeyboardCloseBracket, "]"},
|
|
||||||
{kHIDUsage_KeyboardBackslash, "\\"},
|
|
||||||
{kHIDUsage_KeyboardSemicolon, ";"},
|
|
||||||
{kHIDUsage_KeyboardQuote, "'"},
|
|
||||||
{kHIDUsage_KeyboardGraveAccentAndTilde, "Tilde"},
|
|
||||||
{kHIDUsage_KeyboardComma, ","},
|
|
||||||
{kHIDUsage_KeyboardPeriod, "."},
|
|
||||||
{kHIDUsage_KeyboardSlash, "/"},
|
|
||||||
{kHIDUsage_KeyboardCapsLock, "Caps Lock"},
|
|
||||||
{kHIDUsage_KeyboardF1, "F1"},
|
|
||||||
{kHIDUsage_KeyboardF2, "F2"},
|
|
||||||
{kHIDUsage_KeyboardF3, "F3"},
|
|
||||||
{kHIDUsage_KeyboardF4, "F4"},
|
|
||||||
{kHIDUsage_KeyboardF5, "F5"},
|
|
||||||
{kHIDUsage_KeyboardF6, "F6"},
|
|
||||||
{kHIDUsage_KeyboardF7, "F7"},
|
|
||||||
{kHIDUsage_KeyboardF8, "F8"},
|
|
||||||
{kHIDUsage_KeyboardF9, "F9"},
|
|
||||||
{kHIDUsage_KeyboardF10, "F10"},
|
|
||||||
{kHIDUsage_KeyboardF11, "F11"},
|
|
||||||
{kHIDUsage_KeyboardF12, "F12"},
|
|
||||||
{kHIDUsage_KeyboardInsert, "Insert"},
|
|
||||||
{kHIDUsage_KeyboardHome, "Home"},
|
|
||||||
{kHIDUsage_KeyboardPageUp, "Page Up"},
|
|
||||||
{kHIDUsage_KeyboardDeleteForward, "Delete"},
|
|
||||||
{kHIDUsage_KeyboardEnd, "End"},
|
|
||||||
{kHIDUsage_KeyboardPageDown, "Page Down"},
|
|
||||||
{kHIDUsage_KeyboardRightArrow, "Right Arrow"},
|
|
||||||
{kHIDUsage_KeyboardLeftArrow, "Left Arrow"},
|
|
||||||
{kHIDUsage_KeyboardDownArrow, "Down Arrow"},
|
|
||||||
{kHIDUsage_KeyboardUpArrow, "Up Arrow"},
|
|
||||||
{kHIDUsage_KeypadSlash, "Keypad /"},
|
|
||||||
{kHIDUsage_KeypadAsterisk, "Keypad *"},
|
|
||||||
{kHIDUsage_KeypadHyphen, "Keypad -"},
|
|
||||||
{kHIDUsage_KeypadPlus, "Keypad +"},
|
|
||||||
{kHIDUsage_KeypadEnter, "Keypad Enter"},
|
|
||||||
{kHIDUsage_Keypad1, "Keypad 1"},
|
|
||||||
{kHIDUsage_Keypad2, "Keypad 2"},
|
|
||||||
{kHIDUsage_Keypad3, "Keypad 3"},
|
|
||||||
{kHIDUsage_Keypad4, "Keypad 4"},
|
|
||||||
{kHIDUsage_Keypad5, "Keypad 5"},
|
|
||||||
{kHIDUsage_Keypad6, "Keypad 6"},
|
|
||||||
{kHIDUsage_Keypad7, "Keypad 7"},
|
|
||||||
{kHIDUsage_Keypad8, "Keypad 8"},
|
|
||||||
{kHIDUsage_Keypad9, "Keypad 9"},
|
|
||||||
{kHIDUsage_Keypad0, "Keypad 0"},
|
|
||||||
{kHIDUsage_KeypadPeriod, "Keypad ."},
|
|
||||||
{kHIDUsage_KeyboardNonUSBackslash, "Paragraph"},
|
|
||||||
{kHIDUsage_KeypadEqualSign, "Keypad ="},
|
|
||||||
{kHIDUsage_KeypadComma, "Keypad ,"},
|
|
||||||
{kHIDUsage_KeyboardLeftControl, "Left Control"},
|
|
||||||
{kHIDUsage_KeyboardLeftShift, "Left Shift"},
|
|
||||||
{kHIDUsage_KeyboardLeftAlt, "Left Alt"},
|
|
||||||
{kHIDUsage_KeyboardLeftGUI, "Left Command"},
|
|
||||||
{kHIDUsage_KeyboardRightControl, "Right Control"},
|
|
||||||
{kHIDUsage_KeyboardRightShift, "Right Shift"},
|
|
||||||
{kHIDUsage_KeyboardRightAlt, "Right Alt"},
|
|
||||||
{kHIDUsage_KeyboardRightGUI, "Right Command"},
|
|
||||||
{184, "Eject"},
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint32_t keycode = IOHIDElementGetUsage(m_element);
|
|
||||||
for (auto& named_key : named_keys)
|
|
||||||
{
|
|
||||||
if (named_key.code == keycode)
|
|
||||||
{
|
|
||||||
m_name = named_key.name;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "Key " << keycode;
|
|
||||||
m_name = ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
ControlState Keyboard::Key::GetState() const
|
|
||||||
{
|
|
||||||
IOHIDValueRef value;
|
|
||||||
|
|
||||||
if (IOHIDDeviceGetValue(m_device, m_element, &value) == kIOReturnSuccess)
|
|
||||||
return IOHIDValueGetIntegerValue(value);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ControlState Keyboard::Cursor::GetState() const
|
|
||||||
{
|
|
||||||
return std::max(0.0, ControlState(m_axis) / (m_positive ? 1.0 : -1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
ControlState Keyboard::Button::GetState() const
|
|
||||||
{
|
|
||||||
return (m_button != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Keyboard::Cursor::GetName() const
|
|
||||||
{
|
|
||||||
static char tmpstr[] = "Cursor ..";
|
|
||||||
tmpstr[7] = (char)('X' + m_index);
|
|
||||||
tmpstr[8] = (m_positive ? '+' : '-');
|
|
||||||
return tmpstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Keyboard::Button::GetName() const
|
|
||||||
{
|
|
||||||
return std::string("Click ") + char('0' + m_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Keyboard::Key::GetName() const
|
|
||||||
{
|
|
||||||
return m_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Keyboard::IsSameDevice(const IOHIDDeviceRef other_device) const
|
|
||||||
{
|
|
||||||
return m_device == other_device;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -136,8 +136,7 @@ bool InputConfig::IsControllerControlledByGamepadDevice(int index) const
|
||||||
const auto& controller = m_controllers.at(index).get()->default_device;
|
const auto& controller = m_controllers.at(index).get()->default_device;
|
||||||
|
|
||||||
// Filter out anything which obviously not a gamepad
|
// Filter out anything which obviously not a gamepad
|
||||||
return !((controller.source == "Keyboard") // OSX IOKit Keyboard/Mouse
|
return !((controller.source == "Quartz") // OSX Quartz Keyboard/Mouse
|
||||||
|| (controller.source == "Quartz") // OSX Quartz Keyboard/Mouse
|
|
||||||
|| (controller.source == "XInput2") // Linux and BSD Keyboard/Mouse
|
|| (controller.source == "XInput2") // Linux and BSD Keyboard/Mouse
|
||||||
|| (controller.source == "Android" &&
|
|| (controller.source == "Android" &&
|
||||||
controller.name == "Touchscreen") // Android Touchscreen
|
controller.name == "Touchscreen") // Android Touchscreen
|
||||||
|
|
Loading…
Reference in New Issue