From 5b54612d91129afb92aee01e14984e7e2e401709 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 20:41:51 -0700 Subject: [PATCH] Pass authtoken in from user, and add a wrapper for web UI on Mac. --- ext/mac-ui-macgap1-wrapper/LICENSE | 25 + .../MacGap.xcodeproj/project.pbxproj | 492 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/MacGap.xccheckout | 41 + .../UserInterfaceState.xcuserstate | Bin 0 -> 46675 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 18268 bytes .../WorkspaceSettings.xcsettings | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 27811 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcdebugger/Breakpoints.xcbkptlist | 131 + .../xcschemes/MacGap.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../api.xcuserdatad/xcschemes/MacGap.xcscheme | 88 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints.xcbkptlist | 161 + .../xcschemes/MacGap.xcscheme | 84 + .../xcschemes/xcschememanagement.plist | 22 + .../MacGap/AppDelegate.h | 18 + .../MacGap/AppDelegate.m | 110 + .../MacGap/Classes/CallbackDelegate.h | 20 + .../MacGap/Classes/CallbackDelegate.m | 168 + .../MacGap/Classes/Commands/App.h | 21 + .../MacGap/Classes/Commands/App.m | 128 + .../MacGap/Classes/Commands/Command.h | 18 + .../MacGap/Classes/Commands/Command.m | 28 + .../MacGap/Classes/Commands/Dock.h | 11 + .../MacGap/Classes/Commands/Dock.m | 31 + .../MacGap/Classes/Commands/MenuItemProxy.h | 31 + .../MacGap/Classes/Commands/MenuItemProxy.m | 150 + .../MacGap/Classes/Commands/MenuProxy.h | 31 + .../MacGap/Classes/Commands/MenuProxy.m | 233 ++ .../MacGap/Classes/Commands/Notice.h | 26 + .../MacGap/Classes/Commands/Notice.m | 108 + .../MacGap/Classes/Commands/Path.h | 21 + .../MacGap/Classes/Commands/Path.m | 53 + .../MacGap/Classes/Commands/Sound.h | 17 + .../MacGap/Classes/Commands/Sound.m | 97 + .../MacGap/Classes/Commands/UserDefaults.h | 43 + .../MacGap/Classes/Commands/UserDefaults.m | 211 + .../MacGap/Classes/Commands/fonts.h | 9 + .../MacGap/Classes/Commands/fonts.m | 48 + .../MacGap/Classes/Constants.h | 7 + .../MacGap/Classes/ContentView.h | 15 + .../MacGap/Classes/ContentView.m | 68 + .../MacGap/Classes/JSEventHelper.h | 20 + .../MacGap/Classes/JSEventHelper.m | 41 + .../MacGap/Classes/Utils.h | 20 + .../MacGap/Classes/Utils.m | 93 + .../MacGap/Classes/WebViewDelegate.h | 49 + .../MacGap/Classes/WebViewDelegate.m | 206 + .../MacGap/Classes/Window.h | 23 + .../MacGap/Classes/Window.m | 94 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h | 10 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m | 51 + .../MacGap/MacGap-Info.plist | 34 + .../MacGap/MacGap-Prefix.pch | 15 + .../MacGap/WindowController.h | 13 + .../MacGap/WindowController.m | 54 + .../MacGap/en.lproj/Credits.rtf | 13 + .../MacGap/en.lproj/InfoPlist.strings | 2 + .../MacGap/en.lproj/MainMenu.xib | 3404 +++++++++++++++++ .../MacGap/en.lproj/Window.xib | 337 ++ ext/mac-ui-macgap1-wrapper/MacGap/main.m | 14 + ext/mac-ui-macgap1-wrapper/README.md | 36 + ext/mac-ui-macgap1-wrapper/application.icns | Bin 0 -> 88566 bytes ext/mac-ui-macgap1-wrapper/public/index.html | 33 + ui/main.jsx | 49 +- 68 files changed, 7537 insertions(+), 1 deletion(-) create mode 100644 ext/mac-ui-macgap1-wrapper/LICENSE create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/main.m create mode 100644 ext/mac-ui-macgap1-wrapper/README.md create mode 100644 ext/mac-ui-macgap1-wrapper/application.icns create mode 100644 ext/mac-ui-macgap1-wrapper/public/index.html diff --git a/ext/mac-ui-macgap1-wrapper/LICENSE b/ext/mac-ui-macgap1-wrapper/LICENSE new file mode 100644 index 000000000..c7fd4a4a5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/LICENSE @@ -0,0 +1,25 @@ +MacGap was ported from phonegap-mac, and is under the same license (MIT) + +The MIT License +***************** + +Copyright (c) <2012> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj new file mode 100644 index 000000000..ea339cf0a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj @@ -0,0 +1,492 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */ = {isa = PBXBuildFile; fileRef = 1495814E15C15CCC00E1CFE5 /* Notice.m */; }; + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA618CC332E005EDDF3 /* Command.m */; }; + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */; }; + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */; }; + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */; }; + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DB018CD906F005EDDF3 /* MenuProxy.m */; }; + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD672B518FE618E00C0DAAD /* UserDefaults.m */; }; + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */; }; + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 88746BED14CCA435001E160E /* JSEventHelper.m */; }; + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0645F14BDE10A00E4BCE2 /* Window.m */; }; + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88C0646414BDEC5800E4BCE2 /* Window.xib */; }; + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0646C14BDF6A600E4BCE2 /* WindowController.m */; }; + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1C2B9901AFB0CF10060D7C2 /* Security.framework */; }; + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B80015179E0FC100B069A8 /* Clipboard.m */; }; + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA32509C14BA813600BF0781 /* WebKit.framework */; }; + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BC14BA85E700BF0781 /* ContentView.m */; }; + FA3250C514BA85E700BF0781 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BE14BA85E700BF0781 /* Utils.m */; }; + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C014BA85E700BF0781 /* WebViewDelegate.m */; }; + FA3250D314BA860800BF0781 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C914BA860800BF0781 /* App.m */; }; + FA3250D514BA860800BF0781 /* Dock.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CB14BA860800BF0781 /* Dock.m */; }; + FA3250D914BA860800BF0781 /* Path.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CF14BA860800BF0781 /* Path.m */; }; + FA3250DB14BA860800BF0781 /* Sound.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250D114BA860800BF0781 /* Sound.m */; }; + FA3250E514BA883A00BF0781 /* public in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E414BA883A00BF0781 /* public */; }; + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E614BA8BCE00BF0781 /* application.icns */; }; + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3F7741168F70780027B324 /* Cocoa.framework */; }; + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FAE451C714BA79C600190544 /* InfoPlist.strings */; }; + FAE451CB14BA79C600190544 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451CA14BA79C600190544 /* main.m */; }; + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = FAE451CD14BA79C600190544 /* Credits.rtf */; }; + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451D114BA79C600190544 /* AppDelegate.m */; }; + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAE451D314BA79C600190544 /* MainMenu.xib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + FA3250DD14BA876F00BF0781 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1495814D15C15CCC00E1CFE5 /* Notice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Notice.h; path = Classes/Commands/Notice.h; sourceTree = ""; }; + 1495814E15C15CCC00E1CFE5 /* Notice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Notice.m; path = Classes/Commands/Notice.m; sourceTree = ""; }; + 6F169DA518CC332E005EDDF3 /* Command.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Command.h; path = Classes/Commands/Command.h; sourceTree = ""; }; + 6F169DA618CC332E005EDDF3 /* Command.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Command.m; path = Classes/Commands/Command.m; sourceTree = ""; }; + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CallbackDelegate.h; path = Classes/CallbackDelegate.h; sourceTree = ""; }; + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CallbackDelegate.m; path = Classes/CallbackDelegate.m; sourceTree = ""; }; + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuItemProxy.h; path = Classes/Commands/MenuItemProxy.h; sourceTree = ""; }; + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuItemProxy.m; path = Classes/Commands/MenuItemProxy.m; sourceTree = ""; }; + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuProxy.h; path = Classes/Commands/MenuProxy.h; sourceTree = ""; }; + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuProxy.m; path = Classes/Commands/MenuProxy.m; sourceTree = ""; }; + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UserDefaults.h; path = Classes/Commands/UserDefaults.h; sourceTree = ""; }; + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UserDefaults.m; path = Classes/Commands/UserDefaults.m; sourceTree = ""; }; + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fonts.h; path = Classes/Commands/fonts.h; sourceTree = ""; }; + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = fonts.m; path = Classes/Commands/fonts.m; sourceTree = ""; }; + 88746BEC14CCA435001E160E /* JSEventHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSEventHelper.h; path = Classes/JSEventHelper.h; sourceTree = ""; }; + 88746BED14CCA435001E160E /* JSEventHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JSEventHelper.m; path = Classes/JSEventHelper.m; sourceTree = ""; }; + 88C0645E14BDE10A00E4BCE2 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Window.h; path = Classes/Window.h; sourceTree = ""; }; + 88C0645F14BDE10A00E4BCE2 /* Window.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Window.m; path = Classes/Window.m; sourceTree = ""; }; + 88C0646514BDEC5800E4BCE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Window.xib; sourceTree = ""; }; + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; + C1C2B9901AFB0CF10060D7C2 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + F2B80014179E0FC100B069A8 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; + F2B80015179E0FC100B069A8 /* Clipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; + FA32509C14BA813600BF0781 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + FA3250BA14BA85E700BF0781 /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Constants.h; path = Classes/Constants.h; sourceTree = ""; }; + FA3250BB14BA85E700BF0781 /* ContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContentView.h; path = Classes/ContentView.h; sourceTree = ""; }; + FA3250BC14BA85E700BF0781 /* ContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContentView.m; path = Classes/ContentView.m; sourceTree = ""; }; + FA3250BD14BA85E700BF0781 /* Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Classes/Utils.h; sourceTree = ""; }; + FA3250BE14BA85E700BF0781 /* Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Classes/Utils.m; sourceTree = ""; }; + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebViewDelegate.h; path = Classes/WebViewDelegate.h; sourceTree = ""; }; + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WebViewDelegate.m; path = Classes/WebViewDelegate.m; sourceTree = ""; }; + FA3250C814BA860800BF0781 /* App.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = App.h; path = Classes/Commands/App.h; sourceTree = ""; }; + FA3250C914BA860800BF0781 /* App.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = App.m; path = Classes/Commands/App.m; sourceTree = ""; }; + FA3250CA14BA860800BF0781 /* Dock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dock.h; path = Classes/Commands/Dock.h; sourceTree = ""; }; + FA3250CB14BA860800BF0781 /* Dock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Dock.m; path = Classes/Commands/Dock.m; sourceTree = ""; }; + FA3250CE14BA860800BF0781 /* Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Path.h; path = Classes/Commands/Path.h; sourceTree = ""; }; + FA3250CF14BA860800BF0781 /* Path.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Path.m; path = Classes/Commands/Path.m; sourceTree = ""; }; + FA3250D014BA860800BF0781 /* Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Sound.h; path = Classes/Commands/Sound.h; sourceTree = ""; }; + FA3250D114BA860800BF0781 /* Sound.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Sound.m; path = Classes/Commands/Sound.m; sourceTree = ""; }; + FA3250E414BA883A00BF0781 /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + FA3250E614BA8BCE00BF0781 /* application.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = application.icns; sourceTree = SOURCE_ROOT; }; + FA3F7741168F70780027B324 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; + FAE451BA14BA79C600190544 /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FAE451BE14BA79C600190544 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + FAE451C114BA79C600190544 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + FAE451C214BA79C600190544 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + FAE451C314BA79C600190544 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + FAE451C614BA79C600190544 /* MacGap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MacGap-Info.plist"; sourceTree = ""; }; + FAE451C814BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + FAE451CA14BA79C600190544 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MacGap-Prefix.pch"; sourceTree = ""; }; + FAE451CE14BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + FAE451D014BA79C600190544 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + FAE451D114BA79C600190544 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + FAE451D414BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FAE451B714BA79C600190544 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */, + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */, + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */, + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + FA3250E014BA87B800BF0781 /* Classes */ = { + isa = PBXGroup; + children = ( + FA3250E114BA87DD00BF0781 /* Commands */, + FA3250BA14BA85E700BF0781 /* Constants.h */, + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */, + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */, + FA3250BB14BA85E700BF0781 /* ContentView.h */, + FA3250BC14BA85E700BF0781 /* ContentView.m */, + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */, + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */, + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */, + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */, + ); + name = Classes; + sourceTree = ""; + }; + FA3250E114BA87DD00BF0781 /* Commands */ = { + isa = PBXGroup; + children = ( + 6F169DA518CC332E005EDDF3 /* Command.h */, + 6F169DA618CC332E005EDDF3 /* Command.m */, + 1495814D15C15CCC00E1CFE5 /* Notice.h */, + 1495814E15C15CCC00E1CFE5 /* Notice.m */, + FA3250CA14BA860800BF0781 /* Dock.h */, + FA3250CB14BA860800BF0781 /* Dock.m */, + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */, + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */, + FA3250BD14BA85E700BF0781 /* Utils.h */, + FA3250BE14BA85E700BF0781 /* Utils.m */, + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */, + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */, + FA3250CE14BA860800BF0781 /* Path.h */, + FA3250CF14BA860800BF0781 /* Path.m */, + FA3250D014BA860800BF0781 /* Sound.h */, + FA3250D114BA860800BF0781 /* Sound.m */, + FA3250C814BA860800BF0781 /* App.h */, + FA3250C914BA860800BF0781 /* App.m */, + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */, + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */, + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */, + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */, + 88C0645E14BDE10A00E4BCE2 /* Window.h */, + 88C0645F14BDE10A00E4BCE2 /* Window.m */, + 88746BEC14CCA435001E160E /* JSEventHelper.h */, + 88746BED14CCA435001E160E /* JSEventHelper.m */, + F2B80014179E0FC100B069A8 /* Clipboard.h */, + F2B80015179E0FC100B069A8 /* Clipboard.m */, + ); + name = Commands; + sourceTree = ""; + }; + FAE451AF14BA79C600190544 = { + isa = PBXGroup; + children = ( + FA3F7741168F70780027B324 /* Cocoa.framework */, + FA3250E414BA883A00BF0781 /* public */, + FAE451C414BA79C600190544 /* MacGap */, + FAE451BD14BA79C600190544 /* Frameworks */, + FAE451BB14BA79C600190544 /* Products */, + ); + sourceTree = ""; + }; + FAE451BB14BA79C600190544 /* Products */ = { + isa = PBXGroup; + children = ( + FAE451BA14BA79C600190544 /* ZeroTier One.app */, + ); + name = Products; + sourceTree = ""; + }; + FAE451BD14BA79C600190544 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C1C2B9901AFB0CF10060D7C2 /* Security.framework */, + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */, + FA32509C14BA813600BF0781 /* WebKit.framework */, + FAE451BE14BA79C600190544 /* Cocoa.framework */, + FAE451C014BA79C600190544 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + FAE451C014BA79C600190544 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + FAE451C114BA79C600190544 /* AppKit.framework */, + FAE451C214BA79C600190544 /* CoreData.framework */, + FAE451C314BA79C600190544 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + FAE451C414BA79C600190544 /* MacGap */ = { + isa = PBXGroup; + children = ( + FA3250E014BA87B800BF0781 /* Classes */, + FAE451D014BA79C600190544 /* AppDelegate.h */, + FAE451D114BA79C600190544 /* AppDelegate.m */, + FAE451D314BA79C600190544 /* MainMenu.xib */, + 88C0646414BDEC5800E4BCE2 /* Window.xib */, + FAE451C514BA79C600190544 /* Supporting Files */, + ); + path = MacGap; + sourceTree = ""; + }; + FAE451C514BA79C600190544 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + FA3250E614BA8BCE00BF0781 /* application.icns */, + FAE451C614BA79C600190544 /* MacGap-Info.plist */, + FAE451C714BA79C600190544 /* InfoPlist.strings */, + FAE451CA14BA79C600190544 /* main.m */, + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */, + FAE451CD14BA79C600190544 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FAE451B914BA79C600190544 /* MacGap */ = { + isa = PBXNativeTarget; + buildConfigurationList = FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */; + buildPhases = ( + FAE451B814BA79C600190544 /* Resources */, + FAE451B614BA79C600190544 /* Sources */, + FAE451B714BA79C600190544 /* Frameworks */, + FA3250DD14BA876F00BF0781 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MacGap; + productName = MacGap; + productReference = FAE451BA14BA79C600190544 /* ZeroTier One.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FAE451B114BA79C600190544 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = Twitter; + }; + buildConfigurationList = FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = FAE451AF14BA79C600190544; + productRefGroup = FAE451BB14BA79C600190544 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FAE451B914BA79C600190544 /* MacGap */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FAE451B814BA79C600190544 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA3250E514BA883A00BF0781 /* public in Resources */, + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */, + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */, + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */, + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */, + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FAE451B614BA79C600190544 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */, + FA3250D314BA860800BF0781 /* App.m in Sources */, + FA3250D514BA860800BF0781 /* Dock.m in Sources */, + FA3250D914BA860800BF0781 /* Path.m in Sources */, + FA3250DB14BA860800BF0781 /* Sound.m in Sources */, + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */, + FA3250C514BA85E700BF0781 /* Utils.m in Sources */, + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */, + FAE451CB14BA79C600190544 /* main.m in Sources */, + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */, + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */, + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */, + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */, + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */, + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */, + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */, + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */, + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */, + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */, + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 88C0646414BDEC5800E4BCE2 /* Window.xib */ = { + isa = PBXVariantGroup; + children = ( + 88C0646514BDEC5800E4BCE2 /* en */, + ); + name = Window.xib; + sourceTree = ""; + }; + FAE451C714BA79C600190544 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + FAE451C814BA79C600190544 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + FAE451CD14BA79C600190544 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + FAE451CE14BA79C600190544 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + FAE451D314BA79C600190544 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + FAE451D414BA79C600190544 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FAE451D614BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Debug; + }; + FAE451D714BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Release; + }; + FAE451D914BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + FAE451DA14BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D614BA79C600190544 /* Debug */, + FAE451D714BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D914BA79C600190544 /* Debug */, + FAE451DA14BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FAE451B114BA79C600190544 /* Project object */; +} diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..88f36fc7b --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout new file mode 100644 index 000000000..b2ea215df --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 4D486E78-E297-4CC3-AAAE-1A58EDAC87E6 + IDESourceControlProjectName + MacGap + IDESourceControlProjectOriginsDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + https://github.com/MacGapProject/MacGap1.git + + IDESourceControlProjectPath + MacGap.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ../.. + + IDESourceControlProjectURL + https://github.com/MacGapProject/MacGap1.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlWCCName + MacGap1 + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..20281812beaefed26ed5a7ceb16e431be71ad75f GIT binary patch literal 46675 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 z�t{*PwQ&dvrm-jK^z<2|DjBX} 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 D9oef! literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..659c8766e --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..822ed3cb6581b8e606bab5208852eff2f504b0a4 GIT binary patch literal 27811 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..6ff33e603 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..38f661269 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..0aaad5827 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 000000000..fe2b45415 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..2555dc89c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..8e541eaba --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..872d6d7d5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h new file mode 100644 index 000000000..bf7370b50 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h @@ -0,0 +1,18 @@ +// +// AppDelegate.h +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "Classes/ContentView.h" + +#import "WindowController.h" + +@interface AppDelegate : NSObject + +@property (retain, nonatomic) WindowController *windowController; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m new file mode 100644 index 000000000..96a3e8201 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m @@ -0,0 +1,110 @@ +// +// AppDelegate.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +@synthesize windowController; + +- (void) applicationWillFinishLaunching:(NSNotification *)aNotification +{ +} + +-(BOOL)applicationShouldHandleReopen:(NSApplication*)application + hasVisibleWindows:(BOOL)visibleWindows{ + if(!visibleWindows){ + [self.windowController.window makeKeyAndOrderFront: nil]; + } + return YES; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { + return YES; +} + +- (void) applicationDidFinishLaunching:(NSNotification *)aNotification { + // Create authorization reference + OSStatus status; + AuthorizationRef authorizationRef; + + // AuthorizationCreate and pass NULL as the initial + // AuthorizationRights set so that the AuthorizationRef gets created + // successfully, and then later call AuthorizationCopyRights to + // determine or extend the allowable rights. + // http://developer.apple.com/qa/qa2001/qa1172.html + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error Creating Initial Authorization: %d", status); + return; + } + + // kAuthorizationRightExecute == "system.privilege.admin" + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; + + // Call AuthorizationCopyRights to determine or extend the allowable rights. + status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + { + NSLog(@"Copy Rights Unsuccessful: %d", status); + return; + } + + // use rm tool with -rf + char *tool = "/bin/cat"; + char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = NULL; + + status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error: %d", status); + } + + char url[16384]; + memset(url,0,sizeof(url)); + if (pipe) { + char buf[16384]; + + FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + long n = fread(buf,1,sizeof(buf)-1,pf); + long port = 9993; // default + if (n > 0) { + buf[n] = (char)0; + port = strtol(buf,(char **)0,10); + } + fclose(pf); + + n = (long)fread(buf,1,sizeof(buf)-1,pipe); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + } + fclose(pipe); + } + + // The only way to guarantee that a credential acquired when you + // request a right is not shared with other authorization instances is + // to destroy the credential. To do so, call the AuthorizationFree + // function with the flag kAuthorizationFlagDestroyRights. + // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html + status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + + NSString *urlStr = [[NSString alloc] initWithCString:url]; + self.windowController = [[WindowController alloc] initWithURL: urlStr]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + self.windowController.contentView.webView.alphaValue = 1.0; + self.windowController.contentView.alphaValue = 1.0; + [self.windowController showWindow:self]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h new file mode 100755 index 000000000..0f31ee417 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h @@ -0,0 +1,20 @@ +// +// CallbackDelegate.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@interface CallbackDelegate : Command { +} + +@property JSObjectRef callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback; +- (id) call; +- (id) callWithParams:(id)firstOrNil, ... NS_REQUIRES_NIL_TERMINATION; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m new file mode 100755 index 000000000..5ce8fbe33 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m @@ -0,0 +1,168 @@ +// +// CallbackDelegate.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "CallbackDelegate.h" +#import + +@implementation CallbackDelegate + +@synthesize callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback +{ + if (!aCallback) + return nil; + if ([aCallback isKindOfClass:[WebUndefined class]]) + return nil; + + self = [super initWithContext:aContext]; + if (!self) + return nil; + + callback = [aCallback JSObject]; + JSValueProtect(context, callback); + return self; +} + +- (void) dealloc +{ + if (callback) + { + JSValueUnprotect(context, callback); + callback = nil; + } +} + +- (id) objectFromValue:(JSValueRef)val +{ + JSStringRef jstr; + NSString *rets; + + switch(JSValueGetType(context, val)) + { + case kJSTypeUndefined: + case kJSTypeNull: + return nil; + case kJSTypeBoolean: + return [NSNumber numberWithBool:JSValueToBoolean(context, val)]; + case kJSTypeNumber: + return [NSNumber numberWithDouble:JSValueToNumber(context, val, NULL)]; + case kJSTypeString: + jstr = JSValueToStringCopy(context, val, NULL); + size_t sz = JSStringGetMaximumUTF8CStringSize(jstr); + char *buf = (char*)malloc(sz); + JSStringGetUTF8CString(jstr, buf, sz); + rets = [NSString stringWithUTF8String:buf]; + free(buf); + return rets; + case kJSTypeObject: + // TODO: dictionary or something + return nil; + default: + NSAssert(false, @"Invalid JavaScript type"); + return nil; + } +} + +- (JSValueRef) valueFromObject:(id)obj +{ + JSValueRef val = nil; + if (!obj) + { + val = JSValueMakeNull(context); + } + else if ([obj isKindOfClass:[NSString class]]) + { + JSStringRef jstr = JSStringCreateWithUTF8CString([obj UTF8String]); + val = JSValueMakeString(context, jstr); + JSStringRelease(jstr); + } + else if ([obj isKindOfClass:[NSNumber class]]) + { + val = JSValueMakeNumber(context, [obj doubleValue]); + } + else if ([obj isKindOfClass:[NSDictionary class]]) + { + JSObjectRef o = JSObjectMake(context, NULL, NULL); + for (NSString *key in obj) + { + JSStringRef kstr = JSStringCreateWithUTF8CString([key UTF8String]); + JSValueRef v = [self valueFromObject:[obj objectForKey:key]]; + + JSObjectSetProperty(context, o, kstr, v, kJSPropertyAttributeNone, NULL); + JSStringRelease(kstr); + } + val = o; + } + else if ([obj isKindOfClass:[NSArray class]]) + { + NSUInteger pcount = [obj count]; + JSValueRef jsArgs[pcount]; + NSUInteger i=0; + for (id v in obj) + { + jsArgs[i++] = [self valueFromObject:v]; + } + val = JSObjectMakeArray(context, pcount, jsArgs, NULL); + } + else if ([obj isKindOfClass:[NSDate class]]) + { + NSTimeInterval secs = [obj timeIntervalSince1970]; + JSValueRef jsArgs[1]; + // call the Date(milliseconds) constructor in JS + jsArgs[0] = JSValueMakeNumber(context, secs * 1000.0); + val = JSObjectMakeDate(context, 1, jsArgs, NULL); + } + else + { + NSLog(@"Warning: unknown object type for: %@", obj); + val = JSValueMakeUndefined(context); + } + return val; +} + +- (id) call +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + + JSValueRef jsArgs[0]; + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, 0, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +- (id) callWithParams:(id)firstOrNil, ... +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + NSUInteger pcount = 0; + id p; + va_list args; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + pcount++; + } + va_end(args); + + JSValueRef jsArgs[pcount]; + NSUInteger j = 0; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + jsArgs[j++] = [self valueFromObject:p]; + } + va_end(args); + + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, j, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h new file mode 100644 index 000000000..f65ba61e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h @@ -0,0 +1,21 @@ +#import + +#import "WindowController.h" + +@interface App : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; + +- (void) terminate; +- (void) activate; +- (void) hide; +- (void) unhide; +- (void) beep; +- (void) bounce; +- (void) setCustomUserAgent:(NSString *)userAgentString; +- (NSNumber*) systemIdleTime; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m new file mode 100644 index 000000000..6d47a17e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m @@ -0,0 +1,128 @@ +#import "App.h" + +#import "JSEventHelper.h" + +@implementation App + +@synthesize webView; + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveSleepNotification:) + name: NSWorkspaceWillSleepNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveWakeNotification:) + name: NSWorkspaceDidWakeNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveActivateNotification:) + name: NSWorkspaceDidActivateApplicationNotification object: NULL]; + } + + return self; +} + +- (void) terminate { + [NSApp terminate:nil]; +} + +- (void) activate { + [NSApp activateIgnoringOtherApps:YES]; +} + +- (void) hide { + [NSApp hide:nil]; +} + +- (void) unhide { + [NSApp unhide:nil]; +} + +- (void)beep { + NSBeep(); +} + +- (void) bounce { + [NSApp requestUserAttention:NSInformationalRequest]; +} + +- (void)setCustomUserAgent:(NSString *)userAgentString { + [self.webView setCustomUserAgent: userAgentString]; +} + +- (void) open:(NSString*)url { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; +} + +- (void) launch:(NSString *)name { + [[NSWorkspace sharedWorkspace] launchApplication:name]; +} + +- (void)receiveSleepNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"sleep" forWebView:self.webView]; +} + +- (void) receiveWakeNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"wake" forWebView:self.webView]; +} + +- (void) receiveActivateNotification:(NSNotification*)notification{ + NSDictionary* userInfo = [notification userInfo]; + NSRunningApplication* runningApplication = [userInfo objectForKey:NSWorkspaceApplicationKey]; + if (runningApplication) { + NSMutableDictionary* applicationDidGetFocusDict = [[NSMutableDictionary alloc] initWithCapacity:2]; + [applicationDidGetFocusDict setObject:runningApplication.localizedName + forKey:@"localizedName"]; + [applicationDidGetFocusDict setObject:[runningApplication.bundleURL absoluteString] + forKey:@"bundleURL"]; + + [JSEventHelper triggerEvent:@"appActivated" withArgs:applicationDidGetFocusDict forWebView:self.webView]; + } +} + + + + +/* + To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType. + */ +- (NSNumber*)systemIdleTime { + CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); + + return [NSNumber numberWithDouble:timeSinceLastEvent]; +} + + + + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + } else if (selector == @selector(launch:)) { + result = @"launch"; + } else if (selector == @selector(setCustomUserAgent:)) { + result = @"setCustomUserAgent"; + } else if (selector == @selector(systemIdleTime)) { + result = @"systemIdleTime"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h new file mode 100755 index 000000000..65d6b6d48 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h @@ -0,0 +1,18 @@ +// +// Command.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +@interface Command : NSObject { + JSContextRef context; +} + +- (id) initWithContext:(JSContextRef)aContext; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m new file mode 100755 index 000000000..39b85630a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m @@ -0,0 +1,28 @@ +// +// Command.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import + +@implementation Command + +- (id) initWithContext:(JSContextRef)aContext { + self = [super init]; + if (!self) + return nil; + context = aContext; + JSGlobalContextRetain((JSGlobalContextRef)context); + return self; +} + +- (void)dealloc +{ + if (context) + JSGlobalContextRelease((JSGlobalContextRef)context); +} +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h new file mode 100644 index 000000000..b3c533d79 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h @@ -0,0 +1,11 @@ +#import + +@interface Dock : NSObject { + +} +- (void) setBadge:(NSString*)value; +- (NSString *) badge; + +@property (readwrite, copy) NSString *badge; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m new file mode 100644 index 000000000..a4494d165 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m @@ -0,0 +1,31 @@ +#import "Dock.h" + +@implementation Dock + +@synthesize badge; + +- (void) setBadge:(NSString *)value +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + [tile setBadgeLabel:value]; +} + +- (NSString *) badge +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + return [tile badgeLabel]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h new file mode 100755 index 000000000..d765978fa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h @@ -0,0 +1,31 @@ +// +// MenuItemProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import "CallbackDelegate.h" + +@class MenuProxy; + +@interface MenuItemProxy : Command { + NSMenuItem *item; + CallbackDelegate *callback; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem; + +- (MenuProxy*)addSubmenu; + +- (void) remove; +- (void) setCallback:(WebScriptObject*)aCallback; +- (void) setKey:(NSString*)keyCommand; +- (void) setTitle:(NSString*)title; +- (void) enable; +- (void) disable; +- (MenuProxy*)submenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m new file mode 100755 index 000000000..7b9702cc4 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m @@ -0,0 +1,150 @@ +// +// MenuItemProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "MenuItemProxy.h" +#import "MenuProxy.h" + +@implementation MenuItemProxy + +- (id) initWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + NSAssert(anItem, @"anItem required"); + self = [super initWithContext:aContext]; + if (!self) + return nil; + item = anItem; + item.representedObject = self; + + return self; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + MenuItemProxy *proxy = [anItem representedObject]; + if (proxy) + { + NSLog(@"MIP Cache hit"); + NSAssert([proxy class] == [MenuItemProxy class], @"Bad proxy"); + return proxy; + } + return [[MenuItemProxy alloc] initWithContext:aContext andMenuItem:anItem]; +} + +- (NSString*) description +{ + return [item description]; +} + +- (MenuProxy*)addSubmenu +{ + NSMenu *s = [item submenu]; + if (!s) + { + s = [[NSMenu alloc] initWithTitle:@"FFFFFFOOOOO"]; + [item setSubmenu:s]; + } + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) remove +{ + NSMenu *menu = [item menu]; + [menu removeItem:item]; +} + +- (void)callCallback:(id)sender +{ + [callback callWithParams:[sender title], nil]; +} + +- (void) setCallback:(WebScriptObject*)aCallback +{ + NSAssert(item, @"item required"); + callback = [[CallbackDelegate alloc] initWithContext:context forCallback:aCallback]; + [item setAction:@selector(callCallback:)]; + [item setTarget:self]; +} + +- (void)setKey:(NSString*)keyCommand +{ + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + [item setKeyEquivalent:aKey]; + + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; +} + +- (void) setTitle:(NSString*)title +{ + [item setTitle:title]; +} + +- (MenuProxy*)submenu; +{ + // TODO: make this work as a property + NSMenu *s = [item submenu]; + if (!s) + return nil; + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) enable +{ + [item setEnabled:YES]; +} + +- (void) disable +{ + [item setEnabled:NO]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addSubmenu)) { + result = @"addSubmenu"; + } + else if (selector == @selector(remove)) { + result = @"remove"; + } + else if (selector == @selector(setCallback:)) { + result = @"setCallback"; + } + else if (selector == @selector(setKey:)) { + result = @"setKey"; + } + else if (selector == @selector(setTitle:)) { + result = @"setTitle"; + } + else if (selector == @selector(submenu)) { + result = @"submenu"; + } + else if (selector == @selector(enable)) { + result = @"enable"; + } + else if (selector == @selector(disable)) { + result = @"disable"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h new file mode 100755 index 000000000..afd6c6edb --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h @@ -0,0 +1,31 @@ +// +// MenuProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@class MenuItemProxy; + +@interface MenuProxy : Command { + NSMenu *menu; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu; + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)aKey + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index; + +- (MenuItemProxy*)addSeparator; +- (MenuItemProxy*)itemForKey:(id)key; +- (MenuProxy*)removeItem:(id)key; + ++ (NSString*)getKeyFromString:(NSString*)keyCommand; ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m new file mode 100755 index 000000000..5bc10a763 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m @@ -0,0 +1,233 @@ +// +// MenuProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +#import "MenuProxy.h" +#import "MenuItemProxy.h" + +static char REPRESENTED_OBJECT; + +@interface NSMenu (represented) +@property (strong) id representedObject; +@end + +@implementation NSMenu (represented) + +- (id) representedObject +{ + return objc_getAssociatedObject(self, &REPRESENTED_OBJECT); +} + +- (void) setRepresentedObject:(id)representedObject +{ + objc_setAssociatedObject(self, + &REPRESENTED_OBJECT, + representedObject, + OBJC_ASSOCIATION_RETAIN); +} + +@end + +@implementation MenuProxy + +- (id) initWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + self = [super initWithContext:aContext]; + if (!self) + return nil; + menu = aMenu; + menu.representedObject = self; + return self; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + // singleton-ish. + MenuProxy *ret = [aMenu representedObject]; + if (ret) + { + NSLog(@"MP cache hit"); + return ret; + } + return [[MenuProxy alloc] initWithContext:aContext andMenu:aMenu]; +} + +- (void) dealloc +{ + menu.representedObject = nil; +} + +- (NSString*) description +{ + return [menu description]; +} + +static BOOL isNullish(id o) +{ + if (!o) + return YES; + if ([o isKindOfClass:[WebUndefined class]]) + return YES; + return NO; +} + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)keyCommand + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index +{ + if (isNullish(title)) + title = @""; + + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + NSMenuItem *item = nil; + + if(index) { + item = [menu insertItemWithTitle:title action:nil keyEquivalent:aKey atIndex:index ]; + } else { + item = [menu addItemWithTitle:title action:nil keyEquivalent:aKey ]; + + } + + // Set the modifiers. + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; + + if(!menu.supermenu) { + NSMenu *s = [[NSMenu alloc] initWithTitle:title]; + [item setSubmenu:s]; + } + + MenuItemProxy *mip = [MenuItemProxy proxyWithContext:context andMenuItem:item]; + if (!isNullish(aCallback)) + [mip setCallback:aCallback]; + + + return mip; +} + ++ (NSString*)getKeyFromString:(NSString*)keyCommand { + if (isNullish(keyCommand)) + keyCommand = @""; + + // Obtain the key (if there are modifiers, it will be the last character). + NSString *aKey = @""; + if ([keyCommand length] > 0) { + aKey = [keyCommand substringFromIndex:[keyCommand length] - 1]; + } + + return aKey; +} + ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand { + // aKeys may optionally specify one or more modifiers. + NSUInteger modifiers = 0; + + if ([keyCommand rangeOfString:@"caps"].location != NSNotFound) modifiers += NSAlphaShiftKeyMask; + if ([keyCommand rangeOfString:@"shift"].location != NSNotFound) modifiers += NSShiftKeyMask; + if ([keyCommand rangeOfString:@"cmd"].location != NSNotFound) modifiers += NSCommandKeyMask; + if ([keyCommand rangeOfString:@"ctrl"].location != NSNotFound) modifiers += NSControlKeyMask; + if ([keyCommand rangeOfString:@"opt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + if ([keyCommand rangeOfString:@"alt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + + return modifiers; +} + +- (MenuItemProxy*)addSeparator +{ + NSMenuItem *sep = [NSMenuItem separatorItem]; + [menu addItem:sep]; + return [MenuItemProxy proxyWithContext:context andMenuItem:sep]; +} + +- (MenuItemProxy*)itemForKey:(id)key +{ + if (isNullish(key)) + return nil; + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + return [MenuItemProxy proxyWithContext:context andMenuItem:item]; +} + +- (MenuProxy*)removeItem:(id)key +{ + if (isNullish(key)) + return nil; + + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + [menu removeItem:item]; + return [MenuProxy proxyWithContext:context andMenu:menu]; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addItemWithTitle:keyEquivalent:callback:atIndex:)) { + result = @"addItem"; + } + else if (selector == @selector(addSeparator)) { + result = @"addSeparator"; + } + else if (selector == @selector(itemForKey:)) { + result = @"getItem"; + } + else if (selector == @selector(removeItem:)) { + result = @"removeMenu"; + } + + return result; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h new file mode 100644 index 000000000..51077a434 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h @@ -0,0 +1,26 @@ +// +// Notice.h +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +#define APP_NOTICE_NOTIFICATION @"Notice" + +@interface Notice : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) notify:(NSDictionary*)message; +- (void) close:(NSString*)notificationId; ++ (BOOL) available; + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m new file mode 100644 index 000000000..a4095f9f2 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m @@ -0,0 +1,108 @@ +// +// Notice.m +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Notice.h" + +#import "JSEventHelper.h" + +@implementation Notice + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; + } + return self; +} + +- (void) notify:(NSDictionary *)message { + NSUserNotification *notification = [[NSUserNotification alloc] init]; + [notification setTitle:[message valueForKey:@"title"]]; + [notification setInformativeText:[message valueForKey:@"content"]]; + [notification setDeliveryDate:[NSDate dateWithTimeInterval:0 sinceDate:[NSDate date]]]; + BOOL playSound = true; // optional parameter, false only when {sound: false} + @try { + NSNumber *s = [message valueForKey:@"sound"]; + if ([[s className] isEqual: @"__NSCFBoolean"]) { + playSound = [s boolValue]; + } + } + @catch (NSException *exception) { + } + if (playSound) { + [notification setSoundName:NSUserNotificationDefaultSoundName]; + } + NSString *id = @""; // optional, needed for close + @try { + id = [message valueForKey:@"id"]; + } + @catch (NSException *exception) { + } + [notification setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:id, @"id", nil]]; + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + [center scheduleNotification:notification]; +} + +// close all notifications with id == notificationId or close all notifications if notificationId == "*" +- (void) close:(NSString*)notificationId { + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + for(NSUserNotification * deliveredNote in center.deliveredNotifications) { + if ([notificationId isEqualToString:@"*"] || [deliveredNote.userInfo[@"id"] isEqualToString:notificationId]) { + [center removeDeliveredNotification: deliveredNote]; + } + } +} + ++ (BOOL) available { + if ([NSUserNotificationCenter respondsToSelector:@selector(defaultUserNotificationCenter)]) + return YES; + + return NO; +} + +- (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification +{ + NSString *notificationId = [notification.userInfo valueForKey:@"id"]; + [JSEventHelper triggerEvent:@"macgap.notify.activated" forDetail:notificationId forWebView:self.webView]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + BOOL result = YES; + if (selector == @selector(notify:)) + result = NO; + if (selector == @selector(close:)) + result = NO; + + return result; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(notify:)) { + result = @"notify"; + } + if (selector == @selector(close:)) { + result = @"close"; + } + + return result; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h new file mode 100644 index 000000000..f931340d0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h @@ -0,0 +1,21 @@ +#import + +@interface Path : NSObject { + +} + +- (NSString *) application; +- (NSString *) resource; +- (NSString *) documents; +- (NSString *) library; +- (NSString *) home; +- (NSString *) temp; + +@property (readonly,copy) NSString* application; +@property (readonly,copy) NSString* resource; +@property (readonly,copy) NSString* documents; +@property (readonly,copy) NSString* library; +@property (readonly,copy) NSString* home; +@property (readonly,copy) NSString* temp; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m new file mode 100644 index 000000000..8c54100f7 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m @@ -0,0 +1,53 @@ +#import "Path.h" + +@implementation Path + +@synthesize application; +@synthesize resource; +@synthesize documents; +@synthesize library; +@synthesize home; +@synthesize temp; + +- (NSString *)application { + return [[NSBundle mainBundle] bundlePath]; +} + +- (NSString *)resource { + return [[NSBundle mainBundle] resourcePath]; +} + +- (NSString *)documents { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return [paths objectAtIndex:0]; +} + +- (NSString *)library { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); + NSLog( @"%@", paths ); + return [paths objectAtIndex:0]; +} + +- (NSString *)home { + return NSHomeDirectory(); +} + +- (NSString *)temp { + return NSTemporaryDirectory(); +} + +#pragma mark WebScripting Protocol + +/* checks whether a selector is acceptable to be called from JavaScript */ ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h new file mode 100644 index 000000000..067076439 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h @@ -0,0 +1,17 @@ +#import +#import "Command.h" +#import "CallbackDelegate.h" + + +@interface Sound : Command { + +} + +// pending callbacks for sounds being played, to keep +// ARC from freeing them too early +@property (nonatomic, strong) NSMutableSet *pending; + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback; +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m new file mode 100644 index 000000000..9f4a44dbc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m @@ -0,0 +1,97 @@ +#import "Sound.h" + + +@interface PlayDelegate : CallbackDelegate { +} + +@property (nonatomic, weak) Sound *sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound; +@end + +@implementation PlayDelegate + +@synthesize sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound +{ + self = [super initWithContext:aContext forCallback:aCallback]; + if (!self) + return nil; + sound = aSound; + return self; +} + +- (void)sound:(NSSound *)aSound didFinishPlaying:(BOOL)finishedPlaying { + [self callWithParams:[aSound name], nil]; + [sound.pending removeObject:self]; +} + +@end + +@implementation Sound + +@synthesize pending; + +- (id) initWithContext:(JSContextRef)aContext { + self = [super initWithContext:aContext]; + if (!self) { + return nil; + } + + pending = [NSMutableSet new]; + return self; +} + +- (void) playSound:(NSSound*)sound onComplete:(WebScriptObject*)callback { + if (callback != (id)[WebUndefined undefined]) { + PlayDelegate *d = [[PlayDelegate alloc] initWithContext:context + forCallback:callback + withSound:self]; + [pending addObject:d]; + [sound setDelegate:d]; + } + [sound play]; +} + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback { + NSURL* fileUrl = [NSURL fileURLWithPath:[[Utils sharedInstance] pathForResource:file]]; + DebugNSLog(@"Sound file:%@", [fileUrl description]); + + NSSound* sound = [[NSSound alloc] initWithContentsOfURL:fileUrl byReference:YES]; + [self playSound:sound onComplete:callback]; +} + +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback { + NSSound *systemSound = [NSSound soundNamed:name]; + [self playSound:systemSound onComplete:callback]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(play:onComplete:)) { + result = @"play"; + } + else if (selector == @selector(playSystem:onComplete:)) { + result = @"playSystem"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h new file mode 100644 index 000000000..269191b39 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h @@ -0,0 +1,43 @@ +// +// UserDefaults.h +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import + +#import "WindowController.h" + +@interface UserDefaults : NSObject + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (NSString*) getMyDefaults; +- (NSDictionary*) myDefaultsDictionary; +- (void) removeObjectForKey:(NSString*)key; +- (NSArray*) getUserDefaultsKeys; + +- (NSString*) addPrefix:(NSString*)key; + +- (void) setString:(NSString*)key withValue:(NSString*)value; +- (NSString*) getString:(NSString*)key; + +- (void) setInteger:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getInteger:(NSString*)key; + +- (void) setBool:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getBool:(NSString*)key; + +- (void) setFloat:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getFloat:(NSString*)key; + +// Could also be implemented: +//– setObject:forKey: +//– setDouble:forKey: +//– setURL:forKey: + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m new file mode 100644 index 000000000..485687108 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m @@ -0,0 +1,211 @@ +// +// UserDefaults.m +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import "UserDefaults.h" +#import "JSEventHelper.h" + +@interface UserDefaults() { + +} + +-(void) setupNotificationCenter; + +@end + + +@implementation UserDefaults + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [self setupNotificationCenter]; + } + + return self; +} + + +-(void) setupNotificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(defaultsChanged:) + name:NSUserDefaultsDidChangeNotification + object:nil]; +} + +- (void)defaultsChanged:(NSNotification *)notification { + NSDictionary* returnDict = [self myDefaultsDictionary]; + [JSEventHelper triggerEvent:@"userDefaultsChanged" withArgs:returnDict forWebView:self.webView]; +} + +- (NSString*) getMyDefaults { + NSDictionary* myDefaults = [self myDefaultsDictionary]; + + return [[Utils sharedInstance] convertDictionaryToJSON:myDefaults]; +} + +- (NSDictionary*) myDefaultsDictionary { + NSString* prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + NSMutableDictionary* returnDict = [[NSMutableDictionary alloc] init]; + + // Get the user defaults. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Build up a dictionary containing just the items beginning with our + // prefix. + for (NSString* key in [self getUserDefaultsKeys]) { + if ([key hasPrefix:prefix]) { + id val = [defaults valueForKey:key]; + [returnDict setObject:val forKey:key]; + } + } + + return returnDict; +} + +- (NSArray*) getUserDefaultsKeys { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [[prefs dictionaryRepresentation] allKeys]; +} + +- (void) removeObjectForKey:(NSString*)key { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:prefixedKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +// Check we have a standard prefix for JS-modified keys, for security purposes. +// If not, add it. This stops JavaScript from ever being able to modify keys +// it did not create. +- (NSString*) addPrefix:(NSString*)key { + NSString* prefix; + prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + + if (![key hasPrefix:prefix]) { + key = [prefix stringByAppendingString:key]; + } + return key; +} + +// String + +- (void) setString:(NSString*)key withValue:(NSString*)value { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + [prefs setObject:value forKey:prefixedKey]; +} + +- (NSString*) getString:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [prefs stringForKey:key]; +} + +// All the following must convert their type to NSNumber for JavaScript. + +// Integer + +- (void) setInteger:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSInteger myInt = [value intValue]; + [prefs setInteger:myInt forKey:prefixedKey]; +} + +- (NSNumber*) getInteger:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithInteger:[prefs integerForKey:key]]; +} + +// Boolean + +- (void) setBool:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + BOOL myBool = [value boolValue]; + [prefs setBool:myBool forKey:prefixedKey]; +} + +- (NSNumber*) getBool:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithBool:[prefs boolForKey:key]]; +} + +// Float + +- (void) setFloat:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + float myFloat = [value floatValue]; + [prefs setFloat:myFloat forKey:prefixedKey]; +} + +- (NSNumber*) getFloat:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithFloat:[prefs floatForKey:key]]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(getMyDefaults)) { + result = @"getMyDefaults"; + } + + if (selector == @selector(removeObjectForKey:)) { + result = @"removeObjectForKey"; + } + + else if (selector == @selector(setString:withValue:)) { + result = @"setString"; + } else if (selector == @selector(getString:)) { + result = @"getString"; + } + + else if (selector == @selector(setInteger:withValue:)) { + result = @"setInteger"; + } else if (selector == @selector(getInteger:)) { + result = @"getInteger"; + } + + else if (selector == @selector(setBool:withValue:)) { + result = @"setBool"; + } else if (selector == @selector(getBool:)) { + result = @"getBool"; + } + + else if (selector == @selector(setFloat:withValue:)) { + result = @"setFloat"; + } else if (selector == @selector(getFloat:)) { + result = @"getFloat"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h new file mode 100644 index 000000000..62c7b7e83 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h @@ -0,0 +1,9 @@ +@interface Fonts : NSObject { +} + +- (NSArray*) availableFonts; +- (NSArray*) availableFontFamilies; +- (NSArray*) availableMembersOfFontFamily:(NSString*)fontFamily; +- (CGFloat) defaultLineHeightForFont:(NSString *)theFontName ofSize:(CGFloat)theFontSize; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m new file mode 100644 index 000000000..b17818a53 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m @@ -0,0 +1,48 @@ +#import "fonts.h" + +@implementation Fonts + + +- (NSArray*) availableFonts { + return [[NSFontManager sharedFontManager] availableFonts]; +} + +- (NSArray*) availableFontFamilies { + return [[NSFontManager sharedFontManager] availableFontFamilies]; +} + +- (NSArray*) availableMembersOfFontFamily:(NSString *)fontFamily { + return [[NSFontManager sharedFontManager] availableMembersOfFontFamily:fontFamily]; +} + +- (CGFloat) defaultLineHeightForFont:(NSString*)theFontName ofSize:(CGFloat)theFontSize { + NSFont *theFont = [NSFont fontWithName:theFontName size:theFontSize]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + + return [lm defaultLineHeightForFont:theFont]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(availableMembersOfFontFamily:)) { + result = @"availableMembersOfFontFamily"; + } else if (selector == @selector(defaultLineHeightForFont:ofSize:)) { + result = @"defaultLineHeightForFont"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h new file mode 100644 index 000000000..1fe59d6cc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h @@ -0,0 +1,7 @@ +// Application constants + +#define kStartPage @"http://127.0.0.1:9993/" + +#define kStartFolder @"." + +#define kWebScriptNamespace @"macgap" \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h new file mode 100644 index 000000000..65890a5ee --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h @@ -0,0 +1,15 @@ +#import +#import + +@class WebViewDelegate; + +@interface ContentView : NSView { + IBOutlet WebView* webView; + WebViewDelegate* delegate; +} + +@property (retain) WebView* webView; +@property (retain) WebViewDelegate* delegate; +@property (strong) IBOutlet NSMenu *mainMenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m new file mode 100644 index 000000000..24e58cd1c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m @@ -0,0 +1,68 @@ +#import "ContentView.h" +#import "WebViewDelegate.h" +#import "AppDelegate.h" +#import "JSEventHelper.h" + +@interface WebPreferences (WebPreferencesPrivate) + - (void)_setLocalStorageDatabasePath:(NSString *)path; + - (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; + - (void) setDatabasesEnabled:(BOOL)databasesEnabled; + - (void) setDeveloperExtrasEnabled:(BOOL)developerExtrasEnabled; + - (void) setWebGLEnabled:(BOOL)webGLEnabled; + - (void) setOfflineWebApplicationCacheEnabled:(BOOL)offlineWebApplicationCacheEnabled; +@end + +@implementation ContentView + +@synthesize webView, delegate, mainMenu; + +- (void) awakeFromNib +{ + WebPreferences *webPrefs = [WebPreferences standardPreferences]; + + NSString *cappBundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; + NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath]; + NSString *savePath = [NSString pathWithComponents:[NSArray arrayWithObjects:applicationSupportFile, cappBundleName, @"LocalStorage", nil]]; + [webPrefs _setLocalStorageDatabasePath:savePath]; + [webPrefs setLocalStorageEnabled:YES]; + [webPrefs setDatabasesEnabled:YES]; + [webPrefs setDeveloperExtrasEnabled:[[NSUserDefaults standardUserDefaults] boolForKey: @"developer"]]; + [webPrefs setOfflineWebApplicationCacheEnabled:YES]; + [webPrefs setWebGLEnabled:YES]; + + [self.webView setPreferences:webPrefs]; + + NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage + sharedHTTPCookieStorage]; + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; + + [self.webView setApplicationNameForUserAgent: @"MacGap"]; + + self.delegate = [[WebViewDelegate alloc] initWithMenu:[NSApp mainMenu]]; + [self.webView setFrameLoadDelegate:self.delegate]; + [self.webView setUIDelegate:self.delegate]; + [self.webView setResourceLoadDelegate:self.delegate]; + [self.webView setDownloadDelegate:self.delegate]; + [self.webView setPolicyDelegate:self.delegate]; + [self.webView setDrawsBackground:NO]; + [self.webView setShouldCloseWithWindow:NO]; + + [self.webView setGroupName:@"MacGap"]; + +} + +- (void) windowResized:(NSNotification*)notification; +{ + NSWindow* window = (NSWindow*)notification.object; + NSSize size = [window frame].size; + + DebugNSLog(@"window width = %f, window height = %f", size.width, size.height); + + bool isFullScreen = (window.styleMask & NSFullScreenWindowMask) == NSFullScreenWindowMask; + int titleBarHeight = isFullScreen ? 0 : [[Utils sharedInstance] titleBarHeight:window]; + + [self.webView setFrame:NSMakeRect(0, 0, size.width, size.height - titleBarHeight)]; + [JSEventHelper triggerEvent:@"orientationchange" forWebView:self.webView]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h new file mode 100644 index 000000000..401f3e396 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h @@ -0,0 +1,20 @@ +// +// Helper.h +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +@interface JSEventHelper : NSObject + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m new file mode 100644 index 000000000..65406b3c0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m @@ -0,0 +1,41 @@ +// +// Helper.m +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "JSEventHelper.h" + +@implementation JSEventHelper + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:[NSMutableDictionary dictionary] forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:args forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView { + + // Convert args Dictionary to JSON. + NSString* jsonString = [[Utils sharedInstance] convertDictionaryToJSON:args]; + + // Create the event JavaScript and run it. + NSString * str = [NSString stringWithFormat:@"var e = document.createEvent('Events'); e.initEvent('%@', true, false); e.data=%@; %@.dispatchEvent(e); ", event, jsonString, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView { + [self triggerEvent:event forDetail:detail forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView { + NSString *detailEscaped = [detail stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; + NSString *str = [NSString stringWithFormat:@"var e = new CustomEvent('%@', { 'detail': decodeURIComponent(\"%@\") }); %@.dispatchEvent(e); ", event, detailEscaped, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h new file mode 100644 index 000000000..f573d881a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h @@ -0,0 +1,20 @@ +#import +#import + +#define DEG_EPS 0.001 +#define fequal(a,b) (fabs((a) - (b)) < DEG_EPS) +#define fequalzero(a) (fabs(a) < DEG_EPS) + +@class LoadingView; + +@interface Utils : NSObject { +} + +- (float) titleBarHeight:(NSWindow*)aWindow; +- (NSString*) pathForResource:(NSString*)resourcepath; +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict; +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray; + ++ (Utils*) sharedInstance; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m new file mode 100644 index 000000000..8d85c2949 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m @@ -0,0 +1,93 @@ +#import "Utils.h" +#import + +static Utils* sharedInstance = nil; + +@implementation Utils + +- (float) titleBarHeight:(NSWindow*)aWindow +{ + NSRect frame = [aWindow frame]; + NSRect contentRect = [NSWindow contentRectForFrameRect: frame + styleMask: NSTitledWindowMask]; + + return (frame.size.height - contentRect.size.height); +} + +- (NSString*) pathForResource:(NSString*)resourcepath +{ + NSBundle * mainBundle = [NSBundle mainBundle]; + NSMutableArray *directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; + NSString *filename = [directoryParts lastObject]; + [directoryParts removeLastObject]; + + NSString *directoryStr = [NSString stringWithFormat:@"%@/%@", kStartFolder, [directoryParts componentsJoinedByString:@"/"]]; + return [mainBundle pathForResource:filename + ofType:@"" + inDirectory:directoryStr]; +} + +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict { + // Convert defaults Dictionary to JSON. + NSError *error; + NSData *jsonData = [NSJSONSerialization + dataWithJSONObject:dict + options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string + error:&error]; + + NSString *jsonString; + if (! jsonData) { + NSLog(@"Got an error converting to JSON: %@", error); + } + else { + jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + + return jsonString; +} + +// Convert JavaScript array (arrives as a WebScriptObject) into an NSArray of strings. +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray { + NSInteger count = [[jsArray valueForKey:@"length"] integerValue]; + + NSMutableArray *args = [NSMutableArray array]; + for (int i = 0; i < count; i++) { + NSString *item = [jsArray webScriptValueAtIndex:i]; + if ([item isKindOfClass:[NSString class]]) { + [args addObject:item]; + } + } + + return args; +} + +#pragma mark - +#pragma mark Singleton methods + ++ (Utils*) sharedInstance +{ + @synchronized(self) + { + if (sharedInstance == nil){ + sharedInstance = [[Utils alloc] init]; + } + } + return sharedInstance; +} + ++ (id) allocWithZone:(NSZone *)zone { + @synchronized(self) { + if (sharedInstance == nil) { + sharedInstance = [super allocWithZone:zone]; + return sharedInstance; // assignment and return on first allocation + } + } + return nil; // on subsequent allocation attempts return nil +} + +- (id) copyWithZone:(NSZone *)zone +{ + return self; +} + +@end \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h new file mode 100644 index 000000000..49c6da6b9 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h @@ -0,0 +1,49 @@ +#import +#import + +@class Sound; +@class Dock; +@class Growl; +@class Notice; +@class Path; +@class App; +@class Window; +@class Clipboard; +@class Fonts; +@class MenuProxy; +@class UserDefaults; + +@class WindowController; + +@interface WebViewDelegate : NSObject { + Sound* sound; + Dock* dock; + Growl* growl; + Notice* notice; + Path* path; + App* app; + Window* window; + Clipboard* clipboard; + Fonts* fonts; + NSMenu *mainMenu; + UserDefaults* userDefaults; +} + + + +@property (nonatomic, retain) Sound* sound; +@property (nonatomic, retain) Dock* dock; +@property (nonatomic, retain) Growl* growl; +@property (nonatomic, retain) Notice* notice; +@property (nonatomic, retain) Path* path; +@property (nonatomic, retain) App* app; +@property (nonatomic, retain) Window* window; +@property (nonatomic, retain) Clipboard* clipboard; +@property (nonatomic, retain) Fonts* fonts; +@property (nonatomic, retain) MenuProxy* menu; +@property (nonatomic, retain) UserDefaults* userDefaults; + +@property (nonatomic, retain) WindowController *requestedWindow; + +- (id) initWithMenu:(NSMenu*)menu; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m new file mode 100644 index 000000000..505780183 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m @@ -0,0 +1,206 @@ +#import "WebViewDelegate.h" +#import "Sound.h" +#import "Dock.h" +#import "Notice.h" +#import "Path.h" +#import "App.h" +#import "Window.h" +#import "WindowController.h" +#import "Clipboard.h" +#import "Fonts.h" +#import "MenuProxy.h" +#import "UserDefaults.h" + +@implementation WebViewDelegate + +@synthesize sound; +@synthesize dock; +@synthesize growl; +@synthesize notice; +@synthesize path; +@synthesize app; +@synthesize window; +@synthesize requestedWindow; +@synthesize clipboard; +@synthesize fonts; +@synthesize menu; +@synthesize userDefaults; + +- (id) initWithMenu:(NSMenu*)aMenu +{ + self = [super init]; + if (!self) + return nil; + + mainMenu = aMenu; + return self; +} + +- (void) webView:(WebView*)webView didClearWindowObject:(WebScriptObject*)windowScriptObject forFrame:(WebFrame *)frame +{ + JSContextRef context = [frame globalContext]; + if (self.sound == nil) { self.sound = [[Sound alloc] initWithContext:context]; } + if (self.dock == nil) { self.dock = [Dock new]; } + if (self.path == nil) { self.path = [Path new]; } + if (self.clipboard == nil) { self.clipboard = [Clipboard new]; } + if (self.fonts == nil) { self.fonts = [Fonts new]; } + + if (self.notice == nil && [Notice available] == YES) { + self.notice = [[Notice alloc] initWithWebView:webView]; + } + + if (self.app == nil) { + self.app = [[App alloc] initWithWebView:webView]; + } + + if (self.window == nil) { + self.window = [[Window alloc] initWithWebView:webView]; + } + + if (self.menu == nil) { + self.menu = [MenuProxy proxyWithContext:context andMenu:mainMenu]; + } + + if (self.userDefaults == nil) { + self.userDefaults = [[UserDefaults alloc] initWithWebView:webView]; + } + + [windowScriptObject setValue:self forKey:kWebScriptNamespace]; +} + + +- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles{ + + NSOpenPanel * openDlg = [NSOpenPanel openPanel]; + + [openDlg setCanChooseFiles:YES]; + [openDlg setCanChooseDirectories:NO]; + + [openDlg beginWithCompletionHandler:^(NSInteger result){ + if (result == NSFileHandlingPanelOKButton) { + NSArray * files = [[openDlg URLs] valueForKey: @"relativePath"]; + [resultListener chooseFilenames: files]; + } else { + [resultListener cancel]; + } + }]; +} + +- (void) webView:(WebView*)webView addMessageToConsole:(NSDictionary*)message +{ + if (![message isKindOfClass:[NSDictionary class]]) { + return; + } + + NSLog(@"JavaScript console: %@:%@: %@", + [[message objectForKey:@"sourceURL"] lastPathComponent], // could be nil + [message objectForKey:@"lineNumber"], + [message objectForKey:@"message"]); +} + +- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; +} + +- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Yes"]; + [alert addButtonWithTitle:@"No"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] == NSAlertFirstButtonReturn) + return YES; + else + return NO; +} + +/* + By default the size of a database is set to 0 [1]. When a database is being created + it calls this delegate method to get an increase in quota size - or call an error. + PS this method is defined in WebUIDelegatePrivate and may make it difficult, but + not impossible [2], to get an app accepted into the mac app store. + + Further reading: + [1] http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate + [2] http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application/4608549#4608549 + */ +- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier +{ + static const unsigned long long defaultQuota = 5 * 1024 * 1024; + if ([origin respondsToSelector: @selector(setQuota:)]) { + [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]]; + } else { + NSLog(@"could not increase quota for %lld", defaultQuota); + } +} + +- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems +{ + NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy]; + + if (webViewMenuItems) + { + NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator]; + NSMenuItem *menuItem = nil; + while ((menuItem = [itemEnumerator nextObject])) + { + NSInteger tag = [menuItem tag]; + + switch (tag) + { + case WebMenuItemTagOpenLinkInNewWindow: + case WebMenuItemTagDownloadLinkToDisk: + case WebMenuItemTagCopyLinkToClipboard: + case WebMenuItemTagOpenImageInNewWindow: + case WebMenuItemTagDownloadImageToDisk: + case WebMenuItemTagCopyImageToClipboard: + case WebMenuItemTagOpenFrameInNewWindow: + case WebMenuItemTagGoBack: + case WebMenuItemTagGoForward: + case WebMenuItemTagStop: + case WebMenuItemTagOpenWithDefaultApplication: + case WebMenuItemTagReload: + [webViewMenuItems removeObjectIdenticalTo: menuItem]; + } + } + } + + return webViewMenuItems; +} + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{ + requestedWindow = [[WindowController alloc] initWithRequest:request]; + return requestedWindow.contentView.webView; +} + +- (void)webViewShow:(WebView *)sender{ + [requestedWindow showWindow:sender]; +} + +- (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener +{ + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + [listener ignore]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return YES; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h new file mode 100644 index 000000000..f721376e0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h @@ -0,0 +1,23 @@ +#import + +#import "WindowController.h" + +@interface Window : NSObject{ + CGRect _oldRestoreFrame; +} + +@property (retain, nonatomic) WindowController *windowController; +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) open:(NSDictionary *)properties; +- (void) move:(NSDictionary *)properties; +- (void) resize:(NSDictionary *) properties; +- (Boolean) isMaximized; +- (CGFloat) getX; +- (CGFloat) getY; +- (void) maximize; +- (void) restore; +- (void) toggleFullscreen; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m new file mode 100644 index 000000000..2444f62ea --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m @@ -0,0 +1,94 @@ +#import "Window.h" + +@implementation Window + +@synthesize windowController, webView; + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + } + return self; +} + +- (void) open:(NSDictionary *)properties +{ + self.windowController = [[WindowController alloc] initWithURL:[properties valueForKey:@"url"]]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + [self.windowController.window makeKeyWindow]; +} + +- (void) minimize { + [[NSApp mainWindow] miniaturize:[NSApp mainWindow]]; +} + +- (void) toggleFullscreen { + [[NSApp mainWindow] toggleFullScreen:[NSApp mainWindow]]; +} + +- (void) maximize { + CGRect a = [NSApp mainWindow].frame; + _oldRestoreFrame = CGRectMake(a.origin.x, a.origin.y, a.size.width, a.size.height); + [[NSApp mainWindow] setFrame:[[NSScreen mainScreen] visibleFrame] display:YES]; +} + +- (Boolean) isMaximized { + NSRect a = [NSApp mainWindow].frame; + NSRect b = [[NSScreen mainScreen] visibleFrame]; + return a.origin.x == b.origin.x && a.origin.y == b.origin.y && a.size.width == b.size.width && a.size.height == b.size.height; +} + +- (CGFloat) getX { + NSRect frame = [self.webView window].frame; + return frame.origin.x; +} + +- (CGFloat) getY { + NSRect frame = [self.webView window].frame; + return frame.origin.y; +} + +- (void) move:(NSDictionary *)properties +{ + NSRect frame = [self.webView window].frame; + frame.origin.x = [[properties valueForKey:@"x"] doubleValue]; + frame.origin.y = [[properties valueForKey:@"y"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; + +} + +- (void) resize:(NSDictionary *) properties +{ + NSRect frame = [self.webView window].frame; + frame.size.width = [[properties valueForKey:@"width"] doubleValue]; + frame.size.height = [[properties valueForKey:@"height"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; +} + + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + }else if (selector == @selector(move:)){ + result = @"move"; + }else if (selector == @selector(resize:)){ + result = @"resize"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h new file mode 100644 index 000000000..6c1a2f513 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h @@ -0,0 +1,10 @@ +#import + +@interface Clipboard : NSObject { + +} + +- (void) copy:(NSString*)text; +- (NSString *) paste; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m new file mode 100644 index 000000000..1c18dea38 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m @@ -0,0 +1,51 @@ +// +// clipboard.m +// MacGap +// +// Created by David Zorychta on 2013-07-22. +// Copyright (c) 2013 Twitter. All rights reserved. +// + +#import "Clipboard.h" + +@implementation Clipboard + +- (void) copy:(NSString*)text { + [[NSPasteboard generalPasteboard] clearContents]; + [[NSPasteboard generalPasteboard] setString:text forType:NSStringPboardType]; +} + +- (NSString *) paste { + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; + NSDictionary *options = [NSDictionary dictionary]; + BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; + if (ok) { + NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; + return (NSString *) [objectsToPaste objectAtIndex:0]; + } + return @""; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(copy:)) { + result = @"copy"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist new file mode 100644 index 000000000..2031cefcc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ZeroTier One + CFBundleIconFile + application.icns + CFBundleIdentifier + com.zerotier.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ZeroTier One + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch new file mode 100644 index 000000000..ad05e8420 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch @@ -0,0 +1,15 @@ +// +// Prefix header for all source files of the 'MacGap' target in the 'MacGap' project +// + +#ifdef __OBJC__ + #ifdef _DEBUG + #define DebugNSLog(format, ...) NSLog(format, ## __VA_ARGS__) + #else + #define DebugNSLog(format, ...) + #endif + + #import + #import "Constants.h" + #import "Utils.h" +#endif diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h new file mode 100644 index 000000000..72927effa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h @@ -0,0 +1,13 @@ +#import +#import "ContentView.h" + +@interface WindowController : NSWindowController { + +} + +- (id) initWithURL:(NSString *) url; +- (id) initWithRequest: (NSURLRequest *)request; +@property (retain) NSURL * url; +@property (retain) IBOutlet ContentView *contentView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m new file mode 100644 index 000000000..2765a2e3c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m @@ -0,0 +1,54 @@ +#import "WindowController.h" + + +@interface WindowController() { + +} + +-(void) notificationCenter; + +@end + +@implementation WindowController + +@synthesize contentView, url; + +- (id) initWithURL:(NSString *) relativeURL{ + self = [super initWithWindowNibName:@"Window"]; + self.url = [NSURL URLWithString:relativeURL relativeToURL:[[NSBundle mainBundle] resourceURL]]; + + [self.window setFrameAutosaveName:@"MacGapWindow"]; + [self notificationCenter]; + + return self; +} + +-(id) initWithRequest: (NSURLRequest *)request{ + self = [super initWithWindowNibName:@"Window"]; + [self notificationCenter]; + [[self.contentView.webView mainFrame] loadRequest:request]; + + return self; +} + +-(void) notificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self.contentView + selector:@selector(windowResized:) + name:NSWindowDidResizeNotification + object:[self window]]; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + if (self.url != nil) { + [self.contentView.webView setMainFrameURL:[self.url absoluteString]]; + } + + + // Implement this method to handle any initialization after your + // window controller's window has been loaded from its nib file. +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf new file mode 100644 index 000000000..6f388f662 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf @@ -0,0 +1,13 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\b\fs24 \cf0 (c)2011-2015 ZeroTier, Inc.\ +Licensed under the GNU GPLv3\ +\ +UI Wrapper MacGap (c) Twitter, Inc.\ +Licensed under the MIT License\ +http://macgap.com/\ +} \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib new file mode 100644 index 000000000..998c505a8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib @@ -0,0 +1,3404 @@ + + + + 1080 + 14D136 + 7702 + 1347.57 + 758.70 + + com.apple.InterfaceBuilder.CocoaPlugin + 7702 + + + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AppDelegate + + + AMainMenu + + + + ZeroTier One + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + + ZeroTier One + + + + About ZeroTier One + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide MacGap + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit ZeroTier One + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + + Format + + + + Font + + 2147483647 + + + submenuAction: + + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + + Ligature + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + + Help + + + + ZeroTier One Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 547 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + delegate + + + + 545 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 546 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 547 + + + + + AppDelegate + NSObject + + IBProjectSource + ../MacGap/AppDelegate.h + + + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocumentController + NSObject + + id + id + id + id + + + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSPopover + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSPopover.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSView + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSViewController + NSResponder + + view + NSView + + + view + + view + NSView + + + + IBFrameworkSource + AppKit.framework/Headers/NSViewController.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + WebView + NSView + + id + id + id + id + id + id + id + id + id + id + id + + + + goBack: + id + + + goForward: + id + + + makeTextLarger: + id + + + makeTextSmaller: + id + + + makeTextStandardSize: + id + + + reload: + id + + + reloadFromOrigin: + id + + + stopLoading: + id + + + takeStringURLFrom: + id + + + toggleContinuousSpellChecking: + id + + + toggleSmartInsertDelete: + id + + + + IBFrameworkSource + WebKit.framework/Headers/WebView.h + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib new file mode 100644 index 000000000..70d0c57b8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib @@ -0,0 +1,337 @@ + + + + 1070 + 11C74 + 1938 + 1138.23 + 567.00 + + YES + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + YES + 1938 + 822 + + + + YES + NSWindowTemplate + NSView + NSCustomObject + WebView + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + WindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {758, 410}} + 544735232 + Window + NSWindow + + + + + 256 + + YES + + + 274 + + YES + + YES + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple URL pasteboard type + Apple Web Archive pasteboard type + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + WebURLsWithTitlesPboardType + public.png + public.url + public.url-name + + + {758, 410} + + + + 2 + _NS:51 + + + + + + YES + + YES + WebKitDefaultFixedFontSize + WebKitDefaultFontSize + WebKitMinimumFontSize + + + YES + + + + + + + YES + YES + + + {758, 410} + + + + + {{0, 0}, {1920, 1178}} + {10000000000000, 10000000000000} + 128 + YES + + + + + YES + + + contentView + + + + 23 + + + + window + + + + 25 + + + + title: contentView.webView.mainFrameTitle + + + + + + title: contentView.webView.mainFrameTitle + title + contentView.webView.mainFrameTitle + 2 + + + 31 + + + + webView + + + + 19 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + 5 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 2.CustomClassName + 2.IBPluginDependency + 5.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + ContentView + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + + YES + + + + + + YES + + + + + 31 + + + + YES + + ContentView + NSView + + webView + WebView + + + webView + + webView + WebView + + + + IBProjectSource + ./Classes/ContentView.h + + + + WebView + + reloadFromOrigin: + id + + + reloadFromOrigin: + + reloadFromOrigin: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + WindowController + NSWindowController + + contentView + ContentView + + + contentView + + contentView + ContentView + + + + IBProjectSource + ./Classes/WindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/main.m b/ext/mac-ui-macgap1-wrapper/MacGap/main.m new file mode 100644 index 000000000..4ad50ad59 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/main.m @@ -0,0 +1,14 @@ +// +// main.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/ext/mac-ui-macgap1-wrapper/README.md b/ext/mac-ui-macgap1-wrapper/README.md new file mode 100644 index 000000000..bc69b1326 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/README.md @@ -0,0 +1,36 @@ +#MacGap + +The MacGap project provides HTML/JS/CSS developers an Xcode project for developing Native OSX Apps that run in OSX's WebView and take advantage of WebKit technologies. + +The project exposes a JavaScript API for OS X integration, such as displaying native OS X 10.9 notifications. The MacGap project is extremely lightweight and nimble; a blank application is about 980KB. + +### Features: +* tiny compiled app sizes +* Mac App Store compatible +* access to many Mac OS X-specific features + +##Pre-requisites + +MacGap works on OSX 10.6 and later. + +Generate apps with the [macgap generator](http://github.com/maccman/macgap-rb), no compile necessary. + + gem install macgap + + macgap new myapp + macgap build myapp + +##API + +MacGap exposes an object called `macgap` inside JavaScript. You can use it to alter the Dock icon and display Growl notifications, amongst other things. The API is documented in the WIKI on GitHub: https://github.com/maccman/macgap/wiki + + +##Attributes + +MacGap was forked/ported from Phonegap-mac. It's under the same license (MIT). + +##Custom Build + +To build, make sure you have installed the latest Mac OSX Core Library. Download at [http://developer.apple.com/](http://developer.apple.com/). + +Just clone the repository and build in Xcode. The file `public/index.html` is loaded on startup. diff --git a/ext/mac-ui-macgap1-wrapper/application.icns b/ext/mac-ui-macgap1-wrapper/application.icns new file mode 100644 index 0000000000000000000000000000000000000000..e4bcb2819c56c81aad36c3bf615e777727a0a158 GIT binary patch literal 88566 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∓fknCt7h{G6ay1jJaE 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 U^|fwgYOnFH>KIY%ueteu01?E2761SM literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/public/index.html b/ext/mac-ui-macgap1-wrapper/public/index.html new file mode 100644 index 000000000..9fab93250 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/public/index.html @@ -0,0 +1,33 @@ + + + + MacGap + + + + + + + +

MacGap

+ + \ No newline at end of file diff --git a/ui/main.jsx b/ui/main.jsx index 01c300e99..aa4c8bf1c 100644 --- a/ui/main.jsx +++ b/ui/main.jsx @@ -1,4 +1,51 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +function getUrlParameter(parameter) +{ + var currLocation = window.location.search; + if (currLocation.indexOf('?') < 0) + return ''; + var parArr = currLocation.split("?")[1].split("&"); + for(var i = 0; i < parArr.length; i++){ + parr = parArr[i].split("="); + if (parr[0] == parameter) { + return decodeURIComponent(parr[1]); + } + } + return ''; +} + +var ztAuthToken = getUrlParameter('authToken'); +if ((!ztAuthToken)||(ztAuthToken.length <= 0)) { + ztAuthToken = prompt('No authToken specified in URL. Enter token from\nauthtoken.secret to authorize.'); +} + React.render( - , + , document.getElementById('main') );