Update manual and version numbers.
[enjoyable.git] / Enjoyable.xcodeproj / project.pbxproj
index eee41a1..0e6ca04 100644 (file)
                8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
                D594BF000FAE7397007A85F2 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D594BEFF0FAE7397007A85F2 /* IOKit.framework */; };
                EE1F3CEA16EF4182008C6426 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = EE1F3CE816EF4182008C6426 /* Localizable.strings */; };
+               EE35A6E417BBCC9500413995 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE35A6E317BBCC9500413995 /* CoreVideo.framework */; };
                EE3D897A16EA7EFC00596D1F /* Status Menu Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = EE3D897916EA7EFC00596D1F /* Status Menu Icon@2x.png */; };
                EE3D897C16EA806E00596D1F /* Status Menu Icon Disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = EE3D897B16EA806E00596D1F /* Status Menu Icon Disabled@2x.png */; };
                EE3D897F16EA817E00596D1F /* Status Menu Icon Disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = EE3D897D16EA817E00596D1F /* Status Menu Icon Disabled.png */; };
                EE3D898016EA817E00596D1F /* Status Menu Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = EE3D897E16EA817E00596D1F /* Status Menu Icon.png */; };
+               EE48263016F6680D001B0C64 /* NSProcessInfo+Debugging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE48262F16F6680D001B0C64 /* NSProcessInfo+Debugging.m */; };
+               EE52145C16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.m in Sources */ = {isa = PBXBuildFile; fileRef = EE52145B16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.m */; };
+               EE52145F16F404D500E3C574 /* NJDeviceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EE52145E16F404D500E3C574 /* NJDeviceViewController.m */; };
                EE6A122E16E8F46300EDBD32 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = EE6A122D16E8F46300EDBD32 /* Icon.icns */; };
+               EE83ACEC16F545EA00083E94 /* NJMappingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EE83ACEB16F545EA00083E94 /* NJMappingsViewController.m */; };
+               EE8455DD16F0E46B00F32A01 /* NSRunningApplication+LoginItem.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8455DC16F0E46B00F32A01 /* NSRunningApplication+LoginItem.m */; };
                EED4CE6E16ED692400C65AA8 /* NJMappingMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = EED4CE6D16ED692400C65AA8 /* NJMappingMenuController.m */; };
                EED4CE7716EE195100C65AA8 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EED4CE7616EE195100C65AA8 /* Sparkle.framework */; };
                EED4CE7816EE195B00C65AA8 /* Sparkle.framework in Copy Sparkle Framework */ = {isa = PBXBuildFile; fileRef = EED4CE7616EE195100C65AA8 /* Sparkle.framework */; };
                EEF17D3816E8E2E100D7DC4D /* NSView+FirstResponder.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D3216E8E2E100D7DC4D /* NSView+FirstResponder.m */; };
                EEF17D5C16E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D3A16E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.m */; };
                EEF17D5D16E8E2EF00D7DC4D /* NJDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D3C16E8E2EF00D7DC4D /* NJDevice.m */; };
-               EEF17D5E16E8E2EF00D7DC4D /* NJDeviceController.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D3E16E8E2EF00D7DC4D /* NJDeviceController.m */; };
+               EEF17D5E16E8E2EF00D7DC4D /* NJInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D3E16E8E2EF00D7DC4D /* NJInputController.m */; };
                EEF17D5F16E8E2EF00D7DC4D /* NJInput.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4016E8E2EF00D7DC4D /* NJInput.m */; };
                EEF17D6016E8E2EF00D7DC4D /* NJInputAnalog.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4216E8E2EF00D7DC4D /* NJInputAnalog.m */; };
                EEF17D6116E8E2EF00D7DC4D /* NJInputButton.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4416E8E2EF00D7DC4D /* NJInputButton.m */; };
                EEF17D6216E8E2EF00D7DC4D /* NJInputHat.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4616E8E2EF00D7DC4D /* NJInputHat.m */; };
                EEF17D6316E8E2EF00D7DC4D /* NJKeyInputField.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4916E8E2EF00D7DC4D /* NJKeyInputField.m */; };
                EEF17D6416E8E2EF00D7DC4D /* NJMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4B16E8E2EF00D7DC4D /* NJMapping.m */; };
