├── 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 |
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 |
--------------------------------------------------------------------------------