summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorShawn Hoffman <godisgovernment@gmail.com>2010-04-27 07:33:33 +0000
committerShawn Hoffman <godisgovernment@gmail.com>2010-04-27 07:33:33 +0000
commitac8bc6b350f82d367ded1e0df87ce0ec283269fa (patch)
treeb6fd88dea0424ac2220d48094145a95d06fc632d /Source
parent199ebe5c9c608d996f2d381d6689fb49088a3d59 (diff)
osx input: now supports mice(buttons + axes). also less crashes :p
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5416 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.h47
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.mm59
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h58
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm71
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.h77
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.mm184
-rw-r--r--Source/Core/InputCommon/Src/SConscript3
-rw-r--r--Source/Dolphin.xcodeproj/project.pbxproj16
8 files changed, 405 insertions, 110 deletions
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.h b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.h
index 02e65bd609..30e8011478 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.h
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.h
@@ -1,7 +1,6 @@
#pragma once
#include "../ControllerInterface.h"
-#include <IOKit/hid/IOHIDLib.h>
namespace ciface
{
@@ -11,51 +10,5 @@ namespace OSX
void Init( std::vector<ControllerInterface::Device*>& devices );
void DeInit();
-class Keyboard : public ControllerInterface::Device
-{
- friend class ControllerInterface;
- friend class ControllerInterface::ControlReference;
-
-protected:
-
- class Input : public ControllerInterface::Device::Input
- {
- friend class Keyboard;
- protected:
- virtual ControlState GetState() = 0;
- };
-
- class Key : public Input
- {
- friend class Keyboard;
- public:
- std::string GetName() const;
- protected:
- Key( IOHIDElementRef key_element );
- ControlState GetState();
- private:
- IOHIDElementRef m_key_element;
- std::string m_key_name;
- };
-
- bool UpdateInput();
- bool UpdateOutput();
-
- ControlState GetInputState( const ControllerInterface::Device::Input* const input );
- void SetOutputState( const ControllerInterface::Device::Output* const output, const ControlState state );
-
-public:
- Keyboard(IOHIDDeviceRef device, int index);
-
- std::string GetName() const;
- std::string GetSource() const;
- int GetId() const;
-
-private:
- IOHIDDeviceRef m_device;
- int m_device_index;
- std::string m_device_name;
-};
-
}
}
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.mm b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.mm
index 7107a314df..8696fb407d 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.mm
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSX.mm
@@ -3,6 +3,8 @@
#ifdef CIFACE_USE_OSX
#include "OSX.h"
+#include "OSXKeyboard.h"
+#include "OSXMouse.h"
#include <Foundation/Foundation.h>
#include <IOKit/hid/IOHIDLib.h>
@@ -15,38 +17,38 @@ namespace OSX
static IOHIDManagerRef HIDManager = NULL;
static CFStringRef OurRunLoop = CFSTR("DolphinOSXInput");
-unsigned int KeyboardIndex = 0;
-
static void DeviceMatching_callback(void* inContext,
IOReturn inResult,
void* inSender,
IOHIDDeviceRef inIOHIDDeviceRef)
{
- NSLog(@"-------------------------");
- NSLog(@"Got Device: %@", IOHIDDeviceGetProperty(inIOHIDDeviceRef, CFSTR(kIOHIDProductKey)));
+ //NSLog(@"-------------------------");
+ //NSLog(@"Got Device: %@", IOHIDDeviceGetProperty(inIOHIDDeviceRef, CFSTR(kIOHIDProductKey)));
// Add to the devices vector if it's of a type we want
if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard) ||
IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Keypad))
{
std::vector<ControllerInterface::Device*> *devices = (std::vector<ControllerInterface::Device*> *)inContext;
- devices->push_back(new Keyboard(inIOHIDDeviceRef, KeyboardIndex++));
+ devices->push_back(new Keyboard(inIOHIDDeviceRef));
}
- /*
- // One of the built-in mice devices insta-crash :(
- else if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Mouse))
+ if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_Mouse))
{
+ std::vector<ControllerInterface::Device*> *devices = (std::vector<ControllerInterface::Device*> *)inContext;
+ devices->push_back(new Mouse(inIOHIDDeviceRef));
}
+ /*
// Probably just a lot of fiddling...but then we can kill SDL dependency (?)
else if (IOHIDDeviceConformsTo(inIOHIDDeviceRef, kHIDPage_GenericDesktop, kHIDUsage_GD_GamePad))
{
+ std::vector<ControllerInterface::Device*> *devices = (std::vector<ControllerInterface::Device*> *)inContext;
+ devices->push_back();
}
*/
else
{
// Actually, we don't want it
- NSLog(@"Throwing away...");
#define shortlog(x)
//#define shortlog(x) NSLog(@"%s: %@", x, IOHIDDeviceGetProperty(inIOHIDDeviceRef, CFSTR(x)));
shortlog(kIOHIDTransportKey)
@@ -75,26 +77,29 @@ static void DeviceMatching_callback(void* inContext,
void Init( std::vector<ControllerInterface::Device*>& devices )
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
HIDManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
if (!HIDManager)
NSLog(@"Failed to create HID Manager reference");
// HID Manager will give us the following devices:
// Keyboard, Keypad, Mouse, GamePad
- NSArray *matchingDevices = [NSArray arrayWithObjects:
- [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
- [NSNumber numberWithInteger:kHIDUsage_GD_Keyboard], @ kIOHIDDeviceUsageKey, nil],
- [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
- [NSNumber numberWithInteger:kHIDUsage_GD_Keypad], @ kIOHIDDeviceUsageKey, nil],
- [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
- [NSNumber numberWithInteger:kHIDUsage_GD_Mouse], @ kIOHIDDeviceUsageKey, nil],
- [NSDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
- [NSNumber numberWithInteger:kHIDUsage_GD_GamePad], @ kIOHIDDeviceUsageKey, nil],
- nil];
+ NSArray *matchingDevices =
+ [NSArray arrayWithObjects:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
+ [NSNumber numberWithInteger:kHIDUsage_GD_Keyboard], @ kIOHIDDeviceUsageKey, nil],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
+ [NSNumber numberWithInteger:kHIDUsage_GD_Keypad], @ kIOHIDDeviceUsageKey, nil],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
+ [NSNumber numberWithInteger:kHIDUsage_GD_Mouse], @ kIOHIDDeviceUsageKey, nil],
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kHIDPage_GenericDesktop], @ kIOHIDDeviceUsagePageKey,
+ [NSNumber numberWithInteger:kHIDUsage_GD_GamePad], @ kIOHIDDeviceUsageKey, nil],
+ nil];
// Pass NULL to get all devices
IOHIDManagerSetDeviceMatchingMultiple(HIDManager, (CFArrayRef)matchingDevices);
@@ -112,6 +117,8 @@ void Init( std::vector<ControllerInterface::Device*>& devices )
// Things should be configured now. Disable hotplugging and other scheduling
IOHIDManagerRegisterDeviceMatchingCallback(HIDManager, NULL, NULL);
IOHIDManagerUnscheduleFromRunLoop(HIDManager, CFRunLoopGetCurrent(), OurRunLoop);
+
+ [pool release];
}
void DeInit()
@@ -154,7 +161,7 @@ void DeviceElementDebugPrint(const void *value, void *context)
}
c_type.append(" ");
- NSLog(@"%s%s%spage: 0x%x usage: 0x%x name: %s lmin: %u lmax: %u",
+ NSLog(@"%s%s%spage: 0x%x usage: 0x%x name: %s lmin: %i lmax: %i pmin: %i pmax: %i",
type.c_str(),
type == "collection" ? ":" : "",
type == "collection" ? c_type.c_str() : " ",
@@ -162,7 +169,9 @@ void DeviceElementDebugPrint(const void *value, void *context)
IOHIDElementGetUsage(e),
IOHIDElementGetName(e), // TOO BAD IT"S FUCKING USELESS
IOHIDElementGetLogicalMin(e),
- IOHIDElementGetLogicalMax(e));
+ IOHIDElementGetLogicalMax(e),
+ IOHIDElementGetPhysicalMin(e),
+ IOHIDElementGetPhysicalMax(e));
if (type == "collection")
{
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h
new file mode 100644
index 0000000000..aabbcd14a9
--- /dev/null
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include "../ControllerInterface.h"
+#include <IOKit/hid/IOHIDLib.h>
+
+namespace ciface
+{
+namespace OSX
+{
+
+class Keyboard : public ControllerInterface::Device
+{
+ friend class ControllerInterface;
+ friend class ControllerInterface::ControlReference;
+
+protected:
+
+ class Input : public ControllerInterface::Device::Input
+ {
+ friend class Keyboard;
+ protected:
+ virtual ControlState GetState() = 0;
+ };
+
+ class Key : public Input
+ {
+ friend class Keyboard;
+ public:
+ std::string GetName() const;
+ protected:
+ Key( IOHIDElementRef element );
+ ControlState GetState();
+ private:
+ IOHIDDeviceRef m_device;
+ IOHIDElementRef m_element;
+ std::string m_name;
+ };
+
+ bool UpdateInput();
+ bool UpdateOutput();
+
+ ControlState GetInputState( const ControllerInterface::Device::Input* const input );
+ void SetOutputState( const ControllerInterface::Device::Output* const output, const ControlState state );
+
+public:
+ Keyboard(IOHIDDeviceRef device);
+
+ std::string GetName() const;
+ std::string GetSource() const;
+ int GetId() const;
+
+private:
+ IOHIDDeviceRef m_device;
+ std::string m_device_name;
+};
+
+}
+}
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm
index febbf24fe9..46b74bf360 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXKeyboard.mm
@@ -2,7 +2,7 @@
#ifdef CIFACE_USE_OSX
-#include "OSX.h"
+#include "OSXKeyboard.h"
#include <Foundation/Foundation.h>
#include <IOKit/hid/IOHIDLib.h>
@@ -24,36 +24,39 @@ struct PrettyKeys
extern void DeviceElementDebugPrint(const void*, void*);
-Keyboard::Keyboard(IOHIDDeviceRef device, int index)
+Keyboard::Keyboard(IOHIDDeviceRef device)
: m_device(device)
- , m_device_index(index)
{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
m_device_name = [(NSString *)IOHIDDeviceGetProperty(m_device, CFSTR(kIOHIDProductKey)) UTF8String];
- // Go through all the elements of the device we've been given and try to make something out of them
- CFArrayRef elements = IOHIDDeviceCopyMatchingElements(m_device, NULL, kIOHIDOptionsTypeNone);
- CFIndex idx = 0;
- for (IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, idx);
- e;
- e = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, ++idx))
+ // This class should only recieve Keyboard or Keypad devices
+ // Now, filter on just the buttons we can handle sanely
+ NSDictionary *matchingElements =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kIOHIDElementTypeInput_Button], @ kIOHIDElementTypeKey,
+ [NSNumber numberWithInteger:0], @ kIOHIDElementMinKey,
+ [NSNumber numberWithInteger:1], @ kIOHIDElementMaxKey,
+ nil];
+
+ CFArrayRef elements =
+ IOHIDDeviceCopyMatchingElements(m_device, (CFDictionaryRef)matchingElements, kIOHIDOptionsTypeNone);
+
+ if (elements)
{
- if ((IOHIDElementGetType(e) == kIOHIDElementTypeInput_Button) &&
- (IOHIDElementGetUsagePage(e) == kHIDPage_KeyboardOrKeypad) &&
- (IOHIDElementGetLogicalMin(e) == 0) &&
- (IOHIDElementGetLogicalMax(e) == 1))
- {
- try {
- inputs.push_back(new Key(e));
- }
- catch (std::bad_alloc&) {
- }
- }
- else
+ for (int i = 0; i < CFArrayGetCount(elements); i++)
{
+ IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i);
//DeviceElementDebugPrint(e, NULL);
+
+ try { inputs.push_back(new Key(e)); }
+ catch (std::bad_alloc&) { /*Thrown if the key is reserved*/ }
}
+ CFRelease(elements);
}
- CFRelease(elements);
+
+ [pool release];
}
ControlState Keyboard::GetInputState( const ControllerInterface::Device::Input* const input )
@@ -87,20 +90,22 @@ std::string Keyboard::GetSource() const
int Keyboard::GetId() const
{
- return m_device_index;
+ return 0;
}
-Keyboard::Key::Key(IOHIDElementRef key_element)
- : m_key_element(key_element)
- , m_key_name("RESERVED") // for some reason HID Manager gives these to us. bad_alloc!
+Keyboard::Key::Key(IOHIDElementRef element)
+ : m_element(element)
+ , m_name("RESERVED") // for some reason HID Manager gives these to us. bad_alloc!
{
- uint32_t keycode = IOHIDElementGetUsage(m_key_element);
+ m_device = IOHIDElementGetDevice(m_element);
+
+ uint32_t keycode = IOHIDElementGetUsage(m_element);
for (uint32_t i = 0; i < sizeof(named_keys)/sizeof(*named_keys); i++)
{
if (named_keys[i].code == keycode)
{
- m_key_name = named_keys[i].name;
+ m_name = named_keys[i].name;
return;
}
}
@@ -110,19 +115,15 @@ Keyboard::Key::Key(IOHIDElementRef key_element)
ControlState Keyboard::Key::GetState()
{
IOHIDValueRef value;
- if (IOHIDDeviceGetValue(IOHIDElementGetDevice(m_key_element), m_key_element, &value) == kIOReturnSuccess)
- {
- double scaled_value = IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical);
- //NSLog(@"element %x value %x scaled %f", IOHIDElementGetUsage(m_key_element), value, scaled_value);
- return scaled_value > 0;
- }
+ if (IOHIDDeviceGetValue(m_device, m_element, &value) == kIOReturnSuccess)
+ return IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical) > 0;
return false;
}
std::string Keyboard::Key::GetName() const
{
- return m_key_name;
+ return m_name;
}
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.h b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.h
new file mode 100644
index 0000000000..0049fd311e
--- /dev/null
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.h
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "../ControllerInterface.h"
+#include <IOKit/hid/IOHIDLib.h>
+
+namespace ciface
+{
+namespace OSX
+{
+
+class Mouse : public ControllerInterface::Device
+{
+ friend class ControllerInterface;
+ friend class ControllerInterface::ControlReference;
+
+protected:
+
+ class Input : public ControllerInterface::Device::Input
+ {
+ friend class Mouse;
+ protected:
+ virtual ControlState GetState() = 0;
+ };
+
+ class Button : public Input
+ {
+ friend class Mouse;
+ public:
+ std::string GetName() const;
+ protected:
+ Button( IOHIDElementRef element );
+ ControlState GetState();
+ private:
+ IOHIDDeviceRef m_device;
+ IOHIDElementRef m_element;
+ std::string m_name;
+ };
+
+ class Axis : public Input
+ {
+ friend class Mouse;
+ public:
+ enum direction {
+ positive = 0,
+ negative
+ };
+ std::string GetName() const;
+ protected:
+ Axis( IOHIDElementRef element, direction dir );
+ ControlState GetState();
+ private:
+ IOHIDDeviceRef m_device;
+ IOHIDElementRef m_element;
+ std::string m_name;
+ direction m_direction;
+ };
+
+ bool UpdateInput();
+ bool UpdateOutput();
+
+ ControlState GetInputState( const ControllerInterface::Device::Input* const input );
+ void SetOutputState( const ControllerInterface::Device::Output* const output, const ControlState state );
+
+public:
+ Mouse(IOHIDDeviceRef device);
+
+ std::string GetName() const;
+ std::string GetSource() const;
+ int GetId() const;
+
+private:
+ IOHIDDeviceRef m_device;
+ std::string m_device_name;
+};
+
+}
+}
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.mm b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.mm
new file mode 100644
index 0000000000..a91d91ada1
--- /dev/null
+++ b/Source/Core/InputCommon/Src/ControllerInterface/OSX/OSXMouse.mm
@@ -0,0 +1,184 @@
+#include "../ControllerInterface.h"
+
+#ifdef CIFACE_USE_OSX
+
+#include "OSXMouse.h"
+#include <Foundation/Foundation.h>
+#include <IOKit/hid/IOHIDLib.h>
+
+namespace ciface
+{
+namespace OSX
+{
+
+extern void DeviceElementDebugPrint(const void*, void*);
+
+
+Mouse::Mouse(IOHIDDeviceRef device)
+ : m_device(device)
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ m_device_name = [(NSString *)IOHIDDeviceGetProperty(m_device, CFSTR(kIOHIDProductKey)) UTF8String];
+
+ // Buttons
+ NSDictionary *buttonDict =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kIOHIDElementTypeInput_Button], @ kIOHIDElementTypeKey,
+ [NSNumber numberWithInteger:kHIDPage_Button], @ kIOHIDElementUsagePageKey,
+ nil];
+
+ CFArrayRef buttons =
+ IOHIDDeviceCopyMatchingElements(m_device, (CFDictionaryRef)buttonDict, kIOHIDOptionsTypeNone);
+
+ if (buttons)
+ {
+ for (int i = 0; i < CFArrayGetCount(buttons); i++)
+ {
+ IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(buttons, i);
+ //DeviceElementDebugPrint(e, NULL);
+
+ inputs.push_back(new Button(e));
+ }
+ CFRelease(buttons);
+ }
+
+ // Axes
+ NSDictionary *axisDict =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:kIOHIDElementTypeInput_Misc], @ kIOHIDElementTypeKey,
+ nil];
+
+ CFArrayRef axes =
+ IOHIDDeviceCopyMatchingElements(m_device, (CFDictionaryRef)axisDict, kIOHIDOptionsTypeNone);
+
+ if (axes)
+ {
+ for (int i = 0; i < CFArrayGetCount(axes); i++)
+ {
+ IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(axes, i);
+ //DeviceElementDebugPrint(e, NULL);
+
+ inputs.push_back(new Axis(e, Axis::negative));
+ inputs.push_back(new Axis(e, Axis::positive));
+ }
+ CFRelease(axes);
+ }
+
+ [pool release];
+}
+
+ControlState Mouse::GetInputState( const ControllerInterface::Device::Input* const input )
+{
+ return ((Input*)input)->GetState();
+}
+
+void Mouse::SetOutputState( const ControllerInterface::Device::Output* const output, const ControlState state )
+{
+}
+
+bool Mouse::UpdateInput()
+{
+ return true;
+}
+
+bool Mouse::UpdateOutput()
+{
+ return true;
+}
+
+std::string Mouse::GetName() const
+{
+ return m_device_name;
+}
+
+std::string Mouse::GetSource() const
+{
+ return "OSX";
+}
+
+int Mouse::GetId() const
+{
+ return 0;
+}
+
+
+Mouse::Button::Button(IOHIDElementRef element)
+ : m_element(element)
+{
+ m_device = IOHIDElementGetDevice(m_element);
+
+ std::ostringstream s;
+ s << IOHIDElementGetUsage(m_element);
+ m_name = std::string("Button ") + s.str();
+}
+
+ControlState Mouse::Button::GetState()
+{
+ IOHIDValueRef value;
+ if (IOHIDDeviceGetValue(m_device, m_element, &value) == kIOReturnSuccess)
+ return IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical) > 0;
+
+ return false;
+}
+
+std::string Mouse::Button::GetName() const
+{
+ return m_name;
+}
+
+
+Mouse::Axis::Axis(IOHIDElementRef element, direction dir)
+ : m_element(element)
+ , m_direction(dir)
+{
+ m_device = IOHIDElementGetDevice(m_element);
+
+ // Need to parse the element a bit first
+ std::string description("unk");
+
+ switch (IOHIDElementGetUsage(m_element))
+ {
+ default:
+ NSLog(@"Unknown axis type 0x%x, using anyways...", IOHIDElementGetUsage(m_element));
+ break;
+ case kHIDUsage_GD_X: description = "X"; break;
+ case kHIDUsage_GD_Y: description = "Y"; break;
+ case kHIDUsage_GD_Wheel: description = "Wheel"; break;
+ case kHIDUsage_Csmr_ACPan: description = "Pan"; break;
+ }
+
+ m_name = std::string("Axis ") + description;
+ m_name.append((m_direction == positive) ? std::string("+") : std::string("-"));
+}
+
+ControlState Mouse::Axis::GetState()
+{
+ IOHIDValueRef value;
+ if (IOHIDDeviceGetValue(m_device, m_element, &value) == kIOReturnSuccess)
+ {
+ double scaled_value = IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical);
+ double actual_value = 0;
+
+ if ((scaled_value < 0) && (m_direction == negative))
+ actual_value = fabs(scaled_value);
+ else if ((scaled_value > 0) && (m_direction == positive))
+ actual_value = scaled_value;
+
+ //NSLog(@"%s %f %f", m_name.c_str(), scaled_value, actual_value);
+ return actual_value;
+ }
+
+ return false;
+}
+
+std::string Mouse::Axis::GetName() const
+{
+ return m_name;
+}
+
+
+}
+}
+
+#endif
diff --git a/Source/Core/InputCommon/Src/SConscript b/Source/Core/InputCommon/Src/SConscript
index 647307f750..8530d6a32a 100644
--- a/Source/Core/InputCommon/Src/SConscript
+++ b/Source/Core/InputCommon/Src/SConscript
@@ -29,7 +29,8 @@ if icenv['HAVE_SDL']:
if sys.platform == 'darwin':
files += [
'ControllerInterface/OSX/OSX.mm',
- 'ControllerInterface/OSX/OSXKeyboard.mm'
+ 'ControllerInterface/OSX/OSXKeyboard.mm',
+ 'ControllerInterface/OSX/OSXMouse.mm'
]
icenv['FRAMEWORKS'] = ['IOKit']
diff --git a/Source/Dolphin.xcodeproj/project.pbxproj b/Source/Dolphin.xcodeproj/project.pbxproj
index 7e07a8bc6b..a916e92de5 100644
--- a/Source/Dolphin.xcodeproj/project.pbxproj
+++ b/Source/Dolphin.xcodeproj/project.pbxproj
@@ -955,6 +955,9 @@
292AC59211838FD700B8790B /* pluginspecs_pad.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC1DC11838FD700B8790B /* pluginspecs_pad.h */; };
292AC59311838FD700B8790B /* pluginspecs_video.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC1DD11838FD700B8790B /* pluginspecs_video.h */; };
292AC59411838FD700B8790B /* pluginspecs_wiimote.h in Headers */ = {isa = PBXBuildFile; fileRef = 292AC1DE11838FD700B8790B /* pluginspecs_wiimote.h */; };
+ 298D72BB11867D970096937B /* OSXKeyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = 298D72BA11867D970096937B /* OSXKeyboard.h */; };
+ 298D731E118699AD0096937B /* OSXMouse.mm in Sources */ = {isa = PBXBuildFile; fileRef = 298D731C118699AD0096937B /* OSXMouse.mm */; };
+ 298D731F118699AD0096937B /* OSXMouse.h in Headers */ = {isa = PBXBuildFile; fileRef = 298D731D118699AD0096937B /* OSXMouse.h */; };
29D1528F118634B400CC2741 /* OSXKeyboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 29D1528E118634B400CC2741 /* OSXKeyboard.mm */; };
29D152AC1186461800CC2741 /* NamedKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 29D152AB1186461800CC2741 /* NamedKeys.h */; };
5232B1F10EEB634D0093A7B1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5232B1F00EEB634D0093A7B1 /* Cocoa.framework */; };
@@ -2316,6 +2319,9 @@
292AC1DC11838FD700B8790B /* pluginspecs_pad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pluginspecs_pad.h; sourceTree = "<group>"; };
292AC1DD11838FD700B8790B /* pluginspecs_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pluginspecs_video.h; sourceTree = "<group>"; };
292AC1DE11838FD700B8790B /* pluginspecs_wiimote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pluginspecs_wiimote.h; sourceTree = "<group>"; };
+ 298D72BA11867D970096937B /* OSXKeyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSXKeyboard.h; sourceTree = "<group>"; };
+ 298D731C118699AD0096937B /* OSXMouse.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OSXMouse.mm; sourceTree = "<group>"; };
+ 298D731D118699AD0096937B /* OSXMouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSXMouse.h; sourceTree = "<group>"; };
29D1528E118634B400CC2741 /* OSXKeyboard.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OSXKeyboard.mm; sourceTree = "<group>"; };
29D152AB1186461800CC2741 /* NamedKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NamedKeys.h; sourceTree = "<group>"; };
5048396D09E3307300765E4B /* DolphinProj.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; path = DolphinProj.xcconfig; sourceTree = "<group>"; };
@@ -3581,9 +3587,12 @@
isa = PBXGroup;
children = (
29D152AB1186461800CC2741 /* NamedKeys.h */,
- 29D1528E118634B400CC2741 /* OSXKeyboard.mm */,
- 292AC00211838FD600B8790B /* OSX.mm */,
292AC00311838FD600B8790B /* OSX.h */,
+ 292AC00211838FD600B8790B /* OSX.mm */,
+ 298D72BA11867D970096937B /* OSXKeyboard.h */,
+ 29D1528E118634B400CC2741 /* OSXKeyboard.mm */,
+ 298D731D118699AD0096937B /* OSXMouse.h */,
+ 298D731C118699AD0096937B /* OSXMouse.mm */,
);
path = OSX;
sourceTree = "<group>";
@@ -4850,6 +4859,8 @@
292AC59311838FD700B8790B /* pluginspecs_video.h in Headers */,
292AC59411838FD700B8790B /* pluginspecs_wiimote.h in Headers */,
29D152AC1186461800CC2741 /* NamedKeys.h in Headers */,
+ 298D72BB11867D970096937B /* OSXKeyboard.h in Headers */,
+ 298D731F118699AD0096937B /* OSXMouse.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -5903,6 +5914,7 @@
292AC58A11838FD700B8790B /* WiimoteEmu.cpp in Sources */,
292AC58D11838FD700B8790B /* WiimoteNew.cpp in Sources */,
29D1528F118634B400CC2741 /* OSXKeyboard.mm in Sources */,
+ 298D731E118699AD0096937B /* OSXMouse.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};