-               EEF17D6516E8E2EF00D7DC4D /* NJMappingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4D16E8E2EF00D7DC4D /* NJMappingsController.m */; };
                EEF17D6616E8E2EF00D7DC4D /* NJOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D4F16E8E2EF00D7DC4D /* NJOutput.m */; };
-               EEF17D6716E8E2EF00D7DC4D /* NJOutputController.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D5116E8E2EF00D7DC4D /* NJOutputController.m */; };
+               EEF17D6716E8E2EF00D7DC4D /* NJOutputViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D5116E8E2EF00D7DC4D /* NJOutputViewController.m */; };
                EEF17D6816E8E2EF00D7DC4D /* NJOutputKeyPress.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D5316E8E2EF00D7DC4D /* NJOutputKeyPress.m */; };
                EEF17D6916E8E2EF00D7DC4D /* NJOutputMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D5516E8E2EF00D7DC4D /* NJOutputMapping.m */; };
                EEF17D6A16E8E2EF00D7DC4D /* NJOutputMouseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF17D5716E8E2EF00D7DC4D /* NJOutputMouseButton.m */; };
                8D1107320486CEB800E47090 /* Enjoyable.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Enjoyable.app; sourceTree = BUILT_PRODUCTS_DIR; };
                D594BEFF0FAE7397007A85F2 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
                EE1F3CE916EF4182008C6426 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/Localizable.strings; sourceTree = "<group>"; };
+               EE35A6E317BBCC9500413995 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
                EE3D897916EA7EFC00596D1F /* Status Menu Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Status Menu Icon@2x.png"; path = "Resources/Status Menu Icon@2x.png"; sourceTree = "<group>"; };
                EE3D897B16EA806E00596D1F /* Status Menu Icon Disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Status Menu Icon Disabled@2x.png"; path = "Resources/Status Menu Icon Disabled@2x.png"; sourceTree = "<group>"; };
                EE3D897D16EA817E00596D1F /* Status Menu Icon Disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Status Menu Icon Disabled.png"; path = "Resources/Status Menu Icon Disabled.png"; sourceTree = "<group>"; };
                EE3D897E16EA817E00596D1F /* Status Menu Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Status Menu Icon.png"; path = "Resources/Status Menu Icon.png"; sourceTree = "<group>"; };
+               EE48262E16F6680D001B0C64 /* NSProcessInfo+Debugging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSProcessInfo+Debugging.h"; path = "Categories/NSProcessInfo+Debugging.h"; sourceTree = "<group>"; };
+               EE48262F16F6680D001B0C64 /* NSProcessInfo+Debugging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSProcessInfo+Debugging.m"; path = "Categories/NSProcessInfo+Debugging.m"; sourceTree = "<group>"; };
+               EE52145A16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSOutlineView+ItemAccessors.h"; path = "Categories/NSOutlineView+ItemAccessors.h"; sourceTree = "<group>"; };
+               EE52145B16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSOutlineView+ItemAccessors.m"; path = "Categories/NSOutlineView+ItemAccessors.m"; sourceTree = "<group>"; };
+               EE52145D16F404D500E3C574 /* NJDeviceViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJDeviceViewController.h; path = Classes/NJDeviceViewController.h; sourceTree = "<group>"; };
+               EE52145E16F404D500E3C574 /* NJDeviceViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJDeviceViewController.m; path = Classes/NJDeviceViewController.m; sourceTree = "<group>"; };
                EE6A122D16E8F46300EDBD32 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = "<group>"; };
+               EE83ACEA16F545EA00083E94 /* NJMappingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJMappingsViewController.h; path = Classes/NJMappingsViewController.h; sourceTree = "<group>"; };
+               EE83ACEB16F545EA00083E94 /* NJMappingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJMappingsViewController.m; path = Classes/NJMappingsViewController.m; sourceTree = "<group>"; };
+               EE8455DB16F0E46B00F32A01 /* NSRunningApplication+LoginItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSRunningApplication+LoginItem.h"; path = "Categories/NSRunningApplication+LoginItem.h"; sourceTree = "<group>"; };
+               EE8455DC16F0E46B00F32A01 /* NSRunningApplication+LoginItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSRunningApplication+LoginItem.m"; path = "Categories/NSRunningApplication+LoginItem.m"; sourceTree = "<group>"; };
                EED4CE6C16ED692400C65AA8 /* NJMappingMenuController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJMappingMenuController.h; path = Classes/NJMappingMenuController.h; sourceTree = "<group>"; };
                EED4CE6D16ED692400C65AA8 /* NJMappingMenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJMappingMenuController.m; path = Classes/NJMappingMenuController.m; sourceTree = "<group>"; };
                EED4CE7616EE195100C65AA8 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
                EEF17D3A16E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EnjoyableApplicationDelegate.m; path = Classes/EnjoyableApplicationDelegate.m; sourceTree = "<group>"; };
                EEF17D3B16E8E2EF00D7DC4D /* NJDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJDevice.h; path = Classes/NJDevice.h; sourceTree = "<group>"; };
                EEF17D3C16E8E2EF00D7DC4D /* NJDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJDevice.m; path = Classes/NJDevice.m; sourceTree = "<group>"; };
-               EEF17D3D16E8E2EF00D7DC4D /* NJDeviceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJDeviceController.h; path = Classes/NJDeviceController.h; sourceTree = "<group>"; };
-               EEF17D3E16E8E2EF00D7DC4D /* NJDeviceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJDeviceController.m; path = Classes/NJDeviceController.m; sourceTree = "<group>"; };
+               EEF17D3D16E8E2EF00D7DC4D /* NJInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJInputController.h; path = Classes/NJInputController.h; sourceTree = "<group>"; };
+               EEF17D3E16E8E2EF00D7DC4D /* NJInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJInputController.m; path = Classes/NJInputController.m; sourceTree = "<group>"; };
                EEF17D3F16E8E2EF00D7DC4D /* NJInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJInput.h; path = Classes/NJInput.h; sourceTree = "<group>"; };
                EEF17D4016E8E2EF00D7DC4D /* NJInput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJInput.m; path = Classes/NJInput.m; sourceTree = "<group>"; };
                EEF17D4116E8E2EF00D7DC4D /* NJInputAnalog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJInputAnalog.h; path = Classes/NJInputAnalog.h; sourceTree = "<group>"; };
                EEF17D4916E8E2EF00D7DC4D /* NJKeyInputField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJKeyInputField.m; path = Classes/NJKeyInputField.m; sourceTree = "<group>"; };
                EEF17D4A16E8E2EF00D7DC4D /* NJMapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJMapping.h; path = Classes/NJMapping.h; sourceTree = "<group>"; };
                EEF17D4B16E8E2EF00D7DC4D /* NJMapping.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJMapping.m; path = Classes/NJMapping.m; sourceTree = "<group>"; };
-               EEF17D4C16E8E2EF00D7DC4D /* NJMappingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJMappingsController.h; path = Classes/NJMappingsController.h; sourceTree = "<group>"; };
-               EEF17D4D16E8E2EF00D7DC4D /* NJMappingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJMappingsController.m; path = Classes/NJMappingsController.m; sourceTree = "<group>"; };
                EEF17D4E16E8E2EF00D7DC4D /* NJOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJOutput.h; path = Classes/NJOutput.h; sourceTree = "<group>"; };
                EEF17D4F16E8E2EF00D7DC4D /* NJOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJOutput.m; path = Classes/NJOutput.m; sourceTree = "<group>"; };
-               EEF17D5016E8E2EF00D7DC4D /* NJOutputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJOutputController.h; path = Classes/NJOutputController.h; sourceTree = "<group>"; };
-               EEF17D5116E8E2EF00D7DC4D /* NJOutputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJOutputController.m; path = Classes/NJOutputController.m; sourceTree = "<group>"; };
+               EEF17D5016E8E2EF00D7DC4D /* NJOutputViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJOutputViewController.h; path = Classes/NJOutputViewController.h; sourceTree = "<group>"; };
+               EEF17D5116E8E2EF00D7DC4D /* NJOutputViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJOutputViewController.m; path = Classes/NJOutputViewController.m; sourceTree = "<group>"; };
                EEF17D5216E8E2EF00D7DC4D /* NJOutputKeyPress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJOutputKeyPress.h; path = Classes/NJOutputKeyPress.h; sourceTree = "<group>"; };
                EEF17D5316E8E2EF00D7DC4D /* NJOutputKeyPress.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NJOutputKeyPress.m; path = Classes/NJOutputKeyPress.m; sourceTree = "<group>"; };
                EEF17D5416E8E2EF00D7DC4D /* NJOutputMapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NJOutputMapping.h; path = Classes/NJOutputMapping.h; sourceTree = "<group>"; };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               EE35A6E417BBCC9500413995 /* CoreVideo.framework in Frameworks */,
                                8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
                                D594BF000FAE7397007A85F2 /* IOKit.framework in Frameworks */,
                                EED4CE7716EE195100C65AA8 /* Sparkle.framework in Frameworks */,
                        children = (
                                EEF17D3916E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.h */,
                                EEF17D3A16E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.m */,
-                               EEF17D3D16E8E2EF00D7DC4D /* NJDeviceController.h */,
-                               EEF17D3E16E8E2EF00D7DC4D /* NJDeviceController.m */,
-                               EEF17D4C16E8E2EF00D7DC4D /* NJMappingsController.h */,
-                               EEF17D4D16E8E2EF00D7DC4D /* NJMappingsController.m */,
-                               EEF17D5016E8E2EF00D7DC4D /* NJOutputController.h */,
-                               EEF17D5116E8E2EF00D7DC4D /* NJOutputController.m */,
-                               EEF17D4816E8E2EF00D7DC4D /* NJKeyInputField.h */,
-                               EEF17D4916E8E2EF00D7DC4D /* NJKeyInputField.m */,
-                               EEF17D4A16E8E2EF00D7DC4D /* NJMapping.h */,
-                               EEF17D4B16E8E2EF00D7DC4D /* NJMapping.m */,
-                               EEF17D4716E8E2EF00D7DC4D /* NJInputPathElement.h */,
-                               EEE703DD16F0B3F6002FDD69 /* NJInputPathElement.m */,
-                               EEF17D3B16E8E2EF00D7DC4D /* NJDevice.h */,
-                               EEF17D3C16E8E2EF00D7DC4D /* NJDevice.m */,
-                               EEF17D3F16E8E2EF00D7DC4D /* NJInput.h */,
-                               EEF17D4016E8E2EF00D7DC4D /* NJInput.m */,
-                               EEF17D4116E8E2EF00D7DC4D /* NJInputAnalog.h */,
-                               EEF17D4216E8E2EF00D7DC4D /* NJInputAnalog.m */,
-                               EEF17D4316E8E2EF00D7DC4D /* NJInputButton.h */,
-                               EEF17D4416E8E2EF00D7DC4D /* NJInputButton.m */,
-                               EEF17D4516E8E2EF00D7DC4D /* NJInputHat.h */,
-                               EEF17D4616E8E2EF00D7DC4D /* NJInputHat.m */,
-                               EEF17D4E16E8E2EF00D7DC4D /* NJOutput.h */,
-                               EEF17D4F16E8E2EF00D7DC4D /* NJOutput.m */,
-                               EEF17D5216E8E2EF00D7DC4D /* NJOutputKeyPress.h */,
-                               EEF17D5316E8E2EF00D7DC4D /* NJOutputKeyPress.m */,
-                               EEF17D5416E8E2EF00D7DC4D /* NJOutputMapping.h */,
-                               EEF17D5516E8E2EF00D7DC4D /* NJOutputMapping.m */,
-                               EEF17D5616E8E2EF00D7DC4D /* NJOutputMouseButton.h */,
-                               EEF17D5716E8E2EF00D7DC4D /* NJOutputMouseButton.m */,
-                               EEF17D5816E8E2EF00D7DC4D /* NJOutputMouseMove.h */,
-                               EEF17D5916E8E2EF00D7DC4D /* NJOutputMouseMove.m */,
-                               EEF17D5A16E8E2EF00D7DC4D /* NJOutputMouseScroll.h */,
-                               EEF17D5B16E8E2EF00D7DC4D /* NJOutputMouseScroll.m */,
-                               EED4CE6C16ED692400C65AA8 /* NJMappingMenuController.h */,
-                               EED4CE6D16ED692400C65AA8 /* NJMappingMenuController.m */,
-                               EEE703DA16F089FE002FDD69 /* NJHIDManager.h */,
-                               EEE703DB16F089FE002FDD69 /* NJHIDManager.m */,
+                               EEDB86A216FA4C42000E91C3 /* Input */,
+                               EEDB86A316FA4C5C000E91C3 /* Output */,
+                               EEDB86A516FA4CE4000E91C3 /* Views */,
+                               EEDB86A416FA4CD1000E91C3 /* View Controllers */,
                        );
                        name = Classes;
                        sourceTree = "<group>";
                        children = (
                                EED4CE7616EE195100C65AA8 /* Sparkle.framework */,
                                D594BEFF0FAE7397007A85F2 /* IOKit.framework */,
+                               EE35A6E317BBCC9500413995 /* CoreVideo.framework */,
                                1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
                        );
                        name = "Linked Frameworks";
                EE1D5F8B16E403D600749C36 /* Categories */ = {
                        isa = PBXGroup;
                        children = (
+                               EE8455DB16F0E46B00F32A01 /* NSRunningApplication+LoginItem.h */,
+                               EE8455DC16F0E46B00F32A01 /* NSRunningApplication+LoginItem.m */,
                                EEF17D2716E8E2E100D7DC4D /* NSError+Description.h */,
                                EEF17D2816E8E2E100D7DC4D /* NSError+Description.m */,
                                EEF17D2916E8E2E100D7DC4D /* NSFileManager+UniqueNames.h */,
                                EEF17D3216E8E2E100D7DC4D /* NSView+FirstResponder.m */,
                                EEE73B1416EA42E5009D9D99 /* NSRunningApplication+NJPossibleNames.h */,
                                EEE73B1516EA42E5009D9D99 /* NSRunningApplication+NJPossibleNames.m */,
+                               EE52145A16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.h */,
+                               EE52145B16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.m */,
+                               EE48262E16F6680D001B0C64 /* NSProcessInfo+Debugging.h */,
+                               EE48262F16F6680D001B0C64 /* NSProcessInfo+Debugging.m */,
                        );
                        name = Categories;
                        sourceTree = "<group>";
                };
