From 1615865ef3aa1efb418556c3a5abde9cfb272122 Mon Sep 17 00:00:00 2001 From: Jacob Gillespie Date: Sun, 20 Dec 2015 10:00:49 -0600 Subject: [PATCH] Replace DDHidLib with custom version from BeardedSpice --- CHANGELOG.md | 2 + radiant-player-mac.xcodeproj/project.pbxproj | 82 +- radiant-player-mac/AppDelegate.h | 4 +- radiant-player-mac/AppDelegate.m | 44 +- .../Headers => DDHidLib}/DDHidAppleMikey.h | 0 radiant-player-mac/DDHidLib/DDHidAppleMikey.m | 164 ++ .../A => DDHidLib}/DDHidAppleRemote.h | 1 + .../DDHidLib/DDHidAppleRemote.m | 252 ++ .../Headers => DDHidLib}/DDHidDevice.h | 0 radiant-player-mac/DDHidLib/DDHidDevice.m | 612 +++++ .../Headers => DDHidLib}/DDHidElement.h | 0 radiant-player-mac/DDHidLib/DDHidElement.m | 193 ++ .../Headers => DDHidLib}/DDHidEvent.h | 0 .../A/DDHidEvent.h => DDHidLib/DDHidEvent.m} | 48 +- .../Headers => DDHidLib}/DDHidQueue.h | 0 radiant-player-mac/DDHidLib/DDHidQueue.m | 174 ++ .../Headers => DDHidLib}/DDHidUsage.h | 0 radiant-player-mac/DDHidLib/DDHidUsage.m | 84 + .../Headers => DDHidLib}/DDHidUsageTables.h | 0 .../DDHidLib/DDHidUsageTables.m | 85 + .../NSDictionary+DDHidExtras.h} | 28 +- .../DDHidLib/NSDictionary+DDHidExtras.m | 81 + .../DDHidLib/NSXReturnThrowError.h | 103 + .../DDHidLib/NSXReturnThrowError.m | 106 + .../Frameworks/DDHidLib.framework/DDHidLib | Bin 163040 -> 0 bytes .../Headers/DDHidAppleRemote.h | 84 - .../Headers/DDHidJoystick.h | 132 - .../Headers/DDHidKeyboard.h | 68 - .../Headers/DDHidKeyboardBarcodeScanner.h | 74 - .../DDHidLib.framework/Headers/DDHidLib.h | 36 - .../DDHidLib.framework/Headers/DDHidMouse.h | 78 - .../Resources/DDHidStandardUsages.plist | 2327 ----------------- .../DDHidLib.framework/Resources/Info.plist | 42 - .../Versions/A/DDHidAppleMikey.h | 66 - .../Versions/A/DDHidDevice.h | 131 - .../Versions/A/DDHidElement.h | 65 - .../Versions/A/DDHidJoystick.h | 132 - .../Versions/A/DDHidKeyboard.h | 68 - .../Versions/A/DDHidKeyboardBarcodeScanner.h | 74 - .../DDHidLib.framework/Versions/A/DDHidLib | Bin 163040 -> 0 bytes .../DDHidLib.framework/Versions/A/DDHidLib.h | 36 - .../Versions/A/DDHidMouse.h | 78 - .../Versions/A/DDHidQueue.h | 70 - .../Versions/A/DDHidUsageTables.h | 40 - .../A/Resources/DDHidStandardUsages.plist | 2327 ----------------- .../Versions/A/Resources/Info.plist | 42 - 46 files changed, 2017 insertions(+), 6016 deletions(-) rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidAppleMikey.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidAppleMikey.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Versions/A => DDHidLib}/DDHidAppleRemote.h (98%) create mode 100644 radiant-player-mac/DDHidLib/DDHidAppleRemote.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidDevice.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidDevice.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidElement.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidElement.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidEvent.h (100%) rename radiant-player-mac/{Frameworks/DDHidLib.framework/Versions/A/DDHidEvent.h => DDHidLib/DDHidEvent.m} (74%) rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidQueue.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidQueue.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidUsage.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidUsage.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Headers => DDHidLib}/DDHidUsageTables.h (100%) create mode 100644 radiant-player-mac/DDHidLib/DDHidUsageTables.m rename radiant-player-mac/{Frameworks/DDHidLib.framework/Versions/A/DDHidUsage.h => DDHidLib/NSDictionary+DDHidExtras.h} (68%) create mode 100644 radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.m create mode 100644 radiant-player-mac/DDHidLib/NSXReturnThrowError.h create mode 100644 radiant-player-mac/DDHidLib/NSXReturnThrowError.m delete mode 100755 radiant-player-mac/Frameworks/DDHidLib.framework/DDHidLib delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleRemote.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidJoystick.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboard.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboardBarcodeScanner.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidLib.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidMouse.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Resources/DDHidStandardUsages.plist delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Resources/Info.plist delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleMikey.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidDevice.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidElement.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidJoystick.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboard.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboardBarcodeScanner.h delete mode 100755 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidMouse.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidQueue.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsageTables.h delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/DDHidStandardUsages.plist delete mode 100644 radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/Info.plist diff --git a/CHANGELOG.md b/CHANGELOG.md index 35f79a02..159412d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ This file should follow the standards specified on [keepachangelog.com](http://k This project adheres to [Semantic Versioning](http://semver.org/). ## [unreleased] +### Fixed +* Fixed a bug introduced in 1.6.0 where Radiant would hang when external HID devices were connected ([#463](https://github.com/radiant-player/radiant-player-mac/pull/463)). Note that there is still an outstanding bug where the headphone play/pause buttons open iTunes in addition to controlling Radiant. That is still being investigated. ## [1.6.1] - 2015-12-20 ### Fixed diff --git a/radiant-player-mac.xcodeproj/project.pbxproj b/radiant-player-mac.xcodeproj/project.pbxproj index baeb86d0..7abb52ac 100644 --- a/radiant-player-mac.xcodeproj/project.pbxproj +++ b/radiant-player-mac.xcodeproj/project.pbxproj @@ -19,8 +19,17 @@ 2B8FC1C318C9CB16006D04FF /* RadiantPlayerScriptCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B8FC1C218C9CB16006D04FF /* RadiantPlayerScriptCommand.m */; }; 38D0C36DAD0F40F5A7254224 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BABD1B4DDCC34CB291C66033 /* libPods.a */; }; 42C12CDD1C1A73C100E5029B /* RdiantStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 42C12CDC1C1A73C100E5029B /* RdiantStyle.m */; }; - 691954C11C1F305E00FAC602 /* DDHidLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 691954C01C1F305E00FAC602 /* DDHidLib.framework */; }; - 69DDF0611C1F334D006493B1 /* DDHidLib.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 691954C01C1F305E00FAC602 /* DDHidLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 693BAD221C2702A90022B557 /* DDHidLib in Resources */ = {isa = PBXBuildFile; fileRef = 693BAD211C2702A90022B557 /* DDHidLib */; }; + 693BAD4D1C2705200022B557 /* DDHidAppleMikey.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD3A1C2705200022B557 /* DDHidAppleMikey.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD4E1C2705200022B557 /* DDHidAppleRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD3C1C2705200022B557 /* DDHidAppleRemote.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD4F1C2705200022B557 /* DDHidDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD3E1C2705200022B557 /* DDHidDevice.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD501C2705200022B557 /* DDHidElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD401C2705200022B557 /* DDHidElement.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD511C2705200022B557 /* DDHidEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD421C2705200022B557 /* DDHidEvent.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD521C2705200022B557 /* DDHidQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD441C2705200022B557 /* DDHidQueue.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD531C2705200022B557 /* DDHidUsage.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD461C2705200022B557 /* DDHidUsage.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD541C2705200022B557 /* DDHidUsageTables.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD481C2705200022B557 /* DDHidUsageTables.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD551C2705200022B557 /* NSDictionary+DDHidExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD4A1C2705200022B557 /* NSDictionary+DDHidExtras.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 693BAD561C2705200022B557 /* NSXReturnThrowError.m in Sources */ = {isa = PBXBuildFile; fileRef = 693BAD4C1C2705200022B557 /* NSXReturnThrowError.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; B06FB3D219F7723500351943 /* LightStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BB948819F76CFD0081C97D /* LightStyle.m */; }; D302E13418B561E100CCD18E /* Preferences.plist in Resources */ = {isa = PBXBuildFile; fileRef = D302E13318B561E100CCD18E /* Preferences.plist */; }; D3091F6318C32961007C8DCD /* Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = D3091F6218C32961007C8DCD /* Utilities.m */; }; @@ -91,7 +100,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 69DDF0611C1F334D006493B1 /* DDHidLib.framework in Copy Frameworks */, D31ACE8D193BE39E00AC7CB4 /* Growl.framework in Copy Frameworks */, D30F578B1BDB7BD300929904 /* Sparkle.framework in Copy Frameworks */, ); @@ -133,7 +141,26 @@ 2B8FC1C218C9CB16006D04FF /* RadiantPlayerScriptCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RadiantPlayerScriptCommand.m; sourceTree = ""; }; 42C12CDB1C1A73AB00E5029B /* RdiantStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RdiantStyle.h; sourceTree = ""; }; 42C12CDC1C1A73C100E5029B /* RdiantStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RdiantStyle.m; sourceTree = ""; }; - 691954C01C1F305E00FAC602 /* DDHidLib.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DDHidLib.framework; path = "radiant-player-mac/Frameworks/DDHidLib.framework"; sourceTree = ""; }; + 693BAD391C2705200022B557 /* DDHidAppleMikey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidAppleMikey.h; path = DDHidLib/DDHidAppleMikey.h; sourceTree = ""; }; + 693BAD3A1C2705200022B557 /* DDHidAppleMikey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidAppleMikey.m; path = DDHidLib/DDHidAppleMikey.m; sourceTree = ""; }; + 693BAD3B1C2705200022B557 /* DDHidAppleRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidAppleRemote.h; path = DDHidLib/DDHidAppleRemote.h; sourceTree = ""; }; + 693BAD3C1C2705200022B557 /* DDHidAppleRemote.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidAppleRemote.m; path = DDHidLib/DDHidAppleRemote.m; sourceTree = ""; }; + 693BAD3D1C2705200022B557 /* DDHidDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidDevice.h; path = DDHidLib/DDHidDevice.h; sourceTree = ""; }; + 693BAD3E1C2705200022B557 /* DDHidDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidDevice.m; path = DDHidLib/DDHidDevice.m; sourceTree = ""; }; + 693BAD3F1C2705200022B557 /* DDHidElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidElement.h; path = DDHidLib/DDHidElement.h; sourceTree = ""; }; + 693BAD401C2705200022B557 /* DDHidElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidElement.m; path = DDHidLib/DDHidElement.m; sourceTree = ""; }; + 693BAD411C2705200022B557 /* DDHidEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidEvent.h; path = DDHidLib/DDHidEvent.h; sourceTree = ""; }; + 693BAD421C2705200022B557 /* DDHidEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidEvent.m; path = DDHidLib/DDHidEvent.m; sourceTree = ""; }; + 693BAD431C2705200022B557 /* DDHidQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidQueue.h; path = DDHidLib/DDHidQueue.h; sourceTree = ""; }; + 693BAD441C2705200022B557 /* DDHidQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidQueue.m; path = DDHidLib/DDHidQueue.m; sourceTree = ""; }; + 693BAD451C2705200022B557 /* DDHidUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidUsage.h; path = DDHidLib/DDHidUsage.h; sourceTree = ""; }; + 693BAD461C2705200022B557 /* DDHidUsage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidUsage.m; path = DDHidLib/DDHidUsage.m; sourceTree = ""; }; + 693BAD471C2705200022B557 /* DDHidUsageTables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHidUsageTables.h; path = DDHidLib/DDHidUsageTables.h; sourceTree = ""; }; + 693BAD481C2705200022B557 /* DDHidUsageTables.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DDHidUsageTables.m; path = DDHidLib/DDHidUsageTables.m; sourceTree = ""; }; + 693BAD491C2705200022B557 /* NSDictionary+DDHidExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DDHidExtras.h"; path = "DDHidLib/NSDictionary+DDHidExtras.h"; sourceTree = ""; }; + 693BAD4A1C2705200022B557 /* NSDictionary+DDHidExtras.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DDHidExtras.m"; path = "DDHidLib/NSDictionary+DDHidExtras.m"; sourceTree = ""; }; + 693BAD4B1C2705200022B557 /* NSXReturnThrowError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSXReturnThrowError.h; path = DDHidLib/NSXReturnThrowError.h; sourceTree = ""; }; + 693BAD4C1C2705200022B557 /* NSXReturnThrowError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSXReturnThrowError.m; path = DDHidLib/NSXReturnThrowError.m; sourceTree = ""; }; A32790DC482A48E18B516D0B /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; B0BB948719F76CF80081C97D /* LightStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightStyle.h; sourceTree = ""; }; B0BB948819F76CFD0081C97D /* LightStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LightStyle.m; sourceTree = ""; }; @@ -249,7 +276,6 @@ files = ( D31ACE86193BCD3E00AC7CB4 /* Growl.framework in Frameworks */, D370E8E018E21ABC007B5450 /* QuartzCore.framework in Frameworks */, - 691954C11C1F305E00FAC602 /* DDHidLib.framework in Frameworks */, D3B4C0C318DAB4740069AB18 /* JavaScriptCore.framework in Frameworks */, D30F57891BDB7B2200929904 /* Sparkle.framework in Frameworks */, 1A7B687417453E4C001E509E /* WebKit.framework in Frameworks */, @@ -284,7 +310,6 @@ 1A7B683E17453E40001E509E /* Frameworks */ = { isa = PBXGroup; children = ( - 691954C01C1F305E00FAC602 /* DDHidLib.framework */, D30F57881BDB7B2200929904 /* Sparkle.framework */, D31ACE85193BCD3E00AC7CB4 /* Growl.framework */, D370E8DF18E21ABC007B5450 /* QuartzCore.framework */, @@ -310,6 +335,7 @@ 1A7B684517453E40001E509E /* radiant-player-mac */ = { isa = PBXGroup; children = ( + 693BAD381C27050B0022B557 /* DDHidLib */, D36F50621A3D871D000541C9 /* Support */, D31ACE87193BDC9700AC7CB4 /* Notifications */, D3D4C3E318E75C79007238B3 /* LastFm */, @@ -366,6 +392,33 @@ path = AppleScript; sourceTree = ""; }; + 693BAD381C27050B0022B557 /* DDHidLib */ = { + isa = PBXGroup; + children = ( + 693BAD391C2705200022B557 /* DDHidAppleMikey.h */, + 693BAD3A1C2705200022B557 /* DDHidAppleMikey.m */, + 693BAD3B1C2705200022B557 /* DDHidAppleRemote.h */, + 693BAD3C1C2705200022B557 /* DDHidAppleRemote.m */, + 693BAD3D1C2705200022B557 /* DDHidDevice.h */, + 693BAD3E1C2705200022B557 /* DDHidDevice.m */, + 693BAD3F1C2705200022B557 /* DDHidElement.h */, + 693BAD401C2705200022B557 /* DDHidElement.m */, + 693BAD411C2705200022B557 /* DDHidEvent.h */, + 693BAD421C2705200022B557 /* DDHidEvent.m */, + 693BAD431C2705200022B557 /* DDHidQueue.h */, + 693BAD441C2705200022B557 /* DDHidQueue.m */, + 693BAD451C2705200022B557 /* DDHidUsage.h */, + 693BAD461C2705200022B557 /* DDHidUsage.m */, + 693BAD471C2705200022B557 /* DDHidUsageTables.h */, + 693BAD481C2705200022B557 /* DDHidUsageTables.m */, + 693BAD491C2705200022B557 /* NSDictionary+DDHidExtras.h */, + 693BAD4A1C2705200022B557 /* NSDictionary+DDHidExtras.m */, + 693BAD4B1C2705200022B557 /* NSXReturnThrowError.h */, + 693BAD4C1C2705200022B557 /* NSXReturnThrowError.m */, + ); + name = DDHidLib; + sourceTree = ""; + }; D318341818CFC73500E8F9B1 /* Styles */ = { isa = PBXGroup; children = ( @@ -570,6 +623,7 @@ files = ( D326EA6418B2D7E500BEC02F /* css in Resources */, D3D4C3E518E76063007238B3 /* LastFmPopover.xib in Resources */, + 693BAD221C2702A90022B557 /* DDHidLib in Resources */, D326EA6518B2D7E500BEC02F /* js in Resources */, 2B8FC1C018C9CB0E006D04FF /* radiant-player-mac.sdef in Resources */, D302E13418B561E100CCD18E /* Preferences.plist in Resources */, @@ -628,18 +682,22 @@ D3CD9C3C18F25E0E002FBEE9 /* ImageURLProtocol.m in Sources */, 1A68DAD81803B588004CBA25 /* CustomWebView.m in Sources */, D318342118D0513D00E8F9B1 /* CookieStorage.m in Sources */, + 693BAD4F1C2705200022B557 /* DDHidDevice.m in Sources */, D318341B18CFC7C500E8F9B1 /* ApplicationStyle.m in Sources */, 2B8FC1C318C9CB16006D04FF /* RadiantPlayerScriptCommand.m in Sources */, D3B71C2F18C2D5770041358B /* LastFmPreferencesViewController.m in Sources */, D30CA00519383160007B05B2 /* NSApplication+ScriptingProperties.m in Sources */, 1A7B684C17453E40001E509E /* main.m in Sources */, D37B638A18F1EFD30098F9DC /* InvertedSpriteURLProtocol.m in Sources */, + 693BAD561C2705200022B557 /* NSXReturnThrowError.m in Sources */, D35F2E8C1A3D9D130072E461 /* Swizzle.c in Sources */, D3DB8FF518BD2AEC00ABE93B /* PlaybackConstants.m in Sources */, D32861701924744200395FEA /* NSHTTPCookieStorage+Swizzle.m in Sources */, + 693BAD4D1C2705200022B557 /* DDHidAppleMikey.m in Sources */, D3DF18181A99A581002AEE64 /* GoogleStyle.m in Sources */, D3D4C3EB18E77AA0007238B3 /* LastFmTrackTableCellView.m in Sources */, 1A7B685317453E40001E509E /* AppDelegate.m in Sources */, + 693BAD551C2705200022B557 /* NSDictionary+DDHidExtras.m in Sources */, D3DB8FF818BD6A6400ABE93B /* PlaybackSliderCell.m in Sources */, D3FAC6D718BA942500D9F461 /* PopupViewDelegate.m in Sources */, 42C12CDD1C1A73C100E5029B /* RdiantStyle.m in Sources */, @@ -657,8 +715,11 @@ D3B71C2818C2D5240041358B /* PreferencesWindowController.m in Sources */, D328616519234D7900395FEA /* TitleBarTextView.m in Sources */, D318341718CFBC7400E8F9B1 /* AppearancePreferencesViewController.m in Sources */, + 693BAD501C2705200022B557 /* DDHidElement.m in Sources */, D37B638418ED315B0098F9DC /* LastFm+TrackInfo.m in Sources */, + 693BAD511C2705200022B557 /* DDHidEvent.m in Sources */, D30CA0081938722F007B05B2 /* NSImage+ScriptingDescriptor.m in Sources */, + 693BAD541C2705200022B557 /* DDHidUsageTables.m in Sources */, D35788BD18C2F820006AF859 /* GeneralPreferencesViewController.m in Sources */, D3FAC6D418BA81EC00D9F461 /* PopupStatusView.m in Sources */, D31ACE8A193BDD0F00AC7CB4 /* NotificationCenter.m in Sources */, @@ -666,10 +727,13 @@ D37C928C195E3B3F0035709A /* SpotifyBlackStyle.m in Sources */, FF76BDFF1C05083D0004D31A /* DarkCyanStyle.m in Sources */, D343CDF518C69DF4002F9DB3 /* NavigationPreferencesViewController.m in Sources */, + 693BAD531C2705200022B557 /* DDHidUsage.m in Sources */, + 693BAD4E1C2705200022B557 /* DDHidAppleRemote.m in Sources */, D3F14A4918F357AA007D4536 /* AdvancedPreferencesViewController.m in Sources */, D3D4C3E818E76674007238B3 /* LastFmPopover.m in Sources */, D3091F6318C32961007C8DCD /* Utilities.m in Sources */, D370E8E318E2BFE1007B5450 /* ExpandHoverView.m in Sources */, + 693BAD521C2705200022B557 /* DDHidQueue.m in Sources */, D32861681924000800395FEA /* NSDate+UTCString.m in Sources */, D32CCEFD18BE9BF800BDD484 /* PopupView.m in Sources */, D36F50651A3D874E000541C9 /* VisualEffectView.m in Sources */, @@ -772,11 +836,12 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/radiant-player-mac/Frameworks", + "$(PROJECT_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "radiant-player-mac/prefix.pch"; INFOPLIST_FILE = "$(SRCROOT)/radiant-player-mac/info.plist"; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; PRODUCT_NAME = "Radiant Player"; WRAPPER_EXTENSION = app; }; @@ -790,11 +855,12 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/radiant-player-mac/Frameworks", + "$(PROJECT_DIR)", ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "radiant-player-mac/prefix.pch"; INFOPLIST_FILE = "$(SRCROOT)/radiant-player-mac/info.plist"; - LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; PRODUCT_NAME = "Radiant Player"; WRAPPER_EXTENSION = app; }; diff --git a/radiant-player-mac/AppDelegate.h b/radiant-player-mac/AppDelegate.h index 1f0390ca..5402c66a 100644 --- a/radiant-player-mac/AppDelegate.h +++ b/radiant-player-mac/AppDelegate.h @@ -11,7 +11,6 @@ #import #import #import -#import #import "Notifications/NotificationCenter.h" @@ -45,7 +44,8 @@ NSMutableDictionary *_styles; BOOL _isTall; - NSArray *mikeys; + NSMutableArray *_mikeys; + NSMutableArray *_appleRemotes; WebView *dummyWebView; DummyWebViewPolicyDelegate *dummyWebViewDelegate; diff --git a/radiant-player-mac/AppDelegate.m b/radiant-player-mac/AppDelegate.m index 171697a7..f35800a7 100644 --- a/radiant-player-mac/AppDelegate.m +++ b/radiant-player-mac/AppDelegate.m @@ -9,9 +9,10 @@ #import "AppDelegate.h" #import "LastFmService.h" +#import "DDHidAppleRemote.h" +#import "DDHidAppleMikey.h" #import -#import @implementation AppDelegate @@ -512,8 +513,8 @@ static CGEventRef event_tap_callback(CGEventTapProxy proxy, - (void) pressKey:(NSUInteger)keytype { - [self keyEvent:keytype state:0xA]; // key down - [self keyEvent:keytype state: 0xB]; // key up + [self keyEvent:keytype state:0xA]; // key down + [self keyEvent:keytype state:0xB]; // key up } - (void) keyEvent:(NSUInteger)keytype state:(NSUInteger)state @@ -541,15 +542,32 @@ - (void) refreshMikeys { NSLog(@"Reset Mikeys"); - if (mikeys != nil) { - [mikeys makeObjectsPerformSelector:@selector(stopListening) withObject:nil]; + if (_mikeys != nil) { + @try { + [_mikeys makeObjectsPerformSelector:@selector(stopListening)]; + } + @catch (NSException *exception) { + NSLog(@"Error when stopListening on device: %@", exception); + } + } + @try { + NSArray *mikeys = [DDHidAppleMikey allMikeys]; + _mikeys = [NSMutableArray arrayWithCapacity:mikeys.count]; + for (DDHidAppleMikey *item in mikeys) { + @try { + [item setDelegate:self]; + [item setListenInExclusiveMode:NO]; + [item startListening]; + [_mikeys addObject:item]; + } + @catch (NSException *exception) { + NSLog(@"Error when startListning on device: %@, exception %@", item, exception); + } + } + } + @catch (NSException *exception) { + NSLog(@"Error obtaining HID devices: %@", [exception description]); } - mikeys = [DDHidAppleMikey allMikeys]; - // we want to be the delegate of the mikeys - [mikeys makeObjectsPerformSelector:@selector(setDelegate:) withObject:self]; - // start listening to all mikey events - [mikeys makeObjectsPerformSelector:@selector(setListenInExclusiveMode:) withObject:(id)kCFBooleanFalse]; - [mikeys makeObjectsPerformSelector:@selector(startListening) withObject:nil]; } - (void) ddhidAppleMikey:(DDHidAppleMikey *)mikey press:(unsigned)usageId upOrDown:(BOOL)upOrDown @@ -569,10 +587,10 @@ - (void) ddhidAppleMikey:(DDHidAppleMikey *)mikey press:(unsigned)usageId upOrDo withObject:nil waitUntilDone:NO]; break; case kHIDUsage_GD_SystemMenuUp: - [self pressKey:NX_KEYTYPE_SOUND_UP]; + // [self pressKey:NX_KEYTYPE_SOUND_UP]; break; case kHIDUsage_GD_SystemMenuDown: - [self pressKey:NX_KEYTYPE_SOUND_DOWN]; + // [self pressKey:NX_KEYTYPE_SOUND_DOWN]; break; default: NSLog(@"Unknown key press seen %d", usageId); diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleMikey.h b/radiant-player-mac/DDHidLib/DDHidAppleMikey.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleMikey.h rename to radiant-player-mac/DDHidLib/DDHidAppleMikey.h diff --git a/radiant-player-mac/DDHidLib/DDHidAppleMikey.m b/radiant-player-mac/DDHidLib/DDHidAppleMikey.m new file mode 100644 index 00000000..4be2735c --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidAppleMikey.m @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidAppleMikey.h" +#import "DDHidElement.h" +#import "DDHidUsage.h" +#import "DDHidQueue.h" +#import "DDHidEvent.h" +#include + +#define APPLE_MIC_ONLY 1 + +@interface DDHidAppleMikey (DDHidAppleMikeyDelegate) + +- (void) ddhidAppleMikey: (DDHidAppleMikey *) mikey + press: (unsigned) usageId + upOrDown:(BOOL)upOrDown; + +@end + +@interface DDHidAppleMikey (Private) + +- (void) initPressElements: (NSArray *) elements; +- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; + +@end + +@implementation DDHidAppleMikey + ++ (NSArray *) allMikeys; +{ + //add mikeys + id a2 = [self allDevicesMatchingUsagePage:12 usageId:1 withClass:self skipZeroLocations:NO]; +#if APPLE_MIC_ONLY + a2 = [a2 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"productName == \"Apple Mikey HID Driver\""]]; +#endif + + return a2; +} + +- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; +{ + self = [super initWithDevice: device error: error_]; + if (self == nil) + return nil; + + mPressElements = [[NSMutableArray alloc] init]; + [self initPressElements: [self elements]]; + + return self; +} + +//=========================================================== +// dealloc +//=========================================================== +- (void) dealloc +{ + [mPressElements release]; + + mPressElements = nil; + [super dealloc]; +} + +#pragma mark - +#pragma mark Elements + +- (NSArray *) pressElements; +{ + return mPressElements; +} + +- (unsigned) numberOfKeys; +{ + return (unsigned)[mPressElements count]; +} + +- (void) addElementsToQueue: (DDHidQueue *) queue; +{ + [queue addElements: mPressElements]; +} + +#pragma mark - +#pragma mark Asynchronous Notification + +- (void) setDelegate: (id) delegate; +{ + mDelegate = delegate; +} + +- (void) addElementsToDefaultQueue; +{ + [self addElementsToQueue: mDefaultQueue]; +} + +@end + +@implementation DDHidAppleMikey (DDHidAppleMikeyDelegate) + +- (void) ddhidAppleMikey:(DDHidAppleMikey *)mikey press:(unsigned int)usageId upOrDown:(BOOL)upOrDown +{ + if ([mDelegate respondsToSelector: _cmd]) + [mDelegate ddhidAppleMikey: mikey press: usageId upOrDown:(BOOL)upOrDown]; +} + +@end + +@implementation DDHidAppleMikey (Private) + +- (void) initPressElements: (NSArray *) elements; +{ + NSEnumerator * e = [elements objectEnumerator]; + DDHidElement * element; + while (element = [e nextObject]) + { +// unsigned usagePage = [[element usage] usagePage]; +// unsigned usageId = [[element usage] usageId]; +// if (usagePage == kHIDPage_KeyboardOrKeypad) +// { +// if ((usageId >= 0x04) && (usageId <= 0xA4) || +// (usageId >= 0xE0) && (usageId <= 0xE7)) + { + [mPressElements addObject: element]; + } +// } + NSArray * subElements = [element elements]; + if (subElements != nil) + [self initPressElements: subElements]; + } +} + +- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; +{ + DDHidEvent * event; + while ((event = [hidQueue nextEvent])) + { + DDHidElement * element = [self elementForCookie: [event elementCookie]]; + unsigned usageId = [[element usage] usageId]; + SInt32 value = [event value]; + [self ddhidAppleMikey:self press:usageId upOrDown:value==1]; + } +} + +@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleRemote.h b/radiant-player-mac/DDHidLib/DDHidAppleRemote.h similarity index 98% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleRemote.h rename to radiant-player-mac/DDHidLib/DDHidAppleRemote.h index f6bc8ef3..a17bddc6 100644 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleRemote.h +++ b/radiant-player-mac/DDHidLib/DDHidAppleRemote.h @@ -42,6 +42,7 @@ enum DDHidAppleRemoteEventIdentifier kDDHidRemoteButtonPlay_Sleep, kDDHidRemoteControl_Switched, kDDHidRemoteControl_Paired, + kDDHidRemoteButtonPlayPause }; typedef enum DDHidAppleRemoteEventIdentifier DDHidAppleRemoteEventIdentifier; diff --git a/radiant-player-mac/DDHidLib/DDHidAppleRemote.m b/radiant-player-mac/DDHidLib/DDHidAppleRemote.m new file mode 100644 index 00000000..35c75a81 --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidAppleRemote.m @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// Based on Martin Kahr's Apple Remote wrapper +// http://www.martinkahr.com/source-code/ + +#import "DDHidAppleRemote.h" +#import "DDHidElement.h" +#import "DDHidUsage.h" +#import "DDHidQueue.h" +#import "DDHidEvent.h" +#import "NSDictionary+DDHidExtras.h" + +@interface DDHidAppleRemote (Private) + +- (void) initRemoteElements: (NSArray *) elements; + +- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; + +- (void) handleEventWithCookieString: (NSString*) cookieString + sumOfValues: (SInt32) sumOfValues; + +@end + +@implementation DDHidAppleRemote + ++ (NSArray *) allRemotes; +{ + CFMutableDictionaryRef hidMatchDictionary = + IOServiceMatching("AppleIRController"); + + return + [DDHidDevice allDevicesMatchingCFDictionary: hidMatchDictionary + withClass: self + skipZeroLocations: YES]; +} + ++ (DDHidAppleRemote *) firstRemote; +{ + NSArray * allRemotes = [self allRemotes]; + if ([allRemotes count] > 0) + return [allRemotes objectAtIndex: 0]; + else + return nil; +} + +- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; +{ + self = [super initWithDevice: device error: error_]; + if (self == nil) + return nil; + + mCookieToButtonMapping = [[NSMutableDictionary alloc] init]; + + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonVolume_Plus + forKey: @"14_12_11_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonVolume_Plus + forKey: @"31_29_28_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonVolume_Minus + forKey: @"14_13_11_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonVolume_Minus + forKey: @"31_30_28_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonMenu + forKey: @"14_7_6_5_14_7_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonMenu + forKey: @"31_20_19_18_31_20_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlay + forKey: @"14_8_6_5_14_8_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlay + forKey: @"31_21_19_18_31_21_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonRight + forKey: @"14_9_6_5_14_9_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonRight + forKey: @"31_22_19_18_31_22_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonLeft + forKey: @"14_10_6_5_14_10_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonLeft + forKey: @"31_23_19_18_31_23_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonRight_Hold + forKey: @"14_6_5_4_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonRight_Hold + forKey: @"31_19_18_4_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonLeft_Hold + forKey: @"14_6_5_3_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonLeft_Hold + forKey: @"31_19_18_3_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonMenu_Hold + forKey: @"14_6_5_14_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonMenu_Hold + forKey: @"31_19_18_31_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlay_Sleep + forKey: @"18_14_6_5_18_14_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlay_Sleep + forKey: @"35_31_19_18_35_31_19_18_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteControl_Switched + forKey: @"19_"]; + //[mCookieToButtonMapping ddhid_setInt: kDDHidRemoteControl_Switched + // forKey: @"??_"]; // unknown for 10.5 + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteControl_Paired + forKey: @"15_14_6_5_15_14_6_5_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteControl_Paired + forKey: @"32_31_19_18_32_31_19_18_"]; + + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonVolume_Plus + forKey: @"33_31_30_21_20_2_"]; + [mCookieToButtonMapping ddhid_setInt:kDDHidRemoteButtonVolume_Minus + forKey:@"33_32_30_21_20_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonRight + forKey:@"33_24_21_20_2_33_24_21_20_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonLeft + forKey:@"33_25_21_20_2_33_25_21_20_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlay + forKey:@"33_21_20_3_2_33_21_20_3_2_"]; // center + // button + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonMenu + forKey:@"33_22_21_20_2_33_22_21_20_2_"]; + [mCookieToButtonMapping ddhid_setInt: kDDHidRemoteButtonPlayPause + forKey:@"33_21_20_8_2_33_21_20_8_2_"]; + + [self initRemoteElements: [self elements]]; + + + return self; +} + +//=========================================================== +// dealloc +//=========================================================== +- (void) dealloc +{ + [mCookieToButtonMapping release]; + [mButtonElements release]; + [mIdElement release]; + + mCookieToButtonMapping = nil; + mButtonElements = nil; + mIdElement = nil; + [super dealloc]; +} + +#pragma mark - +#pragma mark Asynchronous Notification + +- (void) setDelegate: (id) delegate; +{ + mDelegate = delegate; +} + +- (void) addElementsToDefaultQueue; +{ + [mDefaultQueue addElements: mButtonElements]; +} + +#pragma mark - +#pragma mark Properties + +//=========================================================== +// remoteId +//=========================================================== +- (int) remoteId +{ + return mRemoteId; +} + +- (void) setRemoteId: (int) theRemoteId +{ + mRemoteId = theRemoteId; +} + +@end + +@implementation DDHidAppleRemote (Private) + +- (void) initRemoteElements: (NSArray *) elements; +{ + NSAssert([elements count] == 1, @"Assume only 1 top level remote element"); + DDHidElement * consumerControlsElement = [elements objectAtIndex: 0]; + mButtonElements = [[consumerControlsElement elements] retain]; + DDHidElement * element; + NSEnumerator * e = [mButtonElements objectEnumerator]; + while (element = [e nextObject]) + { + if ([[element usage] isEqualToUsagePage: 0x0006 + usageId: 0x0022]) + { + mIdElement = [element retain]; + } + } +} + +- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; +{ + NSMutableString * cookieString = [NSMutableString string]; + SInt32 sumOfValues = 0; + + DDHidEvent * event; + while ((event = [hidQueue nextEvent])) + { + if ([event elementCookie] == [mIdElement cookie]) + { + [self setRemoteId: [event value]]; + } + else + { + sumOfValues += [event value]; + [cookieString appendString: + [NSString stringWithFormat: @"%u_", [event elementCookieAsUnsigned]]]; + } + } + [self handleEventWithCookieString: cookieString sumOfValues: sumOfValues]; +} + +- (void) handleEventWithCookieString: (NSString*) cookieString + sumOfValues: (SInt32) sumOfValues; +{ + NSNumber* buttonId = [mCookieToButtonMapping objectForKey: cookieString]; + if (buttonId != nil) + { + if ([mDelegate respondsToSelector: @selector(ddhidAppleRemoteButton:pressedDown:)]) + { + [mDelegate ddhidAppleRemoteButton: [buttonId intValue] + pressedDown: (sumOfValues>0)]; + } + } + else + NSLog(@"Unknown button for cookiestring %@", cookieString); + +} + +@end + diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidDevice.h b/radiant-player-mac/DDHidLib/DDHidDevice.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidDevice.h rename to radiant-player-mac/DDHidLib/DDHidDevice.h diff --git a/radiant-player-mac/DDHidLib/DDHidDevice.m b/radiant-player-mac/DDHidLib/DDHidDevice.m new file mode 100644 index 00000000..f9f44d3f --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidDevice.m @@ -0,0 +1,612 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidDevice.h" +#import "DDHidUsage.h" +#import "DDHidElement.h" +#import "DDHidQueue.h" +#import "NSDictionary+DDHidExtras.h" +#import "NSXReturnThrowError.h" + +#include + +@interface DDHidDevice (Private) + ++ (void) addDevice: (io_object_t) hidDevice + withClass: (Class) hidClass + skipZeroLocations: (BOOL) skipZeroLocations + toDeviceList: (NSMutableArray *) devices; + +- (BOOL) initPropertiesWithError: (NSError **) error_; +- (BOOL) createDeviceInterfaceWithError: (NSError **) error_; + +@end + +@implementation DDHidDevice + +- (id) initWithDevice: (io_object_t) device error: (NSError **) error; +{ + return [self initLogicalWithDevice: device + logicalDeviceNumber: 0 + error: error]; +} + +- (id) initLogicalWithDevice: (io_object_t) device + logicalDeviceNumber: (int) logicalDeviceNumber + error: (NSError **) error; +{ + self = [super init]; + if (self == nil) + return nil; + + mHidDevice = device; + IOObjectRetain(mHidDevice); + + if (![self initPropertiesWithError: error]) + { + [self release]; + return nil; + } + + if (![self createDeviceInterfaceWithError: error]) + { + [self release]; + return nil; + } + + mLogicalDeviceNumber = logicalDeviceNumber; + mListenInExclusiveMode = NO; + mDefaultQueue = nil; + mTag = 0; + + return self; +} + +//=========================================================== +// dealloc +//=========================================================== +- (void) dealloc +{ + [mDefaultQueue release]; + if (mDeviceInterface != NULL) + { + (*mDeviceInterface)->close(mDeviceInterface); + (*mDeviceInterface)->Release(mDeviceInterface); + } + [mElementsByCookie release]; + [mElements release]; + [mUsages release]; + [mPrimaryUsage release]; + [mProperties release]; + IOObjectRelease(mHidDevice); + + mProperties = nil; + mDeviceInterface = NULL; + [super dealloc]; +} + +#pragma mark - +#pragma mark Finding Devices + ++ (NSArray *) allDevices; +{ + // Set up a matching dictionary to search the I/O Registry by class + // name for all HID class devices + CFMutableDictionaryRef hidMatchDictionary = + IOServiceMatching(kIOHIDDeviceKey); + id retVal = nil; + if(hidMatchDictionary) { + retVal = [self allDevicesMatchingCFDictionary: hidMatchDictionary + withClass: [DDHidDevice class] + skipZeroLocations: NO]; + //CFRelease(hidMatchDictionary);//dont free, it is freed by IOServiceGetMatchingServices + } + return retVal; +} + ++ (NSArray *) allDevicesMatchingUsagePage: (unsigned) usagePage + usageId: (unsigned) usageId + withClass: (Class) hidClass + skipZeroLocations: (BOOL) skipZeroLocations; +{ + // Set up a matching dictionary to search the I/O Registry by class + // name for all HID class devices + CFMutableDictionaryRef hidMatchDictionary = + IOServiceMatching(kIOHIDDeviceKey); + id retVal = nil; + if(hidMatchDictionary) { + NSMutableDictionary * objcMatchDictionary = + (NSMutableDictionary *) hidMatchDictionary; + [objcMatchDictionary ddhid_setObject: [NSNumber numberWithUnsignedInt: usagePage] + forString: kIOHIDDeviceUsagePageKey]; + [objcMatchDictionary ddhid_setObject: [NSNumber numberWithUnsignedInt: usageId] + forString: kIOHIDDeviceUsageKey]; + retVal = [self allDevicesMatchingCFDictionary: hidMatchDictionary + withClass: hidClass + skipZeroLocations: skipZeroLocations]; + //CFRelease(hidMatchDictionary);//dont free, it is freed by IOServiceGetMatchingServices + } +return retVal; +} + ++ (NSArray *) allDevicesMatchingCFDictionary: (CFDictionaryRef) matchDictionary + withClass: (Class) hidClass + skipZeroLocations: (BOOL) skipZeroLocations; +{ + // Now search I/O Registry for matching devices. + io_iterator_t hidObjectIterator = MACH_PORT_NULL; + NSMutableArray * devices = [NSMutableArray array]; + @try + { + NSXThrowError(IOServiceGetMatchingServices(kIOMasterPortDefault, + matchDictionary, + &hidObjectIterator)); + + if (hidObjectIterator == 0) + return [NSArray array]; + + io_object_t hidDevice; + while ((hidDevice = IOIteratorNext(hidObjectIterator))) + { + @try { + [self addDevice: hidDevice + withClass: hidClass + skipZeroLocations: skipZeroLocations + toDeviceList: devices]; + } + @catch (NSException *exception) { + NSLog(@"(DDHidDevice) Error adding Hid device - %u, class - %@: %@", hidDevice, NSStringFromClass(hidClass), [exception description]); + } + } + + // This makes sure the array return is consistent from run to run, + // assuming no new devices were added. + [devices sortUsingSelector: @selector(compareByLocationId:)]; + } + @finally + { + if (hidObjectIterator != MACH_PORT_NULL) + IOObjectRelease(hidObjectIterator); + } + + return devices; +} + +- (int) logicalDeviceCount; +{ + return 1; +} + +#pragma mark - +#pragma mark I/O Kit Objects + +- (io_object_t) ioDevice; +{ + return mHidDevice; +} + +- (IOHIDDeviceInterface122**) deviceInterface; +{ + return mDeviceInterface; +} + +#pragma mark - +#pragma mark Operations + +- (void) open; +{ + [self openWithOptions: kIOHIDOptionsTypeNone]; +} + +- (void) openWithOptions: (UInt32) options; +{ + NSXThrowError((*mDeviceInterface)->open(mDeviceInterface, options)); +} + +- (void) close; +{ + NSXThrowError((*mDeviceInterface)->close(mDeviceInterface)); +} + +- (DDHidQueue *) createQueueWithSize: (unsigned) size; +{ + IOHIDQueueInterface ** queue = + (*mDeviceInterface)->allocQueue(mDeviceInterface); + if (queue == NULL) + return nil; + return [[[DDHidQueue alloc] initWithHIDQueue: queue + size: size] autorelease]; +} + +- (long) getElementValue: (DDHidElement *) element; +{ + IOHIDEventStruct event; + NSXThrowError((*mDeviceInterface)->getElementValue(mDeviceInterface, + [element cookie], + &event)); + return event.value; +} + +#pragma mark - +#pragma mark Asynchronous Notification + +//=========================================================== +// listenInExclusiveMode +//=========================================================== +- (BOOL) listenInExclusiveMode +{ + return mListenInExclusiveMode; +} + +- (void) setListenInExclusiveMode: (BOOL) flag +{ + mListenInExclusiveMode = flag; +} + +- (void) startListening; +{ + if ([self isListening]) + return; + + UInt32 options = kIOHIDOptionsTypeNone; + if (mListenInExclusiveMode) + options = kIOHIDOptionsTypeSeizeDevice; + [self openWithOptions: options]; + mDefaultQueue = [[self createQueueWithSize: [self sizeOfDefaultQueue]] retain]; + [mDefaultQueue setDelegate: self]; + [self addElementsToDefaultQueue]; + [mDefaultQueue startOnCurrentRunLoop]; +} + +- (void) stopListening; +{ + if (![self isListening]) + return; + + [mDefaultQueue stop]; + [mDefaultQueue release]; + mDefaultQueue = nil; + [self close]; +} + +- (BOOL) isListening; +{ + return (mDefaultQueue != nil); +} + +#pragma mark - +#pragma mark Properties + +- (NSDictionary *) properties; +{ + return mProperties; +} + +//=========================================================== +// - productName +//=========================================================== +- (NSString *) productName +{ + NSString * productName = [mProperties ddhid_stringForString: kIOHIDProductKey]; + if ([self logicalDeviceCount] > 1) + { + productName = [productName stringByAppendingString: + [NSString stringWithFormat:@" #%d", mLogicalDeviceNumber + 1]]; + } + return productName; +} + +//=========================================================== +// - manufacturer +//=========================================================== +- (NSString *) manufacturer +{ + return [mProperties ddhid_stringForString: kIOHIDManufacturerKey]; +} + +//=========================================================== +// - serialNumber +//=========================================================== +- (NSString *) serialNumber +{ + return [mProperties ddhid_stringForString: kIOHIDSerialNumberKey]; +} + +//=========================================================== +// - transport +//=========================================================== +- (NSString *) transport +{ + return [mProperties ddhid_stringForString: kIOHIDTransportKey]; +} + +//=========================================================== +// - vendorId +//=========================================================== +- (long) vendorId +{ + return [mProperties ddhid_longForString: kIOHIDVendorIDKey]; +} + +//=========================================================== +// - productId +//=========================================================== +- (long) productId +{ + return [mProperties ddhid_longForString: kIOHIDProductIDKey]; +} + +//=========================================================== +// - version +//=========================================================== +- (long) version +{ + return [mProperties ddhid_longForString: kIOHIDVersionNumberKey]; +} + +//=========================================================== +// - locationId +//=========================================================== +- (long) locationId +{ + return [mProperties ddhid_longForString: kIOHIDLocationIDKey]; +} + +//=========================================================== +// - usagePage +//=========================================================== +- (long) usagePage +{ + return [mProperties ddhid_longForString: kIOHIDPrimaryUsagePageKey]; +} + +//=========================================================== +// - usage +//=========================================================== +- (long) usage +{ + return [mProperties ddhid_longForString: kIOHIDPrimaryUsageKey]; +} + +- (NSArray *) elements; +{ + return mElements; +} + +- (DDHidElement *) elementForCookie: (IOHIDElementCookie) cookie; +{ + NSNumber * n = [NSNumber numberWithUnsignedInt: (unsigned) cookie]; + return [mElementsByCookie objectForKey: n]; +} + +- (DDHidUsage *) primaryUsage; +{ + return mPrimaryUsage; +} + +- (NSArray *) usages; +{ + return mUsages; +} + +- (NSComparisonResult) compareByLocationId: (DDHidDevice *) device; +{ + long myLocationId = [self locationId]; + long otherLocationId = [device locationId]; + if (myLocationId < otherLocationId) + return NSOrderedAscending; + else if (myLocationId > otherLocationId) + return NSOrderedDescending; + else + return NSOrderedSame; +} + +//=========================================================== +// tag +//=========================================================== +- (int) tag +{ + return mTag; +} + +- (void) setTag: (int) theTag +{ + mTag = theTag; +} + +- (NSString *)description{ + + return [NSString stringWithFormat:@"HidDevice with productName: %@\n manufacturer: %@\n serialNumber: %@\n transport: %@\n vendorId: %ld\n productId: %ld\n version: %ld\n locationId: %ld\n usagePage: %ld\n usage: %ld\n", [self productName], [self manufacturer], [self serialNumber], [self transport], [self vendorId], [self productId], [self version], [self locationId], [self usagePage], [self usage]]; +} + +@end + +@implementation DDHidDevice (Protected) + +- (unsigned) sizeOfDefaultQueue; +{ + return 10; +} + +- (void) addElementsToDefaultQueue; +{ + [mDefaultQueue addElements: [self elements] recursively: YES]; +} + +@end + +@implementation DDHidDevice (Private) + ++ (void) addDevice: (io_object_t) hidDevice + withClass: (Class) hidClass + skipZeroLocations: (BOOL) skipZeroLocations + toDeviceList: (NSMutableArray *) devices; +{ + @try + { + NSError * error = nil; + DDHidDevice * device = [[hidClass alloc] initWithDevice: hidDevice + error: &error]; + if (device == nil) + { + NSXRaiseError(error); + } + [device autorelease]; + + if (([device locationId] == 0) && skipZeroLocations) + return; + + [devices addObject: device]; + + // Add remainnig logical devices + int i; + for (i = 1; i < [device logicalDeviceCount]; i++) + { + device = [[hidClass alloc] initLogicalWithDevice: hidDevice + logicalDeviceNumber: i + error: &error]; + + if (device == nil) + { + NSXRaiseError(error); + } + [device autorelease]; + + [devices addObject: device]; + } + } + @finally + { + IOObjectRelease(hidDevice); + } +} + +- (void) indexElements: (NSArray *) elements; +{ + NSEnumerator * e = [elements objectEnumerator]; + DDHidElement * element; + while (element = [e nextObject]) + { + NSNumber * n = [NSNumber numberWithUnsignedInt: [element cookieAsUnsigned]]; + [mElementsByCookie setObject: element + forKey: n]; + NSArray * children = [element elements]; + if (children != nil) + [self indexElements: children]; + } +} + +- (BOOL) initPropertiesWithError: (NSError **) error_; +{ + NSError * error = nil; + BOOL result = NO; + + CFMutableDictionaryRef properties; + NSXReturnError(IORegistryEntryCreateCFProperties(mHidDevice, &properties, + kCFAllocatorDefault, kNilOptions)); + if (error) + goto done; + + mProperties = (NSMutableDictionary *) properties; + +#if DEBUG + if (![mProperties isKindOfClass:[NSDictionary class]]) { + NSLog(@"Hid device Properties is not a dictionary: %@ self: %@", mProperties, self); + } +#endif + + NSArray * elementProperties = [mProperties ddhid_objectForString: kIOHIDElementKey]; + mElements = [DDHidElement elementsWithPropertiesArray: elementProperties]; + [mElements retain]; + + unsigned usagePage = [mProperties ddhid_unsignedIntForString: kIOHIDPrimaryUsagePageKey]; + unsigned usageId = [mProperties ddhid_unsignedIntForString: kIOHIDPrimaryUsageKey]; + + mPrimaryUsage = [[DDHidUsage alloc] initWithUsagePage: usagePage + usageId: usageId]; + mUsages = [[NSMutableArray alloc] init]; + + NSArray * usagePairs = [mProperties ddhid_objectForString: kIOHIDDeviceUsagePairsKey]; + NSEnumerator * e = [usagePairs objectEnumerator]; + NSDictionary * usagePair; + while (usagePair = [e nextObject]) + { + usagePage = [usagePair ddhid_unsignedIntForString: kIOHIDDeviceUsagePageKey]; + usageId = [usagePair ddhid_unsignedIntForString: kIOHIDDeviceUsageKey]; + DDHidUsage * usage = [DDHidUsage usageWithUsagePage: usagePage + usageId: usageId]; + [mUsages addObject: usage]; + } + + mElementsByCookie = [[NSMutableDictionary alloc] init]; + [self indexElements: mElements]; + result = YES; + +done: + if (error_) + *error_ = error; + return result; +} + +- (BOOL) createDeviceInterfaceWithError: (NSError **) error_; +{ + io_name_t className; + IOCFPlugInInterface ** plugInInterface = NULL; + SInt32 score = 0; + NSError * error = nil; + BOOL result = NO; + + mDeviceInterface = NULL; + + NSXReturnError(IOObjectGetClass(mHidDevice, className)); + if (error) + goto done; + + NSXReturnError(IOCreatePlugInInterfaceForService(mHidDevice, + kIOHIDDeviceUserClientTypeID, + kIOCFPlugInInterfaceID, + &plugInInterface, + &score)); + if (error) + goto done; + + //Call a method of the intermediate plug-in to create the device interface + NSXReturnError((*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (LPVOID) &mDeviceInterface)); + if (error) + goto done; + + result = YES; + +done: + if (plugInInterface != NULL) + { + (*plugInInterface)->Release(plugInInterface); + } + if (error_) + *error_ = error; + return result; +} + +@end + diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidElement.h b/radiant-player-mac/DDHidLib/DDHidElement.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidElement.h rename to radiant-player-mac/DDHidLib/DDHidElement.h diff --git a/radiant-player-mac/DDHidLib/DDHidElement.m b/radiant-player-mac/DDHidLib/DDHidElement.m new file mode 100644 index 00000000..605824a6 --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidElement.m @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidElement.h" +#import "DDHidUsage.h" +#import "NSDictionary+DDHidExtras.h" +#include + +@implementation DDHidElement + ++ (NSArray *) elementsWithPropertiesArray: (NSArray *) propertiesArray; +{ + if(!propertiesArray) return nil; + if(![propertiesArray isKindOfClass:[NSArray class]]) propertiesArray = @[propertiesArray]; + + NSMutableArray * elements = [NSMutableArray array]; + + NSDictionary * properties; + NSEnumerator * e = [propertiesArray objectEnumerator]; + while (properties = [e nextObject]) + { +#if DEBUG + if (![properties isKindOfClass:[NSDictionary class]]) { + NSLog(@"DDHidElement properties is not a dictionary: %@ self: %@", properties, self); + } +#endif + DDHidElement * element = [DDHidElement elementWithProperties: properties]; + [elements addObject: element]; + } + + return elements; +} + ++ (DDHidElement *) elementWithProperties: (NSDictionary *) properties; +{ + DDHidElement * element = [[DDHidElement alloc] initWithProperties: properties]; + return [element autorelease]; +} + +- (id) initWithProperties: (NSDictionary *) properties; +{ + self = [super init]; + if (self == nil) + return nil; + + mProperties = [properties retain]; + unsigned usagePage = [mProperties ddhid_unsignedIntForString: kIOHIDElementUsagePageKey]; + unsigned usageId = [mProperties ddhid_unsignedIntForString: kIOHIDElementUsageKey]; + mUsage = [[DDHidUsage alloc] initWithUsagePage: usagePage + usageId: usageId]; + + NSArray * elementsProperties = + [mProperties ddhid_objectForString: kIOHIDElementKey]; + mElements = [[DDHidElement elementsWithPropertiesArray: elementsProperties] + retain]; + + return self; +} + +//=========================================================== +// dealloc +//=========================================================== +- (void) dealloc +{ + [mProperties release]; + [mUsage release]; + [mElements release]; + + mProperties = nil; + mUsage = nil; + mElements = nil; + [super dealloc]; +} + +- (NSDictionary *) properties; +{ + return mProperties; +} + +- (NSString *) stringForKey: (NSString *) key; +{ + return [mProperties objectForKey: key]; +} + +- (NSString *) description; +{ + return [[self usage] usageNameWithIds]; +} + +- (IOHIDElementCookie) cookie; +{ + return (IOHIDElementCookie) + [mProperties ddhid_unsignedIntForString: kIOHIDElementCookieKey]; +} + +- (unsigned) cookieAsUnsigned; +{ + return [mProperties ddhid_unsignedIntForString: kIOHIDElementCookieKey]; +} + +- (DDHidUsage *) usage; +{ + return mUsage; +} + +- (NSArray *) elements; +{ + return mElements; +} + +- (NSString *) name; +{ + return [mProperties ddhid_objectForString: kIOHIDElementNameKey]; +} + +- (BOOL) hasNullState; +{ + return [mProperties ddhid_boolForString: kIOHIDElementHasNullStateKey]; +} + +- (BOOL) hasPreferredState; +{ + return [mProperties ddhid_boolForString: kIOHIDElementHasNullStateKey]; +} + +- (BOOL) isArray; +{ + return [mProperties ddhid_boolForString: kIOHIDElementIsArrayKey]; +} + +- (BOOL) isRelative; +{ + return [mProperties ddhid_boolForString: kIOHIDElementIsRelativeKey]; +} + +- (BOOL) isWrapping; +{ + return [mProperties ddhid_boolForString: kIOHIDElementIsWrappingKey]; +} + +- (long) maxValue; +{ + return [mProperties ddhid_longForString: kIOHIDElementMaxKey]; +} + +- (long) minValue; +{ + return [mProperties ddhid_longForString: kIOHIDElementMinKey]; +} + +- (NSComparisonResult) compareByUsage: (DDHidElement *) device; +{ + unsigned myUsagePage = [[self usage] usagePage]; + unsigned myUsageId = [[self usage] usageId]; + + unsigned otherUsagePage = [[device usage] usagePage]; + unsigned otherUsageId = [[device usage] usageId]; + + if (myUsagePage < otherUsagePage) + return NSOrderedAscending; + else if (myUsagePage > otherUsagePage) + return NSOrderedDescending; + + if (myUsageId < otherUsageId) + return NSOrderedAscending; + else if (myUsageId > otherUsageId) + return NSOrderedDescending; + + return NSOrderedSame; +} + +@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidEvent.h b/radiant-player-mac/DDHidLib/DDHidEvent.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidEvent.h rename to radiant-player-mac/DDHidLib/DDHidEvent.h diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidEvent.h b/radiant-player-mac/DDHidLib/DDHidEvent.m similarity index 74% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidEvent.h rename to radiant-player-mac/DDHidLib/DDHidEvent.m index 0861cfd2..8b2ab5fb 100644 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidEvent.h +++ b/radiant-player-mac/DDHidLib/DDHidEvent.m @@ -22,24 +22,60 @@ * SOFTWARE. */ -#import -#include +#import "DDHidEvent.h" -@interface DDHidEvent : NSObject -{ - IOHIDEventStruct mEvent; -} + +@implementation DDHidEvent + (DDHidEvent *) eventWithIOHIDEvent: (IOHIDEventStruct *) event; +{ + return [[[self alloc] initWithIOHIDEvent: event] autorelease]; +} - (id) initWithIOHIDEvent: (IOHIDEventStruct *) event; +{ + self = [super init]; + if (self == nil) + return nil; + + mEvent = *event; + + return self; +} - (IOHIDElementType) type; +{ + return mEvent.type; +} + - (IOHIDElementCookie) elementCookie; +{ + return mEvent.elementCookie; +} + - (unsigned) elementCookieAsUnsigned; +{ + return (unsigned) mEvent.elementCookie; +} + - (SInt32) value; +{ + return mEvent.value; +} + - (AbsoluteTime) timestamp; +{ + return mEvent.timestamp; +} + - (UInt32) longValueSize; +{ + return mEvent.longValueSize; +} + - (void *) longValue; +{ + return mEvent.longValue; +} @end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidQueue.h b/radiant-player-mac/DDHidLib/DDHidQueue.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidQueue.h rename to radiant-player-mac/DDHidLib/DDHidQueue.h diff --git a/radiant-player-mac/DDHidLib/DDHidQueue.m b/radiant-player-mac/DDHidLib/DDHidQueue.m new file mode 100644 index 00000000..4575dff0 --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidQueue.m @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidQueue.h" +#import "DDHidElement.h" +#import "DDHIdEvent.h" +#import "NSXReturnThrowError.h" + +static void queueCallbackFunction(void* target, IOReturn result, void* refcon, + void* sender); + +@interface DDHidQueue (Private) + +- (void) handleQueueCallback; + +@end + +@implementation DDHidQueue + +- (id) initWithHIDQueue: (IOHIDQueueInterface **) queue + size: (unsigned) size; +{ + self = [super init]; + if (self == nil) + return nil; + + mQueue = queue; + IOReturn result = (*mQueue)->create(mQueue, 0, size); + if (result != kIOReturnSuccess) + { + [self release]; + return nil; + } + + return self; +} + +- (void) dealloc; +{ + [self stop]; + (*mQueue)->dispose(mQueue); + (*mQueue)->Release(mQueue); + [super dealloc]; +} + +- (void) addElement: (DDHidElement *) element; +{ + IOHIDElementCookie cookie = [element cookie]; + (*mQueue)->addElement(mQueue, cookie, 0); +} + +- (void) addElements: (NSArray *) elements; +{ + return [self addElements: elements recursively: NO]; +} + +- (void) addElements: (NSArray *) elements recursively: (BOOL) recursively; +{ + NSEnumerator * e = [elements objectEnumerator]; + DDHidElement * element; + while (element = [e nextObject]) + { + [self addElement: element]; + if (recursively) + [self addElements: [element elements]]; + } +} + +- (void) setDelegate: (id) delegate; +{ + mDelegate = delegate; +} + +- (void) startOnCurrentRunLoop; +{ + [self startOnRunLoop: [NSRunLoop currentRunLoop]]; +} + +- (void) startOnRunLoop: (NSRunLoop *) runLoop; +{ + if (mStarted) + return; + + mRunLoop = [runLoop retain]; + + NSXThrowError((*mQueue)->createAsyncEventSource(mQueue, &mEventSource)); + NSXThrowError((*mQueue)->setEventCallout(mQueue, queueCallbackFunction, self, NULL)); + CFRunLoopAddSource([mRunLoop getCFRunLoop], mEventSource, + kCFRunLoopDefaultMode); + (*mQueue)->start(mQueue); + mStarted = YES; +} + +- (void) stop; +{ + if (!mStarted) + return; + + CFRunLoopRemoveSource([mRunLoop getCFRunLoop], mEventSource, kCFRunLoopDefaultMode); + (*mQueue)->stop(mQueue); + [mRunLoop release]; + CFRelease(mEventSource); + + mRunLoop = nil; + mStarted = NO; +} + +- (BOOL) isStarted; +{ + return mStarted; +} + +- (BOOL) getNextEvent: (IOHIDEventStruct *) event; +{ + AbsoluteTime zeroTime = {0, 0}; + IOReturn result = (*mQueue)->getNextEvent(mQueue, event, zeroTime, 0); + return (result == kIOReturnSuccess); +} + +- (DDHidEvent *) nextEvent; +{ + AbsoluteTime zeroTime = {0, 0}; + IOHIDEventStruct event; + IOReturn result = (*mQueue)->getNextEvent(mQueue, &event, zeroTime, 0); + if (result != kIOReturnSuccess) + return nil; + else + return [DDHidEvent eventWithIOHIDEvent: &event]; +} + +@end + +@implementation DDHidQueue (Private) + +- (void) handleQueueCallback; +{ + if ([mDelegate respondsToSelector: @selector(ddhidQueueHasEvents:)]) + { + [mDelegate ddhidQueueHasEvents: self]; + } +} + +@end + +static void queueCallbackFunction(void* target, IOReturn result, void* refcon, + void* sender) +{ + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + DDHidQueue * queue = (DDHidQueue *) target; + [queue handleQueueCallback]; + [pool release]; + +} diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidUsage.h b/radiant-player-mac/DDHidLib/DDHidUsage.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidUsage.h rename to radiant-player-mac/DDHidLib/DDHidUsage.h diff --git a/radiant-player-mac/DDHidLib/DDHidUsage.m b/radiant-player-mac/DDHidLib/DDHidUsage.m new file mode 100644 index 00000000..8fe2c117 --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidUsage.m @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidUsage.h" +#import "DDHidUsageTables.h" + +@implementation DDHidUsage + ++ (DDHidUsage *) usageWithUsagePage: (unsigned) usagePage + usageId: (unsigned) usageId; +{ + return [[[self alloc] initWithUsagePage: usagePage usageId: usageId] + autorelease]; +} + +- (id) initWithUsagePage: (unsigned) usagePage + usageId: (unsigned) usageId; +{ + self = [super init]; + if (self == nil) + return nil; + + mUsagePage = usagePage; + mUsageId = usageId; + + return self; +} + +- (unsigned) usagePage; +{ + return mUsagePage; +} + +- (unsigned) usageId; +{ + return mUsageId; +} + +- (NSString *) usageName; +{ + DDHidUsageTables * usageTables = [DDHidUsageTables standardUsageTables]; + return + [usageTables descriptionForUsagePage: mUsagePage + usage: mUsageId]; +} + +- (NSString *) usageNameWithIds; +{ + return [NSString stringWithFormat: @"%@ (0x%04x : 0x%04x)", + [self usageName], mUsagePage, mUsageId]; +} + +- (NSString *) description; +{ + return [NSString stringWithFormat: @"HID Usage: %@", [self usageName]]; +} + +- (BOOL) isEqualToUsagePage: (unsigned) usagePage usageId: (unsigned) usageId; +{ + return ((mUsagePage == usagePage) && (mUsageId == usageId)); +} + +@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidUsageTables.h b/radiant-player-mac/DDHidLib/DDHidUsageTables.h similarity index 100% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidUsageTables.h rename to radiant-player-mac/DDHidLib/DDHidUsageTables.h diff --git a/radiant-player-mac/DDHidLib/DDHidUsageTables.m b/radiant-player-mac/DDHidLib/DDHidUsageTables.m new file mode 100644 index 00000000..9e7703a8 --- /dev/null +++ b/radiant-player-mac/DDHidLib/DDHidUsageTables.m @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "DDHidUsageTables.h" + +@implementation DDHidUsageTables + +static DDHidUsageTables * sStandardUsageTables = nil; + ++ (DDHidUsageTables *) standardUsageTables; +{ + if (sStandardUsageTables == nil) + { + NSBundle * myBundle = [NSBundle bundleForClass: self]; + NSString * usageTablesPath = + [myBundle pathForResource: @"DDHidStandardUsages" ofType: @"plist"]; + NSDictionary * lookupTables = + [NSDictionary dictionaryWithContentsOfFile: usageTablesPath]; + sStandardUsageTables = + [[DDHidUsageTables alloc] initWithLookupTables: lookupTables]; + [sStandardUsageTables retain]; + } + + return sStandardUsageTables; +} + +- (id) initWithLookupTables: (NSDictionary *) lookupTables; +{ + self = [super init]; + if (self == nil) + return nil; + + mLookupTables = [lookupTables retain]; + + return self; +} + +- (NSString *) descriptionForUsagePage: (unsigned) usagePage + usage: (unsigned) usage +{ + NSString * usagePageString = [NSString stringWithFormat: @"%u", usagePage]; + NSString * usageString = [NSString stringWithFormat: @"%u", usage]; + // NSNumber * usagePageNumber = [NSNumber numberWithUnsignedInt: usagePage]; + + NSDictionary * usagePageLookup = [mLookupTables objectForKey: usagePageString]; + if (usagePageLookup == nil) + return @"Unknown usage page"; + + NSDictionary * usageLookup = [usagePageLookup objectForKey: @"usages"]; + NSString * description = [usageLookup objectForKey: usageString]; + if (description != nil) + return description; + + NSString * defaultUsage = [usagePageLookup objectForKey: @"default"]; + if (defaultUsage != nil) + { + description = [NSString stringWithFormat: defaultUsage, usage]; + return description; + } + + return @"Unknown usage"; +} + +@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsage.h b/radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.h similarity index 68% rename from radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsage.h rename to radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.h index 8dc5654c..750d0d40 100644 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsage.h +++ b/radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.h @@ -25,28 +25,22 @@ #import -@interface DDHidUsage : NSObject -{ - unsigned mUsagePage; - unsigned mUsageId; -} +@interface NSDictionary (DDHidExtras) -+ (DDHidUsage *) usageWithUsagePage: (unsigned) usagePage - usageId: (unsigned) usageId; +- (unsigned) ddhid_unsignedForKey: (NSString *) key; -- (id) initWithUsagePage: (unsigned) usagePage - usageId: (unsigned) usageId; +- (id) ddhid_objectForString: (const char *) key; -- (unsigned) usagePage; +- (NSString *) ddhid_stringForString: (const char *) key; +- (long) ddhid_longForString: (const char *) key; +- (unsigned int) ddhid_unsignedIntForString: (const char *) key; +- (BOOL) ddhid_boolForString: (const char *) key; -- (unsigned) usageId; - -- (NSString *) usageName; - -- (NSString *) usageNameWithIds; +@end -- (NSString *) description; +@interface NSMutableDictionary (DDHidExtras) -- (BOOL) isEqualToUsagePage: (unsigned) usagePage usageId: (unsigned) usageId; +- (void) ddhid_setObject: (id) object forString: (const char *) key; +- (void) ddhid_setInt: (int) i forKey: (id) key; @end diff --git a/radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.m b/radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.m new file mode 100644 index 00000000..4864a489 --- /dev/null +++ b/radiant-player-mac/DDHidLib/NSDictionary+DDHidExtras.m @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2007 Dave Dribin + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#import "NSDictionary+DDHidExtras.h" + + +@implementation NSDictionary (DDHidExtras) + +- (unsigned) ddhid_unsignedForKey: (NSString *) key; +{ + NSNumber * number = [self objectForKey: key]; + return [number unsignedIntValue]; +} + +- (id) ddhid_objectForString: (const char *) key; +{ + NSString * objcKey = [NSString stringWithUTF8String: key]; + return [self objectForKey: objcKey]; +} + +- (NSString *) ddhid_stringForString: (const char *) key; +{ + return [self ddhid_objectForString: key]; +} + +- (long) ddhid_longForString: (const char *) key; +{ + NSNumber * number = [self ddhid_objectForString: key]; + return [number longValue]; +} + +- (unsigned int) ddhid_unsignedIntForString: (const char *) key; +{ + NSNumber * number = [self ddhid_objectForString: key]; + return [number unsignedIntValue]; +} + +- (BOOL) ddhid_boolForString: (const char *) key; +{ + NSNumber * number = [self ddhid_objectForString: key]; + return [number boolValue]; +} + +@end + +@implementation NSMutableDictionary (DDHidExtras) + +- (void) ddhid_setObject: (id) object forString: (const char *) key; +{ + NSString * objcKey = [NSString stringWithUTF8String: key]; + [self setObject: object forKey: objcKey]; +} + +- (void) ddhid_setInt: (int) i forKey: (id) key; +{ + NSNumber * number = [NSNumber numberWithInt: i]; + [self setObject: number forKey: key]; +} + +@end diff --git a/radiant-player-mac/DDHidLib/NSXReturnThrowError.h b/radiant-player-mac/DDHidLib/NSXReturnThrowError.h new file mode 100644 index 00000000..b8aa11a3 --- /dev/null +++ b/radiant-player-mac/DDHidLib/NSXReturnThrowError.h @@ -0,0 +1,103 @@ +/***************************************************************************//** + NSXReturnThrowError.h + Copyright (c) 2007 Jonathan 'Wolf' Rentzsch: + Some rights reserved: + + @section Overview + + NSXReturnThrowError does two things: + + 1. Eases wrapping error codes into NSError objects. + + 2. Enhances NSError by adding origin information to the error instance. + Origin information includes the actual line of code that returned + the error, as well as the file+line+function/method name. + + A big NSXReturnThrowError feature is that it deduces the correct NSError + error domain based on the wrapped code's return type+value. Bonus: it + does so without requiring ObjC++, relying on \@encode acrobatics + instead. + + NSXReturnThrowError was coded against 10.4, but should be compatible + with 10.3 as well. However that's currently untested. + + @section Usage + + NSXReturnThrowError handles both types of error handling: explicit + returning of NSError objects and raising NSExceptions. + + Use NSXReturnError() if you're returning NSError objects explicitly: + + @code + - (id)demoReturnError:(NSError**)error_ { + id result = nil; + NSError *error = nil; + + NSXReturnError(SomeCarbonFunction()); + if (!error) + NSXReturnError(someposixfunction()); + if (!error) + NSXReturnError(some_mach_function()); + if (!error) + NSXReturnError([SomeCocoaClass sharedInstance]); + + if (error_) *error_ = error; + return result; + } + @endcode + + Use NSXThrowError() if you'd prefer to raise NSException objects: + + @code + - (id)demo { + id result = nil; + + NSXThrowError(SomeCarbonFunction()); + NSXThrowError(someposixfunction()); + NSXThrowError(some_mach_function()); + NSXThrowError([SomeCocoaClass newObject]); + + return result; + } + @endcode + + The current structure of the raised NSException object is that it's a + normal NSException whose name is "NSError". The actual error object is + hung off the exception's userInfo dictionary with the key of @"error". + + @mainpage NSXReturnThrowError + @todo Add a compile-time flag for whether to stuff __FILE__+friends + info into the generated NSError or not. + + + ***************************************************************************/ + +#import + +extern NSString *NSXErrorExceptionName; +extern NSString *NULLPointerErrorDomain; +extern NSString *BOOLErrorDomain; + +void NSXMakeErrorImp(const char *objCType_, intptr_t result_, const char *file_, unsigned line_, const char *function_, const char *code_, NSError **error_); + +#define NSXMakeError(ERROR, CODE) \ + do{ \ + typeof(CODE) codeResult = (CODE); \ + NSXMakeErrorImp(@encode(typeof(CODE)), (intptr_t)codeResult, __FILE__, __LINE__, __PRETTY_FUNCTION__, #CODE, &ERROR); \ + }while(0) + +#define NSXReturnError(CODE) NSXMakeError(error, CODE) + +#define NSXRaiseError(ERROR) \ + [[NSException exceptionWithName:NSXErrorExceptionName \ + reason:[error description] \ + userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]] raise]; + +#define NSXThrowError(CODE) \ + do{ \ + NSError *error = nil; \ + NSXReturnError(CODE); \ + if (error) { \ + NSXRaiseError(ERROR); \ + } \ + }while(0) diff --git a/radiant-player-mac/DDHidLib/NSXReturnThrowError.m b/radiant-player-mac/DDHidLib/NSXReturnThrowError.m new file mode 100644 index 00000000..bb1f0d7c --- /dev/null +++ b/radiant-player-mac/DDHidLib/NSXReturnThrowError.m @@ -0,0 +1,106 @@ +/******************************************************************************* + NSXReturnThrowError.m + Copyright (c) 2007 Jonathan 'Wolf' Rentzsch: + Some rights reserved: + + ***************************************************************************/ + +#import "NSXReturnThrowError.h" + +NSString *NSXErrorExceptionName = @"NSXError"; +NSString *NULLPointerErrorDomain = @"NULLPointerErrorDomain"; +NSString *BOOLErrorDomain = @"BOOLErrorDomain"; + +typedef enum { + NSXErrorCodeType_Unknown, + NSXErrorCodeType_Cocoa, // "@" + NSXErrorCodeType_PosixOrMach, // "i" (-1 == posix+errno, otherwise mach) + NSXErrorCodeType_Carbon, // "s" || "l" + NSXErrorCodeType_ptr, // "r*" || "*" || "^" + NSXErrorCodeType_BOOL // "c" +} NSXErrorCodeType; + +static NSXErrorCodeType NSXErrorCodeTypeFromObjCType(const char *objCType) { + switch (objCType[0]) { + case 's': + case 'l': + return NSXErrorCodeType_Carbon; + case 'i': + return NSXErrorCodeType_PosixOrMach; + case '@': + return NSXErrorCodeType_Cocoa; + case '^': + case '*': + return NSXErrorCodeType_ptr; + case 'r': + return '*' == objCType[1] ? NSXErrorCodeType_ptr : NSXErrorCodeType_Unknown; + case 'c': + return NSXErrorCodeType_BOOL; + default: + return NSXErrorCodeType_Unknown; + } +} + +void NSXMakeErrorImp(const char *objCType_, intptr_t result_, const char *file_, unsigned line_, const char *function_, const char *code_, NSError **error_) { + NSString *errorDomain = nil; + int errorCode = (int)result_; + + switch (NSXErrorCodeTypeFromObjCType(objCType_)) { + case NSXErrorCodeType_Cocoa: + // codeResult's type is an id/NSObject* pointer. 0 == nil == failure. + if (0 == result_) { + errorDomain = @"NSCocoaErrorDomain"; // Could use NSCocoaErrorDomain symbol, but that would force us to 10.4. + errorCode = -1; + } + break; + case NSXErrorCodeType_Carbon: + // codeResult's type is OSErr (short) or OSStatus (long). 0 == noErr == success. + if (0 != result_) { + errorDomain = NSOSStatusErrorDomain; + } + break; + case NSXErrorCodeType_PosixOrMach: + // codeResult's type is int, which is used for both posix error codes and mach_error_t/kern_return_t. + // 0 means success for both, and we can differentiate posix error codes since they're always -1 (the + // actual posix code stored in errno). + if (0 != result_) { + if (-1 == result_) { + // Posix error code. + errorDomain = NSPOSIXErrorDomain; + errorCode = errno; + } else { + // Mach error code. + errorDomain = NSMachErrorDomain; + } + } + break; + case NSXErrorCodeType_ptr: + // codeResult's type is some sort of non-id/non-NSObject* pointer. 0 == NULL == failure. + if (0 == result_) { + errorDomain = NULLPointerErrorDomain; + errorCode = -1; + } + break; + case NSXErrorCodeType_BOOL: + // codeResult's type is a BOOL. 0 == NO == failure. + if (0 == result_) { + errorDomain = BOOLErrorDomain; + errorCode = -1; + } + break; + default: + NSCAssert1(NO, @"NSXErrorCodeType_Unknown: \"%s\"", objCType_); + break; + } + + if (errorDomain && error_) { + *error_ = [NSError errorWithDomain:errorDomain + code:errorCode + userInfo:[NSDictionary dictionaryWithObjectsAndKeys: + [NSString stringWithUTF8String:file_], @"reportingFile", + [NSNumber numberWithInt:line_], @"reportingLine", + [NSString stringWithUTF8String:function_], @"reportingMethod", + [NSString stringWithUTF8String:code_], @"origin", + nil]]; + } +} diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/DDHidLib b/radiant-player-mac/Frameworks/DDHidLib.framework/DDHidLib deleted file mode 100755 index 1257681aef2bf563d267f8c88bfdf49d655ed45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163040 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
)ZNjs_Pjwd%qFnOTx# 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 RT$St1U3y1gQpKM6?|&~!F_!=U diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleRemote.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleRemote.h deleted file mode 100644 index f6bc8ef3..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidAppleRemote.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import - -#import "DDHidDevice.h" - -@class DDHidElement; - -enum DDHidAppleRemoteEventIdentifier -{ - kDDHidRemoteButtonVolume_Plus=0, - kDDHidRemoteButtonVolume_Minus, - kDDHidRemoteButtonMenu, - kDDHidRemoteButtonPlay, - kDDHidRemoteButtonRight, - kDDHidRemoteButtonLeft, - kDDHidRemoteButtonRight_Hold, - kDDHidRemoteButtonLeft_Hold, - kDDHidRemoteButtonMenu_Hold, - kDDHidRemoteButtonPlay_Sleep, - kDDHidRemoteControl_Switched, - kDDHidRemoteControl_Paired, -}; -typedef enum DDHidAppleRemoteEventIdentifier DDHidAppleRemoteEventIdentifier; - -@interface DDHidAppleRemote : DDHidDevice -{ - NSMutableDictionary * mCookieToButtonMapping; - NSArray * mButtonElements; - DDHidElement * mIdElement; - int mRemoteId; - - id mDelegate; -} - -+ (NSArray *) allRemotes; - -+ (DDHidAppleRemote *) firstRemote; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -#pragma mark - -#pragma mark Properties - -- (int) remoteId; -- (void) setRemoteId: (int) theRemoteId; - -@end - -@interface NSObject (DDHidAppleRemoteDelegate) - -- (void) ddhidAppleRemoteButton: (DDHidAppleRemoteEventIdentifier) buttonIdentifier - pressedDown: (BOOL) pressedDown; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidJoystick.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidJoystick.h deleted file mode 100644 index ebf20ccb..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidJoystick.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidJoystickStick : NSObject -{ - DDHidElement * mXAxisElement; - DDHidElement * mYAxisElement; - NSMutableArray * mStickElements; - // Point of view elements (i.e. hat switches) - NSMutableArray * mPovElements; -} - -- (DDHidElement *) xAxisElement; - -- (DDHidElement *) yAxisElement; - -#pragma mark - -#pragma mark StickElements - indexed accessors - -- (unsigned int) countOfStickElements; -- (DDHidElement *) objectInStickElementsAtIndex: (unsigned int)index; - -#pragma mark - -#pragma mark PovElements - indexed accessors - -- (unsigned int) countOfPovElements; -- (DDHidElement *) objectInPovElementsAtIndex: (unsigned int)index; - -- (NSArray *) allElements; - -- (BOOL) addElement: (DDHidElement *) element; - -@end - -@interface DDHidJoystick : DDHidDevice -{ - NSMutableArray * mSticks; - NSMutableArray * mButtonElements; - NSMutableArray * mLogicalDeviceElements; - - id mDelegate; -} - -+ (NSArray *) allJoysticks; - -- (id) initLogicalWithDevice: (io_object_t) device - logicalDeviceNumber: (int) logicalDeviceNumber - error: (NSError **) error; - -- (int) logicalDeviceCount; - -#pragma mark - -#pragma mark Joystick Elements - -- (unsigned) numberOfButtons; - -- (NSArray *) buttonElements; - -#pragma mark - -#pragma mark Sticks - indexed accessors - -- (unsigned int) countOfSticks; -- (DDHidJoystickStick *) objectInSticksAtIndex: (unsigned int)index; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -#define DDHID_JOYSTICK_VALUE_MIN -65536 -#define DDHID_JOYSTICK_VALUE_MAX 65536 - -@interface NSObject (DDHidJoystickDelegate) - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - xChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - yChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - otherAxis: (unsigned) otherAxis - valueChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - povNumber: (unsigned) povNumber - valueChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - buttonDown: (unsigned) buttonNumber; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - buttonUp: (unsigned) buttonNumber; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboard.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboard.h deleted file mode 100644 index fd9200d2..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboard.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidKeyboard : DDHidDevice -{ - NSMutableArray * mKeyElements; - - id mDelegate; -} - -+ (NSArray *) allKeyboards; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Keyboards Elements - -- (NSArray *) keyElements; - -- (unsigned) numberOfKeys; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -@interface NSObject (DDHidKeyboardDelegate) - -- (void) ddhidKeyboard: (DDHidKeyboard *) keyboard - keyDown: (unsigned) usageId; - -- (void) ddhidKeyboard: (DDHidKeyboard *) keyboard - keyUp: (unsigned) usageId; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboardBarcodeScanner.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboardBarcodeScanner.h deleted file mode 100644 index 6573b016..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidKeyboardBarcodeScanner.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin, Lucas Newman - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidKeyboardBarcodeScanner : DDHidDevice -{ - NSMutableArray * mKeyElements; - - NSMutableString * mAccumulatedDigits; - NSTimer *mBarcodeInputTimer; - BOOL mIsLikelyKeyboardBarcodeScanner; - - id mDelegate; -} - -+ (NSArray *) allPossibleKeyboardBarcodeScanners; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Keyboard Elements - -- (NSArray *) keyElements; - -- (NSUInteger) numberOfKeys; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -#pragma mark - -#pragma mark Properties - -- (BOOL) isLikelyKeyboardBarcodeScanner; - -@end - -@interface NSObject (DDHidKeyboardBarcodeScannerDelegate) - -- (void) ddhidKeyboardBarcodeScanner: (DDHidKeyboardBarcodeScanner *) keyboardBarcodeScanner - gotBarcode: (NSString *) barcode; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidLib.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidLib.h deleted file mode 100644 index 20d86817..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidLib.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import "DDHidDevice.h" -#import "DDHidElement.h" -#import "DDHidUsage.h" -#import "DDHidQueue.h" -#import "DDHidEvent.h" -#import "DDHidUsageTables.h" -#import "DDHidMouse.h" -#import "DDHidJoystick.h" -#import "DDHidKeyboard.h" -#import "DDHidAppleRemote.h" -#import "DDHidAppleMikey.h" -#import "DDHidKeyboardBarcodeScanner.h" diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidMouse.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidMouse.h deleted file mode 100644 index d396aba0..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Headers/DDHidMouse.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidMouse : DDHidDevice -{ - DDHidElement * mXElement; - DDHidElement * mYElement; - DDHidElement * mWheelElement; - NSMutableArray * mButtonElements; - - id mDelegate; -} - -+ (NSArray *) allMice; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Mouse Elements - -- (DDHidElement *) xElement; - -- (DDHidElement *) yElement; - -- (DDHidElement *) wheelElement; - -- (NSArray *) buttonElements; - -- (unsigned) numberOfButtons; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -@interface NSObject (DDHidMouseDelegate) - -- (void) ddhidMouse: (DDHidMouse *) mouse xChanged: (SInt32) deltaX; -- (void) ddhidMouse: (DDHidMouse *) mouse yChanged: (SInt32) deltaY; -- (void) ddhidMouse: (DDHidMouse *) mouse wheelChanged: (SInt32) deltaWheel; -- (void) ddhidMouse: (DDHidMouse *) mouse buttonDown: (unsigned) buttonNumber; -- (void) ddhidMouse: (DDHidMouse *) mouse buttonUp: (unsigned) buttonNumber; - -@end - diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/DDHidStandardUsages.plist b/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/DDHidStandardUsages.plist deleted file mode 100644 index 84eb663f..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/DDHidStandardUsages.plist +++ /dev/null @@ -1,2327 +0,0 @@ - - - - - 1 - - description - Generic Desktop - ranges - - - usages - - 0 - Undefined - 1 - Pointer - 2 - Mouse - 3 - Reserved - 4 - Joystick - 5 - Game Pad - 6 - Keyboard - 7 - Keypad - 8 - Multi-axis Controller - 48 - X - 49 - Y - 50 - Z - 51 - Rx - 52 - Ry - 53 - Rz - 54 - Slider - 55 - Dial - 56 - Wheel - 57 - Hat Switch - 58 - Counted Buffer - 59 - Byte Count - 60 - Motion Wakeup - 64 - Vx - 65 - Vy - 66 - Vz - 67 - Vbrx - 68 - Vbry - 69 - Vbrx - 70 - Vno - 128 - System Control - 129 - System Power Down - 130 - System Sleep - 131 - System Wake Up - 132 - System Context Menu - 133 - System Main Menu - 134 - System App Menu - 135 - System Menu Help - 136 - System Menu Exit - 137 - System Menu Select - 138 - System Menu Right - 139 - System Menu Left - 140 - System Menu Up - 141 - System Menu Down - 144 - D-pad Up - 145 - D-pad Down - 146 - D-pad Right - 147 - D-pad Left - - - 2 - - description - Simulation Controls - ranges - - - usages - - 0 - Undefined - 1 - Flight Simulation Device - 2 - Automobile Simulation Device - 3 - Tank Simulation Device - 4 - Spaceship Simulation Device - 5 - Submarine Simulation Device - 6 - Sailing Simulation Device - 7 - Motorcycle Simulation Device - 8 - Sports Simulation Device - 9 - Airplane Simulation Device - 10 - Helicopter Simulation Device - 11 - Magic Carpet Simulation Device - 12 - Bicycle - 32 - Flight Control Stick - 33 - Flight Stick - 34 - Cyclic Control - 35 - Cyclic Trim - 36 - Flight Yoke - 37 - Track Control - 38 - Driving Control - 176 - Aileron - 177 - Aileron Trim - 178 - Anti-Torque Control - 179 - Auto-pilot Enable - 180 - Chaff Release - 181 - Collective Control - 182 - Dive Brake - 183 - Electronic Counter Measures - 184 - Elevator - 185 - Elevator Trim - 186 - Rudder - 187 - Throttle - 188 - Flight Communication - 189 - Flare Release - 190 - Landing Gear - 191 - Toe Brake - 192 - Trigger - 193 - Weapons Arm - 194 - Weapons Select - 195 - Wing Flaps - 196 - Accelerator - 197 - Brake - 198 - Clutch - 199 - Shifter - 200 - Steering - 201 - Turret Direction - 202 - Barrel Elevation - 203 - Dive Plane - 204 - Ballast - 205 - Bicycle Crank - 206 - Handle Bars - 207 - Front Brake - 208 - Rear Brake - - - 3 - - description - VR Controls - ranges - - - usages - - 0 - Unidentified - 1 - Belt - 2 - Body Suit - 3 - Flexor - 4 - Glove - 5 - Head Tracker - 6 - Head Mounted Display - 7 - Hand Tracker - 8 - Oculometer - 9 - Vest - 10 - Animatronic Device - 32 - Stereo Enable - 33 - Display Enable - - - 4 - - description - Sports Controls - ranges - - - usages - - 0 - Unidentified - 1 - Baseball Bat - 2 - Golf Club - 3 - Rowing Machine - 4 - Treadmill - 48 - Oar - 49 - Slope - 50 - Rate - 51 - Stick Speed - 52 - Stick Face Angle - 53 - Stick Heel/Toe - 54 - Stick Follow Through - 55 - Stick Tempo - 56 - Stick Type - 57 - Stick Height - 80 - Putter - 81 - 1 Iron - 82 - 2 Iron - 83 - 3 Iron - 84 - 4 Iron - 85 - 5 Iron - 86 - 6 Iron - 87 - 7 Iron - 88 - 8 Iron - 89 - 9 Iron - 90 - 10 Iron - 91 - 11 Iron - 92 - Sand Wedge - 93 - Loft Wedge - 94 - Power Wedge - 95 - 1 Wood - 96 - 3 Wood - 97 - 5 Wood - 98 - 7 Wood - 99 - 9 Wood - - - 5 - - description - Game Controls - ranges - - - usages - - 0 - Undefined - 1 - 3D Game Controller - 2 - Pinball Device - 3 - Gun Device - 32 - Point of View - 33 - Turn Right/Left - 34 - Pitch Right/Left - 35 - Roll Forward/Backward - 36 - Move Right/Left - 37 - Move Forward/Backward - 38 - Move Up/Down - 39 - Lean Right/Left - 40 - Lean Forward/Backward - 41 - Height of POV - 42 - Flipper - 43 - Secondary Flipper - 44 - Bump - 45 - New Game - 46 - Shoot Ball - 47 - Player - 48 - Gun Bolt - 49 - Gun Clip - 50 - Gun Selector - 51 - Gun Single Shot - 52 - Gun Burst - 53 - Gun Automatic - 54 - Gun Safety - 55 - Gamepad Fire/Jump - 57 - Gamepad Trigger - - - 7 - - description - Keyboard - ranges - - - usages - - 0 - No Event - 1 - Keyboard ErrorRollOver - 2 - Keyboard POSTFail - 3 - Keyboard ErrorUndefined - 4 - Keyboard a and A - 5 - Keyboard b and B - 6 - Keyboard c and C - 7 - Keyboard d and D - 8 - Keyboard e and E - 9 - Keyboard f and F - 10 - Keyboard g and G - 11 - Keyboard h and H - 12 - Keyboard i and I - 13 - Keyboard j and J - 14 - Keyboard k and K - 15 - Keyboard l and L - 16 - Keyboard m and M - 17 - Keyboard n and N - 18 - Keyboard o and O - 19 - Keyboard p and P - 20 - Keyboard q and Q - 21 - Keyboard r and R - 22 - Keyboard s and S - 23 - Keyboard t and T - 24 - Keyboard u and U - 25 - Keyboard v and V - 26 - Keyboard w and W - 27 - Keyboard x and X - 28 - Keyboard y and Y - 29 - Keyboard z and Z - 30 - Keyboard 1 and ! - 31 - Keyboard 2 and @ - 32 - Keyboard 3 and # - 33 - Keyboard 4 and $ - 34 - Keyboard 5 and % - 35 - Keyboard 6 and ^ - 36 - Keyboard 7 and & - 37 - Keyboard 8 and * - 38 - Keyboard 9 and ( - 39 - Keyboard 0 and ) - 40 - Keyboard Return (ENTER) - 41 - Keyboard ESCAPE - 42 - Keyboard DELETE (Backspace) - 43 - Keyboard Tab - 44 - Keyboard Spacebar - 45 - Keyboard - and (underscore) - 46 - Keyboard = and + - 47 - Keyboard [ and { - 48 - Keyboard ] and } - 49 - Keyboard \ and | - 50 - Keyboard Non-US # and ~ - 51 - Keyboard ; and : - 52 - Keyboard ' and " - 53 - Keyboard Grave Accent and Tilde - 54 - Keyboard, and < - 55 - Keyboard . and > - 56 - Keyboard / and ? - 57 - Keyboard Caps Lock - 58 - Keyboard F1 - 59 - Keyboard F2 - 60 - Keyboard F3 - 61 - Keyboard F4 - 62 - Keyboard F5 - 63 - Keyboard F6 - 64 - Keyboard F7 - 65 - Keyboard F8 - 66 - Keyboard F9 - 67 - Keyboard F10 - 68 - Keyboard F11 - 69 - Keyboard F12 - 70 - Keyboard PrintScreen - 71 - Keyboard Scroll Lock - 72 - Keyboard Pause - 73 - Keyboard Insert - 74 - Keyboard Home - 75 - Keyboard PageUp - 76 - Keyboard Delete Forward - 77 - Keyboard End - 78 - Keyboard PageDown - 79 - Keyboard RightArrow - 80 - Keyboard LeftArrow - 81 - Keyboard DownArrow - 82 - Keyboard UpArrow - 83 - Keypad Num Lock and Clear - 84 - Keypad / - 85 - Keypad * - 86 - Keypad - - 87 - Keypad + - 88 - Keypad ENTER - 89 - Keypad 1 and End - 90 - Keypad 2 and Down Arrow - 91 - Keypad 3 and PageDn - 92 - Keypad 4 and Left Arrow - 93 - Keypad 5 - 94 - Keypad 6 and Right Arrow - 95 - Keypad 7 and Home - 96 - Keypad 8 and Up Arrow - 97 - Keypad 9 and PageUp - 98 - Keypad 0 and Insert - 99 - Keypad . and Delete - 100 - Keyboard Non-US \ and | - 101 - Keyboard Application - 102 - Keyboard Power - 103 - Keypad = - 104 - Keyboard F13 - 105 - Keyboard F14 - 106 - Keyboard F15 - 107 - Keyboard F16 - 108 - Keyboard F17 - 109 - Keyboard F18 - 110 - Keyboard F19 - 111 - Keyboard F20 - 112 - Keyboard F21 - 113 - Keyboard F22 - 114 - Keyboard F23 - 115 - Keyboard F24 - 116 - Keyboard Execute - 117 - Keyboard Help - 118 - Keyboard Menu - 119 - Keyboard Select - 120 - Keyboard Stop - 121 - Keyboard Again - 122 - Keyboard Undo - 123 - Keyboard Cut - 124 - Keyboard Copy - 125 - Keyboard Paste - 126 - Keyboard Find - 127 - Keyboard Mute - 128 - Keyboard Volume Up - 129 - Keyboard Volume Down - 130 - Keyboard Locking Caps Lock - 131 - Keyboard Locking Num Lock - 132 - Keyboard Locking Scroll Lock - 133 - Keypad Comma - 134 - Keypad Equal Sign - 135 - Keyboard International1 - 136 - Keyboard International2 - 137 - Keyboard International3 - 138 - Keyboard International4 - 139 - Keyboard International5 - 140 - Keyboard International6 - 141 - Keyboard International7 - 142 - Keyboard International8 - 143 - Keyboard International9 - 144 - Keyboard LANG1 - 145 - Keyboard LANG2 - 146 - Keyboard LANG3 - 147 - Keyboard LANG4 - 148 - Keyboard LANG5 - 149 - Keyboard LANG6 - 150 - Keyboard LANG7 - 151 - Keyboard LANG8 - 152 - Keyboard LANG9 - 153 - Keyboard Alternate Erase - 154 - Keyboard SysReq/Attention - 155 - Keyboard Cancel - 156 - Keyboard Clear - 157 - Keyboard Prior - 158 - Keyboard Return - 159 - Keyboard Separator - 160 - Keyboard Out - 161 - Keyboard Oper - 162 - Keyboard Clear/Again - 163 - Keyboard CrSel/Props - 164 - Keyboard ExSel - 224 - Keyboard LeftControl - 225 - Keyboard LeftShift - 226 - Keyboard LeftAlt - 227 - Keyboard Left GUI - 228 - Keyboard RightControl - 229 - Keyboard RightShift - 230 - Keyboard RightAlt - 231 - Keyboard Right GUI - - - 8 - - description - LEDs - ranges - - {76, 65535} - Reserved - - usages - - 0 - Undefined - 1 - Num Lock - 2 - Caps Lock - 3 - Scroll Lock - 4 - Compose - 5 - Kana - 6 - Power - 7 - Shift - 8 - Do Not Disturb - 9 - Mute - 10 - Tone Enable - 11 - High Cut Filter - 12 - Low Cut Filter - 13 - Equalizer Enable - 14 - Sound Field On - 15 - Surround Field On - 16 - Repeat - 17 - Stereo - 18 - Sampling Rate Detect - 19 - Spinning - 20 - CAV - 21 - CLV - 22 - Recording Format Detect - 23 - Off-Hook - 24 - Ring - 25 - Message Waiting - 26 - Data Mode - 27 - Battery Operation - 28 - Battery OK - 29 - Battery Low - 30 - Speaker - 31 - Head Set - 32 - Hold - 33 - Microphone - 34 - Coverage - 35 - Night Mode - 36 - Send Calls - 37 - Call Pickup - 38 - Conference - 39 - Stand-by - 40 - Camera On - 41 - Camera Off - 42 - On-Line - 43 - Off-Line - 44 - Busy - 45 - Ready - 46 - Paper-Out - 47 - Paper-Jam - 48 - Remote - 49 - Forward - 50 - Reverse - 51 - Stop - 52 - Rewind - 53 - Fast Forward - 54 - Play - 55 - Pause - 56 - Record - 57 - Error - 58 - Usage Selected Indicator - 59 - Usage In Use Indicator - 60 - Usage Multi Mode Indicator - 61 - Indicator On - 62 - Indicator Flash - 63 - Indicator Slow Blink - 64 - Indicator Fast Blink - 65 - Indicator Off - 66 - Flash On Time - 67 - Slow Blink On Time - 68 - Slow Blink Off Time - 69 - Fast Blink On Time - 70 - Fast Blink Off Time - 71 - Usage Indicator Color - 72 - Red - 73 - Green - 74 - Amber - 75 - Generic Indicator - 76 - System Suspend - 77 - External Power Connected - - - 9 - - default - Button %d - description - Button - ranges - - - usages - - 0 - No Button Pressed - - - 10 - - default - Instance %d - description - Ordinal - ranges - - - usages - - 0 - Unused - - - 11 - - description - Telephony - ranges - - - usages - - 0 - Unassigned - 1 - Phone - 2 - Answering Machine - 3 - Message Controls - 4 - Handset - 5 - Headset - 6 - Telephony Key Pad - 7 - Programmable Button - 32 - Hook Switch - 33 - Flash - 34 - Feature - 35 - Hold - 36 - Redial - 37 - Transfer - 38 - Drop - 39 - Park - 40 - Forward Calls - 41 - Alternate Function - 42 - Line - 43 - Speaker Phone - 44 - Conference - 45 - Ring Enable - 46 - Ring Select - 47 - Phone Mute - 48 - Caller ID - 80 - Speed Dial - 81 - Store Number - 82 - Recall Number - 83 - Phone Directory - 112 - Voice Mail - 113 - Screen Calls - 114 - Do Not Disturb - 115 - Message - 116 - Answer On/Off - 144 - Inside Dial Tone - 145 - Outside Dial Tone - 146 - Inside Ring Tone - 147 - Outside Ring Tone - 148 - Priority Ring Tone - 149 - Inside Ringback - 150 - Priority Ringback - 151 - Line Busy Tone - 152 - Reorder Tone - 153 - Call Waiting Tone - 154 - Confirmation Tone 1 - 155 - Confirmation Tone 2 - 156 - Tones Off - 176 - Phone Key 0 - 177 - Phone Key 1 - 178 - Phone Key 2 - 179 - Phone Key 3 - 180 - Phone Key 4 - 181 - Phone Key 5 - 182 - Phone Key 6 - 183 - Phone Key 7 - 184 - Phone Key 8 - 185 - Phone Key 9 - 186 - Phone Key Star - 187 - Phone Key Pound - 188 - Phone Key A - 189 - Phone Key B - 190 - Phone Key C - 191 - Phone Key D - - - 12 - - description - Consumer - ranges - - - usages - - 0 - Unassigned - 1 - Consumer Control - 2 - Numeric Key Pad - 3 - Programmable Buttons - 32 - +10 - 33 - +100 - 34 - AM/PM - 48 - Power - 49 - Reset - 50 - Sleep - 51 - Sleep After - 52 - Sleep Mode - 53 - Illumination - 54 - Function Buttons - 64 - Menu - 65 - Menu Pick - 66 - Menu Up - 67 - Menu Down - 68 - Menu Left - 69 - Menu Right - 70 - Menu Escape - 71 - Menu Value Increase - 72 - Menu Value Decrease - 96 - Data On Screen - 97 - Closed Caption - 98 - Closed Caption Select - 99 - VCR/TV - 100 - Broadcast Mode - 101 - Snapshot - 102 - Still - 128 - Selection - 129 - Assign Selection - 130 - Mode Step - 131 - Recall Last - 132 - Enter Channel - 133 - Order Movie - 134 - Channel - 135 - Media Selection - 136 - Media Select Computer - 137 - Media Select TV - 138 - Media Select WWW - 139 - Media Select DVD - 140 - Media Select Telephone - 141 - Media Select Program Guide - 142 - Media Select Video Phone - 143 - Media Select Games - 144 - Media Select Messages - 145 - Media Select CD - 146 - Media Select VCR - 147 - Media Select Tuner - 148 - Quit - 149 - Help - 150 - Media Select Tape - 151 - Media Select Cable - 152 - Media Select Satellite - 153 - Media Select Security - 154 - Media Select Home - 155 - Media Select Call - 156 - Channel Increment - 157 - Channel Decrement - 158 - Media Select SAP - 160 - VCR Plus - 161 - Once - 162 - Daily - 163 - Weekly - 164 - Monthly - 176 - Play - 177 - Pause - 178 - Record - 179 - Fast Forward - 180 - Rewind - 181 - Scan Next Track - 182 - Scan Previous Track - 183 - Stop - 184 - Eject - 185 - Random Play - 186 - Select DisC - 187 - Enter Disc - 188 - Repeat - 189 - Tracking - 190 - Track Normal - 191 - Slow Tracking - 192 - Frame Forward - 193 - Frame Back - 194 - Mark - 195 - Clear Mark - 196 - Repeat From Mark - 197 - Return To Mark - 198 - Search Mark Forward - 199 - Search Mark Backwards - 200 - Counter Reset - 201 - Show Counter - 202 - Tracking Increment - 203 - Tracking Decrement - 205 - Pause/Play - 224 - Volume - 225 - Balance - 226 - Mute - 227 - Bass - 228 - Treble - 229 - Bass Boost - 230 - Surround Mode - 231 - Loudness - 232 - MPX - 233 - Volume Up - 234 - Volume Down - 240 - Speed Select - 241 - Playback Speed - 242 - Standard Play - 243 - Long Play - 244 - Extended Play - 245 - Slow - 256 - Fan Enable - 257 - Fan Speed - 258 - Light - 259 - Light Illumination Level - 260 - Climate Control Enable - 261 - Room Temperature - 262 - Security Enable - 263 - Fire Alarm - 264 - Police Alarm - 336 - Balance Right - 337 - Balance Left - 338 - Bass Increment - 339 - Bass Decrement - 340 - Treble Increment - 341 - Treble Decrement - 352 - Speaker System - 353 - Channel Left - 354 - Channel Right - 355 - Channel Center - 356 - Channel Front - 357 - Channel Center Front - 358 - Channel Side - 359 - Channel Surround - 360 - Channel Low Frequency Enhancement - 361 - Channel Top - 362 - Channel Unknown - 368 - Sub-channel - 369 - Sub-channel Increment - 370 - Sub-channel Decrement - 371 - Alternate Audio Increment - 372 - Alternate Audio Decrement - 384 - Application Launch Buttons - 385 - AL Launch Button Configuration Tool - 386 - AL Programmable Button Configuration - 387 - AL Consumer Control Configuration - 388 - AL Word Processor - 389 - AL Text Editor - 390 - AL Spreadsheet - 391 - AL Graphics Editor - 392 - AL Presentation App - 393 - AL Database App - 394 - AL Email Reader - 395 - AL Newsreader - 396 - AL Voicemail - 397 - AL Contacts/Address Book - 398 - AL Calendar/Schedule - 399 - AL Task/Project Manager - 400 - AL Log/Journal/Timecard - 401 - AL Checkbook/Finance - 402 - AL Calculator - 403 - AL A/V Capture/Playback - 404 - AL Local Machine Browser - 405 - AL LAN/WAN Browser - 406 - AL Internet Browser - 407 - AL Remote Networking/ISP Connect - 408 - AL Network Conference - 409 - AL Network Chat - 410 - AL Telephony/Dialer - 411 - AL Logon - 412 - AL Logoff - 413 - AL Logon/Logoff - 414 - AL Terminal Lock/Screensaver - 415 - AL Control Panel - 416 - AL Command Line Processor/Run - 417 - AL Process/Task Manager - 418 - AL Select Tast/Application - 419 - AL Next Task/Application - 420 - AL Previous Task/Application - 421 - AL Preemptive Halt Task/Application - 423 - AL My Documents - 427 - AC Spell - 438 - AL My Pictures - 439 - AL My Music - 512 - Generic GUI Application Controls - 513 - AC New - 514 - AC Open - 515 - AC Close - 516 - AC Exit - 517 - AC Maximize - 518 - AC Minimize - 519 - AC Save - 520 - AC Print - 521 - AC Properties - 538 - AC Undo - 539 - AC Copy - 540 - AC Cut - 541 - AC Paste - 542 - AC Select All - 543 - AC Find - 544 - AC Find and Replace - 545 - AC Search - 546 - AC Go To - 547 - AC Home - 548 - AC Back - 549 - AC Forward - 550 - AC Stop - 551 - AC Refresh - 552 - AC Previous Link - 553 - AC Next Link - 554 - AC Bookmarks - 555 - AC History - 556 - AC Subscriptions - 557 - AC Zoom In - 558 - AC Zoom Out - 559 - AC Zoom - 560 - AC Full Screen View - 561 - AC Normal View - 562 - AC View Toggle - 563 - AC Scroll Up - 564 - AC Scroll Down - 565 - AC Scroll - 566 - AC Pan Left - 567 - AC Pan Right - 568 - AC Pan - 569 - AC New Window - 570 - AC Tile Horizontally - 571 - AC Tile Vertically - 572 - AC Format - 633 - AC Redo - 649 - AC Reply - 651 - AC Fwd - 652 - AC Send - - - 13 - - description - Digitizer - ranges - - - usages - - 0 - Undefined - 1 - Digitizer - 2 - Pen - 3 - Light Pen - 4 - Touch Screen - 5 - Touch Pad - 6 - White Board - 7 - Coordinate Measuring Machine - 8 - 3-D Digitizer - 9 - Stereo Plotter - 10 - Articulated Arm - 11 - Armature - 12 - Multiple Point Digitizer - 13 - Free Space Wand - 32 - Stylus - 33 - Puck - 34 - Finger - 48 - Tip Pressure - 49 - Barrel Pressure - 50 - In Range - 51 - Touch - 52 - Untouch - 53 - Tap - 54 - Quality - 55 - Data Valid - 56 - Transducer Index - 57 - Tablet Function Keys - 58 - Program Change Keys - 59 - Battery Strength - 60 - Invert - 61 - X Tilt - 62 - Y Tilt - 63 - Azimuth - 64 - Altitude - 65 - Twist - 66 - Tip Switch - 67 - Secondary Tip Switch - 68 - Barrel Switch - 69 - Eraser - 70 - Tablet Pick - - - 15 - - description - Physical Interface Device - ranges - - - usages - - - - 16 - - default - Unicode Char u%04x - description - Unicode - ranges - - - usages - - - - 20 - - description - Alphnumeric Display - ranges - - - usages - - 0 - Undefined - 1 - Alphanumeric Display - 32 - Display Attributes Report - 33 - ASCII Character Set - 34 - Data Read Back - 35 - Font Read Back - 36 - Display Control Report - 37 - Clear Display - 38 - Display Enable - 39 - Screen Saver Delay - 40 - Screen Saver Enable - 41 - Vertical Scroll - 42 - Horizontal Scroll - 43 - Character Report - 44 - Display Data - 45 - Display Status - 46 - Stat Not Ready - 47 - Stat Ready - 48 - Err Not a loadable character - 49 - Err Font data cannot be read - 50 - Cursor Position Report - 51 - Row - 52 - Column - 53 - Rows - 54 - Columns - 55 - Cursor Pixel Positioning - 56 - Cursor Mode - 57 - Cursor Enable - 58 - Cursor Blink - 59 - Font Report - 60 - Font Data - 61 - Character Width - 62 - Character Height - 63 - Character Spacing Horizontal - 64 - Character Spacing Vertical - 65 - Unicode Character Set - - - 128 - - description - Monitor - ranges - - - usages - - 0 - Undefined - 1 - Monitor Control - 2 - EDID Information - 3 - VDIF Information - 4 - VESA Version - 5 - On Screen Display - 6 - Auto Size Center - 7 - Polarity Horz Synch - 8 - Polarity Vert Synch - 9 - Sync Type - 10 - Screen Position - 11 - Horizontal Frequency - 12 - Vertical Frequency - - - 129 - - default - ENUM %d - description - Monitor Enumerated Values - ranges - - - usages - - 0 - unassigned - - - 130 - - description - VESA Virtual Controls - ranges - - - usages - - 16 - Brightness - 18 - Contrast - 22 - Video Gain Red - 24 - Video Gain Green - 26 - Video Gain Blue - 28 - Focus - 32 - Horizontal Position - 34 - Horizontal Size - 36 - Horizontal Pincushion - 38 - Horizontal Pincushion Balance - 40 - Horizontal Misconvergence - 42 - Horizontal Linearity - 44 - Horizontal Linearity Balance - 48 - Vertical Position - 50 - Vertical Size - 52 - Vertical Pincushion - 54 - Vertical Pincushion Balance - 56 - Vertical Misconvergence - 58 - Vertical Linearity - 60 - Vertical Linearity Balance - 64 - Parallelogram Distortion - 66 - Trapezoidal Distortion - 68 - Tilt - 70 - Top Corner Distortion Control - 72 - Top Corner Distortion Balance - 74 - Bottom Corner Distortion Control - 76 - Bottom Corner Distortion Balance - 86 - MoirHorizontal - 88 - MoirVertical - 94 - Input Level Select - 96 - Input Source Select - 98 - Stereo Mode - 108 - Video Black Level Red - 110 - Video Black Level Green - 112 - Video Black Level Blue - - - 131 - - description - VESA Command - ranges - - - usages - - 0 - Undefined - 1 - Settings - 2 - Degauss - - - 132 - - description - Power Device - ranges - - - usages - - 0 - Undefined - 1 - iName - 2 - PresentStatus - 3 - ChangedStatus - 4 - UPS - 5 - PowerSupply - 16 - BatterySystem - 17 - BatterySystemID - 18 - Battery - 19 - BatteryID - 20 - Charger - 21 - ChargerID - 22 - PowerConverter - 23 - PowerConverterID - 24 - OutletSystem - 25 - OutletSystemID - 26 - Input - 27 - InputID - 28 - Output - 29 - OutputID - 30 - Flow - 31 - FlowID - 32 - Outlet - 33 - OutletID - 34 - Gang - 35 - GangID - 36 - Sink - 37 - SinkID - 48 - Voltage - 49 - Current - 50 - Frequency - 51 - ApparentPower - 52 - ActivePower - 53 - PercentLoad - 54 - Temperature - 55 - Humidity - 64 - ConfigVoltage - 65 - ConfigCurrent - 66 - ConfigFrequency - 67 - ConfigApparentPower - 68 - ConfigActivePower - 69 - ConfigPercentLoad - 70 - ConfigTemperature - 71 - ConfigHumidity - 80 - SwitchOnControl - 81 - SwitchOffControl - 82 - ToggleControl - 83 - LowVoltageTransfer - 84 - HighVoltageTransfer - 85 - DelayBeforeReboot - 86 - DelayBeforeStartup - 87 - DelayBeforeShutdown - 88 - Test - 89 - Vendorspecificcommand - 96 - Present - 97 - Good - 98 - InternalFailure - 99 - VoltageOutOfRange - 100 - FrequencyOutOfRange - 101 - Overload - 102 - OverCharged - 103 - OverTemperature - 104 - ShutdownRequested - 105 - ShutdownImminent - 106 - VendorSpecificAnswerValid - 107 - SwitchOn/Off - 108 - Switcheble - 109 - Used - 110 - Boost - 111 - Buck - 112 - Initialized - 113 - Tested - - - 133 - - description - Battery System - ranges - - - usages - - 0 - Undefined - 1 - SMBBatteryMode - 2 - SMBBatteryStatus - 3 - SMBAlarmWarning - 4 - SMBChargerMode - 5 - SMBChargerStatus - 6 - SMBChargerSpecInfo - 7 - SMBSelectorState - 8 - SMBSelectorPreset - 9 - SMBSelectorInfo - 16 - OptionalMfgFunction1 - 17 - OptionalMfgFunction2 - 18 - OptionalMfgFunction3 - 19 - OptionalMfgFunction4 - 20 - OptionalMfgFunction5 - 21 - ConnectionToSMBus - 22 - OutputConnection - 23 - ChargerConnection - 24 - BatteryInsertion - 25 - Usenext - 26 - OKToUse - 40 - ManufacturerAccess - 41 - RemainingCapacityLimit - 42 - RemainingTimeLimit - 43 - AtRate - 44 - CapacityMode - 45 - BroadcastToCharger - 46 - PrimaryBattery - 47 - ChargeController - 64 - TerminateCharge - 65 - TermminateDischarge - 66 - BelowRemainingCapacityLimit - 67 - RemainingTimeLimitExpired - 68 - Charging - 69 - Discharging - 70 - FullyCharged - 71 - FullyDischarged - 72 - ConditionningFlag - 73 - AtRateOK - 74 - SMBErrorCode - 75 - NeedReplacement - 96 - AtRateTimeToFull - 97 - AtRateTimeToEmpty - 98 - AverageCurrent - 99 - Maxerror - 100 - RelativeStateOfCharge - 101 - AbsoluteStateOfCharge - 102 - RemainingCapacity - 103 - FullChargeCapacity - 104 - RunTimeToEmpty - 105 - AverageTimeToEmpty - 106 - AverageTimeToFull - 107 - CycleCount - 128 - BattPackModelLevel - 129 - InternalChargeController - 130 - PrimaryBatterySupport - 131 - DesignCapacity - 132 - SpecificationInfo - 133 - ManufacturerDate - 134 - SerialNumber - 135 - iManufacturerName - 136 - iDevicename - 137 - iDeviceChemistery - 138 - iManufacturerData - 139 - Rechargeable - 140 - WarningCapacityLimit - 141 - CapacityGranularity1 - 142 - CapacityGranularity2 - 192 - InhibitCharge - 193 - EnablePolling - 194 - ResetToZero - 208 - ACPresent - 209 - BatteryPresent - 210 - PowerFail - 211 - AlarmInhibited - 212 - ThermistorUnderRange - 213 - ThermistorHot - 214 - ThermistorCold - 215 - ThermistorOverRange - 216 - VoltageOutOfRange - 217 - CurrentOutOfRange - 218 - CurrentNotRegulated - 219 - VoltageNotRegulated - 220 - MasterMode - 221 - ChargerBattery/HostControlled - 240 - ChargerSpecInfo - 241 - ChargerSpecRef - 242 - Level2 - 243 - Level3 - - - 140 - - description - Bar Code Scanner - ranges - - - usages - - - - 141 - - description - Scale Device - ranges - - - usages - - - - 144 - - description - Camera Control - ranges - - - usages - - - - 145 - - description - Arcade Device - ranges - - - usages - - 233 - Base Up - 234 - Base Down - - - - diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/Info.plist b/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/Info.plist deleted file mode 100644 index c0ff6501..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Resources/Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - BuildMachineOSBuild - 15C50 - CFBundleDevelopmentRegion - English - CFBundleExecutable - DDHidLib - CFBundleIdentifier - org.dribin.dave.DDHidLib - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.1.1 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 1010.9.0 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 7C68 - DTPlatformVersion - GM - DTSDKBuild - 15C43 - DTSDKName - macosx10.11 - DTXcode - 0720 - DTXcodeBuild - 7C68 - - diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleMikey.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleMikey.h deleted file mode 100644 index c6bea0d3..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidAppleMikey.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidAppleMikey : DDHidDevice -{ - NSMutableArray * mPressElements; - - id mDelegate; -} - -+ (NSArray *) allMikeys; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Elements - -- (NSArray *) pressElements; - -- (unsigned) numberOfKeys; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -@interface NSObject (DDHidAppleMikeyDelegate) - -- (void) ddhidAppleMikey: (DDHidAppleMikey *) mikey - press: (unsigned) usageId - upOrDown:(BOOL)upOrDown; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidDevice.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidDevice.h deleted file mode 100644 index 40b9fdb3..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidDevice.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#include -#include -#include -#include - -@class DDHidUsage; -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidDevice : NSObject -{ - io_object_t mHidDevice; - IOHIDDeviceInterface122** mDeviceInterface; - - NSMutableDictionary * mProperties; - DDHidUsage * mPrimaryUsage; - NSMutableArray * mUsages; - NSArray * mElements; - NSMutableDictionary * mElementsByCookie; - BOOL mListenInExclusiveMode; - DDHidQueue * mDefaultQueue; - int mTag; - int mLogicalDeviceNumber; -} - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error; -- (id) initLogicalWithDevice: (io_object_t) device - logicalDeviceNumber: (int) logicalDeviceNumber - error: (NSError **) error; -- (int) logicalDeviceCount; - -#pragma mark - -#pragma mark Finding Devices - -+ (NSArray *) allDevices; - -+ (NSArray *) allDevicesMatchingUsagePage: (unsigned) usagePage - usageId: (unsigned) usageId - withClass: (Class) hidClass - skipZeroLocations: (BOOL) emptyLocation; - -+ (NSArray *) allDevicesMatchingCFDictionary: (CFDictionaryRef) matchDictionary - withClass: (Class) hidClass - skipZeroLocations: (BOOL) emptyLocation; - -#pragma mark - -#pragma mark I/O Kit Objects - -- (io_object_t) ioDevice; -- (IOHIDDeviceInterface122**) deviceInterface; - -#pragma mark - -#pragma mark Operations - -- (void) open; -- (void) openWithOptions: (UInt32) options; -- (void) close; -- (DDHidQueue *) createQueueWithSize: (unsigned) size; -- (long) getElementValue: (DDHidElement *) element; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (BOOL) listenInExclusiveMode; -- (void) setListenInExclusiveMode: (BOOL) flag; - -- (void) startListening; - -- (void) stopListening; - -- (BOOL) isListening; - -#pragma mark - -#pragma mark Properties - -- (NSDictionary *) properties; - -- (NSArray *) elements; -- (DDHidElement *) elementForCookie: (IOHIDElementCookie) cookie; - -- (NSString *) productName; -- (NSString *) manufacturer; -- (NSString *) serialNumber; -- (NSString *) transport; -- (long) vendorId; -- (long) productId; -- (long) version; -- (long) locationId; -- (long) usagePage; -- (long) usage; -- (DDHidUsage *) primaryUsage; -- (NSArray *) usages; - -- (NSComparisonResult) compareByLocationId: (DDHidDevice *) device; - -- (int) tag; -- (void) setTag: (int) theTag; - -@end - -@interface DDHidDevice (Protected) - -- (unsigned) sizeOfDefaultQueue; -- (void) addElementsToDefaultQueue; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidElement.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidElement.h deleted file mode 100644 index 4e9577cd..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidElement.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#include - -@class DDHidUsage; - -@interface DDHidElement : NSObject -{ - NSDictionary * mProperties; - DDHidUsage * mUsage; - NSArray * mElements; -} - -+ (NSArray *) elementsWithPropertiesArray: (NSArray *) propertiesArray; - -+ (DDHidElement *) elementWithProperties: (NSDictionary *) properties; - -- (id) initWithProperties: (NSDictionary *) properties; - -- (NSDictionary *) properties; - -- (NSString *) stringForKey: (NSString *) key; - -- (NSString *) description; - -- (IOHIDElementCookie) cookie; -- (unsigned) cookieAsUnsigned; - -- (NSArray *) elements; -- (DDHidUsage *) usage; -- (NSString *) name; -- (BOOL) hasNullState; -- (BOOL) hasPreferredState; -- (BOOL) isArray; -- (BOOL) isRelative; -- (BOOL) isWrapping; -- (long) maxValue; -- (long) minValue; - -- (NSComparisonResult) compareByUsage: (DDHidElement *) device; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidJoystick.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidJoystick.h deleted file mode 100644 index ebf20ccb..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidJoystick.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidJoystickStick : NSObject -{ - DDHidElement * mXAxisElement; - DDHidElement * mYAxisElement; - NSMutableArray * mStickElements; - // Point of view elements (i.e. hat switches) - NSMutableArray * mPovElements; -} - -- (DDHidElement *) xAxisElement; - -- (DDHidElement *) yAxisElement; - -#pragma mark - -#pragma mark StickElements - indexed accessors - -- (unsigned int) countOfStickElements; -- (DDHidElement *) objectInStickElementsAtIndex: (unsigned int)index; - -#pragma mark - -#pragma mark PovElements - indexed accessors - -- (unsigned int) countOfPovElements; -- (DDHidElement *) objectInPovElementsAtIndex: (unsigned int)index; - -- (NSArray *) allElements; - -- (BOOL) addElement: (DDHidElement *) element; - -@end - -@interface DDHidJoystick : DDHidDevice -{ - NSMutableArray * mSticks; - NSMutableArray * mButtonElements; - NSMutableArray * mLogicalDeviceElements; - - id mDelegate; -} - -+ (NSArray *) allJoysticks; - -- (id) initLogicalWithDevice: (io_object_t) device - logicalDeviceNumber: (int) logicalDeviceNumber - error: (NSError **) error; - -- (int) logicalDeviceCount; - -#pragma mark - -#pragma mark Joystick Elements - -- (unsigned) numberOfButtons; - -- (NSArray *) buttonElements; - -#pragma mark - -#pragma mark Sticks - indexed accessors - -- (unsigned int) countOfSticks; -- (DDHidJoystickStick *) objectInSticksAtIndex: (unsigned int)index; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -#define DDHID_JOYSTICK_VALUE_MIN -65536 -#define DDHID_JOYSTICK_VALUE_MAX 65536 - -@interface NSObject (DDHidJoystickDelegate) - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - xChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - yChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - otherAxis: (unsigned) otherAxis - valueChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - stick: (unsigned) stick - povNumber: (unsigned) povNumber - valueChanged: (int) value; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - buttonDown: (unsigned) buttonNumber; - -- (void) ddhidJoystick: (DDHidJoystick *) joystick - buttonUp: (unsigned) buttonNumber; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboard.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboard.h deleted file mode 100644 index fd9200d2..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboard.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidKeyboard : DDHidDevice -{ - NSMutableArray * mKeyElements; - - id mDelegate; -} - -+ (NSArray *) allKeyboards; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Keyboards Elements - -- (NSArray *) keyElements; - -- (unsigned) numberOfKeys; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -@interface NSObject (DDHidKeyboardDelegate) - -- (void) ddhidKeyboard: (DDHidKeyboard *) keyboard - keyDown: (unsigned) usageId; - -- (void) ddhidKeyboard: (DDHidKeyboard *) keyboard - keyUp: (unsigned) usageId; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboardBarcodeScanner.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboardBarcodeScanner.h deleted file mode 100644 index 6573b016..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidKeyboardBarcodeScanner.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin, Lucas Newman - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidKeyboardBarcodeScanner : DDHidDevice -{ - NSMutableArray * mKeyElements; - - NSMutableString * mAccumulatedDigits; - NSTimer *mBarcodeInputTimer; - BOOL mIsLikelyKeyboardBarcodeScanner; - - id mDelegate; -} - -+ (NSArray *) allPossibleKeyboardBarcodeScanners; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Keyboard Elements - -- (NSArray *) keyElements; - -- (NSUInteger) numberOfKeys; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -#pragma mark - -#pragma mark Properties - -- (BOOL) isLikelyKeyboardBarcodeScanner; - -@end - -@interface NSObject (DDHidKeyboardBarcodeScannerDelegate) - -- (void) ddhidKeyboardBarcodeScanner: (DDHidKeyboardBarcodeScanner *) keyboardBarcodeScanner - gotBarcode: (NSString *) barcode; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib deleted file mode 100755 index 1257681aef2bf563d267f8c88bfdf49d655ed45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163040 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
)ZNjs_Pjwd%qFnOTx# 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 RT$St1U3y1gQpKM6?|&~!F_!=U diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib.h deleted file mode 100644 index 20d86817..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidLib.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import "DDHidDevice.h" -#import "DDHidElement.h" -#import "DDHidUsage.h" -#import "DDHidQueue.h" -#import "DDHidEvent.h" -#import "DDHidUsageTables.h" -#import "DDHidMouse.h" -#import "DDHidJoystick.h" -#import "DDHidKeyboard.h" -#import "DDHidAppleRemote.h" -#import "DDHidAppleMikey.h" -#import "DDHidKeyboardBarcodeScanner.h" diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidMouse.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidMouse.h deleted file mode 100644 index d396aba0..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidMouse.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#import "DDHidDevice.h" - -@class DDHidElement; -@class DDHidQueue; - -@interface DDHidMouse : DDHidDevice -{ - DDHidElement * mXElement; - DDHidElement * mYElement; - DDHidElement * mWheelElement; - NSMutableArray * mButtonElements; - - id mDelegate; -} - -+ (NSArray *) allMice; - -- (id) initWithDevice: (io_object_t) device error: (NSError **) error_; - -#pragma mark - -#pragma mark Mouse Elements - -- (DDHidElement *) xElement; - -- (DDHidElement *) yElement; - -- (DDHidElement *) wheelElement; - -- (NSArray *) buttonElements; - -- (unsigned) numberOfButtons; - -- (void) addElementsToQueue: (DDHidQueue *) queue; - -#pragma mark - -#pragma mark Asynchronous Notification - -- (void) setDelegate: (id) delegate; - -- (void) addElementsToDefaultQueue; - -@end - -@interface NSObject (DDHidMouseDelegate) - -- (void) ddhidMouse: (DDHidMouse *) mouse xChanged: (SInt32) deltaX; -- (void) ddhidMouse: (DDHidMouse *) mouse yChanged: (SInt32) deltaY; -- (void) ddhidMouse: (DDHidMouse *) mouse wheelChanged: (SInt32) deltaWheel; -- (void) ddhidMouse: (DDHidMouse *) mouse buttonDown: (unsigned) buttonNumber; -- (void) ddhidMouse: (DDHidMouse *) mouse buttonUp: (unsigned) buttonNumber; - -@end - diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidQueue.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidQueue.h deleted file mode 100644 index 315d0031..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidQueue.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import -#include - -@class DDHidElement; -@class DDHidEvent; - -@interface DDHidQueue : NSObject -{ - IOHIDQueueInterface ** mQueue; - NSRunLoop * mRunLoop; - BOOL mStarted; - - id mDelegate; - CFRunLoopSourceRef mEventSource; -} - -- (id) initWithHIDQueue: (IOHIDQueueInterface **) queue - size: (unsigned) size; - -- (void) addElement: (DDHidElement *) element; - -- (void) addElements: (NSArray *) elements; - -- (void) addElements: (NSArray *) elements recursively: (BOOL) recursively; - -- (void) setDelegate: (id) delegate; - -- (void) startOnCurrentRunLoop; - -- (void) startOnRunLoop: (NSRunLoop *) runLoop; - -- (void) stop; - -- (BOOL) isStarted; - -- (BOOL) getNextEvent: (IOHIDEventStruct *) event; - -- (DDHidEvent *) nextEvent; - -@end - -@interface NSObject (DDHidQueueDelegate) - -- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsageTables.h b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsageTables.h deleted file mode 100644 index be8d46ed..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/DDHidUsageTables.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2007 Dave Dribin - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#import - - -@interface DDHidUsageTables : NSObject -{ - NSDictionary * mLookupTables; -} - -+ (DDHidUsageTables *) standardUsageTables; - -- (id) initWithLookupTables: (NSDictionary *) lookupTables; - -- (NSString *) descriptionForUsagePage: (unsigned) usagePage - usage: (unsigned) usage; - -@end diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/DDHidStandardUsages.plist b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/DDHidStandardUsages.plist deleted file mode 100644 index 84eb663f..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/DDHidStandardUsages.plist +++ /dev/null @@ -1,2327 +0,0 @@ - - - - - 1 - - description - Generic Desktop - ranges - - - usages - - 0 - Undefined - 1 - Pointer - 2 - Mouse - 3 - Reserved - 4 - Joystick - 5 - Game Pad - 6 - Keyboard - 7 - Keypad - 8 - Multi-axis Controller - 48 - X - 49 - Y - 50 - Z - 51 - Rx - 52 - Ry - 53 - Rz - 54 - Slider - 55 - Dial - 56 - Wheel - 57 - Hat Switch - 58 - Counted Buffer - 59 - Byte Count - 60 - Motion Wakeup - 64 - Vx - 65 - Vy - 66 - Vz - 67 - Vbrx - 68 - Vbry - 69 - Vbrx - 70 - Vno - 128 - System Control - 129 - System Power Down - 130 - System Sleep - 131 - System Wake Up - 132 - System Context Menu - 133 - System Main Menu - 134 - System App Menu - 135 - System Menu Help - 136 - System Menu Exit - 137 - System Menu Select - 138 - System Menu Right - 139 - System Menu Left - 140 - System Menu Up - 141 - System Menu Down - 144 - D-pad Up - 145 - D-pad Down - 146 - D-pad Right - 147 - D-pad Left - - - 2 - - description - Simulation Controls - ranges - - - usages - - 0 - Undefined - 1 - Flight Simulation Device - 2 - Automobile Simulation Device - 3 - Tank Simulation Device - 4 - Spaceship Simulation Device - 5 - Submarine Simulation Device - 6 - Sailing Simulation Device - 7 - Motorcycle Simulation Device - 8 - Sports Simulation Device - 9 - Airplane Simulation Device - 10 - Helicopter Simulation Device - 11 - Magic Carpet Simulation Device - 12 - Bicycle - 32 - Flight Control Stick - 33 - Flight Stick - 34 - Cyclic Control - 35 - Cyclic Trim - 36 - Flight Yoke - 37 - Track Control - 38 - Driving Control - 176 - Aileron - 177 - Aileron Trim - 178 - Anti-Torque Control - 179 - Auto-pilot Enable - 180 - Chaff Release - 181 - Collective Control - 182 - Dive Brake - 183 - Electronic Counter Measures - 184 - Elevator - 185 - Elevator Trim - 186 - Rudder - 187 - Throttle - 188 - Flight Communication - 189 - Flare Release - 190 - Landing Gear - 191 - Toe Brake - 192 - Trigger - 193 - Weapons Arm - 194 - Weapons Select - 195 - Wing Flaps - 196 - Accelerator - 197 - Brake - 198 - Clutch - 199 - Shifter - 200 - Steering - 201 - Turret Direction - 202 - Barrel Elevation - 203 - Dive Plane - 204 - Ballast - 205 - Bicycle Crank - 206 - Handle Bars - 207 - Front Brake - 208 - Rear Brake - - - 3 - - description - VR Controls - ranges - - - usages - - 0 - Unidentified - 1 - Belt - 2 - Body Suit - 3 - Flexor - 4 - Glove - 5 - Head Tracker - 6 - Head Mounted Display - 7 - Hand Tracker - 8 - Oculometer - 9 - Vest - 10 - Animatronic Device - 32 - Stereo Enable - 33 - Display Enable - - - 4 - - description - Sports Controls - ranges - - - usages - - 0 - Unidentified - 1 - Baseball Bat - 2 - Golf Club - 3 - Rowing Machine - 4 - Treadmill - 48 - Oar - 49 - Slope - 50 - Rate - 51 - Stick Speed - 52 - Stick Face Angle - 53 - Stick Heel/Toe - 54 - Stick Follow Through - 55 - Stick Tempo - 56 - Stick Type - 57 - Stick Height - 80 - Putter - 81 - 1 Iron - 82 - 2 Iron - 83 - 3 Iron - 84 - 4 Iron - 85 - 5 Iron - 86 - 6 Iron - 87 - 7 Iron - 88 - 8 Iron - 89 - 9 Iron - 90 - 10 Iron - 91 - 11 Iron - 92 - Sand Wedge - 93 - Loft Wedge - 94 - Power Wedge - 95 - 1 Wood - 96 - 3 Wood - 97 - 5 Wood - 98 - 7 Wood - 99 - 9 Wood - - - 5 - - description - Game Controls - ranges - - - usages - - 0 - Undefined - 1 - 3D Game Controller - 2 - Pinball Device - 3 - Gun Device - 32 - Point of View - 33 - Turn Right/Left - 34 - Pitch Right/Left - 35 - Roll Forward/Backward - 36 - Move Right/Left - 37 - Move Forward/Backward - 38 - Move Up/Down - 39 - Lean Right/Left - 40 - Lean Forward/Backward - 41 - Height of POV - 42 - Flipper - 43 - Secondary Flipper - 44 - Bump - 45 - New Game - 46 - Shoot Ball - 47 - Player - 48 - Gun Bolt - 49 - Gun Clip - 50 - Gun Selector - 51 - Gun Single Shot - 52 - Gun Burst - 53 - Gun Automatic - 54 - Gun Safety - 55 - Gamepad Fire/Jump - 57 - Gamepad Trigger - - - 7 - - description - Keyboard - ranges - - - usages - - 0 - No Event - 1 - Keyboard ErrorRollOver - 2 - Keyboard POSTFail - 3 - Keyboard ErrorUndefined - 4 - Keyboard a and A - 5 - Keyboard b and B - 6 - Keyboard c and C - 7 - Keyboard d and D - 8 - Keyboard e and E - 9 - Keyboard f and F - 10 - Keyboard g and G - 11 - Keyboard h and H - 12 - Keyboard i and I - 13 - Keyboard j and J - 14 - Keyboard k and K - 15 - Keyboard l and L - 16 - Keyboard m and M - 17 - Keyboard n and N - 18 - Keyboard o and O - 19 - Keyboard p and P - 20 - Keyboard q and Q - 21 - Keyboard r and R - 22 - Keyboard s and S - 23 - Keyboard t and T - 24 - Keyboard u and U - 25 - Keyboard v and V - 26 - Keyboard w and W - 27 - Keyboard x and X - 28 - Keyboard y and Y - 29 - Keyboard z and Z - 30 - Keyboard 1 and ! - 31 - Keyboard 2 and @ - 32 - Keyboard 3 and # - 33 - Keyboard 4 and $ - 34 - Keyboard 5 and % - 35 - Keyboard 6 and ^ - 36 - Keyboard 7 and & - 37 - Keyboard 8 and * - 38 - Keyboard 9 and ( - 39 - Keyboard 0 and ) - 40 - Keyboard Return (ENTER) - 41 - Keyboard ESCAPE - 42 - Keyboard DELETE (Backspace) - 43 - Keyboard Tab - 44 - Keyboard Spacebar - 45 - Keyboard - and (underscore) - 46 - Keyboard = and + - 47 - Keyboard [ and { - 48 - Keyboard ] and } - 49 - Keyboard \ and | - 50 - Keyboard Non-US # and ~ - 51 - Keyboard ; and : - 52 - Keyboard ' and " - 53 - Keyboard Grave Accent and Tilde - 54 - Keyboard, and < - 55 - Keyboard . and > - 56 - Keyboard / and ? - 57 - Keyboard Caps Lock - 58 - Keyboard F1 - 59 - Keyboard F2 - 60 - Keyboard F3 - 61 - Keyboard F4 - 62 - Keyboard F5 - 63 - Keyboard F6 - 64 - Keyboard F7 - 65 - Keyboard F8 - 66 - Keyboard F9 - 67 - Keyboard F10 - 68 - Keyboard F11 - 69 - Keyboard F12 - 70 - Keyboard PrintScreen - 71 - Keyboard Scroll Lock - 72 - Keyboard Pause - 73 - Keyboard Insert - 74 - Keyboard Home - 75 - Keyboard PageUp - 76 - Keyboard Delete Forward - 77 - Keyboard End - 78 - Keyboard PageDown - 79 - Keyboard RightArrow - 80 - Keyboard LeftArrow - 81 - Keyboard DownArrow - 82 - Keyboard UpArrow - 83 - Keypad Num Lock and Clear - 84 - Keypad / - 85 - Keypad * - 86 - Keypad - - 87 - Keypad + - 88 - Keypad ENTER - 89 - Keypad 1 and End - 90 - Keypad 2 and Down Arrow - 91 - Keypad 3 and PageDn - 92 - Keypad 4 and Left Arrow - 93 - Keypad 5 - 94 - Keypad 6 and Right Arrow - 95 - Keypad 7 and Home - 96 - Keypad 8 and Up Arrow - 97 - Keypad 9 and PageUp - 98 - Keypad 0 and Insert - 99 - Keypad . and Delete - 100 - Keyboard Non-US \ and | - 101 - Keyboard Application - 102 - Keyboard Power - 103 - Keypad = - 104 - Keyboard F13 - 105 - Keyboard F14 - 106 - Keyboard F15 - 107 - Keyboard F16 - 108 - Keyboard F17 - 109 - Keyboard F18 - 110 - Keyboard F19 - 111 - Keyboard F20 - 112 - Keyboard F21 - 113 - Keyboard F22 - 114 - Keyboard F23 - 115 - Keyboard F24 - 116 - Keyboard Execute - 117 - Keyboard Help - 118 - Keyboard Menu - 119 - Keyboard Select - 120 - Keyboard Stop - 121 - Keyboard Again - 122 - Keyboard Undo - 123 - Keyboard Cut - 124 - Keyboard Copy - 125 - Keyboard Paste - 126 - Keyboard Find - 127 - Keyboard Mute - 128 - Keyboard Volume Up - 129 - Keyboard Volume Down - 130 - Keyboard Locking Caps Lock - 131 - Keyboard Locking Num Lock - 132 - Keyboard Locking Scroll Lock - 133 - Keypad Comma - 134 - Keypad Equal Sign - 135 - Keyboard International1 - 136 - Keyboard International2 - 137 - Keyboard International3 - 138 - Keyboard International4 - 139 - Keyboard International5 - 140 - Keyboard International6 - 141 - Keyboard International7 - 142 - Keyboard International8 - 143 - Keyboard International9 - 144 - Keyboard LANG1 - 145 - Keyboard LANG2 - 146 - Keyboard LANG3 - 147 - Keyboard LANG4 - 148 - Keyboard LANG5 - 149 - Keyboard LANG6 - 150 - Keyboard LANG7 - 151 - Keyboard LANG8 - 152 - Keyboard LANG9 - 153 - Keyboard Alternate Erase - 154 - Keyboard SysReq/Attention - 155 - Keyboard Cancel - 156 - Keyboard Clear - 157 - Keyboard Prior - 158 - Keyboard Return - 159 - Keyboard Separator - 160 - Keyboard Out - 161 - Keyboard Oper - 162 - Keyboard Clear/Again - 163 - Keyboard CrSel/Props - 164 - Keyboard ExSel - 224 - Keyboard LeftControl - 225 - Keyboard LeftShift - 226 - Keyboard LeftAlt - 227 - Keyboard Left GUI - 228 - Keyboard RightControl - 229 - Keyboard RightShift - 230 - Keyboard RightAlt - 231 - Keyboard Right GUI - - - 8 - - description - LEDs - ranges - - {76, 65535} - Reserved - - usages - - 0 - Undefined - 1 - Num Lock - 2 - Caps Lock - 3 - Scroll Lock - 4 - Compose - 5 - Kana - 6 - Power - 7 - Shift - 8 - Do Not Disturb - 9 - Mute - 10 - Tone Enable - 11 - High Cut Filter - 12 - Low Cut Filter - 13 - Equalizer Enable - 14 - Sound Field On - 15 - Surround Field On - 16 - Repeat - 17 - Stereo - 18 - Sampling Rate Detect - 19 - Spinning - 20 - CAV - 21 - CLV - 22 - Recording Format Detect - 23 - Off-Hook - 24 - Ring - 25 - Message Waiting - 26 - Data Mode - 27 - Battery Operation - 28 - Battery OK - 29 - Battery Low - 30 - Speaker - 31 - Head Set - 32 - Hold - 33 - Microphone - 34 - Coverage - 35 - Night Mode - 36 - Send Calls - 37 - Call Pickup - 38 - Conference - 39 - Stand-by - 40 - Camera On - 41 - Camera Off - 42 - On-Line - 43 - Off-Line - 44 - Busy - 45 - Ready - 46 - Paper-Out - 47 - Paper-Jam - 48 - Remote - 49 - Forward - 50 - Reverse - 51 - Stop - 52 - Rewind - 53 - Fast Forward - 54 - Play - 55 - Pause - 56 - Record - 57 - Error - 58 - Usage Selected Indicator - 59 - Usage In Use Indicator - 60 - Usage Multi Mode Indicator - 61 - Indicator On - 62 - Indicator Flash - 63 - Indicator Slow Blink - 64 - Indicator Fast Blink - 65 - Indicator Off - 66 - Flash On Time - 67 - Slow Blink On Time - 68 - Slow Blink Off Time - 69 - Fast Blink On Time - 70 - Fast Blink Off Time - 71 - Usage Indicator Color - 72 - Red - 73 - Green - 74 - Amber - 75 - Generic Indicator - 76 - System Suspend - 77 - External Power Connected - - - 9 - - default - Button %d - description - Button - ranges - - - usages - - 0 - No Button Pressed - - - 10 - - default - Instance %d - description - Ordinal - ranges - - - usages - - 0 - Unused - - - 11 - - description - Telephony - ranges - - - usages - - 0 - Unassigned - 1 - Phone - 2 - Answering Machine - 3 - Message Controls - 4 - Handset - 5 - Headset - 6 - Telephony Key Pad - 7 - Programmable Button - 32 - Hook Switch - 33 - Flash - 34 - Feature - 35 - Hold - 36 - Redial - 37 - Transfer - 38 - Drop - 39 - Park - 40 - Forward Calls - 41 - Alternate Function - 42 - Line - 43 - Speaker Phone - 44 - Conference - 45 - Ring Enable - 46 - Ring Select - 47 - Phone Mute - 48 - Caller ID - 80 - Speed Dial - 81 - Store Number - 82 - Recall Number - 83 - Phone Directory - 112 - Voice Mail - 113 - Screen Calls - 114 - Do Not Disturb - 115 - Message - 116 - Answer On/Off - 144 - Inside Dial Tone - 145 - Outside Dial Tone - 146 - Inside Ring Tone - 147 - Outside Ring Tone - 148 - Priority Ring Tone - 149 - Inside Ringback - 150 - Priority Ringback - 151 - Line Busy Tone - 152 - Reorder Tone - 153 - Call Waiting Tone - 154 - Confirmation Tone 1 - 155 - Confirmation Tone 2 - 156 - Tones Off - 176 - Phone Key 0 - 177 - Phone Key 1 - 178 - Phone Key 2 - 179 - Phone Key 3 - 180 - Phone Key 4 - 181 - Phone Key 5 - 182 - Phone Key 6 - 183 - Phone Key 7 - 184 - Phone Key 8 - 185 - Phone Key 9 - 186 - Phone Key Star - 187 - Phone Key Pound - 188 - Phone Key A - 189 - Phone Key B - 190 - Phone Key C - 191 - Phone Key D - - - 12 - - description - Consumer - ranges - - - usages - - 0 - Unassigned - 1 - Consumer Control - 2 - Numeric Key Pad - 3 - Programmable Buttons - 32 - +10 - 33 - +100 - 34 - AM/PM - 48 - Power - 49 - Reset - 50 - Sleep - 51 - Sleep After - 52 - Sleep Mode - 53 - Illumination - 54 - Function Buttons - 64 - Menu - 65 - Menu Pick - 66 - Menu Up - 67 - Menu Down - 68 - Menu Left - 69 - Menu Right - 70 - Menu Escape - 71 - Menu Value Increase - 72 - Menu Value Decrease - 96 - Data On Screen - 97 - Closed Caption - 98 - Closed Caption Select - 99 - VCR/TV - 100 - Broadcast Mode - 101 - Snapshot - 102 - Still - 128 - Selection - 129 - Assign Selection - 130 - Mode Step - 131 - Recall Last - 132 - Enter Channel - 133 - Order Movie - 134 - Channel - 135 - Media Selection - 136 - Media Select Computer - 137 - Media Select TV - 138 - Media Select WWW - 139 - Media Select DVD - 140 - Media Select Telephone - 141 - Media Select Program Guide - 142 - Media Select Video Phone - 143 - Media Select Games - 144 - Media Select Messages - 145 - Media Select CD - 146 - Media Select VCR - 147 - Media Select Tuner - 148 - Quit - 149 - Help - 150 - Media Select Tape - 151 - Media Select Cable - 152 - Media Select Satellite - 153 - Media Select Security - 154 - Media Select Home - 155 - Media Select Call - 156 - Channel Increment - 157 - Channel Decrement - 158 - Media Select SAP - 160 - VCR Plus - 161 - Once - 162 - Daily - 163 - Weekly - 164 - Monthly - 176 - Play - 177 - Pause - 178 - Record - 179 - Fast Forward - 180 - Rewind - 181 - Scan Next Track - 182 - Scan Previous Track - 183 - Stop - 184 - Eject - 185 - Random Play - 186 - Select DisC - 187 - Enter Disc - 188 - Repeat - 189 - Tracking - 190 - Track Normal - 191 - Slow Tracking - 192 - Frame Forward - 193 - Frame Back - 194 - Mark - 195 - Clear Mark - 196 - Repeat From Mark - 197 - Return To Mark - 198 - Search Mark Forward - 199 - Search Mark Backwards - 200 - Counter Reset - 201 - Show Counter - 202 - Tracking Increment - 203 - Tracking Decrement - 205 - Pause/Play - 224 - Volume - 225 - Balance - 226 - Mute - 227 - Bass - 228 - Treble - 229 - Bass Boost - 230 - Surround Mode - 231 - Loudness - 232 - MPX - 233 - Volume Up - 234 - Volume Down - 240 - Speed Select - 241 - Playback Speed - 242 - Standard Play - 243 - Long Play - 244 - Extended Play - 245 - Slow - 256 - Fan Enable - 257 - Fan Speed - 258 - Light - 259 - Light Illumination Level - 260 - Climate Control Enable - 261 - Room Temperature - 262 - Security Enable - 263 - Fire Alarm - 264 - Police Alarm - 336 - Balance Right - 337 - Balance Left - 338 - Bass Increment - 339 - Bass Decrement - 340 - Treble Increment - 341 - Treble Decrement - 352 - Speaker System - 353 - Channel Left - 354 - Channel Right - 355 - Channel Center - 356 - Channel Front - 357 - Channel Center Front - 358 - Channel Side - 359 - Channel Surround - 360 - Channel Low Frequency Enhancement - 361 - Channel Top - 362 - Channel Unknown - 368 - Sub-channel - 369 - Sub-channel Increment - 370 - Sub-channel Decrement - 371 - Alternate Audio Increment - 372 - Alternate Audio Decrement - 384 - Application Launch Buttons - 385 - AL Launch Button Configuration Tool - 386 - AL Programmable Button Configuration - 387 - AL Consumer Control Configuration - 388 - AL Word Processor - 389 - AL Text Editor - 390 - AL Spreadsheet - 391 - AL Graphics Editor - 392 - AL Presentation App - 393 - AL Database App - 394 - AL Email Reader - 395 - AL Newsreader - 396 - AL Voicemail - 397 - AL Contacts/Address Book - 398 - AL Calendar/Schedule - 399 - AL Task/Project Manager - 400 - AL Log/Journal/Timecard - 401 - AL Checkbook/Finance - 402 - AL Calculator - 403 - AL A/V Capture/Playback - 404 - AL Local Machine Browser - 405 - AL LAN/WAN Browser - 406 - AL Internet Browser - 407 - AL Remote Networking/ISP Connect - 408 - AL Network Conference - 409 - AL Network Chat - 410 - AL Telephony/Dialer - 411 - AL Logon - 412 - AL Logoff - 413 - AL Logon/Logoff - 414 - AL Terminal Lock/Screensaver - 415 - AL Control Panel - 416 - AL Command Line Processor/Run - 417 - AL Process/Task Manager - 418 - AL Select Tast/Application - 419 - AL Next Task/Application - 420 - AL Previous Task/Application - 421 - AL Preemptive Halt Task/Application - 423 - AL My Documents - 427 - AC Spell - 438 - AL My Pictures - 439 - AL My Music - 512 - Generic GUI Application Controls - 513 - AC New - 514 - AC Open - 515 - AC Close - 516 - AC Exit - 517 - AC Maximize - 518 - AC Minimize - 519 - AC Save - 520 - AC Print - 521 - AC Properties - 538 - AC Undo - 539 - AC Copy - 540 - AC Cut - 541 - AC Paste - 542 - AC Select All - 543 - AC Find - 544 - AC Find and Replace - 545 - AC Search - 546 - AC Go To - 547 - AC Home - 548 - AC Back - 549 - AC Forward - 550 - AC Stop - 551 - AC Refresh - 552 - AC Previous Link - 553 - AC Next Link - 554 - AC Bookmarks - 555 - AC History - 556 - AC Subscriptions - 557 - AC Zoom In - 558 - AC Zoom Out - 559 - AC Zoom - 560 - AC Full Screen View - 561 - AC Normal View - 562 - AC View Toggle - 563 - AC Scroll Up - 564 - AC Scroll Down - 565 - AC Scroll - 566 - AC Pan Left - 567 - AC Pan Right - 568 - AC Pan - 569 - AC New Window - 570 - AC Tile Horizontally - 571 - AC Tile Vertically - 572 - AC Format - 633 - AC Redo - 649 - AC Reply - 651 - AC Fwd - 652 - AC Send - - - 13 - - description - Digitizer - ranges - - - usages - - 0 - Undefined - 1 - Digitizer - 2 - Pen - 3 - Light Pen - 4 - Touch Screen - 5 - Touch Pad - 6 - White Board - 7 - Coordinate Measuring Machine - 8 - 3-D Digitizer - 9 - Stereo Plotter - 10 - Articulated Arm - 11 - Armature - 12 - Multiple Point Digitizer - 13 - Free Space Wand - 32 - Stylus - 33 - Puck - 34 - Finger - 48 - Tip Pressure - 49 - Barrel Pressure - 50 - In Range - 51 - Touch - 52 - Untouch - 53 - Tap - 54 - Quality - 55 - Data Valid - 56 - Transducer Index - 57 - Tablet Function Keys - 58 - Program Change Keys - 59 - Battery Strength - 60 - Invert - 61 - X Tilt - 62 - Y Tilt - 63 - Azimuth - 64 - Altitude - 65 - Twist - 66 - Tip Switch - 67 - Secondary Tip Switch - 68 - Barrel Switch - 69 - Eraser - 70 - Tablet Pick - - - 15 - - description - Physical Interface Device - ranges - - - usages - - - - 16 - - default - Unicode Char u%04x - description - Unicode - ranges - - - usages - - - - 20 - - description - Alphnumeric Display - ranges - - - usages - - 0 - Undefined - 1 - Alphanumeric Display - 32 - Display Attributes Report - 33 - ASCII Character Set - 34 - Data Read Back - 35 - Font Read Back - 36 - Display Control Report - 37 - Clear Display - 38 - Display Enable - 39 - Screen Saver Delay - 40 - Screen Saver Enable - 41 - Vertical Scroll - 42 - Horizontal Scroll - 43 - Character Report - 44 - Display Data - 45 - Display Status - 46 - Stat Not Ready - 47 - Stat Ready - 48 - Err Not a loadable character - 49 - Err Font data cannot be read - 50 - Cursor Position Report - 51 - Row - 52 - Column - 53 - Rows - 54 - Columns - 55 - Cursor Pixel Positioning - 56 - Cursor Mode - 57 - Cursor Enable - 58 - Cursor Blink - 59 - Font Report - 60 - Font Data - 61 - Character Width - 62 - Character Height - 63 - Character Spacing Horizontal - 64 - Character Spacing Vertical - 65 - Unicode Character Set - - - 128 - - description - Monitor - ranges - - - usages - - 0 - Undefined - 1 - Monitor Control - 2 - EDID Information - 3 - VDIF Information - 4 - VESA Version - 5 - On Screen Display - 6 - Auto Size Center - 7 - Polarity Horz Synch - 8 - Polarity Vert Synch - 9 - Sync Type - 10 - Screen Position - 11 - Horizontal Frequency - 12 - Vertical Frequency - - - 129 - - default - ENUM %d - description - Monitor Enumerated Values - ranges - - - usages - - 0 - unassigned - - - 130 - - description - VESA Virtual Controls - ranges - - - usages - - 16 - Brightness - 18 - Contrast - 22 - Video Gain Red - 24 - Video Gain Green - 26 - Video Gain Blue - 28 - Focus - 32 - Horizontal Position - 34 - Horizontal Size - 36 - Horizontal Pincushion - 38 - Horizontal Pincushion Balance - 40 - Horizontal Misconvergence - 42 - Horizontal Linearity - 44 - Horizontal Linearity Balance - 48 - Vertical Position - 50 - Vertical Size - 52 - Vertical Pincushion - 54 - Vertical Pincushion Balance - 56 - Vertical Misconvergence - 58 - Vertical Linearity - 60 - Vertical Linearity Balance - 64 - Parallelogram Distortion - 66 - Trapezoidal Distortion - 68 - Tilt - 70 - Top Corner Distortion Control - 72 - Top Corner Distortion Balance - 74 - Bottom Corner Distortion Control - 76 - Bottom Corner Distortion Balance - 86 - MoirHorizontal - 88 - MoirVertical - 94 - Input Level Select - 96 - Input Source Select - 98 - Stereo Mode - 108 - Video Black Level Red - 110 - Video Black Level Green - 112 - Video Black Level Blue - - - 131 - - description - VESA Command - ranges - - - usages - - 0 - Undefined - 1 - Settings - 2 - Degauss - - - 132 - - description - Power Device - ranges - - - usages - - 0 - Undefined - 1 - iName - 2 - PresentStatus - 3 - ChangedStatus - 4 - UPS - 5 - PowerSupply - 16 - BatterySystem - 17 - BatterySystemID - 18 - Battery - 19 - BatteryID - 20 - Charger - 21 - ChargerID - 22 - PowerConverter - 23 - PowerConverterID - 24 - OutletSystem - 25 - OutletSystemID - 26 - Input - 27 - InputID - 28 - Output - 29 - OutputID - 30 - Flow - 31 - FlowID - 32 - Outlet - 33 - OutletID - 34 - Gang - 35 - GangID - 36 - Sink - 37 - SinkID - 48 - Voltage - 49 - Current - 50 - Frequency - 51 - ApparentPower - 52 - ActivePower - 53 - PercentLoad - 54 - Temperature - 55 - Humidity - 64 - ConfigVoltage - 65 - ConfigCurrent - 66 - ConfigFrequency - 67 - ConfigApparentPower - 68 - ConfigActivePower - 69 - ConfigPercentLoad - 70 - ConfigTemperature - 71 - ConfigHumidity - 80 - SwitchOnControl - 81 - SwitchOffControl - 82 - ToggleControl - 83 - LowVoltageTransfer - 84 - HighVoltageTransfer - 85 - DelayBeforeReboot - 86 - DelayBeforeStartup - 87 - DelayBeforeShutdown - 88 - Test - 89 - Vendorspecificcommand - 96 - Present - 97 - Good - 98 - InternalFailure - 99 - VoltageOutOfRange - 100 - FrequencyOutOfRange - 101 - Overload - 102 - OverCharged - 103 - OverTemperature - 104 - ShutdownRequested - 105 - ShutdownImminent - 106 - VendorSpecificAnswerValid - 107 - SwitchOn/Off - 108 - Switcheble - 109 - Used - 110 - Boost - 111 - Buck - 112 - Initialized - 113 - Tested - - - 133 - - description - Battery System - ranges - - - usages - - 0 - Undefined - 1 - SMBBatteryMode - 2 - SMBBatteryStatus - 3 - SMBAlarmWarning - 4 - SMBChargerMode - 5 - SMBChargerStatus - 6 - SMBChargerSpecInfo - 7 - SMBSelectorState - 8 - SMBSelectorPreset - 9 - SMBSelectorInfo - 16 - OptionalMfgFunction1 - 17 - OptionalMfgFunction2 - 18 - OptionalMfgFunction3 - 19 - OptionalMfgFunction4 - 20 - OptionalMfgFunction5 - 21 - ConnectionToSMBus - 22 - OutputConnection - 23 - ChargerConnection - 24 - BatteryInsertion - 25 - Usenext - 26 - OKToUse - 40 - ManufacturerAccess - 41 - RemainingCapacityLimit - 42 - RemainingTimeLimit - 43 - AtRate - 44 - CapacityMode - 45 - BroadcastToCharger - 46 - PrimaryBattery - 47 - ChargeController - 64 - TerminateCharge - 65 - TermminateDischarge - 66 - BelowRemainingCapacityLimit - 67 - RemainingTimeLimitExpired - 68 - Charging - 69 - Discharging - 70 - FullyCharged - 71 - FullyDischarged - 72 - ConditionningFlag - 73 - AtRateOK - 74 - SMBErrorCode - 75 - NeedReplacement - 96 - AtRateTimeToFull - 97 - AtRateTimeToEmpty - 98 - AverageCurrent - 99 - Maxerror - 100 - RelativeStateOfCharge - 101 - AbsoluteStateOfCharge - 102 - RemainingCapacity - 103 - FullChargeCapacity - 104 - RunTimeToEmpty - 105 - AverageTimeToEmpty - 106 - AverageTimeToFull - 107 - CycleCount - 128 - BattPackModelLevel - 129 - InternalChargeController - 130 - PrimaryBatterySupport - 131 - DesignCapacity - 132 - SpecificationInfo - 133 - ManufacturerDate - 134 - SerialNumber - 135 - iManufacturerName - 136 - iDevicename - 137 - iDeviceChemistery - 138 - iManufacturerData - 139 - Rechargeable - 140 - WarningCapacityLimit - 141 - CapacityGranularity1 - 142 - CapacityGranularity2 - 192 - InhibitCharge - 193 - EnablePolling - 194 - ResetToZero - 208 - ACPresent - 209 - BatteryPresent - 210 - PowerFail - 211 - AlarmInhibited - 212 - ThermistorUnderRange - 213 - ThermistorHot - 214 - ThermistorCold - 215 - ThermistorOverRange - 216 - VoltageOutOfRange - 217 - CurrentOutOfRange - 218 - CurrentNotRegulated - 219 - VoltageNotRegulated - 220 - MasterMode - 221 - ChargerBattery/HostControlled - 240 - ChargerSpecInfo - 241 - ChargerSpecRef - 242 - Level2 - 243 - Level3 - - - 140 - - description - Bar Code Scanner - ranges - - - usages - - - - 141 - - description - Scale Device - ranges - - - usages - - - - 144 - - description - Camera Control - ranges - - - usages - - - - 145 - - description - Arcade Device - ranges - - - usages - - 233 - Base Up - 234 - Base Down - - - - diff --git a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/Info.plist b/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index c0ff6501..00000000 --- a/radiant-player-mac/Frameworks/DDHidLib.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - BuildMachineOSBuild - 15C50 - CFBundleDevelopmentRegion - English - CFBundleExecutable - DDHidLib - CFBundleIdentifier - org.dribin.dave.DDHidLib - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.1.1 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - MacOSX - - CFBundleVersion - 1010.9.0 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 7C68 - DTPlatformVersion - GM - DTSDKBuild - 15C43 - DTSDKName - macosx10.11 - DTXcode - 0720 - DTXcodeBuild - 7C68 - -