├── ToolShelf-4-3Dconnexion ├── Assets.xcassets │ ├── Contents.json │ ├── Attention.imageset │ │ ├── Attention.png │ │ ├── Attention@2x.png │ │ ├── Attention@3x.png │ │ └── Contents.json │ ├── Logos.imageset │ │ ├── 3DconnexionLogo.png │ │ ├── 3DconnexionLogo@2x.png │ │ ├── 3DconnexionLogo@3x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ ├── 3DconnexionLogo-1.png │ │ ├── 3DconnexionLogo@2x.png │ │ └── Contents.json ├── ToolShelf-4-3Dconnexion.entitlements ├── ConnexionClientErrors.swift ├── ConnexionRemoveHandler.swift ├── 3Dconnexion-Bridging-Header.h ├── 3DConnexionDriverCheck.c ├── MyConnexionDeviceStateTuple.swift ├── ConnexionAddedHandler.swift ├── VCDriverError.swift ├── ConnexionAuxiliaries.swift ├── Info.plist ├── AppDelegate.swift ├── ConnexionMessageHandler.swift ├── VCMainView.swift ├── ConnexionClient.swift ├── ConnexionClientHelper.swift └── Base.lproj │ └── Main.storyboard ├── ToolShelf-4-3Dconnexion.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── martinmajewski.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── ToolShelf-4-3Dconnexion.xcscheme └── project.pbxproj ├── README.md └── LICENSE /ToolShelf-4-3Dconnexion/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention@2x.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Attention@3x.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo@2x.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/3DconnexionLogo@3x.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/AppIcon.appiconset/3DconnexionLogo-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/AppIcon.appiconset/3DconnexionLogo-1.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/AppIcon.appiconset/3DconnexionLogo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MartinMajewski/ToolShelf-4-3Dconnexion/HEAD/ToolShelf-4-3Dconnexion/Assets.xcassets/AppIcon.appiconset/3DconnexionLogo@2x.png -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ToolShelf-4-3Dconnexion.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.device.usb 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionClientErrors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionClientErrors.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 13.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | enum ConnexionClientError : Swift.Error { 10 | typealias RawValue = Swift.Error 11 | case CFBundleSignatureNotValid 12 | case ClientIdAlreadySet 13 | case ClientIdInvalid(clientId : UInt16) 14 | case DriverNotFound 15 | case OSErr(osErrCode : Int16) 16 | } 17 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Attention.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Attention.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "Attention@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "Attention@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/Logos.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "3DconnexionLogo.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "3DconnexionLogo@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "3DconnexionLogo@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionRemoveHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionRemoveHandler.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 24.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let removedHandler : ConnexionRemovedHandlerProc = {(deviceId : UInt32) -> Void in 12 | print("Device removed with ID \(deviceId)") 13 | 14 | CCH.Instance.connectedDevicesDictonary[deviceId] = nil 15 | 16 | AppInstance.mainVC.printConnectedDevicesFrom(Dictonary: CCH.Instance.connectedDevicesDictonary, sorted: true) 17 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/3Dconnexion-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // 3dconnexion-Bridging-Header.h 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 21.10.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | #ifndef _3dconnexion_Bridging_Header_h 10 | #define _3dconnexion_Bridging_Header_h 11 | 12 | #import "/Library/Frameworks/3DconnexionClient.framework/Headers/ConnexionClientAPI.h" 13 | #import "/Library/Frameworks/3DconnexionClient.framework/Headers/ConnexionClient.h" 14 | 15 | bool isConnexionDriverAvailable(); 16 | 17 | #endif /* _3dconnexion_Bridging_Header_h */ 18 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/3DConnexionDriverCheck.c: -------------------------------------------------------------------------------- 1 | // 2 | // weak_link.cpp 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 24.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | #include "3Dconnexion-Bridging-Header.h" 10 | 11 | extern int16_t SetConnexionHandlers( 12 | ConnexionMessageHandlerProc messageHandler, 13 | ConnexionAddedHandlerProc addedHandler, 14 | ConnexionRemovedHandlerProc removedHandler, 15 | bool useSeparateThread) __attribute__((weak_import)); 16 | 17 | 18 | 19 | bool isConnexionDriverAvailable(){ 20 | 21 | return (SetConnexionHandlers != NULL); 22 | 23 | } 24 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion.xcodeproj/xcuserdata/martinmajewski.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ToolShelf-4-3Dconnexion.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 30337CC41BE7664C00220DC6 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/MyConnexionDeviceStateTuple.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MyConnexionDeviceStateTuple.swift 3 | // 3DconnexionStatsUtility 4 | // 5 | // Created by Martin Majewski on 29.10.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | typealias MyConnexionDeviceStateTuple = ( 12 | version: UInt16, 13 | client: UInt16, 14 | 15 | command: UInt16, 16 | param: Int16, 17 | value: Int32, 18 | time: UInt64, 19 | 20 | report: (UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8), 21 | 22 | buttons8: UInt16, 23 | axis: (tx:Int16, ty:Int16, tz:Int16, rx:Int16, ry:Int16, rz:Int16), 24 | address: UInt16, 25 | buttons: UInt32); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ToolShelf-4-3Dconnexion 2 | 3 | **This repository is updated occasionally to mirror the latest changes regarding macOS and Swift. Therefore, there might be mismatches between this code and the How-To guide!** 4 | 5 | This is the accompanying repository for the How-To guide found on 6 | 7 | http://www.martinmajewski.net/how2use3dconnexionwithswift/ 8 | 9 | The guide shows how to implement a 3Dconnexion device into an OS X App written in Swift 2.1 for OS X 10.11 (ElCapitan). 10 | The resuting binary can be installed from the Apple App Store 11 | 12 | https://itunes.apple.com/us/app/toolshelf-4-3dconnexion/id1062563927 13 | 14 | Feel free to browse, use and learn from this code, as it is released under the MIT license. 15 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionAddedHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionAddHandler.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 24.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let addedHandler : ConnexionAddedHandlerProc = {(deviceId : UInt32) -> Void in 12 | print("Device added with ID \(deviceId)") 13 | 14 | if let device = CCH.DeviceDictonary[deviceId]{ 15 | CCH.Instance.connectedDevicesDictonary[deviceId] = device 16 | }else{ 17 | CCH.Instance.connectedDevicesDictonary[deviceId] = "Unknown" 18 | } 19 | 20 | AppInstance.mainVC.printConnectedDevicesFrom(Dictonary: CCH.Instance.connectedDevicesDictonary, sorted: true) 21 | 22 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/VCDriverError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VCDriverError.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 25.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | public class VCDriverError: NSViewController{ 12 | @IBOutlet var mlMessage: NSTextField! 13 | 14 | @IBAction func btnCloseApp(sender: AnyObject) { 15 | print("Closing Application now!") 16 | self.dismiss(self) 17 | AppInstance.ExitNow(sender: self) 18 | } 19 | 20 | @IBAction func btnOpenWebsiteAndCloseApp(sender: AnyObject) { 21 | if(!AppInstance.openWebsite(URL: "http://www.3dconnexion.de/service/drivers.html")) { 22 | print("failed to open") 23 | } 24 | self.dismiss(self) 25 | btnCloseApp(sender: self) 26 | } 27 | 28 | @IBAction func btnOpenMMNetAndCloseApp(sender: AnyObject) { 29 | if(!AppInstance.openWebsite(URL: "http://www.martinmajewski.net")) { 30 | print("failed to open") 31 | } 32 | self.dismiss(self) 33 | btnCloseApp(sender: self) 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Martin Majewski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "512x512", 45 | "idiom" : "mac", 46 | "filename" : "3DconnexionLogo-1.png", 47 | "scale" : "1x" 48 | }, 49 | { 50 | "size" : "512x512", 51 | "idiom" : "mac", 52 | "filename" : "3DconnexionLogo@2x.png", 53 | "scale" : "2x" 54 | } 55 | ], 56 | "info" : { 57 | "version" : 1, 58 | "author" : "xcode" 59 | } 60 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionAuxiliaries.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionAuxiliaries.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 01.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ConnexionAuxiliaries{ 12 | 13 | static func GetStringFrom(DeviceState ds: ConnexionDeviceState) -> String!{ 14 | return "--------------------------\n" + 15 | "Version:\t\(ds.version)\n" + 16 | "Client:\t\(ds.client)\n" + 17 | "Command:\t\(ds.command)\n" + 18 | "Param:\t\(ds.param)\n" + 19 | "Value:\t\(ds.value)\n" + 20 | "Time:\t\(ds.time)\n" + 21 | "Report:\t\(ds.report)\n" + 22 | "Buttons8:\t\(ds.buttons8)\n" + 23 | "Axis:\t\(ds.axis)\n" + 24 | "Address:\t\(ds.address)\n" + 25 | "Buttons:\t\(ds.buttons)" 26 | } 27 | 28 | static func GetStringFrom(DevicePrefs dp: ConnexionDevicePrefs) -> String!{ 29 | return "--------------------------\n" + 30 | "type:\t\(dp.type)\n" + 31 | "version:\t\(dp.version)\n" + 32 | "deviceID:\t\(dp.deviceID)\n" + 33 | "appSignature:\t\(dp.appSignature)\n" + 34 | "mainSpeed:\t\(dp.mainSpeed)\n" + 35 | "zoomOnY:\t\(dp.zoomOnY)\n" + 36 | "dominant:\t\(dp.dominant)\n" + 37 | "gamma:\t\(dp.gamma)\n" + 38 | "intersect:\t\(dp.intersect)\n" 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.1 21 | CFBundleSignature 22 | tsdc 23 | CFBundleVersion 24 | 5 25 | LSApplicationCategoryType 26 | public.app-category.utilities 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | NSHumanReadableCopyright 30 | Copyright © 2015 MartinMajewski.net. All rights reserved. 31 | NSMainStoryboardFile 32 | Main 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 21.10.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | let AppInstance = NSApplication.shared.delegate as! AppDelegate 12 | 13 | @NSApplicationMain 14 | class AppDelegate: NSObject, NSApplicationDelegate { 15 | 16 | var mainVC : VCMainView! 17 | 18 | override init() { 19 | super.init() 20 | } 21 | 22 | func applicationDidFinishLaunching(aNotification: NSNotification) { 23 | 24 | } 25 | 26 | func ExitNow(sender: AnyObject) { 27 | NSApplication.shared.terminate(self) 28 | } 29 | 30 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 31 | return true 32 | } 33 | 34 | func openWebsite(URL url: String) -> Bool { 35 | if let checkURL = NSURL(string: url) { 36 | if NSWorkspace.shared.open(checkURL as URL) { 37 | print("\(checkURL) successfully opened") 38 | return true 39 | } 40 | } 41 | print("invalid url: \(url)") 42 | return false 43 | } 44 | 45 | @IBAction func openMyWebsite(_ sender: AnyObject) { 46 | if(!openWebsite(URL: "http://www.martinmajewski.net")) { 47 | print("failed to open") 48 | } 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionMessageHandler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionCallbacks.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 24.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let messageHandler : ConnexionMessageHandlerProc = { (deviceId: UInt32, msgType: UInt32, msgArgPtr: UnsafeMutableRawPointer!) -> Void in 12 | //print("Inside myMessageHandler") 13 | switch(msgType){ 14 | case ConnexionClient.Msg.DeviceState: 15 | // print("Inside ConnexionClient.Msg.DeviceState") 16 | let state = msgArgPtr.assumingMemoryBound(to: ConnexionDeviceState.self) 17 | if state.pointee.client == CCH.Instance.ClientId { 18 | AppInstance.mainVC.tfActiveDevice.stringValue = "\(CCH.Instance.connectedDevicesDictonary[deviceId]!)\nDevice Id: \(deviceId)\nAddress: 0x\(String(state.pointee.address, radix: 16)) - 0d\(state.pointee.address)\n" 19 | print("Report:\t\(state.pointee.report)\n") 20 | switch(state.pointee.command){ 21 | case ConnexionClient.Cmd.HandleAxis: 22 | AppInstance.mainVC.lblTranslateX.stringValue = String(state.pointee.axis.0) 23 | AppInstance.mainVC.lblTranslateY.stringValue = String(state.pointee.axis.1) 24 | AppInstance.mainVC.lblTranslateZ.stringValue = String(state.pointee.axis.2) 25 | AppInstance.mainVC.lblRotateX.stringValue = String(state.pointee.axis.3) 26 | AppInstance.mainVC.lblRotateY.stringValue = String(state.pointee.axis.4) 27 | AppInstance.mainVC.lblRotateZ.stringValue = String(state.pointee.axis.5) 28 | break; 29 | case ConnexionClient.Cmd.HandleButtons: 30 | var outputString : String = "" 31 | for idx in 1...32{ 32 | if(CCH.Instance.isButtonActive(withId: UInt32(idx), inside: &state.pointee.buttons)){ 33 | outputString += "- \(idx) -\n" 34 | } 35 | } 36 | AppInstance.mainVC.lblActiveBtns.stringValue = outputString 37 | break 38 | default: 39 | break 40 | } 41 | } 42 | break; 43 | case ConnexionClient.Msg.PrefsChanged: 44 | print("Inside ConnexionClient.Msg.PrefsChanged") 45 | break; 46 | case ConnexionClient.Msg.CalibrateDevice: 47 | print("Inside ConnexionClient.Msg.CalibrateDevice") 48 | break; 49 | default: 50 | // Ignoring other message types 51 | break; 52 | } 53 | } as! ConnexionMessageHandlerProc 54 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion.xcodeproj/xcuserdata/martinmajewski.xcuserdatad/xcschemes/ToolShelf-4-3Dconnexion.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/VCMainView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 21.10.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | public class VCMainView: NSViewController { 12 | @IBOutlet var lblTranslateX: NSTextField! 13 | @IBOutlet var lblTranslateY: NSTextField! 14 | @IBOutlet var lblTranslateZ: NSTextField! 15 | 16 | @IBOutlet var lblRotateX: NSTextField! 17 | @IBOutlet var lblRotateY: NSTextField! 18 | @IBOutlet var lblRotateZ: NSTextField! 19 | 20 | @IBOutlet var lblActiveBtns: NSTextField! 21 | 22 | @IBOutlet var tfActiveDevice: NSTextField! 23 | @IBOutlet var tfConnectedDevices: NSTextFieldCell! 24 | 25 | private let connexionCH = CCH.Instance 26 | 27 | lazy var vcDriverNotInstalled: NSViewController = { 28 | return self.storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "StrbrdIdDriverError")) as! NSViewController 29 | }() 30 | 31 | func printConnectedDevicesFrom(Dictonary cdd : [UInt32: String], sorted: Bool = false) -> Void { 32 | var output : String = "" 33 | 34 | func appendLineFrom(deviceId id: UInt32, DeviceName value: String) -> Void{ 35 | output.append("\(id) - \(value)\n") 36 | } 37 | 38 | if sorted{ 39 | let sortedConnectedDevices = cdd.sorted(by: {$0.0 < $1.0}) 40 | 41 | for (id, name) in sortedConnectedDevices { 42 | appendLineFrom(deviceId: id, DeviceName: name) 43 | } 44 | }else{ 45 | for (id, name) in cdd { 46 | appendLineFrom(deviceId: id, DeviceName: name) 47 | } 48 | } 49 | 50 | tfConnectedDevices.stringValue = output 51 | } 52 | 53 | 54 | @IBAction func cofigureAxis(_ sender: NSButton) { 55 | if let identifier = sender.identifier { 56 | print("Identifier: \(identifier)") 57 | 58 | switch identifier.rawValue { 59 | case "cbDominantMode": 60 | if(sender.state == NSControl.StateValue.on){ 61 | connexionCH.set(AxisMode: CCH.AxisMode.DominantMode, On: true) 62 | }else{ 63 | connexionCH.set(AxisMode: CCH.AxisMode.DominantMode, On: false) 64 | } 65 | break 66 | case "rbAxisAll": 67 | connexionCH.set(AxisMode: CCH.AxisMode.AllAxis) 68 | break 69 | case "rbAxisTranslation": 70 | connexionCH.set(AxisMode: CCH.AxisMode.TranslationOnly) 71 | break 72 | case "rbAxisRotation": 73 | connexionCH.set(AxisMode: CCH.AxisMode.RotationOnly) 74 | break 75 | case "rbAxisDisabled": 76 | connexionCH.set(AxisMode: CCH.AxisMode.DisableAllAxis) 77 | break 78 | default: 79 | break 80 | } 81 | } 82 | } 83 | 84 | @IBAction func btnOpenPrefPane(_ sender: AnyObject) { 85 | connexionCH.openPreferencesPane() 86 | } 87 | 88 | override public func viewDidLoad() { 89 | super.viewDidLoad() 90 | 91 | AppInstance.mainVC = self 92 | } 93 | 94 | override public func viewDidAppear() { 95 | 96 | do{ 97 | try connexionCH.start(MsgHandlerClosure: messageHandler, AddedHandlerClosure: addedHandler, RemovedHandlerClosure: removedHandler) 98 | }catch(ConnexionClientError.OSErr(let osErrCode)){ 99 | print("OSErr code: \(osErrCode)") 100 | }catch ConnexionClientError.ClientIdInvalid(let clientId){ 101 | print("ClientId is not valid \(clientId)") 102 | }catch ConnexionClientError.ClientIdAlreadySet{ 103 | print("ClientId is already set") 104 | }catch ConnexionClientError.CFBundleSignatureNotValid{ 105 | print("App Bundle Signature not valid") 106 | }catch ConnexionClientError.DriverNotFound{ 107 | print("3Dconnexion driver not found!") 108 | self.presentViewControllerAsSheet(vcDriverNotInstalled) 109 | }catch{ 110 | print("An unknownerror occured") 111 | } 112 | } 113 | 114 | override public func viewDidDisappear() { 115 | do{ 116 | try connexionCH.stop() 117 | }catch{ 118 | print("ViewController disappears without ConnexionClient cleanup. There was probably a problem with the driver!") 119 | } 120 | } 121 | } 122 | 123 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionClient.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionClient.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 24.10.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ConnexionClient{ 12 | 13 | struct ClientMode{ 14 | static let TakeOver : UInt16 = 1 // take over device completely, driver no longer executes assignments 15 | static let Plugin : UInt16 = 2 // receive plugin assignments only, let driver take care of its own 16 | }; 17 | 18 | //============================================================================== 19 | // Client commands 20 | 21 | // The following assignments must be executed by the client: 22 | struct Cmd{ 23 | static let None : UInt16 = 0 24 | static let HandleRawData : UInt16 = 1 25 | static let HandleButtons : UInt16 = 2 26 | static let HandleAxis : UInt16 = 3 27 | static let AppSpecific : UInt16 = 10 28 | }; 29 | 30 | //============================================================================== 31 | // Messages 32 | 33 | // The following messages are forwarded to user space clients: 34 | struct Msg{ 35 | static let DeviceState : UInt32 = 862212946 // '3dSR' forwarded device state data 36 | static let PrefsChanged : UInt32 = 862212163 // '3dPC' notify clients that the current app prefs have changed 37 | static let CalibrateDevice : UInt32 = 862212931 // '3dSC' device state data to be used for calibration 38 | } 39 | 40 | // Control messages for the driver sent via the ConnexionControl API: 41 | struct Ctrl{ 42 | static let SetLEDState : UInt32 = 862221164 // '3dsl' set the LED state, param = (uint8_t)ledState 43 | static let GetDeviceID : UInt32 = 862218596 // '3did' get vendorID and productID in the high and low words of the result 44 | static let Calibrate : UInt32 = 862217057 // '3dca'calibrate the device with the current axes values (same as executing the calibrate assignment) 45 | static let Uncalibrate : UInt32 = 862217317 // '3dde' uncalibrate the device (i.e. reset calibration to 0,0,0,0,0,0) 46 | static let OpenPrefPane : UInt32 = 862220144 // '3dop' open the 3dconnexion preference pane in System Preferences 47 | static let SetSwitches : UInt32 = 862221171 // '3dss' set the current state of the client-controlled feature switches (bitmap, see masks below) 48 | } 49 | // Client capability mask constants (this mask defines which buttons and controls should be sent to clients, the others are handled by the driver) 50 | 51 | struct Mask{ 52 | static let Button1 : UInt32 = 0x0001 53 | static let Button2 : UInt32 = 0x0002 54 | static let Button3 : UInt32 = 0x0004 55 | static let Button4 : UInt32 = 0x0008 56 | static let Button5 : UInt32 = 0x0010 57 | static let Button6 : UInt32 = 0x0020 58 | static let Button7 : UInt32 = 0x0040 59 | static let Button8 : UInt32 = 0x0080 60 | 61 | static let Axis1 : UInt32 = 0x0100 62 | static let Axis2 : UInt32 = 0x0200 63 | static let Axis3 : UInt32 = 0x0400 64 | static let Axis4 : UInt32 = 0x0800 65 | static let Axis5 : UInt32 = 0x1000 66 | static let Axis6 : UInt32 = 0x2000 67 | 68 | static let Buttons : UInt32 = 0x00FF // note: this only specifies the first 8 buttons, kept for backwards compatibility 69 | static let AxisTrans : UInt32 = 0x0700 70 | static let AxisRot : UInt32 = 0x3800 71 | static let Axis : UInt32 = 0x3F00 72 | static let All : UInt32 = 0x3FFF 73 | 74 | // Added in version 10:0 to support all 32 buttons on the SpacePilot Pro, use with the new SetConnexionClientButtonMask API 75 | // Although being a 64bit value 3Dconnexion uses a uint32_t type. Bug? 76 | 77 | static let Button9 : UInt64 = 0x00000100 78 | static let Button10 : UInt64 = 0x00000200 79 | static let Button11 : UInt64 = 0x00000400 80 | static let Button12 : UInt64 = 0x00000800 81 | static let Button13 : UInt64 = 0x00001000 82 | static let Button14 : UInt64 = 0x00002000 83 | static let Button15 : UInt64 = 0x00004000 84 | static let Button16 : UInt64 = 0x00008000 85 | 86 | static let Button17 : UInt64 = 0x00010000 87 | static let Button18 : UInt64 = 0x00020000 88 | static let Button19 : UInt64 = 0x00040000 89 | static let Button20 : UInt64 = 0x00080000 90 | static let Button21 : UInt64 = 0x00100000 91 | static let Button22 : UInt64 = 0x00200000 92 | static let Button23 : UInt64 = 0x00400000 93 | static let Button24 : UInt64 = 0x00800000 94 | 95 | static let Button25 : UInt64 = 0x01000000 96 | static let Button26 : UInt64 = 0x02000000 97 | static let Button27 : UInt64 = 0x04000000 98 | static let Button28 : UInt64 = 0x08000000 99 | static let Button29 : UInt64 = 0x10000000 100 | static let Button30 : UInt64 = 0x20000000 101 | static let Button31 : UInt64 = 0x40000000 102 | static let Button32 : UInt64 = 0x80000000 103 | 104 | // Have to cast this UInt64 value to UIn32... This is weird!!! 105 | 106 | static let AllButtons : UInt64 = 0xFFFFFFFF 107 | } 108 | 109 | // Masks for client-controlled feature switches 110 | /* 111 | Driver uses a 32 bit-mask to (de-)activate axis and the dominant mode 112 | 113 | Only the first 16 bits from the lsb upwards are used so far 114 | 115 | Dominant: 0000 0010 116 | 117 | Translation Axis: 118 | Axis 1 (Tx): 0000 0100 119 | Axis 2 (Ty): 0000 1000 120 | Axis 3 (Tz): 0001 0000 121 | 122 | Rotatio Axis: 123 | Axis 4 (Rx): 0010 0000 124 | Axis 5 (Ry): 0100 0000 125 | Axis 6 (Rz): 1000 0000 126 | 127 | EnableTrans, EnableRot and EnableAll are simply accumulated bit-masks of the above patterns 128 | 129 | EnableTrans: 0001 1100 130 | EnableRot: 1110 0000 131 | EnableAll: 1111 1100 132 | 133 | The AllDisabled field is a little bit odd, because it is actually an 64bit integer value with the msb set to 1. 134 | The msb inside a signed integer variable is the sign bit. The current value stands for the 135 | */ 136 | struct Switch{ 137 | static let Dominant : Int32 = 0x0002 138 | static let EnableAxis1 : Int32 = 0x0004 139 | static let EnableAxis2 : Int32 = 0x0008 140 | static let EnableAxis3 : Int32 = 0x0010 141 | static let EnableAxis4 : Int32 = 0x0020 142 | static let EnableAxis5 : Int32 = 0x0040 143 | static let EnableAxis6 : Int32 = 0x0080 144 | 145 | static let EnableTrans : Int32 = 0x001C 146 | static let EnableRot : Int32 = 0x00E0 147 | static let EnableAll : Int32 = 0x00FC 148 | 149 | static let AllDisabled : Int64 = 0x80000000 // use driver defaults instead of client-controlled switches 150 | } 151 | 152 | //============================================================================== 153 | // Device state record 154 | 155 | // Structure type and current version: 156 | static let DeviceStateType : UInt32 = 0x4D53 // 'MS' (Connexion State) 157 | static let DeviceStateVers : UInt32 = 0x6D33 // 'm3' (version 3 includes 32-bit button data in previously unused field, binary compatible with version 2) 158 | 159 | //============================================================================== 160 | // Device prefs record 161 | 162 | // Structure type and current version: 163 | static let DevicePrefsType : UInt32 = 0x4D50 // 'MP' (Connexion Prefs) 164 | static let DevicePrefsVers : UInt32 = 0x7031 // 'p1' (version 1) 165 | 166 | //============================================================================== 167 | 168 | } 169 | 170 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/ConnexionClientHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnexionClientAPI.swift 3 | // ToolShelf-4-3Dconnexion 4 | // 5 | // Created by Martin Majewski on 13.11.15. 6 | // Copyright © 2015 MartinMajewski.net. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | typealias CCH = ConnexionClientHelper 12 | 13 | class ConnexionClientHelper { 14 | // ============================================================================== 15 | // Singleton Pattern 16 | private static let instance : ConnexionClientHelper = ConnexionClientHelper(); 17 | 18 | static var Instance : ConnexionClientHelper{ 19 | get{ 20 | return instance 21 | } 22 | } 23 | 24 | private init(){ 25 | 26 | } 27 | 28 | // ============================================================================= 29 | // Dictonary of device Ids and device names as found on 30 | // http://www.3dconnexion.de/index.php?id=200&faq_red=faq/27 31 | // Device Ids are integer equivalents of the hexcode PID values 32 | static let DeviceDictonary : [UInt32: String] = [ 33 | 50691: "SpaceMouse Plus (XT) USB", 34 | 50693: "CadMan", 35 | 50694: "SpaceMouse Classic USB", 36 | 50721: "SpaceBall 5000 USB", 37 | 50723: "SpaceTraveler", 38 | 50725: "SpacePilot", 39 | 50726: "SpaceNavigator", 40 | 50727: "SpaceExplorer", 41 | 50728: "SpaceNavigator for Notebooks", 42 | 50729: "SpacePilot Pro", 43 | 50731: "SpaceMouse Pro (wired)", 44 | 50734: "SpceMouse (cabled)", 45 | 50735: "SpceMouse (wireless)", 46 | 50737: "SpceMouse Pro (cabled)", 47 | 50738: "SpceMouse Pro (wireless)", 48 | 50741: "SpaceMouse Compact (wired)", 49 | 50768: "CADMouse (wired)"] 50 | 51 | // ============================================================================== 52 | // Start driver connection 53 | 54 | private var clientId : UInt16 = 0 55 | 56 | func start(MsgHandlerClosure msgHandler : @escaping ConnexionMessageHandlerProc, AddedHandlerClosure addHandler : @escaping ConnexionAddedHandlerProc, RemovedHandlerClosure remHandler : @escaping ConnexionRemovedHandlerProc ) throws -> Void{ 57 | 58 | // Check if 3Dconnexion driver is present or else throw exception 59 | guard isConnexionDriverAvailable() == true else { throw ConnexionClientError.DriverNotFound } 60 | 61 | // Avoid multiple starts 62 | guard clientId == 0 else { throw ConnexionClientError.ClientIdAlreadySet } 63 | 64 | 65 | let error = SetConnexionHandlers(msgHandler, addHandler, remHandler, false) 66 | 67 | guard error == 0 else { throw ConnexionClientError.OSErr(osErrCode: error) } 68 | 69 | if let appSignature = Bundle.main.object(forInfoDictionaryKey: "CFBundleSignature") as? String{ 70 | clientId = RegisterConnexionClient(ConnexionClientHelper.Instance.GetUInt32ValueFrom(String: appSignature), nil, ConnexionClient.ClientMode.TakeOver, ConnexionClient.Mask.All) 71 | 72 | guard clientId != 0 else { throw ConnexionClientError.ClientIdInvalid(clientId: clientId) } 73 | 74 | SetConnexionClientButtonMask(clientId, (UInt32)(ConnexionClient.Mask.AllButtons)); 75 | SetConnexionClientMask(clientId, ConnexionClient.Mask.All) 76 | set(AxisMode: AxisMode.AllAxis, On: true) 77 | 78 | print("clientId: \(clientId)") 79 | 80 | }else{ 81 | throw ConnexionClientError.CFBundleSignatureNotValid 82 | } 83 | } 84 | 85 | // ============================================================================== 86 | // Start driver connection 87 | 88 | func stop() throws -> Void{ 89 | // Check if 3Dconnexion driver is present or else throw exception 90 | guard isConnexionDriverAvailable() == true else { throw ConnexionClientError.DriverNotFound } 91 | 92 | print("Stopping 3D Mouse for client ID \(clientId) and cleaning up") 93 | UnregisterConnexionClient(clientId) 94 | CleanupConnexionHandlers() 95 | 96 | clientId = 0 97 | } 98 | 99 | var ClientId : UInt16{ 100 | get{ 101 | return clientId 102 | } 103 | } 104 | 105 | // ============================================================================== 106 | // Device Configuration 107 | 108 | var connectedDevicesDictonary = [UInt32: String]() 109 | 110 | // Helper members to monitor and configure device state 111 | private var currentSwitchConfigState = ConnexionClient.Switch.EnableAll 112 | 113 | /* Turn a switch on or off. 114 | || Because a switch can contain one axis or an axis-set we have to perform an OR operation eiter at the ON and OFF case to ensure that all bits of the switch are set to 1. 115 | || If the switch should be turned off every bit related to the switch has to be flipped to 0 inside the currentSwitchConfigState variable. 116 | || This is accomplished by XOR, which depends on having the 1s set in both fields, what is ensured by the previously OR operation. 117 | || Having a 1 inside just the switch or the currentSwitchConfigState would lead to an 1 in the result. 118 | */ 119 | private func turnModeFor(Switch sw: Int32, On on : Bool){ 120 | currentSwitchConfigState = sw | currentSwitchConfigState 121 | if !on{ 122 | currentSwitchConfigState = sw ^ currentSwitchConfigState 123 | } 124 | 125 | ConnexionClientControl(ClientId, ConnexionClient.Ctrl.SetSwitches, currentSwitchConfigState, nil) 126 | } 127 | 128 | func isStateActiveFor(Switch sw : Int32) -> Bool{ 129 | return (sw & currentSwitchConfigState) != 0 130 | } 131 | 132 | enum AxisMode{ 133 | case DisableAllAxis 134 | case DominantMode 135 | case AllAxis 136 | case RotationOnly 137 | case TranslationOnly 138 | } 139 | 140 | func set(AxisMode am : AxisMode, On on : Bool = true) -> Void{ 141 | switch am { 142 | case .DominantMode: 143 | turnModeFor(Switch: ConnexionClient.Switch.Dominant, On: on) 144 | print("Dominant Mode: \(isStateActiveFor(Switch: ConnexionClient.Switch.Dominant))") 145 | 146 | case .DisableAllAxis: 147 | turnModeFor(Switch: ConnexionClient.Switch.EnableAll, On: false) 148 | print("All Axis Mode: \(isStateActiveFor(Switch: ConnexionClient.Switch.EnableAll))") 149 | 150 | case .AllAxis: 151 | turnModeFor(Switch: ConnexionClient.Switch.EnableAll, On: on) 152 | print("All Axis Mode: \(isStateActiveFor(Switch: ConnexionClient.Switch.EnableAll))") 153 | 154 | case .RotationOnly: 155 | turnModeFor(Switch: ConnexionClient.Switch.EnableTrans, On: false) 156 | turnModeFor(Switch: ConnexionClient.Switch.EnableRot, On: true) 157 | print("Rotation Only Mode: \(isStateActiveFor(Switch: ConnexionClient.Switch.EnableRot))") 158 | 159 | case .TranslationOnly: 160 | turnModeFor(Switch: ConnexionClient.Switch.EnableRot, On: false) 161 | turnModeFor(Switch: ConnexionClient.Switch.EnableTrans, On: true) 162 | print("Translation Only Mode: \(isStateActiveFor(Switch: ConnexionClient.Switch.EnableTrans))") 163 | 164 | } 165 | } 166 | 167 | // ============================================================================== 168 | // Helper functions - C Utilities to interact with driver 169 | 170 | let BitMaskOne : UInt32 = 0x0001 171 | 172 | // Convert a Swift String into a UInt32 C like four-characters encoding used e.g. inside the RegisterConnexionClient() function 173 | func GetUInt32ValueFrom(String string : String) -> UInt32 { 174 | var result : UInt32 = 0 175 | if let data = string.data(using: String.Encoding.macOSRoman) { 176 | for i in 0.. [Bool]{ 187 | 188 | var btnDictonary = [Bool](repeating: false, count: 32) 189 | 190 | for bitIdx in 0...31{ 191 | if (buttons & BitMaskOne) == BitMaskOne{ 192 | btnDictonary[bitIdx] = true; 193 | } 194 | 195 | buttons = buttons >> 1 196 | } 197 | 198 | return btnDictonary 199 | } 200 | 201 | func getDeviceID() -> Int32{ 202 | var result : Int32 = 0 203 | 204 | ConnexionControl(ConnexionClient.Ctrl.GetDeviceID, 0, &result) 205 | 206 | return result & 0xFFFF 207 | } 208 | 209 | func openPreferencesPane() -> Void{ 210 | ConnexionClientControl(ClientId, ConnexionClient.Ctrl.OpenPrefPane, 0, nil) 211 | } 212 | 213 | 214 | func isButtonActive(withId id: UInt32, inside buttons: inout UInt32) -> Bool{ 215 | buttons = buttons >> (id - 1) 216 | return (buttons & BitMaskOne) == BitMaskOne 217 | } 218 | 219 | } 220 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 30337CC91BE7664C00220DC6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30337CC81BE7664C00220DC6 /* AppDelegate.swift */; }; 11 | 30337CCB1BE7664C00220DC6 /* VCMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30337CCA1BE7664C00220DC6 /* VCMainView.swift */; }; 12 | 30337CCD1BE7664C00220DC6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 30337CCC1BE7664C00220DC6 /* Assets.xcassets */; }; 13 | 30337CD01BE7664C00220DC6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 30337CCE1BE7664C00220DC6 /* Main.storyboard */; }; 14 | 30337CDC1BE766B700220DC6 /* ConnexionAuxiliaries.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30337CD71BE766B700220DC6 /* ConnexionAuxiliaries.swift */; }; 15 | 30337CDF1BE766B700220DC6 /* ConnexionClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30337CDB1BE766B700220DC6 /* ConnexionClient.swift */; }; 16 | 30337CE21BE766ED00220DC6 /* 3DconnexionClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30337CE11BE766ED00220DC6 /* 3DconnexionClient.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 17 | 3095C82E1BF64516008F97F6 /* ConnexionClientHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3095C82D1BF64516008F97F6 /* ConnexionClientHelper.swift */; }; 18 | 3095C8301BF659FA008F97F6 /* ConnexionClientErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3095C82F1BF659FA008F97F6 /* ConnexionClientErrors.swift */; }; 19 | 3099B5ED1C0471EC00B637B3 /* ConnexionMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3099B5EC1C0471EC00B637B3 /* ConnexionMessageHandler.swift */; }; 20 | 3099B5EF1C04728100B637B3 /* ConnexionAddedHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3099B5EE1C04728100B637B3 /* ConnexionAddedHandler.swift */; }; 21 | 3099B5F11C0472A300B637B3 /* ConnexionRemoveHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3099B5F01C0472A300B637B3 /* ConnexionRemoveHandler.swift */; }; 22 | 30FFBABE1C050CD100E4A878 /* 3DConnexionDriverCheck.c in Sources */ = {isa = PBXBuildFile; fileRef = 30FFBABD1C050CD100E4A878 /* 3DConnexionDriverCheck.c */; }; 23 | 30FFBAC41C05D3A600E4A878 /* VCDriverError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FFBAC31C05D3A600E4A878 /* VCDriverError.swift */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 30337CC51BE7664C00220DC6 /* ToolShelf-4-3Dconnexion.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ToolShelf-4-3Dconnexion.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | 30337CC81BE7664C00220DC6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 29 | 30337CCA1BE7664C00220DC6 /* VCMainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VCMainView.swift; sourceTree = ""; }; 30 | 30337CCC1BE7664C00220DC6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 31 | 30337CCF1BE7664C00220DC6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 32 | 30337CD11BE7664C00220DC6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 30337CD71BE766B700220DC6 /* ConnexionAuxiliaries.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionAuxiliaries.swift; sourceTree = ""; }; 34 | 30337CDA1BE766B700220DC6 /* 3Dconnexion-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "3Dconnexion-Bridging-Header.h"; sourceTree = ""; }; 35 | 30337CDB1BE766B700220DC6 /* ConnexionClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionClient.swift; sourceTree = ""; }; 36 | 30337CE11BE766ED00220DC6 /* 3DconnexionClient.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = 3DconnexionClient.framework; path = ../../../../../../../Library/Frameworks/3DconnexionClient.framework; sourceTree = ""; }; 37 | 30337CE41BE7692700220DC6 /* ToolShelf-4-3Dconnexion.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "ToolShelf-4-3Dconnexion.entitlements"; sourceTree = ""; }; 38 | 3095C82D1BF64516008F97F6 /* ConnexionClientHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionClientHelper.swift; sourceTree = ""; }; 39 | 3095C82F1BF659FA008F97F6 /* ConnexionClientErrors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionClientErrors.swift; sourceTree = ""; }; 40 | 3099B5EC1C0471EC00B637B3 /* ConnexionMessageHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionMessageHandler.swift; sourceTree = ""; }; 41 | 3099B5EE1C04728100B637B3 /* ConnexionAddedHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionAddedHandler.swift; sourceTree = ""; }; 42 | 3099B5F01C0472A300B637B3 /* ConnexionRemoveHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnexionRemoveHandler.swift; sourceTree = ""; }; 43 | 30FFBABD1C050CD100E4A878 /* 3DConnexionDriverCheck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 3DConnexionDriverCheck.c; sourceTree = ""; }; 44 | 30FFBAC31C05D3A600E4A878 /* VCDriverError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VCDriverError.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 30337CC21BE7664C00220DC6 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | 30337CE21BE766ED00220DC6 /* 3DconnexionClient.framework in Frameworks */, 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 30337CBC1BE7664C00220DC6 = { 60 | isa = PBXGroup; 61 | children = ( 62 | 30337CE11BE766ED00220DC6 /* 3DconnexionClient.framework */, 63 | 30337CC71BE7664C00220DC6 /* ToolShelf-4-3Dconnexion */, 64 | 30337CC61BE7664C00220DC6 /* Products */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | 30337CC61BE7664C00220DC6 /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 30337CC51BE7664C00220DC6 /* ToolShelf-4-3Dconnexion.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | 30337CC71BE7664C00220DC6 /* ToolShelf-4-3Dconnexion */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | 303EB9831BE797B3009B6207 /* Ressources */, 80 | 30337CE01BE766C000220DC6 /* 3Dconnexion */, 81 | 30337CC81BE7664C00220DC6 /* AppDelegate.swift */, 82 | 30337CCA1BE7664C00220DC6 /* VCMainView.swift */, 83 | 30FFBAC31C05D3A600E4A878 /* VCDriverError.swift */, 84 | 30337CCC1BE7664C00220DC6 /* Assets.xcassets */, 85 | ); 86 | path = "ToolShelf-4-3Dconnexion"; 87 | sourceTree = ""; 88 | }; 89 | 30337CE01BE766C000220DC6 /* 3Dconnexion */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 30FFBABD1C050CD100E4A878 /* 3DConnexionDriverCheck.c */, 93 | 30337CE31BE7670200220DC6 /* Bridging Header */, 94 | 30337CD71BE766B700220DC6 /* ConnexionAuxiliaries.swift */, 95 | 30337CDB1BE766B700220DC6 /* ConnexionClient.swift */, 96 | 3095C82D1BF64516008F97F6 /* ConnexionClientHelper.swift */, 97 | 3095C82F1BF659FA008F97F6 /* ConnexionClientErrors.swift */, 98 | 3099B5F21C0472B600B637B3 /* Callbacks */, 99 | ); 100 | name = 3Dconnexion; 101 | sourceTree = ""; 102 | }; 103 | 30337CE31BE7670200220DC6 /* Bridging Header */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 30337CDA1BE766B700220DC6 /* 3Dconnexion-Bridging-Header.h */, 107 | ); 108 | name = "Bridging Header"; 109 | sourceTree = ""; 110 | }; 111 | 303EB9831BE797B3009B6207 /* Ressources */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 30337CD11BE7664C00220DC6 /* Info.plist */, 115 | 30337CCE1BE7664C00220DC6 /* Main.storyboard */, 116 | 30337CE41BE7692700220DC6 /* ToolShelf-4-3Dconnexion.entitlements */, 117 | ); 118 | name = Ressources; 119 | sourceTree = ""; 120 | }; 121 | 3099B5F21C0472B600B637B3 /* Callbacks */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 3099B5EC1C0471EC00B637B3 /* ConnexionMessageHandler.swift */, 125 | 3099B5EE1C04728100B637B3 /* ConnexionAddedHandler.swift */, 126 | 3099B5F01C0472A300B637B3 /* ConnexionRemoveHandler.swift */, 127 | ); 128 | name = Callbacks; 129 | sourceTree = ""; 130 | }; 131 | /* End PBXGroup section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | 30337CC41BE7664C00220DC6 /* ToolShelf-4-3Dconnexion */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = 30337CD41BE7664C00220DC6 /* Build configuration list for PBXNativeTarget "ToolShelf-4-3Dconnexion" */; 137 | buildPhases = ( 138 | 30337CC11BE7664C00220DC6 /* Sources */, 139 | 30337CC21BE7664C00220DC6 /* Frameworks */, 140 | 30337CC31BE7664C00220DC6 /* Resources */, 141 | ); 142 | buildRules = ( 143 | ); 144 | dependencies = ( 145 | ); 146 | name = "ToolShelf-4-3Dconnexion"; 147 | productName = "ToolShelf-4-3Dconnexion"; 148 | productReference = 30337CC51BE7664C00220DC6 /* ToolShelf-4-3Dconnexion.app */; 149 | productType = "com.apple.product-type.application"; 150 | }; 151 | /* End PBXNativeTarget section */ 152 | 153 | /* Begin PBXProject section */ 154 | 30337CBD1BE7664C00220DC6 /* Project object */ = { 155 | isa = PBXProject; 156 | attributes = { 157 | LastSwiftUpdateCheck = 0710; 158 | LastUpgradeCheck = 0710; 159 | ORGANIZATIONNAME = MartinMajewski.net; 160 | TargetAttributes = { 161 | 30337CC41BE7664C00220DC6 = { 162 | CreatedOnToolsVersion = 7.1; 163 | DevelopmentTeam = BMGKE42NFX; 164 | SystemCapabilities = { 165 | com.apple.Sandbox = { 166 | enabled = 1; 167 | }; 168 | }; 169 | }; 170 | }; 171 | }; 172 | buildConfigurationList = 30337CC01BE7664C00220DC6 /* Build configuration list for PBXProject "ToolShelf-4-3Dconnexion" */; 173 | compatibilityVersion = "Xcode 3.2"; 174 | developmentRegion = English; 175 | hasScannedForEncodings = 0; 176 | knownRegions = ( 177 | en, 178 | Base, 179 | ); 180 | mainGroup = 30337CBC1BE7664C00220DC6; 181 | productRefGroup = 30337CC61BE7664C00220DC6 /* Products */; 182 | projectDirPath = ""; 183 | projectRoot = ""; 184 | targets = ( 185 | 30337CC41BE7664C00220DC6 /* ToolShelf-4-3Dconnexion */, 186 | ); 187 | }; 188 | /* End PBXProject section */ 189 | 190 | /* Begin PBXResourcesBuildPhase section */ 191 | 30337CC31BE7664C00220DC6 /* Resources */ = { 192 | isa = PBXResourcesBuildPhase; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | 30337CCD1BE7664C00220DC6 /* Assets.xcassets in Resources */, 196 | 30337CD01BE7664C00220DC6 /* Main.storyboard in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXResourcesBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 30337CC11BE7664C00220DC6 /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 30337CDC1BE766B700220DC6 /* ConnexionAuxiliaries.swift in Sources */, 208 | 3099B5F11C0472A300B637B3 /* ConnexionRemoveHandler.swift in Sources */, 209 | 30337CDF1BE766B700220DC6 /* ConnexionClient.swift in Sources */, 210 | 3095C82E1BF64516008F97F6 /* ConnexionClientHelper.swift in Sources */, 211 | 30337CCB1BE7664C00220DC6 /* VCMainView.swift in Sources */, 212 | 30FFBABE1C050CD100E4A878 /* 3DConnexionDriverCheck.c in Sources */, 213 | 30FFBAC41C05D3A600E4A878 /* VCDriverError.swift in Sources */, 214 | 3099B5EF1C04728100B637B3 /* ConnexionAddedHandler.swift in Sources */, 215 | 30337CC91BE7664C00220DC6 /* AppDelegate.swift in Sources */, 216 | 3099B5ED1C0471EC00B637B3 /* ConnexionMessageHandler.swift in Sources */, 217 | 3095C8301BF659FA008F97F6 /* ConnexionClientErrors.swift in Sources */, 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | }; 221 | /* End PBXSourcesBuildPhase section */ 222 | 223 | /* Begin PBXVariantGroup section */ 224 | 30337CCE1BE7664C00220DC6 /* Main.storyboard */ = { 225 | isa = PBXVariantGroup; 226 | children = ( 227 | 30337CCF1BE7664C00220DC6 /* Base */, 228 | ); 229 | name = Main.storyboard; 230 | sourceTree = ""; 231 | }; 232 | /* End PBXVariantGroup section */ 233 | 234 | /* Begin XCBuildConfiguration section */ 235 | 30337CD21BE7664C00220DC6 /* Debug */ = { 236 | isa = XCBuildConfiguration; 237 | buildSettings = { 238 | ALWAYS_SEARCH_USER_PATHS = NO; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BOOL_CONVERSION = YES; 244 | CLANG_WARN_CONSTANT_CONVERSION = YES; 245 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 246 | CLANG_WARN_EMPTY_BODY = YES; 247 | CLANG_WARN_ENUM_CONVERSION = YES; 248 | CLANG_WARN_INT_CONVERSION = YES; 249 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 250 | CLANG_WARN_UNREACHABLE_CODE = YES; 251 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 252 | CODE_SIGN_IDENTITY = "-"; 253 | COPY_PHASE_STRIP = NO; 254 | DEBUG_INFORMATION_FORMAT = dwarf; 255 | ENABLE_STRICT_OBJC_MSGSEND = YES; 256 | ENABLE_TESTABILITY = YES; 257 | GCC_C_LANGUAGE_STANDARD = gnu99; 258 | GCC_DYNAMIC_NO_PIC = NO; 259 | GCC_NO_COMMON_BLOCKS = YES; 260 | GCC_OPTIMIZATION_LEVEL = 0; 261 | GCC_PREPROCESSOR_DEFINITIONS = ( 262 | "DEBUG=1", 263 | "$(inherited)", 264 | ); 265 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 266 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 267 | GCC_WARN_UNDECLARED_SELECTOR = YES; 268 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 269 | GCC_WARN_UNUSED_FUNCTION = YES; 270 | GCC_WARN_UNUSED_VARIABLE = YES; 271 | MACOSX_DEPLOYMENT_TARGET = 10.11; 272 | MTL_ENABLE_DEBUG_INFO = YES; 273 | ONLY_ACTIVE_ARCH = YES; 274 | SDKROOT = macosx; 275 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 276 | }; 277 | name = Debug; 278 | }; 279 | 30337CD31BE7664C00220DC6 /* Release */ = { 280 | isa = XCBuildConfiguration; 281 | buildSettings = { 282 | ALWAYS_SEARCH_USER_PATHS = NO; 283 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 284 | CLANG_CXX_LIBRARY = "libc++"; 285 | CLANG_ENABLE_MODULES = YES; 286 | CLANG_ENABLE_OBJC_ARC = YES; 287 | CLANG_WARN_BOOL_CONVERSION = YES; 288 | CLANG_WARN_CONSTANT_CONVERSION = YES; 289 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 290 | CLANG_WARN_EMPTY_BODY = YES; 291 | CLANG_WARN_ENUM_CONVERSION = YES; 292 | CLANG_WARN_INT_CONVERSION = YES; 293 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 294 | CLANG_WARN_UNREACHABLE_CODE = YES; 295 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 296 | CODE_SIGN_IDENTITY = "-"; 297 | COPY_PHASE_STRIP = NO; 298 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 299 | ENABLE_NS_ASSERTIONS = NO; 300 | ENABLE_STRICT_OBJC_MSGSEND = YES; 301 | GCC_C_LANGUAGE_STANDARD = gnu99; 302 | GCC_NO_COMMON_BLOCKS = YES; 303 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 304 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 305 | GCC_WARN_UNDECLARED_SELECTOR = YES; 306 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 307 | GCC_WARN_UNUSED_FUNCTION = YES; 308 | GCC_WARN_UNUSED_VARIABLE = YES; 309 | MACOSX_DEPLOYMENT_TARGET = 10.11; 310 | MTL_ENABLE_DEBUG_INFO = NO; 311 | ONLY_ACTIVE_ARCH = YES; 312 | SDKROOT = macosx; 313 | }; 314 | name = Release; 315 | }; 316 | 30337CD51BE7664C00220DC6 /* Debug */ = { 317 | isa = XCBuildConfiguration; 318 | buildSettings = { 319 | ALWAYS_SEARCH_USER_PATHS = YES; 320 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 321 | CODE_SIGN_ENTITLEMENTS = "ToolShelf-4-3Dconnexion/ToolShelf-4-3Dconnexion.entitlements"; 322 | CODE_SIGN_IDENTITY = "Mac Developer"; 323 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; 324 | COMBINE_HIDPI_IMAGES = YES; 325 | EMBEDDED_CONTENT_CONTAINS_SWIFT = NO; 326 | FRAMEWORK_SEARCH_PATHS = ( 327 | "$(inherited)", 328 | "$(LOCAL_LIBRARY_DIR)/Frameworks", 329 | ); 330 | INFOPLIST_FILE = "ToolShelf-4-3Dconnexion/Info.plist"; 331 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 332 | MACOSX_DEPLOYMENT_TARGET = 10.11; 333 | PRODUCT_BUNDLE_IDENTIFIER = "net.martinmajewski.ToolShelf-4-3Dconnexion"; 334 | PRODUCT_NAME = "$(TARGET_NAME)"; 335 | PROVISIONING_PROFILE = "7bbe34ee-64c3-4e2e-ac68-4d1232b25879"; 336 | SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/ToolShelf-4-3Dconnexion/3dconnexion-Bridging-Header.h"; 337 | }; 338 | name = Debug; 339 | }; 340 | 30337CD61BE7664C00220DC6 /* Release */ = { 341 | isa = XCBuildConfiguration; 342 | buildSettings = { 343 | ALWAYS_SEARCH_USER_PATHS = YES; 344 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 345 | CODE_SIGN_ENTITLEMENTS = "ToolShelf-4-3Dconnexion/ToolShelf-4-3Dconnexion.entitlements"; 346 | CODE_SIGN_IDENTITY = "Mac Developer"; 347 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; 348 | COMBINE_HIDPI_IMAGES = YES; 349 | EMBEDDED_CONTENT_CONTAINS_SWIFT = NO; 350 | FRAMEWORK_SEARCH_PATHS = ( 351 | "$(inherited)", 352 | "$(LOCAL_LIBRARY_DIR)/Frameworks", 353 | ); 354 | INFOPLIST_FILE = "ToolShelf-4-3Dconnexion/Info.plist"; 355 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 356 | MACOSX_DEPLOYMENT_TARGET = 10.11; 357 | ONLY_ACTIVE_ARCH = YES; 358 | PRODUCT_BUNDLE_IDENTIFIER = "net.martinmajewski.ToolShelf-4-3Dconnexion"; 359 | PRODUCT_NAME = "$(TARGET_NAME)"; 360 | PROVISIONING_PROFILE = "7bbe34ee-64c3-4e2e-ac68-4d1232b25879"; 361 | SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/ToolShelf-4-3Dconnexion/3dconnexion-Bridging-Header.h"; 362 | }; 363 | name = Release; 364 | }; 365 | /* End XCBuildConfiguration section */ 366 | 367 | /* Begin XCConfigurationList section */ 368 | 30337CC01BE7664C00220DC6 /* Build configuration list for PBXProject "ToolShelf-4-3Dconnexion" */ = { 369 | isa = XCConfigurationList; 370 | buildConfigurations = ( 371 | 30337CD21BE7664C00220DC6 /* Debug */, 372 | 30337CD31BE7664C00220DC6 /* Release */, 373 | ); 374 | defaultConfigurationIsVisible = 0; 375 | defaultConfigurationName = Release; 376 | }; 377 | 30337CD41BE7664C00220DC6 /* Build configuration list for PBXNativeTarget "ToolShelf-4-3Dconnexion" */ = { 378 | isa = XCConfigurationList; 379 | buildConfigurations = ( 380 | 30337CD51BE7664C00220DC6 /* Debug */, 381 | 30337CD61BE7664C00220DC6 /* Release */, 382 | ); 383 | defaultConfigurationIsVisible = 0; 384 | defaultConfigurationName = Release; 385 | }; 386 | /* End XCConfigurationList section */ 387 | }; 388 | rootObject = 30337CBD1BE7664C00220DC6 /* Project object */; 389 | } 390 | -------------------------------------------------------------------------------- /ToolShelf-4-3Dconnexion/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 360 | 371 | 382 | 393 | 394 | 395 | 396 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | Either the 3Dconnexion driver 463 | is not installed or it is corrupted. 464 | 465 | Please visit www.3Dconnexion.com to get 466 | the latest driver for your OS X version. 467 | 468 | For more information visit 469 | www.martinmajewski.net 470 | 471 | This application will close on button click. 472 | Please re-open it after driver installation. 473 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 474 | 475 | 476 | 477 | 478 | 489 | 500 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | --------------------------------------------------------------------------------