+               EEDB86A216FA4C42000E91C3 /* Input */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EEE703DA16F089FE002FDD69 /* NJHIDManager.h */,
+                               EEE703DB16F089FE002FDD69 /* NJHIDManager.m */,
+                               EEF17D3D16E8E2EF00D7DC4D /* NJInputController.h */,
+                               EEF17D3E16E8E2EF00D7DC4D /* NJInputController.m */,
+                               EEF17D4716E8E2EF00D7DC4D /* NJInputPathElement.h */,
+                               EEE703DD16F0B3F6002FDD69 /* NJInputPathElement.m */,
+                               EEF17D4A16E8E2EF00D7DC4D /* NJMapping.h */,
+                               EEF17D4B16E8E2EF00D7DC4D /* NJMapping.m */,
+                               EEF17D3B16E8E2EF00D7DC4D /* NJDevice.h */,
+                               EEF17D3C16E8E2EF00D7DC4D /* NJDevice.m */,
+                               EEF17D3F16E8E2EF00D7DC4D /* NJInput.h */,
+                               EEF17D4016E8E2EF00D7DC4D /* NJInput.m */,
+                               EEF17D4116E8E2EF00D7DC4D /* NJInputAnalog.h */,
+                               EEF17D4216E8E2EF00D7DC4D /* NJInputAnalog.m */,
+                               EEF17D4316E8E2EF00D7DC4D /* NJInputButton.h */,
+                               EEF17D4416E8E2EF00D7DC4D /* NJInputButton.m */,
+                               EEF17D4516E8E2EF00D7DC4D /* NJInputHat.h */,
+                               EEF17D4616E8E2EF00D7DC4D /* NJInputHat.m */,
+                       );
+                       name = Input;
+                       sourceTree = "<group>";
+               };
+               EEDB86A316FA4C5C000E91C3 /* Output */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EEF17D4E16E8E2EF00D7DC4D /* NJOutput.h */,
+                               EEF17D4F16E8E2EF00D7DC4D /* NJOutput.m */,
+                               EEF17D5216E8E2EF00D7DC4D /* NJOutputKeyPress.h */,
+                               EEF17D5316E8E2EF00D7DC4D /* NJOutputKeyPress.m */,
+                               EEF17D5416E8E2EF00D7DC4D /* NJOutputMapping.h */,
+                               EEF17D5516E8E2EF00D7DC4D /* NJOutputMapping.m */,
+                               EEF17D5616E8E2EF00D7DC4D /* NJOutputMouseButton.h */,
+                               EEF17D5716E8E2EF00D7DC4D /* NJOutputMouseButton.m */,
+                               EEF17D5816E8E2EF00D7DC4D /* NJOutputMouseMove.h */,
+                               EEF17D5916E8E2EF00D7DC4D /* NJOutputMouseMove.m */,
+                               EEF17D5A16E8E2EF00D7DC4D /* NJOutputMouseScroll.h */,
+                               EEF17D5B16E8E2EF00D7DC4D /* NJOutputMouseScroll.m */,
+                       );
+                       name = Output;
+                       sourceTree = "<group>";
+               };
+               EEDB86A416FA4CD1000E91C3 /* View Controllers */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EEF17D5016E8E2EF00D7DC4D /* NJOutputViewController.h */,
+                               EEF17D5116E8E2EF00D7DC4D /* NJOutputViewController.m */,
+                               EED4CE6C16ED692400C65AA8 /* NJMappingMenuController.h */,
+                               EED4CE6D16ED692400C65AA8 /* NJMappingMenuController.m */,
+                               EE52145D16F404D500E3C574 /* NJDeviceViewController.h */,
+                               EE52145E16F404D500E3C574 /* NJDeviceViewController.m */,
+                               EE83ACEA16F545EA00083E94 /* NJMappingsViewController.h */,
+                               EE83ACEB16F545EA00083E94 /* NJMappingsViewController.m */,
+                       );
+                       name = "View Controllers";
+                       sourceTree = "<group>";
+               };
+               EEDB86A516FA4CE4000E91C3 /* Views */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EEF17D4816E8E2EF00D7DC4D /* NJKeyInputField.h */,
+                               EEF17D4916E8E2EF00D7DC4D /* NJKeyInputField.m */,
+                       );
+                       name = Views;
+                       sourceTree = "<group>";
+               };
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
                                EEF17D3816E8E2E100D7DC4D /* NSView+FirstResponder.m in Sources */,
                                EEF17D5C16E8E2EF00D7DC4D /* EnjoyableApplicationDelegate.m in Sources */,
                                EEF17D5D16E8E2EF00D7DC4D /* NJDevice.m in Sources */,
-                               EEF17D5E16E8E2EF00D7DC4D /* NJDeviceController.m in Sources */,
+                               EEF17D5E16E8E2EF00D7DC4D /* NJInputController.m in Sources */,
                                EEF17D5F16E8E2EF00D7DC4D /* NJInput.m in Sources */,
                                EEF17D6016E8E2EF00D7DC4D /* NJInputAnalog.m in Sources */,
                                EEF17D6116E8E2EF00D7DC4D /* NJInputButton.m in Sources */,
                                EEF17D6216E8E2EF00D7DC4D /* NJInputHat.m in Sources */,
                                EEF17D6316E8E2EF00D7DC4D /* NJKeyInputField.m in Sources */,
                                EEF17D6416E8E2EF00D7DC4D /* NJMapping.m in Sources */,
-                               EEF17D6516E8E2EF00D7DC4D /* NJMappingsController.m in Sources */,
                                EEF17D6616E8E2EF00D7DC4D /* NJOutput.m in Sources */,
-                               EEF17D6716E8E2EF00D7DC4D /* NJOutputController.m in Sources */,
+                               EEF17D6716E8E2EF00D7DC4D /* NJOutputViewController.m in Sources */,
                                EEF17D6816E8E2EF00D7DC4D /* NJOutputKeyPress.m in Sources */,
                                EEF17D6916E8E2EF00D7DC4D /* NJOutputMapping.m in Sources */,
                                EEF17D6A16E8E2EF00D7DC4D /* NJOutputMouseButton.m in Sources */,
                                EED4CE6E16ED692400C65AA8 /* NJMappingMenuController.m in Sources */,
                                EEE703DC16F089FE002FDD69 /* NJHIDManager.m in Sources */,
                                EEE703DE16F0B3F6002FDD69 /* NJInputPathElement.m in Sources */,
+                               EE8455DD16F0E46B00F32A01 /* NSRunningApplication+LoginItem.m in Sources */,
+                               EE52145C16F3E8BD00E3C574 /* NSOutlineView+ItemAccessors.m in Sources */,
+                               EE52145F16F404D500E3C574 /* NJDeviceViewController.m in Sources */,
+                               EE83ACEC16F545EA00083E94 /* NJMappingsViewController.m in Sources */,
+                               EE48263016F6680D001B0C64 /* NSProcessInfo+Debugging.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                CLANG_WARN__DUPLICATE_METHOD_MATCH = NO;
                                GCC_C_LANGUAGE_STANDARD = c99;
                                GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
                                GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
                                GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
                                GCC_TREAT_WARNINGS_AS_ERRORS = YES;