52 Commits

Author SHA1 Message Date
Alex Zielenski 63adfdb342 Merge remote-tracking branch 'origin/dev' 2014-07-31 04:59:36 -04:00
Alex Zielenski fa0764e04b use correct build number 2014-07-31 04:59:26 -04:00
Alex Zielenski e0c342c291 Merge remote-tracking branch 'origin/dev' 2014-07-31 04:58:17 -04:00
Alex Zielenski 200c323225 use a short version string in appcast 2014-07-31 04:57:59 -04:00
Alex Zielenski dc5974b1e5 Merge branch 'dev' 2014-07-31 04:55:33 -04:00
Alex Zielenski e1268114a9 use correct bundle version 2014-07-31 04:55:03 -04:00
Alex Zielenski 835d860546 Merge remote-tracking branch 'origin/dev' 2014-07-31 04:53:06 -04:00
Alex Zielenski ca2a0134d1 sparkle 2014-07-31 04:51:37 -04:00
Alex Zielenski 1a5286d567 bump version 2014-07-29 12:20:32 -04:00
Alex Zielenski c78b363aed fix prefs saving on application 2014-07-26 15:18:43 -04:00
Alex Zielenski 830628bb70 Merge branch 'master' of github.com:alexzielenski/Mousecape 2014-07-26 02:41:29 -04:00
Alex Zielenski 2e7b01e5d7 fix observation leak 2014-07-26 02:41:05 -04:00
Alex Zielenski 46d8ce7c57 Update README.md 2014-07-26 02:38:41 -04:00
Alex Zielenski 2bae6bfa00 Merge pull request #37 from alexzielenski/dev
0.0.5
2014-07-26 02:27:25 -04:00
Alex Zielenski 3a6af2920d fix window not showing applied cape 2014-07-26 02:20:02 -04:00
Alex Zielenski cbb87fa0e0 add option for left-handed users to flip pointers 2014-07-26 02:19:50 -04:00
Alex Zielenski 52162699c3 update current version in read me 2014-07-22 14:33:47 -04:00
Alex Zielenski 746e1b02a5 sort cursors by name in main window to fix #34 2014-07-15 01:50:09 -04:00
Alex Zielenski 5b548b9507 change the way saving works to fix #35 2014-07-15 01:37:36 -04:00
Alex Zielenski a3fd1e3023 use constant 2014-07-15 01:18:53 -04:00
Alex Zielenski 3368d64376 make sure libraryWindowController is loaded before anything to fix #28 2014-07-15 01:18:45 -04:00
Alex Zielenski 1948bff0f5 use promises for dragging with alt key 2014-07-14 23:49:41 -04:00
Alex Zielenski e30572a7f1 allow dragging in multiple images to animate cursors to fix #36 2014-07-14 23:25:41 -04:00
Alex Zielenski 6ce1490fa9 have the first rep set determine image size to fix #31 2014-07-14 18:35:31 -04:00
Alex Zielenski 4aadd80fe8 make hotspot position more accurate to fix #33 2014-07-14 18:13:04 -04:00
Alex Zielenski aec4a42363 better identifier checking 2014-07-14 17:49:57 -04:00
Alex Zielenski a68912d9b2 remove logging 2014-07-14 17:43:21 -04:00
Alex Zielenski 2aa38d60cc add cursor dumping interface action to fix #32 2014-07-14 17:42:17 -04:00
Alex Zielenski e23797f70a allow dragging images out holding alt to fix #29 2014-07-14 16:40:11 -04:00
Alex Zielenski 7a9daedc0e Information about how to animate your cursors 2014-07-02 16:42:13 -04:00
Alex Zielenski 88bf570d9b Merge pull request #27 from alexzielenski/dev
0.0.4
2014-07-02 16:29:52 -04:00
Alex Zielenski 5e432efcf8 remove cloud cursor after dragging an image out 2014-07-02 16:26:42 -04:00
Alex Zielenski 23674e6143 Allow dragging in image previews 2014-07-02 16:23:56 -04:00
Alex Zielenski 6aa869ed43 fix contextual menu actions 2014-07-02 16:18:21 -04:00
Alex Zielenski 0d82cd04c8 update credits 2014-07-02 16:17:50 -04:00
Alex Zielenski 1178ffd32e skip hidden files 2014-07-02 16:17:38 -04:00
Alex Zielenski 1cf5830161 fix bug where app wouldn't close if edit window was open when main window was closed 2014-06-19 13:00:33 -04:00
Alex Zielenski a34578a3b9 Merge branch 'master' of github.com:alexzielenski/Mousecape into dev 2014-06-19 12:50:57 -04:00
Alex Zielenski 900313eb22 bump version number 2014-06-19 12:50:19 -04:00
Alex Zielenski 8107a5a0f8 Merge pull request #25 from alexzielenski/dev
Yosemite
2014-06-19 12:49:08 -04:00
Alex Zielenski 3ca8dbf5da bump version 2014-06-19 12:47:22 -04:00
Alex Zielenski 64b67ec1aa more yosemite updates. NSViewControllers are now hooked into the responder chain so rename the menu action methods 2014-06-19 12:45:35 -04:00
Alex Zielenski be0d63e84d don't leak observation info on dealloc 2014-06-19 12:44:50 -04:00
Alex Zielenski 84ca1342c2 This transformer wants a string returned, not an error 2014-06-19 12:44:31 -04:00
Alex Zielenski 57d5c3a78c use weak properties for these outlets 2014-06-19 12:44:09 -04:00
Alex Zielenski 32f1d18ba8 make sure the images are set as template to have them change color automatically 2014-06-19 12:43:47 -04:00
Alex Zielenski f3fdaad3be use -dirty rather than isDirty for the kvo key 2014-06-19 12:43:21 -04:00
Alex Zielenski 992044c873 quit app after main window is closed 2014-06-19 12:41:23 -04:00
Alex Zielenski b3f56427d9 rewrite helper tool to be an app and install it per-user 2014-06-19 12:41:05 -04:00
Alex Zielenski e7b5fe8d03 yosemite removes CGSISCursorRegistered so we have to weakly link it and replace it 2014-06-19 12:37:28 -04:00
Alex Zielenski b1a5d8ca54 add export/dump feature to mousecloak 2014-06-19 12:34:37 -04:00
Alex Zielenski bb25a10604 Add previews in the cape table view, add a border around the hotspot dot, fix blurry drop zones 2014-03-10 17:59:36 -04:00
60 changed files with 2026 additions and 790 deletions
+1
View File
@@ -0,0 +1 @@
WorkspaceSettings.xcsettings
View File
+375 -152
View File
@@ -9,10 +9,14 @@
/* Begin PBXBuildFile section */
FA04886C189F58B1001F3AB5 /* Edit.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA048868189F58B1001F3AB5 /* Edit.xib */; };
FA04886D189F58B1001F3AB5 /* Library.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA04886A189F58B1001F3AB5 /* Library.xib */; };
FA14DE8D18CE596B00A73BF4 /* RBLClipView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA14DE8E18CE596B00A73BF4 /* RBLScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */; };
FA14DE9118CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA1DC01919527A73009E879C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359844189DBA3800288163 /* SystemConfiguration.framework */; };
FA1DC01A19527A79009E879C /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA254779189D85890038E1D9 /* ApplicationServices.framework */; };
FA35983F189DA3BC00288163 /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; };
FA359840189DA3C100288163 /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FA359849189DC40100288163 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359848189DC40100288163 /* Security.framework */; };
FA35984B189DC48800288163 /* mousecloak in Copy Tools */ = {isa = PBXBuildFile; fileRef = FAC69FAD189D608900BC829D /* mousecloak */; };
FA35984D189DC55A00288163 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA35984C189DC55A00288163 /* ServiceManagement.framework */; };
FA359852189E035900288163 /* listen.m in Sources */ = {isa = PBXBuildFile; fileRef = FA359851189E035900288163 /* listen.m */; };
FA359853189E040D00288163 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA359844189DBA3800288163 /* SystemConfiguration.framework */; };
@@ -20,6 +24,7 @@
FA5107E818A823BD00917185 /* MASPreferencesWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5107E318A823BD00917185 /* MASPreferencesWindowController.m */; };
FA5107ED18A8253600917185 /* MCGeneralPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = FA5107EB18A8253600917185 /* MCGeneralPreferencesController.m */; };
FA5107EE18A8253600917185 /* GeneralPreferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA5107EC18A8253600917185 /* GeneralPreferences.xib */; };
FA7582B8193D377300CE223C /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA7582B7193D377300CE223C /* ApplicationServices.framework */; };
FA8FF76B189D664400750E51 /* restore.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76A189D664400750E51 /* restore.m */; };
FA8FF76E189D66CB00750E51 /* backup.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76D189D66CB00750E51 /* backup.m */; };
FA8FF771189D66D800750E51 /* apply.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF770189D66D800750E51 /* apply.m */; };
@@ -40,10 +45,6 @@
FAC69F78189D603C00BC829D /* MCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69F77189D603C00BC829D /* MCAppDelegate.m */; };
FAC69F7B189D603C00BC829D /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F79189D603C00BC829D /* MainMenu.xib */; };
FAC69F7D189D603C00BC829D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F7C189D603C00BC829D /* Images.xcassets */; };
FAC69F84189D603C00BC829D /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F83189D603C00BC829D /* XCTest.framework */; };
FAC69F85189D603C00BC829D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F64189D603C00BC829D /* Cocoa.framework */; };
FAC69F8D189D603C00BC829D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FAC69F8B189D603C00BC829D /* InfoPlist.strings */; };
FAC69F8F189D603C00BC829D /* MousecapeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69F8E189D603C00BC829D /* MousecapeTests.m */; };
FAC69FB1189D608900BC829D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FB0189D608900BC829D /* main.m */; };
FAC69FB5189D608900BC829D /* mousecloak.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = FAC69FB4189D608900BC829D /* mousecloak.1 */; };
FAC69FD4189D609B00BC829D /* GBCommandLineParser.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FCF189D609B00BC829D /* GBCommandLineParser.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
@@ -52,6 +53,20 @@
FAC69FDA189D632B00BC829D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAC69F64189D603C00BC829D /* Cocoa.framework */; };
FAC69FDC189D636700BC829D /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FAC69FDD189D636700BC829D /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; };
FADBC15118CE51C000B9510F /* DTScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = FADBC15018CE51C000B9510F /* DTScrollView.m */; };
FADBC15418CE535200B9510F /* MCCapePreviewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = FADBC15318CE535200B9510F /* MCCapePreviewItem.m */; };
FADF0143198A2C9200006228 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FADF013A198A2C7500006228 /* Sparkle.framework */; };
FADF0147198A2CAD00006228 /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = FADF013A198A2C7500006228 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FAE5D56C1952700B007620DE /* MCDefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC69FDB189D636700BC829D /* MCDefs.m */; };
FAE5D56D1952700B007620DE /* MCPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = FA35983E189DA3BC00288163 /* MCPrefs.m */; };
FAE5D5701952700B007620DE /* apply.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF770189D66D800750E51 /* apply.m */; };
FAE5D5721952700B007620DE /* listen.m in Sources */ = {isa = PBXBuildFile; fileRef = FA359851189E035900288163 /* listen.m */; };
FAE5D57619527245007620DE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE5D57519527245007620DE /* main.m */; };
FAE5D578195272DD007620DE /* scale.m in Sources */ = {isa = PBXBuildFile; fileRef = FAAEF956189F4ED300145DF8 /* scale.m */; };
FAE5D57B195272F7007620DE /* backup.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76D189D66CB00750E51 /* backup.m */; };
FAE5D57C195272FE007620DE /* restore.m in Sources */ = {isa = PBXBuildFile; fileRef = FA8FF76A189D664400750E51 /* restore.m */; };
FAE5D57E19527359007620DE /* mousecloak in Copy Tool */ = {isa = PBXBuildFile; fileRef = FAC69FAD189D608900BC829D /* mousecloak */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FAE5D580195273B5007620DE /* com.alexzielenski.mousecloakhelper.app in Copy Helper */ = {isa = PBXBuildFile; fileRef = FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */; };
FAEE652918A047E8003AA182 /* NSFileManager+DirectoryLocations.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650A18A047E8003AA182 /* NSFileManager+DirectoryLocations.m */; };
FAEE652A18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650C18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
FAEE652B18A047E8003AA182 /* MCEditCapeController.m in Sources */ = {isa = PBXBuildFile; fileRef = FAEE650F18A047E8003AA182 /* MCEditCapeController.m */; };
@@ -77,27 +92,51 @@
remoteGlobalIDString = FAC69FAC189D608900BC829D;
remoteInfo = mousecloak;
};
FAC69F86189D603C00BC829D /* PBXContainerItemProxy */ = {
FADF0139198A2C7500006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FAC69F59189D603C00BC829D /* Project object */;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 8DC2EF5B0486A6940098B216;
remoteInfo = Sparkle;
};
FADF013B198A2C7500006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 61B5F90209C4CEE200B25A18;
remoteInfo = "Sparkle Test App";
};
FADF013D198A2C7500006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 612279D90DB5470200AB99EA;
remoteInfo = "Sparkle Unit Tests";
};
FADF013F198A2C7500006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 5D06E8D00FD68C7C005AE3F6;
remoteInfo = BinaryDelta;
};
FADF0141198A2C7500006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 55C14BB7136EEF1500649790;
remoteInfo = Autoupdate;
};
FADF0144198A2CA100006228 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = FAC69F60189D603C00BC829D;
remoteInfo = Mousecape;
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
remoteInfo = Sparkle;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
FA35984A189DC47800288163 /* Copy Tools */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 6;
files = (
FA35984B189DC48800288163 /* mousecloak in Copy Tools */,
);
name = "Copy Tools";
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FAB189D608900BC829D /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -108,11 +147,51 @@
);
runOnlyForDeploymentPostprocessing = 1;
};
FADF0146198A2CA600006228 /* Copy Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
FADF0147198A2CAD00006228 /* Sparkle.framework in Copy Frameworks */,
);
name = "Copy Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D57D1952734F007620DE /* Copy Tool */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 6;
files = (
FAE5D57E19527359007620DE /* mousecloak in Copy Tool */,
);
name = "Copy Tool";
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D57F1952737F007620DE /* Copy Helper */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/LoginItems;
dstSubfolderSpec = 1;
files = (
FAE5D580195273B5007620DE /* com.alexzielenski.mousecloakhelper.app in Copy Helper */,
);
name = "Copy Helper";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
FA048869189F58B1001F3AB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Edit.xib; sourceTree = "<group>"; };
FA04886B189F58B1001F3AB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Library.xib; sourceTree = "<group>"; };
FA14DE8918CE596B00A73BF4 /* RBLClipView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RBLClipView.h; sourceTree = "<group>"; };
FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RBLClipView.m; sourceTree = "<group>"; };
FA14DE8B18CE596B00A73BF4 /* RBLScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RBLScrollView.h; sourceTree = "<group>"; };
FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RBLScrollView.m; sourceTree = "<group>"; };
FA14DE8F18CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSColor+RBLCGColorAdditions.h"; sourceTree = "<group>"; };
FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSColor+RBLCGColorAdditions.m"; sourceTree = "<group>"; };
FA1DC01719527A56009E879C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
FA254779189D85890038E1D9 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
FA35983D189DA3BC00288163 /* MCPrefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPrefs.h; sourceTree = "<group>"; };
FA35983E189DA3BC00288163 /* MCPrefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPrefs.m; sourceTree = "<group>"; };
@@ -128,6 +207,7 @@
FA5107EA18A8253600917185 /* MCGeneralPreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCGeneralPreferencesController.h; path = Preferences/MCGeneralPreferencesController.h; sourceTree = "<group>"; };
FA5107EB18A8253600917185 /* MCGeneralPreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MCGeneralPreferencesController.m; path = Preferences/MCGeneralPreferencesController.m; sourceTree = "<group>"; };
FA5107EC18A8253600917185 /* GeneralPreferences.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = GeneralPreferences.xib; path = Preferences/GeneralPreferences.xib; sourceTree = "<group>"; };
FA7582B7193D377300CE223C /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = ../../../../../../../../../System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<group>"; };
FA8FF769189D663B00750E51 /* restore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = restore.h; sourceTree = "<group>"; };
FA8FF76A189D664400750E51 /* restore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = restore.m; sourceTree = "<group>"; };
FA8FF76C189D66C400750E51 /* backup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = backup.h; sourceTree = "<group>"; };
@@ -157,11 +237,7 @@
FAC69F77189D603C00BC829D /* MCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCAppDelegate.m; sourceTree = "<group>"; };
FAC69F7A189D603C00BC829D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
FAC69F7C189D603C00BC829D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
FAC69F82189D603C00BC829D /* MousecapeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MousecapeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
FAC69F83189D603C00BC829D /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
FAC69F8A189D603C00BC829D /* MousecapeTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MousecapeTests-Info.plist"; sourceTree = "<group>"; };
FAC69F8C189D603C00BC829D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
FAC69F8E189D603C00BC829D /* MousecapeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MousecapeTests.m; sourceTree = "<group>"; };
FAC69F9D189D605300BC829D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
FAC69FAD189D608900BC829D /* mousecloak */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mousecloak; sourceTree = BUILT_PRODUCTS_DIR; };
FAC69FB0189D608900BC829D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
@@ -193,6 +269,14 @@
FAC69FD3189D609B00BC829D /* GBSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GBSettings.m; sourceTree = "<group>"; };
FAC69FD7189D623C00BC829D /* Mousecape-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Mousecape-Prefix.pch"; sourceTree = "<group>"; };
FAC69FDB189D636700BC829D /* MCDefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCDefs.m; sourceTree = "<group>"; };
FADBC14F18CE51C000B9510F /* DTScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTScrollView.h; sourceTree = "<group>"; };
FADBC15018CE51C000B9510F /* DTScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTScrollView.m; sourceTree = "<group>"; };
FADBC15218CE535200B9510F /* MCCapePreviewItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCCapePreviewItem.h; sourceTree = "<group>"; };
FADBC15318CE535200B9510F /* MCCapePreviewItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCCapePreviewItem.m; sourceTree = "<group>"; };
FADF012E198A2C7400006228 /* Sparkle.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Sparkle.xcodeproj; path = Sparkle/Sparkle.xcodeproj; sourceTree = "<group>"; };
FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = com.alexzielenski.mousecloakhelper.app; sourceTree = BUILT_PRODUCTS_DIR; };
FAE5D54C19526F82007620DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
FAE5D57519527245007620DE /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
FAEE650918A047E8003AA182 /* NSFileManager+DirectoryLocations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+DirectoryLocations.h"; sourceTree = "<group>"; };
FAEE650A18A047E8003AA182 /* NSFileManager+DirectoryLocations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+DirectoryLocations.m"; sourceTree = "<group>"; };
FAEE650B18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSOrderedSet+AZSortedInsert.h"; sourceTree = "<group>"; };
@@ -232,32 +316,47 @@
files = (
FAAEF8F7189EB34700145DF8 /* QuartzCore.framework in Frameworks */,
FA35984D189DC55A00288163 /* ServiceManagement.framework in Frameworks */,
FADF0143198A2C9200006228 /* Sparkle.framework in Frameworks */,
FA359849189DC40100288163 /* Security.framework in Frameworks */,
FAC69F65189D603C00BC829D /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F7F189D603C00BC829D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F85189D603C00BC829D /* Cocoa.framework in Frameworks */,
FAC69F84189D603C00BC829D /* XCTest.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FAA189D608900BC829D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FA7582B8193D377300CE223C /* ApplicationServices.framework in Frameworks */,
FA359853189E040D00288163 /* SystemConfiguration.framework in Frameworks */,
FAC69FDA189D632B00BC829D /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D54619526F82007620DE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
FA1DC01A19527A79009E879C /* ApplicationServices.framework in Frameworks */,
FA1DC01919527A73009E879C /* SystemConfiguration.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
FA14DE8818CE596B00A73BF4 /* Rebel */ = {
isa = PBXGroup;
children = (
FA14DE8918CE596B00A73BF4 /* RBLClipView.h */,
FA14DE8A18CE596B00A73BF4 /* RBLClipView.m */,
FA14DE8B18CE596B00A73BF4 /* RBLScrollView.h */,
FA14DE8C18CE596B00A73BF4 /* RBLScrollView.m */,
FA14DE8F18CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.h */,
FA14DE9018CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m */,
);
path = Rebel;
sourceTree = "<group>";
};
FA5107DD18A823BD00917185 /* MASPreferences */ = {
isa = PBXGroup;
children = (
@@ -282,6 +381,9 @@
FAAEF8EE189EB32700145DF8 /* external */ = {
isa = PBXGroup;
children = (
FADF012E198A2C7400006228 /* Sparkle.xcodeproj */,
FA14DE8818CE596B00A73BF4 /* Rebel */,
FADBC14E18CE51C000B9510F /* DTScrollView */,
FA5107DD18A823BD00917185 /* MASPreferences */,
FAAEF8EF189EB32700145DF8 /* BTRKit */,
);
@@ -303,8 +405,8 @@
isa = PBXGroup;
children = (
FAC69F6A189D603C00BC829D /* Mousecape */,
FAC69F88189D603C00BC829D /* MousecapeTests */,
FAC69FAF189D608900BC829D /* mousecloak */,
FAE5D54A19526F82007620DE /* mousecloakHelper */,
FAC69F63189D603C00BC829D /* Frameworks */,
FAC69F62189D603C00BC829D /* Products */,
);
@@ -314,8 +416,8 @@
isa = PBXGroup;
children = (
FAC69F61189D603C00BC829D /* Mousecape.app */,
FAC69F82189D603C00BC829D /* MousecapeTests.xctest */,
FAC69FAD189D608900BC829D /* mousecloak */,
FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */,
);
name = Products;
sourceTree = "<group>";
@@ -323,6 +425,8 @@
FAC69F63189D603C00BC829D /* Frameworks */ = {
isa = PBXGroup;
children = (
FA1DC01719527A56009E879C /* CoreGraphics.framework */,
FA7582B7193D377300CE223C /* ApplicationServices.framework */,
FAAEF8F6189EB34700145DF8 /* QuartzCore.framework */,
FA35984C189DC55A00288163 /* ServiceManagement.framework */,
FA359848189DC40100288163 /* Security.framework */,
@@ -379,24 +483,6 @@
name = "Supporting Files";
sourceTree = "<group>";
};
FAC69F88189D603C00BC829D /* MousecapeTests */ = {
isa = PBXGroup;
children = (
FAC69F8E189D603C00BC829D /* MousecapeTests.m */,
FAC69F89189D603C00BC829D /* Supporting Files */,
);
path = MousecapeTests;
sourceTree = "<group>";
};
FAC69F89189D603C00BC829D /* Supporting Files */ = {
isa = PBXGroup;
children = (
FAC69F8A189D603C00BC829D /* MousecapeTests-Info.plist */,
FAC69F8B189D603C00BC829D /* InfoPlist.strings */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
FAC69FAF189D608900BC829D /* mousecloak */ = {
isa = PBXGroup;
children = (
@@ -478,6 +564,44 @@
path = GBCli;
sourceTree = "<group>";
};
FADBC14E18CE51C000B9510F /* DTScrollView */ = {
isa = PBXGroup;
children = (
FADBC14F18CE51C000B9510F /* DTScrollView.h */,
FADBC15018CE51C000B9510F /* DTScrollView.m */,
);
path = DTScrollView;
sourceTree = "<group>";
};
FADF012F198A2C7400006228 /* Products */ = {
isa = PBXGroup;
children = (
FADF013A198A2C7500006228 /* Sparkle.framework */,
FADF013C198A2C7500006228 /* Sparkle Test App.app */,
FADF013E198A2C7500006228 /* Sparkle Unit Tests.xctest */,
FADF0140198A2C7500006228 /* BinaryDelta */,
FADF0142198A2C7500006228 /* Autoupdate.app */,
);
name = Products;
sourceTree = "<group>";
};
FAE5D54A19526F82007620DE /* mousecloakHelper */ = {
isa = PBXGroup;
children = (
FAE5D54B19526F82007620DE /* Supporting Files */,
FAE5D57519527245007620DE /* main.m */,
);
path = mousecloakHelper;
sourceTree = "<group>";
};
FAE5D54B19526F82007620DE /* Supporting Files */ = {
isa = PBXGroup;
children = (
FAE5D54C19526F82007620DE /* Info.plist */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
FAEE650818A047E8003AA182 /* categories */ = {
isa = PBXGroup;
children = (
@@ -544,6 +668,8 @@
FAEE652818A047E8003AA182 /* MMAnimatingImageView.m */,
FAEE653718A048EA003AA182 /* MCSpriteLayer.h */,
FAEE653818A048EA003AA182 /* MCSpriteLayer.m */,
FADBC15218CE535200B9510F /* MCCapePreviewItem.h */,
FADBC15318CE535200B9510F /* MCCapePreviewItem.m */,
);
name = views;
path = src/views;
@@ -560,11 +686,14 @@
FAC69F5F189D603C00BC829D /* Resources */,
FAC69F5E189D603C00BC829D /* Frameworks */,
FA359841189DAAF900288163 /* Build Number */,
FA35984A189DC47800288163 /* Copy Tools */,
FAE5D57D1952734F007620DE /* Copy Tool */,
FAE5D57F1952737F007620DE /* Copy Helper */,
FADF0146198A2CA600006228 /* Copy Frameworks */,
);
buildRules = (
);
dependencies = (
FADF0145198A2CA100006228 /* PBXTargetDependency */,
FA359847189DBEB700288163 /* PBXTargetDependency */,
);
name = Mousecape;
@@ -572,24 +701,6 @@
productReference = FAC69F61189D603C00BC829D /* Mousecape.app */;
productType = "com.apple.product-type.application";
};
FAC69F81189D603C00BC829D /* MousecapeTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAC69F95189D603C00BC829D /* Build configuration list for PBXNativeTarget "MousecapeTests" */;
buildPhases = (
FAC69F7E189D603C00BC829D /* Sources */,
FAC69F7F189D603C00BC829D /* Frameworks */,
FAC69F80189D603C00BC829D /* Resources */,
);
buildRules = (
);
dependencies = (
FAC69F87189D603C00BC829D /* PBXTargetDependency */,
);
name = MousecapeTests;
productName = MousecapeTests;
productReference = FAC69F82189D603C00BC829D /* MousecapeTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
FAC69FAC189D608900BC829D /* mousecloak */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAC69FB6189D608A00BC829D /* Build configuration list for PBXNativeTarget "mousecloak" */;
@@ -607,6 +718,23 @@
productReference = FAC69FAD189D608900BC829D /* mousecloak */;
productType = "com.apple.product-type.tool";
};
FAE5D54819526F82007620DE /* com.alexzielenski.mousecloakhelper */ = {
isa = PBXNativeTarget;
buildConfigurationList = FAE5D56719526F82007620DE /* Build configuration list for PBXNativeTarget "com.alexzielenski.mousecloakhelper" */;
buildPhases = (
FAE5D54519526F82007620DE /* Sources */,
FAE5D54619526F82007620DE /* Frameworks */,
FAE5D54719526F82007620DE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = com.alexzielenski.mousecloakhelper;
productName = mousecloakHelper;
productReference = FAE5D54919526F82007620DE /* com.alexzielenski.mousecloakhelper.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -614,14 +742,15 @@
isa = PBXProject;
attributes = {
CLASSPREFIX = MC;
LastUpgradeCheck = 0500;
LastUpgradeCheck = 0600;
ORGANIZATIONNAME = "Alex Zielenski";
TargetAttributes = {
FAC69F60189D603C00BC829D = {
DevelopmentTeam = 3GD8ABJ22W;
};
FAC69F81189D603C00BC829D = {
TestTargetID = FAC69F60189D603C00BC829D;
FAE5D54819526F82007620DE = {
CreatedOnToolsVersion = 6.0;
DevelopmentTeam = 3GD8ABJ22W;
};
};
};
@@ -632,19 +761,97 @@
knownRegions = (
en,
Base,
ar,
ca,
cs,
cy,
da,
de,
el,
es,
fi,
fr,
he,
hu,
id,
is,
it,
ja,
ko,
nb,
nl,
no,
pl,
pt_BR,
pt_PT,
ro,
ru,
sk,
sl,
sv,
th,
tr,
uk,
zh_CN,
zh_TW,
English,
);
mainGroup = FAC69F58189D603C00BC829D;
productRefGroup = FAC69F62189D603C00BC829D /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = FADF012F198A2C7400006228 /* Products */;
ProjectRef = FADF012E198A2C7400006228 /* Sparkle.xcodeproj */;
},
);
projectRoot = "";
targets = (
FAC69F60189D603C00BC829D /* Mousecape */,
FAC69F81189D603C00BC829D /* MousecapeTests */,
FAC69FAC189D608900BC829D /* mousecloak */,
FAE5D54819526F82007620DE /* com.alexzielenski.mousecloakhelper */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
FADF013A198A2C7500006228 /* Sparkle.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Sparkle.framework;
remoteRef = FADF0139198A2C7500006228 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
FADF013C198A2C7500006228 /* Sparkle Test App.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = "Sparkle Test App.app";
remoteRef = FADF013B198A2C7500006228 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
FADF013E198A2C7500006228 /* Sparkle Unit Tests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "Sparkle Unit Tests.xctest";
remoteRef = FADF013D198A2C7500006228 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
FADF0140198A2C7500006228 /* BinaryDelta */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = BinaryDelta;
remoteRef = FADF013F198A2C7500006228 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
FADF0142198A2C7500006228 /* Autoupdate.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = Autoupdate.app;
remoteRef = FADF0141198A2C7500006228 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
FAC69F5F189D603C00BC829D /* Resources */ = {
isa = PBXResourcesBuildPhase;
@@ -661,11 +868,10 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F80189D603C00BC829D /* Resources */ = {
FAE5D54719526F82007620DE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F8D189D603C00BC829D /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -707,31 +913,28 @@
FAAEF951189F0CC300145DF8 /* restore.m in Sources */,
FAAEF950189EFC9800145DF8 /* apply.m in Sources */,
FAEE652918A047E8003AA182 /* NSFileManager+DirectoryLocations.m in Sources */,
FA14DE9118CE59A600A73BF4 /* NSColor+RBLCGColorAdditions.m in Sources */,
FA5107E818A823BD00917185 /* MASPreferencesWindowController.m in Sources */,
FAEE652D18A047E8003AA182 /* MCEditListController.m in Sources */,
FAC69F71189D603C00BC829D /* main.m in Sources */,
FAEE653218A047E8003AA182 /* MCCursor.m in Sources */,
FAAEF958189F4F8200145DF8 /* scale.m in Sources */,
FAEE653418A047E8003AA182 /* MCFormatters.m in Sources */,
FA14DE8E18CE596B00A73BF4 /* RBLScrollView.m in Sources */,
FAAEF8F4189EB32700145DF8 /* BTRClipView.m in Sources */,
FAAEF8F5189EB32700145DF8 /* BTRScrollView.m in Sources */,
FAC69FDC189D636700BC829D /* MCDefs.m in Sources */,
FAEE652E18A047E8003AA182 /* MCEditWindowController.m in Sources */,
FA359840189DA3C100288163 /* MCPrefs.m in Sources */,
FAEE652B18A047E8003AA182 /* MCEditCapeController.m in Sources */,
FADBC15418CE535200B9510F /* MCCapePreviewItem.m in Sources */,
FAEE652A18A047E8003AA182 /* NSOrderedSet+AZSortedInsert.m in Sources */,
FADBC15118CE51C000B9510F /* DTScrollView.m in Sources */,
FA14DE8D18CE596B00A73BF4 /* RBLClipView.m in Sources */,
FAEE653518A047E8003AA182 /* MCCapeCellView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69F7E189D603C00BC829D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAC69F8F189D603C00BC829D /* MousecapeTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FAC69FA9189D608900BC829D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -751,6 +954,21 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
FAE5D54519526F82007620DE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FAE5D57C195272FE007620DE /* restore.m in Sources */,
FAE5D57B195272F7007620DE /* backup.m in Sources */,
FAE5D57619527245007620DE /* main.m in Sources */,
FAE5D56C1952700B007620DE /* MCDefs.m in Sources */,
FAE5D56D1952700B007620DE /* MCPrefs.m in Sources */,
FAE5D5701952700B007620DE /* apply.m in Sources */,
FAE5D5721952700B007620DE /* listen.m in Sources */,
FAE5D578195272DD007620DE /* scale.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -759,10 +977,10 @@
target = FAC69FAC189D608900BC829D /* mousecloak */;
targetProxy = FA359846189DBEB700288163 /* PBXContainerItemProxy */;
};
FAC69F87189D603C00BC829D /* PBXTargetDependency */ = {
FADF0145198A2CA100006228 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = FAC69F60189D603C00BC829D /* Mousecape */;
targetProxy = FAC69F86189D603C00BC829D /* PBXContainerItemProxy */;
name = Sparkle;
targetProxy = FADF0144198A2CA100006228 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -807,14 +1025,6 @@
name = MainMenu.xib;
sourceTree = "<group>";
};
FAC69F8B189D603C00BC829D /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
FAC69F8C189D603C00BC829D /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -833,6 +1043,7 @@
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
@@ -852,7 +1063,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx10.8;
SDKROOT = macosx10.9;
};
name = Debug;
};
@@ -871,6 +1082,7 @@
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "Developer ID Application";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
@@ -884,7 +1096,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.8;
SDKROOT = macosx10.8;
SDKROOT = macosx10.9;
};
name = Release;
};
@@ -892,11 +1104,11 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "Mousecape/Mousecape-Info.plist";
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -906,61 +1118,20 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Developer ID Application";
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "Mousecape/Mousecape-Info.plist";
MACOSX_DEPLOYMENT_TARGET = 10.9;
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Release;
};
FAC69F96189D603C00BC829D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Mousecape.app/Contents/MacOS/Mousecape";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "MousecapeTests/MousecapeTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
};
name = Debug;
};
FAC69F97189D603C00BC829D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Mousecape.app/Contents/MacOS/Mousecape";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Mousecape/Mousecape-Prefix.pch";
INFOPLIST_FILE = "MousecapeTests/MousecapeTests-Info.plist";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
};
name = Release;
};
FAC69FB7189D608A00BC829D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -980,7 +1151,6 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_OBJC_ARC = NO;
CODE_SIGN_IDENTITY = "Developer ID Application";
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
HEADER_SEARCH_PATHS = (
@@ -992,6 +1162,59 @@
};
name = Release;
};
FAE5D56319526F82007620DE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
COMBINE_HIDPI_IMAGES = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"$(PROJECT_DIR)/mousecloak/vendor",
);
INFOPLIST_FILE = mousecloakHelper/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
METAL_ENABLE_DEBUG_INFO = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
FAE5D56419526F82007620DE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "mousecloak/mousecloak-Prefix.pch";
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"$(PROJECT_DIR)/mousecloak/vendor",
);
INFOPLIST_FILE = mousecloakHelper/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
METAL_ENABLE_DEBUG_INFO = NO;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -1013,15 +1236,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAC69F95189D603C00BC829D /* Build configuration list for PBXNativeTarget "MousecapeTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FAC69F96189D603C00BC829D /* Debug */,
FAC69F97189D603C00BC829D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAC69FB6189D608A00BC829D /* Build configuration list for PBXNativeTarget "mousecloak" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -1031,6 +1245,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FAE5D56719526F82007620DE /* Build configuration list for PBXNativeTarget "com.alexzielenski.mousecloakhelper" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FAE5D56319526F82007620DE /* Debug */,
FAE5D56419526F82007620DE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = FAC69F59189D603C00BC829D /* Project object */;
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
BuildableName = "Mousecape.app"
BlueprintName = "Mousecape"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAC69F81189D603C00BC829D"
BuildableName = "MousecapeTests.xctest"
BlueprintName = "MousecapeTests"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
BuildableName = "Mousecape.app"
BlueprintName = "Mousecape"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
BuildableName = "Mousecape.app"
BlueprintName = "Mousecape"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAC69F60189D603C00BC829D"
BuildableName = "Mousecape.app"
BlueprintName = "Mousecape"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0600"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</MacroExpansion>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "FAE5D54819526F82007620DE"
BuildableName = "com.alexzielenski.mousecloakhelper.app"
BlueprintName = "com.alexzielenski.mousecloakhelper"
ReferencedContainer = "container:Mousecape.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -4,6 +4,11 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>Mousecape Release.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Mousecape.xcscheme</key>
<dict>
<key>orderHint</key>
@@ -12,7 +17,12 @@
<key>mousecloak.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
<key>mousecloakHelper.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
@@ -37,6 +47,16 @@
<key>primary</key>
<true/>
</dict>
<key>FAE5D54819526F82007620DE</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>FAE5D55A19526F82007620DE</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>
+111 -129
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6185.7" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6185.7"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCEditWindowController">
@@ -16,7 +15,7 @@
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" wantsToBeColor="NO" animationBehavior="default" id="1">
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="1" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="525" height="297"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
@@ -27,21 +26,18 @@
<subviews>
<splitView canDrawConcurrently="YES" dividerStyle="thin" vertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3cj-R9-WKK">
<rect key="frame" x="0.0" y="0.0" width="525" height="297"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<customView id="IHY-vi-Wpr">
<rect key="frame" x="0.0" y="0.0" width="135" height="297"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2UQ-R4-qJn">
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="34" horizontalPageScroll="10" verticalLineScroll="34" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2UQ-R4-qJn">
<rect key="frame" x="0.0" y="22" width="135" height="275"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" copiesOnScroll="NO" id="ame-2S-JV7">
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="ame-2S-JV7">
<rect key="frame" x="0.0" y="0.0" width="135" height="275"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowSizeStyle="automatic" viewBased="YES" id="MU4-Yh-0PJ">
<rect key="frame" x="0.0" y="0.0" width="135" height="275"/>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="32" rowSizeStyle="automatic" viewBased="YES" id="MU4-Yh-0PJ">
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@@ -66,7 +62,6 @@
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="tn7-kB-Fvu">
<rect key="frame" x="6" y="8" width="120" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="8we-kW-bNk">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -97,7 +92,6 @@
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="W6i-Uv-3TI">
<rect key="frame" x="6" y="0.0" width="120" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="8bB-Ws-20v">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -128,20 +122,17 @@
</connections>
</tableView>
</subviews>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<nil key="backgroundColor"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="ARR-bd-5zK">
<rect key="frame" x="0.0" y="-16" width="0.0" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="3rZ-7d-Mro">
<rect key="frame" x="-16" y="0.0" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="0ps-WH-ASN">
<rect key="frame" x="0.0" y="0.0" width="22" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="22" id="Fdb-xA-sn9"/>
<constraint firstAttribute="height" constant="22" id="iNY-lh-RsQ"/>
@@ -155,11 +146,10 @@
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="w4h-lB-jLi">
<rect key="frame" x="22" y="0.0" width="22" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="22" y="0.0" width="22" height="20"/>
<constraints>
<constraint firstAttribute="width" constant="22" id="L21-Ci-myo"/>
<constraint firstAttribute="height" constant="22" id="M80-94-gpJ"/>
<constraint firstAttribute="height" constant="20" id="M80-94-gpJ"/>
</constraints>
<buttonCell key="cell" type="smallSquare" bezelStyle="smallSquare" image="NSRemoveTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="HjH-hq-TxT">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@@ -169,9 +159,8 @@
<action selector="removeAction:" target="oUs-Nv-PHw" id="JjR-lV-zwz"/>
</connections>
</button>
<box autoresizesSubviews="NO" verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="UJO-Hw-fRK">
<box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="UJO-Hw-fRK">
<rect key="frame" x="0.0" y="19" width="135" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="height" constant="1" id="NYz-xn-F0g"/>
</constraints>
@@ -192,7 +181,7 @@
<constraint firstItem="w4h-lB-jLi" firstAttribute="leading" secondItem="0ps-WH-ASN" secondAttribute="trailing" id="oqH-vB-hO8"/>
<constraint firstItem="0ps-WH-ASN" firstAttribute="bottom" secondItem="w4h-lB-jLi" secondAttribute="bottom" id="sWe-gf-GX0"/>
<constraint firstItem="2UQ-R4-qJn" firstAttribute="leading" secondItem="IHY-vi-Wpr" secondAttribute="leading" id="thB-tX-fKx"/>
<constraint firstItem="0ps-WH-ASN" firstAttribute="height" secondItem="w4h-lB-jLi" secondAttribute="height" id="uJj-nv-0fc"/>
<constraint firstItem="0ps-WH-ASN" firstAttribute="height" secondItem="w4h-lB-jLi" secondAttribute="height" constant="2" id="uJj-nv-0fc"/>
<constraint firstAttribute="bottom" secondItem="2UQ-R4-qJn" secondAttribute="bottom" constant="22" id="vLX-hs-yVP"/>
</constraints>
</customView>
@@ -221,6 +210,7 @@
<binding destination="oUs-Nv-PHw" name="title" keyPath="cursorLibrary.name" id="RKE-nQ-CzI"/>
<outlet property="delegate" destination="-2" id="4"/>
</connections>
<point key="canvasLocation" x="139.5" y="555.5"/>
</window>
<viewController title="List" id="oUs-Nv-PHw" customClass="MCEditListController">
<connections>
@@ -247,45 +237,40 @@
<rect key="frame" x="0.0" y="0.0" width="504" height="321"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="X2i-rg-HDg">
<rect key="frame" x="18" y="259" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="X2i-rg-HDg">
<rect key="frame" x="18" y="259" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Author:" id="Oyi-AW-60U">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yyn-IO-TkO">
<rect key="frame" x="18" y="209" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yyn-IO-TkO">
<rect key="frame" x="18" y="209" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Version:" id="98i-gH-tf4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ELX-ej-rTb">
<rect key="frame" x="18" y="234" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ELX-ej-rTb">
<rect key="frame" x="18" y="234" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Identifier:" id="Xzj-Uq-4bW">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CTE-6h-rbf">
<rect key="frame" x="18" y="284" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CTE-6h-rbf">
<rect key="frame" x="18" y="284" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Name:" id="oMS-dL-nZj">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bim-1a-xuh">
<rect key="frame" x="89" y="281" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bim-1a-xuh">
<rect key="frame" x="86" y="281" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="07X-ce-vmv">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -296,9 +281,8 @@
<outlet property="nextKeyView" destination="xy3-2B-C0h" id="kJW-OZ-1NO"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xy3-2B-C0h">
<rect key="frame" x="89" y="256" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xy3-2B-C0h">
<rect key="frame" x="86" y="256" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="fmY-Bj-OnI">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -309,9 +293,8 @@
<outlet property="nextKeyView" destination="XYx-UL-WbM" id="74w-oc-ff2"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XYx-UL-WbM">
<rect key="frame" x="89" y="231" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XYx-UL-WbM">
<rect key="frame" x="86" y="231" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="sjK-hK-kfo">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -326,9 +309,8 @@
<outlet property="nextKeyView" destination="car-it-RsL" id="uaw-jj-8AW"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="car-it-RsL">
<rect key="frame" x="89" y="206" width="395" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="car-it-RsL">
<rect key="frame" x="86" y="206" width="398" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="qW0-CC-89l">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -339,18 +321,16 @@
<outlet property="nextKeyView" destination="MJr-Jz-5Cq" id="sfZ-oa-g3c"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="i5v-yD-weq">
<rect key="frame" x="18" y="184" width="65" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="i5v-yD-weq">
<rect key="frame" x="18" y="184" width="62" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Retina:" id="HFS-GR-guB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="MJr-Jz-5Cq">
<rect key="frame" x="87" y="182" width="18" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MJr-Jz-5Cq">
<rect key="frame" x="84" y="182" width="18" height="18"/>
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="overlaps" state="on" inset="2" id="Ma9-Ke-hYa">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@@ -408,45 +388,40 @@
<rect key="frame" x="0.0" y="0.0" width="509" height="321"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dm8-Mj-s5f">
<rect key="frame" x="18" y="284" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Dm8-Mj-s5f">
<rect key="frame" x="18" y="284" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Type:" id="dy9-JM-4d7">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="D5V-CV-BuE">
<rect key="frame" x="18" y="259" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="D5V-CV-BuE">
<rect key="frame" x="18" y="259" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Frames:" id="G4c-OI-avP">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zEj-zS-uzh">
<rect key="frame" x="18" y="234" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zEj-zS-uzh">
<rect key="frame" x="18" y="234" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Frame Duration:" id="5Wb-pc-8jV">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aso-MD-Alm">
<rect key="frame" x="18" y="209" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aso-MD-Alm">
<rect key="frame" x="18" y="209" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Hot Spot:" id="dcq-3r-2DB">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yz7-y5-TxE">
<rect key="frame" x="131" y="277" width="358" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yz7-y5-TxE">
<rect key="frame" x="127" y="277" width="362" height="25"/>
<popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="gKl-8J-X0X">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -456,8 +431,8 @@
<binding destination="tMj-cQ-hK0" name="selectedValue" keyPath="cursor.identifier" id="2aq-Lm-1Lm">
<dictionary key="options">
<string key="NSMultipleValuesPlaceholder">Unknown</string>
<string key="NSNotApplicablePlaceholder">Unknown</string>
<string key="NSNoSelectionPlaceholder">Unknown</string>
<string key="NSNotApplicablePlaceholder">Unknown</string>
<string key="NSNullPlaceholder">Unknown</string>
<string key="NSValueTransformerName">MCCursorTypeValueTransformer</string>
</dictionary>
@@ -465,50 +440,47 @@
<outlet property="nextKeyView" destination="rms-zC-s1M" id="yfu-3L-R4w"/>
</connections>
</popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rms-zC-s1M">
<rect key="frame" x="131" y="254" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rms-zC-s1M">
<rect key="frame" x="127" y="254" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="1" drawsBackground="YES" id="tKY-dX-ibT">
<numberFormatter key="formatter" formatterBehavior="default10_4" positiveFormat="#" negativeFormat="#" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" minimumFractionDigits="0" maximumFractionDigits="0" id="JEt-qW-Py5">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="default10_4" positiveFormat="#" negativeFormat="#" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="JEt-qW-Py5">
<real key="minimum" value="1"/>
<real key="maximum" value="24"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameCount" id="E0q-ga-ftR"/>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameCount" id="05V-RH-y2o">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="nextKeyView" destination="VbK-WJ-M0L" id="y5I-kM-hNq"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VbK-WJ-M0L">
<rect key="frame" x="131" y="229" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VbK-WJ-M0L">
<rect key="frame" x="127" y="229" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="0.0" drawsBackground="YES" id="pqX-MB-QME">
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#.################" negativeFormat="#.################" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" minimumFractionDigits="0" maximumFractionDigits="16" id="QTS-o7-aVO">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#.################" negativeFormat="#.################" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" maximumFractionDigits="16" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="QTS-o7-aVO">
<real key="minimum" value="0.0"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameDuration" id="I6z-BZ-xhp"/>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.frameDuration" id="pBC-y0-ehq">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="nextKeyView" destination="Qcr-83-Tz0" id="gYj-Hj-Txi"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Qcr-83-Tz0">
<rect key="frame" x="131" y="204" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Qcr-83-Tz0">
<rect key="frame" x="127" y="204" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="{0,0}" drawsBackground="YES" id="BWu-hw-sDX">
<customFormatter key="formatter" id="hAv-1z-0Jg" customClass="MCPointFormatter"/>
<font key="font" metaFont="system"/>
@@ -516,90 +488,86 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.hotSpot" id="aFb-fI-aHw"/>
<binding destination="tMj-cQ-hK0" name="value" keyPath="cursor.hotSpot" id="7E7-XS-E4D">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="nextKeyView" destination="wdB-yr-r6Y" id="Smn-hK-iP2"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="75v-aw-FbU">
<rect key="frame" x="143" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="75v-aw-FbU">
<rect key="frame" x="140" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="1x" id="FZ3-qB-kDI">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Hoi-Pr-5wz">
<rect key="frame" x="199" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hoi-Pr-5wz">
<rect key="frame" x="196" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="2x" id="WI8-sV-4D6">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CWo-oD-OZX">
<rect key="frame" x="255" y="98" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CWo-oD-OZX">
<rect key="frame" x="253" y="98" width="23" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="5x" id="4fS-Q1-prn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ryz-mP-wNx">
<rect key="frame" x="307" y="98" width="32" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ryz-mP-wNx">
<rect key="frame" x="306" y="98" width="31" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="10x" id="8fp-Ws-ruA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
<rect key="frame" x="131" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="48" id="MeC-cf-abQ"/>
<constraint firstAttribute="height" constant="48" id="VAO-nl-ZmQ"/>
</constraints>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="YBU-cQ-gUX"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="ggE-Pd-aWo" customClass="MMAnimatingImageView">
<rect key="frame" x="187" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ggE-Pd-aWo" customClass="MMAnimatingImageView">
<rect key="frame" x="183" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="Q6h-vm-kaw"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="G3t-wd-E5Y" customClass="MMAnimatingImageView">
<rect key="frame" x="243" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="G3t-wd-E5Y" customClass="MMAnimatingImageView">
<rect key="frame" x="240" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="VPL-GA-4fS"/>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4hN-Nm-B7Z" customClass="MMAnimatingImageView">
<rect key="frame" x="299" y="123" width="48" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4hN-Nm-B7Z" customClass="MMAnimatingImageView">
<rect key="frame" x="297" y="123" width="49" height="48"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="fp1-eX-JUN"/>
</connections>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OAt-gN-EX5">
<rect key="frame" x="18" y="184" width="107" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OAt-gN-EX5">
<rect key="frame" x="18" y="184" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Size:" id="FrC-7p-0Bq">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wdB-yr-r6Y">
<rect key="frame" x="131" y="179" width="358" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wdB-yr-r6Y">
<rect key="frame" x="127" y="179" width="362" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="{0,0}" drawsBackground="YES" id="OmM-g8-Kyd">
<customFormatter key="formatter" id="wEf-m3-oYM" customClass="MCSizeFormatter"/>
<font key="font" metaFont="system"/>
@@ -611,6 +579,20 @@
<outlet property="nextKeyView" destination="yz7-y5-TxE" id="9Cb-FK-ium"/>
</connections>
</textField>
<customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j7v-U4-eMe" customClass="MMAnimatingImageView">
<rect key="frame" x="127" y="123" width="48" height="48"/>
<constraints>
<constraint firstAttribute="width" constant="48" id="MeC-cf-abQ"/>
<constraint firstAttribute="height" constant="48" id="VAO-nl-ZmQ"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldShowHotSpot" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="shouldAllowDragging" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outlet property="delegate" destination="tMj-cQ-hK0" id="YBU-cQ-gUX"/>
</connections>
</customView>
</subviews>
<constraints>
<constraint firstItem="CWo-oD-OZX" firstAttribute="top" secondItem="G3t-wd-E5Y" secondAttribute="bottom" constant="8" id="3wX-8h-O6z"/>
@@ -708,4 +690,4 @@
<image name="NSAddTemplate" width="8" height="8"/>
<image name="NSRemoveTemplate" width="8" height="8"/>
</resources>
</document>
</document>
+89 -31
View File
@@ -1,20 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6185.11" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6185.11"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCLibraryWindowController">
<connections>
<outlet property="appliedAccessory" destination="3Ui-b0-Yod" id="2Ik-Bo-djE"/>
<outlet property="libraryViewController" destination="zL4-Ay-t4Q" id="DE1-rb-MWQ"/>
<outlet property="progressBar" destination="F5l-qD-fvC" id="VNK-If-Tfi"/>
<outlet property="progressField" destination="Ui8-vk-7P8" id="Esy-lZ-9RN"/>
<outlet property="window" destination="1" id="3"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<window title="Mousecape" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" wantsToBeColor="NO" frameAutosaveName="LibraryWindow" animationBehavior="default" id="1">
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Mousecape" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" frameAutosaveName="LibraryWindow" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="196" y="240" width="711" height="311"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
@@ -23,15 +24,13 @@
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="29" horizontalPageScroll="10" verticalLineScroll="29" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="2Io-MC-n6O" customClass="BTRScrollView">
<scrollView canDrawConcurrently="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="84" horizontalPageScroll="10" verticalLineScroll="84" verticalPageScroll="10" translatesAutoresizingMaskIntoConstraints="NO" id="2Io-MC-n6O" customClass="BTRScrollView">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" copiesOnScroll="NO" id="VhH-tn-4Sf" customClass="BTRClipView">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowSizeStyle="automatic" viewBased="YES" id="dPn-85-uPK">
<rect key="frame" x="0.0" y="0.0" width="711" height="311"/>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="72" rowSizeStyle="automatic" viewBased="YES" id="dPn-85-uPK">
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="12"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@@ -51,12 +50,11 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="syZ-Eq-Lt2" customClass="MCCapeCellView">
<rect key="frame" x="1" y="6" width="708" height="64"/>
<rect key="frame" x="1" y="6" width="708" height="72"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Hfe-RO-hVE">
<rect key="frame" x="18" y="47" width="99" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hfe-RO-hVE">
<rect key="frame" x="18" y="55" width="97" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="0kt-g0-cQb">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -66,9 +64,8 @@
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.name" id="YHc-x9-wXk"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
<rect key="frame" x="117" y="47" width="48" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bEa-BS-ghQ">
<rect key="frame" x="115" y="55" width="48" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Subtitle" id="NXa-Ze-OX2">
<font key="font" metaFont="smallSystemBold"/>
<color key="textColor" name="headerColor" catalog="System" colorSpace="catalog"/>
@@ -79,14 +76,12 @@
</connections>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="jdV-zx-iTs">
<rect key="frame" x="634" y="44" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="634" y="52" width="16" height="16"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="applied" id="bwh-k2-aAS"/>
</imageView>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="QMa-EX-Son">
<rect key="frame" x="658" y="43" width="30" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="HD" id="LsJ-S8-jwy"/>
<rect key="frame" x="658" y="51" width="30" height="18"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="HDTemplate" id="LsJ-S8-jwy"/>
<connections>
<binding destination="syZ-Eq-Lt2" name="value" keyPath="objectValue.hiDPI" id="LcB-QZ-MhG">
<dictionary key="options">
@@ -95,6 +90,31 @@
</binding>
</connections>
</imageView>
<scrollView canDrawConcurrently="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasVerticalScroller="NO" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="odP-lr-hJH" customClass="DTScrollView">
<rect key="frame" x="20" y="3" width="668" height="44"/>
<clipView key="contentView" copiesOnScroll="NO" id="pc3-Zb-Oqk">
<rect key="frame" x="1" y="1" width="666" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="dyM-T9-60O">
<rect key="frame" x="0.0" y="0.0" width="666" height="42"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</collectionView>
</subviews>
</clipView>
<constraints>
<constraint firstAttribute="height" constant="44" id="KzC-9x-FvO"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="mwj-HT-8PV">
<rect key="frame" x="1" y="144" width="233" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="cCy-Hj-b5W">
<rect key="frame" x="-100" y="-100" width="15" height="143"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="Hfe-RO-hVE" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="OHp-3c-ujO"/>
@@ -102,12 +122,17 @@
<constraint firstItem="bEa-BS-ghQ" firstAttribute="leading" secondItem="Hfe-RO-hVE" secondAttribute="trailing" constant="4" id="WVM-Wd-XXI"/>
<constraint firstItem="jdV-zx-iTs" firstAttribute="centerY" secondItem="QMa-EX-Son" secondAttribute="centerY" id="YLI-IS-v1N"/>
<constraint firstItem="bEa-BS-ghQ" firstAttribute="baseline" secondItem="Hfe-RO-hVE" secondAttribute="baseline" id="bCc-gQ-FVG"/>
<constraint firstAttribute="trailing" secondItem="odP-lr-hJH" secondAttribute="trailing" constant="20" symbolic="YES" id="fnI-G1-FZh"/>
<constraint firstItem="odP-lr-hJH" firstAttribute="leading" secondItem="syZ-Eq-Lt2" secondAttribute="leading" constant="20" symbolic="YES" id="joq-b0-pEr"/>
<constraint firstAttribute="trailing" secondItem="QMa-EX-Son" secondAttribute="trailing" constant="20" symbolic="YES" id="oL8-Zy-vvE"/>
<constraint firstItem="QMa-EX-Son" firstAttribute="top" secondItem="syZ-Eq-Lt2" secondAttribute="top" constant="3" id="oPR-SR-Gh8"/>
<constraint firstItem="odP-lr-hJH" firstAttribute="top" secondItem="Hfe-RO-hVE" secondAttribute="bottom" constant="8" symbolic="YES" id="r5F-n8-O3W"/>
<constraint firstItem="Hfe-RO-hVE" firstAttribute="top" secondItem="syZ-Eq-Lt2" secondAttribute="top" id="wWd-7q-n1a"/>
</constraints>
<connections>
<outlet property="appliedImageView" destination="jdV-zx-iTs" id="4DM-pV-X1T"/>
<outlet property="collectionView" destination="dyM-T9-60O" id="eOd-8D-OEK"/>
<outlet property="resolutionImageView" destination="QMa-EX-Son" id="Tr1-E9-rir"/>
<outlet property="subtitleField" destination="bEa-BS-ghQ" id="yeA-RV-Aoi"/>
<outlet property="textField" destination="Hfe-RO-hVE" id="LWw-Ls-hnr"/>
<outlet property="titleField" destination="Hfe-RO-hVE" id="y7O-VO-62y"/>
@@ -126,11 +151,9 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="uK0-YP-77b">
<rect key="frame" x="1" y="1" width="0.0" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="q1a-eU-6AV">
<rect key="frame" x="-15" y="17" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
@@ -145,6 +168,7 @@
<connections>
<outlet property="delegate" destination="-2" id="4"/>
</connections>
<point key="canvasLocation" x="591.5" y="159.5"/>
</window>
<viewController title="Library" id="zL4-Ay-t4Q" customClass="MCLibraryViewController">
<connections>
@@ -160,17 +184,17 @@
DQ
</string>
<connections>
<action selector="applyCape:" target="-1" id="KG6-81-DdR"/>
<action selector="applyCapeAction:" target="-1" id="KHK-0n-gS3"/>
</connections>
</menuItem>
<menuItem title="Edit" tag="-1" keyEquivalent="e" id="HJc-SX-JjZ">
<connections>
<action selector="editCape:" target="-1" id="6nG-0d-9YV"/>
<action selector="editCapeAction:" target="-1" id="xUA-Zj-ToX"/>
</connections>
</menuItem>
<menuItem title="Duplicate" tag="-1" keyEquivalent="S" id="PhG-Ll-nqz">
<connections>
<action selector="duplicateCape:" target="-1" id="N0m-Bu-OYJ"/>
<action selector="duplicateCapeAction:" target="-1" id="3xf-LP-P1p"/>
</connections>
</menuItem>
<menuItem title="Remove" tag="-1" id="Aig-wl-ivn">
@@ -178,14 +202,14 @@ DQ
CA
</string>
<connections>
<action selector="removeCape:" target="-1" id="rSg-Ns-VmO"/>
<action selector="removeCapeAction:" target="-1" id="Psf-74-zsG"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="A7P-y0-FBc"/>
<menuItem title="Show in Finder" tag="-1" id="2WM-EN-kiI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showCape:" target="-1" id="Wu1-o2-zZP"/>
<action selector="showCapeAction:" target="-1" id="iF0-eu-Du4"/>
</connections>
</menuItem>
</items>
@@ -196,7 +220,6 @@ CA
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cSP-XN-7we">
<rect key="frame" x="-2" y="3" width="245" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="right" title="Applied Cursor: None" usesSingleLineMode="YES" id="vZ3-2R-psO">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -222,9 +245,44 @@ CA
<constraint firstItem="cSP-XN-7we" firstAttribute="leading" secondItem="3Ui-b0-Yod" secondAttribute="leading" id="eoA-bD-pz5"/>
</constraints>
</customView>
<view id="smV-Cs-4aH">
<rect key="frame" x="0.0" y="0.0" width="100" height="100"/>
<autoresizingMask key="autoresizingMask"/>
</view>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="DeD-dq-yBF" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" utility="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="272" y="172" width="452" height="58"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
<view key="contentView" id="me1-hA-pTT">
<rect key="frame" x="0.0" y="0.0" width="452" height="58"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<progressIndicator maxValue="100" indeterminate="YES" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="F5l-qD-fvC">
<rect key="frame" x="15" y="19" width="343" height="20"/>
</progressIndicator>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ui8-vk-7P8">
<rect key="frame" x="364" y="21" width="75" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="000 of 129" id="sq0-HM-mp6">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="F5l-qD-fvC" firstAttribute="leading" secondItem="me1-hA-pTT" secondAttribute="leading" constant="15" id="1rr-uN-NwK"/>
<constraint firstItem="F5l-qD-fvC" firstAttribute="centerY" secondItem="Ui8-vk-7P8" secondAttribute="centerY" constant="0.5" id="FgD-90-fQk"/>
<constraint firstAttribute="trailing" secondItem="Ui8-vk-7P8" secondAttribute="trailing" constant="15" id="OgP-qZ-5ss"/>
<constraint firstItem="Ui8-vk-7P8" firstAttribute="leading" secondItem="F5l-qD-fvC" secondAttribute="trailing" constant="8" id="Q6O-6O-84O"/>
<constraint firstAttribute="centerY" secondItem="F5l-qD-fvC" secondAttribute="centerY" id="yZk-CB-OJj"/>
</constraints>
</view>
<point key="canvasLocation" x="499" y="-470"/>
</window>
</objects>
<resources>
<image name="HD" width="30" height="18"/>
<image name="HDTemplate" width="30" height="18"/>
<image name="applied" width="16" height="16"/>
</resources>
</document>
</document>
+20 -11
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6185.11" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6185.11"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -11,7 +10,7 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<menu title="AMainMenu" systemMenu="main" id="29">
<items>
<menuItem title="Mousecape" id="56">
@@ -33,6 +32,9 @@
</menuItem>
<menuItem title="Check for Updates..." id="igk-i0-oH0">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="checkForUpdates:" target="1HC-av-0d2" id="TKL-G4-NhR"/>
</connections>
</menuItem>
<menuItem title="Install Helper Tool" id="Ui2-VN-tbP">
<modifierMask key="keyEquivalentModifierMask"/>
@@ -333,12 +335,12 @@
DQ
</string>
<connections>
<action selector="applyCape:" target="-1" id="vf2-1W-mzE"/>
<action selector="applyCapeAction:" target="-1" id="RAI-pM-j7M"/>
</connections>
</menuItem>
<menuItem title="Edit Cape" keyEquivalent="e" id="5qb-Dw-38q">
<connections>
<action selector="editCape:" target="-1" id="iz5-Ek-fyU"/>
<action selector="editCapeAction:" target="-1" id="E2d-D2-Hj9"/>
</connections>
</menuItem>
<menuItem title="Remove Cape" id="LHh-1u-bK8">
@@ -346,24 +348,24 @@ DQ
CA
</string>
<connections>
<action selector="removeCape:" target="-1" id="1E1-e1-eeH"/>
<action selector="removeCapeAction:" target="-1" id="RE5-YE-iAt"/>
</connections>
</menuItem>
<menuItem title="Duplicate Cape" keyEquivalent="S" id="d9b-6w-ubr">
<connections>
<action selector="duplicateCape:" target="-1" id="pOn-FS-ePg"/>
<action selector="duplicateCapeAction:" target="-1" id="Nj7-Uf-gOO"/>
</connections>
</menuItem>
<menuItem title="Check for Updates" hidden="YES" keyEquivalent="u" id="XTi-86-ese">
<connections>
<action selector="checkCape:" target="-1" id="yBL-WC-dbi"/>
<action selector="checkCapeAction:" target="-1" id="q4O-FG-Rle"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="EOT-Rk-oU3"/>
<menuItem title="Show in Finder" id="PAd-kz-Eoi">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showCape:" target="-1" id="lep-7W-NSD"/>
<action selector="showCapeAction:" target="-1" id="9mC-pd-eiq"/>
</connections>
</menuItem>
<menuItem title="Restore Defaults" keyEquivalent="r" id="uCE-YB-8VL">
@@ -371,6 +373,12 @@ CA
<action selector="restoreCape:" target="494" id="2ve-Ez-ktd"/>
</connections>
</menuItem>
<menuItem title="Dump Cursors…" id="CYY-iE-0bP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="dumpCapeAction:" target="-1" id="B89-Hc-T1C"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
@@ -418,5 +426,6 @@ CA
</connections>
</customObject>
<customObject id="420" customClass="NSFontManager"/>
<customObject id="1HC-av-0d2" customClass="SUUpdater"/>
</objects>
</document>
</document>
+34 -68
View File
@@ -14,8 +14,6 @@
#import "MASPreferencesWindowController.h"
#import "MCGeneralPreferencesController.h"
static AuthorizationRef obtainRights();
@interface MCAppDelegate () {
MASPreferencesWindowController *_preferencesWindowController;
}
@@ -26,14 +24,17 @@ static AuthorizationRef obtainRights();
@implementation MCAppDelegate
@dynamic preferencesWindowController;
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
[self.libraryWindowController loadWindow];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self configureHelperToolMenuItem];
self.libraryWindowController = [[MCLibraryWindowController alloc] initWithWindowNibName:@"Library"];
[self.libraryWindowController showWindow:self];
}
- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag {
[self.libraryWindowController showWindow:sender];
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
return YES;
}
@@ -47,54 +48,42 @@ static AuthorizationRef obtainRights();
}
- (void)configureHelperToolMenuItem {
NSString *mouseCloakDest = @"/usr/local/bin/mousecloak";
NSString *agentDest = [@"/Library/LaunchAgents" stringByAppendingPathComponent: @"com.alexzielenski.mousecloak.listener.plist"];
NSFileManager *manager = [NSFileManager defaultManager];
[self.toggleHelperItem setTag: ([manager fileExistsAtPath:mouseCloakDest] && [manager fileExistsAtPath:agentDest])];
CFDictionaryRef dict = SMJobCopyDictionary(kSMDomainUserLaunchd, CFSTR("com.alexzielenski.mousecloakhelper"));
[self.toggleHelperItem setTag: dict ? 1 : 0];
[self.toggleHelperItem setTitle:self.toggleHelperItem.tag ? @"Uninstall Helper Tool" : @"Install Helper Tool"];
if (dict)
CFRelease(dict);
}
- (IBAction)toggleInstall:(NSMenuItem *)sender {
AuthorizationRef authRef = obtainRights();
BOOL success = NO;
if (authRef == NULL) {
NSLog(@"Failed to obtain authorization right.");
return;
}
NSString *mouseCloakDest = @"/usr/local/bin/mousecloak";
NSString *mouseCloakPath = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"mousecloak"];
NSString *agentDest = [@"/Library/LaunchAgents" stringByAppendingPathComponent: @"com.alexzielenski.mousecloak.listener.plist"];
NSString *agentPath = [NSTemporaryDirectory() stringByAppendingPathComponent: agentDest.lastPathComponent];
NSString *loadCommand = [NSString stringWithFormat:@"launchctl load %s", agentDest.UTF8String];
NSString *unloadCommand = [NSString stringWithFormat:@"launchctl unload %s", agentDest.UTF8String];
if (self.toggleHelperItem.tag) { // Uninstall
system(unloadCommand.UTF8String);
NSDictionary *removeTools = @{ @"Label": @"com.alexzielenski.mousecloak.remove", @"ProgramArguments": @[ @"/bin/rm", mouseCloakDest, agentDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)removeTools, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)removeTools[@"Label"], authRef, true, NULL);
if (self.toggleHelperItem.tag != 0) { // Uninstall
success = SMLoginItemSetEnabled(CFSTR("com.alexzielenski.mousecloakhelper"), false);
} else {
NSDictionary *copyTool = @{ @"Label": @"com.alexzielenski.mousecloak.install", @"ProgramArguments": @[ @"/bin/ln", @"-f", @"-s", mouseCloakPath, mouseCloakDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)copyTool, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)copyTool[@"Label"], authRef, true, NULL);
NSDictionary *launchAgent = @{ @"Label": @"com.alexzielenski.mousecloak.listener", @"ProgramArguments": @[ mouseCloakDest, @"--listen" ], @"LimitLoadToSessionType": @[ @"Aqua" ], @"RunAtLoad": @YES, @"KeepAlive": @YES };
[[NSFileManager defaultManager] removeItemAtPath:agentPath error:nil];
[launchAgent writeToFile:agentPath atomically:NO];
NSDictionary *copyJob = @{ @"Label": @"com.alexzielenski.mousecloak.install2", @"ProgramArguments": @[ @"/bin/cp", @"-f", agentPath, agentDest ], @"RunAtLoad": @YES };
SMJobSubmit(kSMDomainSystemLaunchd, (__bridge CFDictionaryRef)copyJob, authRef, NULL);
SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef)copyJob[@"Label"], authRef, true, NULL);
system(loadCommand.UTF8String);
success = SMLoginItemSetEnabled(CFSTR("com.alexzielenski.mousecloakhelper"), true);
}
// ServiceManagement.framework takes a while to actually register the job dictionary so if the return value is all good we
// can be on our merry way
if (success && self.toggleHelperItem.tag == 0) {
// Successfully Installed
[self.toggleHelperItem setTag: 1];
[self.toggleHelperItem setTitle:@"Uninstall Helper Tool"];
NSRunAlertPanel(@"Sucess", @"The Mousecape helper was successfully installed", @"Sweet", @"Thanks", nil);
} else if (success) {
// Successfully Uninstalled
[self.toggleHelperItem setTag: 0];
[self.toggleHelperItem setTitle:@"Install Helper Tool"];
NSRunAlertPanel(@"Sucess", @"The Mousecape helper was successfully uninstalled", @"Sweet", @"Thanks", nil);
} else {
NSRunAlertPanel(@"Failure", @"The action did not complete successfully", @"Fuck", nil, nil);
}
AuthorizationFree(authRef, kAuthorizationFlagDestroyRights);
[self configureHelperToolMenuItem];
}
- (MASPreferencesWindowController *)preferencesWindowController {
@@ -154,26 +143,3 @@ static AuthorizationRef obtainRights();
}
@end
static AuthorizationRef obtainRights() {
AuthorizationRef authRef = NULL;
// Creating auth item to bless helper tool and install framework
AuthorizationItem authItem = {kSMRightBlessPrivilegedHelper, 0, NULL, 0};
AuthorizationItem modify = {kSMRightModifySystemDaemons, 0, NULL, 0};
AuthorizationItem items[2] = { authItem, modify };
// Creating a set of authorization rights
AuthorizationRights authRights = {2, items};
// Specifying authorization options for authorization
AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights;
// Open dialog and prompt user for password
OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
if (status == errAuthorizationSuccess)
return authRef;
return NULL;
}
+6 -2
View File
@@ -36,11 +36,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.0.2</string>
<string>0.0.5</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1083</string>
<string>1581</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
@@ -51,6 +51,10 @@
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>SUEnableAutomaticChecks</key>
<true/>
<key>SUFeedURL</key>
<string>https://raw.githubusercontent.com/alexzielenski/Mousecape/master/appcast.xml</string>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
+10 -17
View File
@@ -1,29 +1,22 @@
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf200
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw9840\paperh8400
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
\vieww9600\viewh8400\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
\f0\b\fs24 \cf0 Engineering:
\b0 \
Some people\
\
\b Human Interface Design:
\b0 \
Some other people\
Alex Zielenski\
{\field{\*\fldinst{HYPERLINK "http://alexzielenski.com"}}{\fldrslt http://alexzielenski.com}}\
\
\b Testing:
\b0 \
Hopefully not nobody\
\
\b Documentation:
\b0 \
Whoever\
Justin Ayles\
\
\b With special thanks to:
\b0 \
Mom\
}
{\field{\*\fldinst{HYPERLINK "http://maxrudberg.com"}}{\fldrslt Max Rudberg}}\
Mom & Dad\
}
@@ -0,0 +1,16 @@
//
// DTScrollView.h
// iCatalogEditor
//
// Created by Oliver Drobnik on 10/23/12.
// Copyright (c) 2012 Cocoanetics. All rights reserved.
//
#import "RBLScrollView.h"
/**
A scroll view that forwards scroll events up the responder chain if scrolling is along an axis that no scroll bar is shown for. This is useful to have a horizontal scroll view contained in a vertical one. To enable, set usesPredominantAxisScrolling to YES and hide the scroll bar for the axis you don't want to support.
*/
@interface DTScrollView : RBLScrollView
@end
@@ -0,0 +1,33 @@
//
// DTScrollView.m
// iCatalogEditor
//
// Created by Oliver Drobnik on 10/23/12.
// Copyright (c) 2012 Cocoanetics. All rights reserved.
//
#import "DTScrollView.h"
@implementation DTScrollView
- (void)scrollWheel:(NSEvent *)theEvent {
BOOL shouldForwardScroll = NO;
if (self.usesPredominantAxisScrolling) {
if (fabs(theEvent.deltaX) < fabs(theEvent.deltaY)) {
// vertical scroll
if (!self.hasVerticalScroller) {
shouldForwardScroll = YES;
}
}
}
if (shouldForwardScroll) {
[[self nextResponder] scrollWheel:theEvent];
} else {
[super scrollWheel:theEvent];
}
}
@end
@@ -1,32 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1080</int>
<string key="IBDocument.SystemVersion">12E55</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<int key="IBDocument.SystemTarget">1090</int>
<string key="IBDocument.SystemVersion">14A261i</string>
<string key="IBDocument.InterfaceBuilderVersion">6154.17</string>
<string key="IBDocument.AppKitVersion">1321.11</string>
<string key="IBDocument.HIToolboxVersion">737.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">3084</string>
<string key="NS.object.0">6154.17</string>
</object>
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSCustomObject</string>
<string>NSToolbar</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</array>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
<integer value="1" key="NS.object.0"/>
</object>
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<object class="NSCustomObject" id="1001">
<string key="NSClassName">MASPreferencesWindowController</string>
</object>
@@ -42,11 +39,9 @@
<string key="NSWindowRect">{{540, 400}, {360, 270}}</string>
<int key="NSWTFlags">1618478080</int>
<string key="NSWindowTitle"/>
<string key="NSWindowClass">NSWindow</string>
<string key="NSWindowClass">NSPanel</string>
<object class="NSToolbar" key="NSViewClass" id="693562270">
<object class="NSMutableString" key="NSToolbarIdentifier">
<characters key="NS.bytes">A3419266-C6CB-4FAA-AB63-B91B70C196EA</characters>
</object>
<string key="NSToolbarIdentifier">45E11247-C0D1-4D0A-A5E9-F1307B14CEF7</string>
<nil key="NSToolbarDelegate"/>
<bool key="NSToolbarPrefersToBeShown">YES</bool>
<bool key="NSToolbarShowsBaselineSeparator">YES</bool>
@@ -54,14 +49,8 @@
<bool key="NSToolbarAutosavesConfiguration">NO</bool>
<int key="NSToolbarDisplayMode">1</int>
<int key="NSToolbarSizeMode">1</int>
<object class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys" id="0">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<reference key="dict.values" ref="0"/>
</object>
<reference key="NSToolbarIBAllowedItems" ref="0"/>
<dictionary class="NSMutableDictionary" key="NSToolbarIBIdentifiedItems"/>
<array key="NSToolbarIBAllowedItems" id="0"/>
<reference key="NSToolbarIBDefaultItems" ref="0"/>
<reference key="NSToolbarIBSelectableItems" ref="0"/>
</object>
@@ -74,15 +63,14 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSScreenRect">{{0, 0}, {2560, 1417}}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<string key="NSFrameAutosaveName"/>
<bool key="NSWindowIsRestorable">YES</bool>
</object>
</object>
</array>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">window</string>
@@ -115,10 +103,9 @@
</object>
<int key="connectionID">22</int>
</object>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<array key="orderedObjects">
<object class="IBObjectRecord">
<int key="objectID">0</int>
<reference key="object" ref="0"/>
@@ -146,11 +133,10 @@
<object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="children">
<reference ref="1006"/>
<reference ref="693562270"/>
</object>
</array>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
@@ -161,106 +147,123 @@
<object class="IBObjectRecord">
<int key="objectID">4</int>
<reference key="object" ref="693562270"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<reference key="parent" ref="1005"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>-1.IBPluginDependency</string>
<string>-2.IBPluginDependency</string>
<string>-3.IBPluginDependency</string>
<string>1.IBNSWindowAutoPositionCentersHorizontal</string>
<string>1.IBNSWindowAutoPositionCentersVertical</string>
<string>1.IBPluginDependency</string>
<string>1.IBWindowTemplateEditedContentRect</string>
<string>1.NSWindowTemplate.visibleAtLaunch</string>
<string>2.IBPluginDependency</string>
<string>4.IBPluginDependency</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO"/>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{484, 402}, {360, 270}}</string>
<boolean value="NO"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<reference key="dict.values" ref="0"/>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersHorizontal"/>
<boolean value="NO" key="1.IBNSWindowAutoPositionCentersVertical"/>
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1.IBWindowTemplateEditedContentRect">{{484, 402}, {360, 270}}</string>
<boolean value="NO" key="1.NSWindowTemplate.visibleAtLaunch"/>
<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<object class="NSMutableDictionary" key="localizations">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<reference key="dict.values" ref="0"/>
</object>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">23</int>
<int key="maxID">27</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">FirstResponder</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBUserSource</string>
<string key="minorKey"/>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>goNextTab:</string>
<string>goPreviousTab:</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="goNextTab:" id="26850041">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>id</string>
<object class="IBActionInfo" key="goPreviousTab:" id="235845889">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">toolbar</string>
<string key="NS.object.0">NSToolbar</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">toolbar</string>
<object class="IBToOneOutletInfo" key="NS.object.0" id="206441091">
<string key="name">toolbar</string>
<string key="candidateClassName">NSToolbar</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>goNextTab:</string>
<string>goPreviousTab:</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="goNextTab:">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="NSArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBActionInfo">
<string key="name">goNextTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="goPreviousTab:">
<string key="name">goPreviousTab:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">../Mousecape/external/MASPreferences/MASPreferencesWindowController.m</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">MASPreferencesWindowController</string>
<string key="superclassName">NSWindowController</string>
<dictionary class="NSMutableDictionary" key="actions">
<string key="goNextTab:">id</string>
<string key="goPreviousTab:">id</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName">
<reference key="goNextTab:" ref="26850041"/>
<reference key="goPreviousTab:" ref="235845889"/>
</dictionary>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">toolbar</string>
<string key="NS.object.0">NSToolbar</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">toolbar</string>
<reference key="NS.object.0" ref="206441091"/>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MASPreferencesWindowController.h</string>
</object>
</object>
</object>
</array>
</object>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">NO</bool>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
<integer value="3000" key="NS.object.0"/>
<integer value="4600" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
@@ -0,0 +1,25 @@
//
// NSColor+RBLCGColorAdditions.h
// Rebel
//
// Created by Justin Spahr-Summers on 01.12.11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
// Portions copyright (c) 2011 Bitswift. All rights reserved.
// See the LICENSE file for more information.
//
#import <AppKit/AppKit.h>
// Extensions to NSColor for interoperability with CGColor.
@interface NSColor (RBLCGColorAdditions)
// The CGColor corresponding to the receiver.
@property (nonatomic, readonly) CGColorRef rbl_CGColor;
// Returns an NSColor corresponding to the given CGColor.
//
// This currently does not handle pattern colors.
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color;
@end
@@ -0,0 +1,92 @@
//
// NSColor+RBLCGColorAdditions.m
// Rebel
//
// Created by Justin Spahr-Summers on 01.12.11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
// Portions copyright (c) 2011 Bitswift. All rights reserved.
// See the LICENSE file for more information.
//
#import "NSColor+RBLCGColorAdditions.h"
static void drawCGImagePattern (void *info, CGContextRef context) {
CGImageRef image = info;
size_t width = CGImageGetWidth(image);
size_t height = CGImageGetHeight(image);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
}
static void releasePatternInfo (void *info) {
CFRelease(info);
}
@implementation NSColor (RBLCGColorAdditions)
+ (NSColor *)rbl_colorWithCGColor:(CGColorRef)color {
if (color == nil) {
return nil;
}
CGColorSpaceRef colorSpaceRef = CGColorGetColorSpace(color);
NSColorSpace *colorSpace = [[NSColorSpace alloc] initWithCGColorSpace:colorSpaceRef];
NSColor *result = [self colorWithColorSpace:colorSpace components:CGColorGetComponents(color) count:(size_t)CGColorGetNumberOfComponents(color)];
[colorSpace release];
return result;
}
- (CGColorRef)rbl_CGColor {
if ([self.colorSpaceName isEqualToString:NSPatternColorSpace]) {
CGImageRef patternImage = [self.patternImage CGImageForProposedRect:NULL context:nil hints:nil];
if (patternImage == NULL) {
return NULL;
}
size_t width = CGImageGetWidth(patternImage);
size_t height = CGImageGetHeight(patternImage);
CGRect patternBounds = CGRectMake(0, 0, width, height);
CGPatternRef pattern = CGPatternCreate(
// Released in releasePatternInfo().
(void *)CFRetain(patternImage),
patternBounds,
CGAffineTransformIdentity,
width,
height,
kCGPatternTilingConstantSpacingMinimalDistortion,
YES,
&(CGPatternCallbacks){
.version = 0,
.drawPattern = &drawCGImagePattern,
.releaseInfo = &releasePatternInfo
}
);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreatePattern(NULL);
CGColorRef result = CGColorCreateWithPattern(colorSpaceRef, pattern, (CGFloat[]){ 1.0 });
CGColorSpaceRelease(colorSpaceRef);
CGPatternRelease(pattern);
return (CGColorRef)[(id)result autorelease];
}
NSColorSpace *colorSpace = NSColorSpace.genericRGBColorSpace;
NSColor *color = [self colorUsingColorSpace:colorSpace];
CGFloat components[color.numberOfComponents];
[color getComponents:components];
CGColorSpaceRef colorSpaceRef = colorSpace.CGColorSpace;
CGColorRef result = CGColorCreate(colorSpaceRef, components);
return (CGColorRef)[(id)result autorelease];
}
@end
+27
View File
@@ -0,0 +1,27 @@
//
// RBLClipView.h
// Rebel
//
// Created by Justin Spahr-Summers on 2012-09-14.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import <QuartzCore/QuartzCore.h>
// A faster NSClipView based on CAScrollLayer.
//
// This view should be set as the scroll view's contentView as soon as possible
// after the scroll view is initialized. For some reason, scroll bars will
// disappear on 10.7 (but not 10.8) unless hasHorizontalScroller and
// hasVerticalScroller are set _after_ the contentView.
@interface RBLClipView : NSClipView
// The backing layer for this view.
@property (nonatomic, strong) CAScrollLayer *layer;
// Whether the content in this view is opaque.
//
// Defaults to NO.
@property (nonatomic, getter = isOpaque) BOOL opaque;
@end
+52
View File
@@ -0,0 +1,52 @@
//
// RBLClipView.m
// Rebel
//
// Created by Justin Spahr-Summers on 2012-09-14.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RBLClipView.h"
#import "NSColor+RBLCGColorAdditions.h"
@implementation RBLClipView
#pragma mark Properties
@dynamic layer;
- (NSColor *)backgroundColor {
return [NSColor rbl_colorWithCGColor:self.layer.backgroundColor];
}
- (void)setBackgroundColor:(NSColor *)color {
self.layer.backgroundColor = color.rbl_CGColor;
}
- (BOOL)isOpaque {
return self.layer.opaque;
}
- (void)setOpaque:(BOOL)opaque {
self.layer.opaque = opaque;
}
#pragma mark Lifecycle
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self == nil) return nil;
self.layer = [CAScrollLayer layer];
self.wantsLayer = YES;
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawNever;
// Matches default NSClipView settings.
self.backgroundColor = NSColor.clearColor;
self.opaque = NO;
return self;
}
@end
+17
View File
@@ -0,0 +1,17 @@
//
// RBLScrollView.h
// Rebel
//
// Created by Jonathan Willing on 12/4/12.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import <Cocoa/Cocoa.h>
// A NSScrollView subclass which uses an instance of RBLClipView
// as the clip view instead of NSClipView.
//
// Layer-backed by default.
@interface RBLScrollView : NSScrollView
@end
+43
View File
@@ -0,0 +1,43 @@
//
// RBLScrollView.m
// Rebel
//
// Created by Jonathan Willing on 12/4/12.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "RBLScrollView.h"
#import "RBLClipView.h"
@implementation RBLScrollView
#pragma mark Lifecycle
- (id)initWithFrame:(NSRect)frameRect {
self = [super initWithFrame:frameRect];
if (self == nil) return nil;
[self swapClipView];
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
if (![self.contentView isKindOfClass:RBLClipView.class] ) {
[self swapClipView];
}
}
#pragma mark Clip view swapping
- (void)swapClipView {
self.wantsLayer = YES;
id documentView = self.documentView;
RBLClipView *clipView = [[RBLClipView alloc] initWithFrame:self.contentView.frame];
self.contentView = clipView;
self.documentView = documentView;
}
@end
@@ -28,11 +28,6 @@
self.rep500View.scale = 5.0;
self.rep1000View.scale = 10.0;
self.rep100View.shouldShowHotSpot = YES;
self.rep200View.shouldShowHotSpot = YES;
self.rep500View.shouldShowHotSpot = YES;
self.rep1000View.shouldShowHotSpot = YES;
[self.rep100View bind:@"image" toObject:self withKeyPath:@"cursor.cursorImage100" options:nil];
[self.rep100View bind:@"frameCount" toObject:self withKeyPath:@"cursor.frameCount" options:nil];
[self.rep100View bind:@"frameDuration" toObject:self withKeyPath:@"cursor.frameDuration" options:nil];
@@ -69,8 +64,14 @@
}
- (void)imageView:(MMAnimatingImageView *)imageView didAcceptDroppedImages:(NSArray *)images {
CGFloat scale = imageView.scale;
[self.cursor setRepresentation:images.lastObject forScale:cursorScaleForScale(scale)];
MCCursorScale scale = cursorScaleForScale(imageView.scale);
if (NSEvent.modifierFlags == NSAlternateKeyMask) {
[self.cursor addFrame:[MCCursor composeRepresentationWithFrames:images] forScale:scale];
} else {
[self.cursor setRepresentation:[MCCursor composeRepresentationWithFrames:images] forScale:scale];
self.cursor.frameCount = images.count;
}
}
- (void)imageView:(MMAnimatingImageView *)imageView didDragOutImage:(NSImage *)image {
@@ -99,3 +100,4 @@
}
@end
@@ -78,10 +78,10 @@ const char MCCursorNameContext;
NSUInteger index = [self.cursors indexForInsertingObject:lib sortedUsingComparator:self.class.sortComparator];
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
[self.cursors insertObject:lib atIndex:index];
[self startObservingCursor:lib];
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"capes"];
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indices forKey:@"cursors"];
[self.tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp];
}
} else if (kind == NSKeyValueChangeRemoval) {
@@ -90,10 +90,10 @@ const char MCCursorNameContext;
if (index != NSNotFound) {
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:index];
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
[self stopObservingCursor:lib];
[self.cursors removeObjectAtIndex:index];
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"cursors"];
[self.tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:index + 1] withAnimation:NSTableViewAnimationSlideUp | NSTableViewAnimationEffectFade];
}
}
@@ -56,7 +56,7 @@
[self.editListController addObserver:self forKeyPath:@"selectedObject" options:0 context:nil];
[self _setCurrentViewController:self.editCapeController];
[self.window bind:@"documentEdited" toObject:self withKeyPath:@"cursorLibrary.isDirty" options:nil];
[self.window bind:@"documentEdited" toObject:self withKeyPath:@"cursorLibrary.dirty" options:nil];
}
- (void)dealloc {
@@ -28,6 +28,7 @@
- (NSURL *)URLForCape:(MCCursorLibrary *)cape;
- (NSSet *)capesWithIdentifier:(NSString *)identifier;
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block;
@end
@@ -10,8 +10,7 @@
#import "NSOrderedSet+AZSortedInsert.h"
#import "apply.h"
#import "restore.h"
const char MCLibraryIdentifierContext;
#import "create.h"
@interface MCLibraryController ()
@property (nonatomic, readwrite, strong) NSUndoManager *undoManager;
@@ -19,18 +18,21 @@ const char MCLibraryIdentifierContext;
@property (readwrite, copy) NSURL *libraryURL;
@property (readwrite, weak) MCCursorLibrary *appliedCape;
- (void)loadLibrary;
- (void)willSaveNotification:(NSNotification *)note;
@end
@implementation MCLibraryController
- (NSURL *)URLForCape:(MCCursorLibrary *)cape {
return [NSURL fileURLWithPathComponents:@[ self.libraryURL.path, [cape.identifier stringByAppendingPathExtension:@"cape"] ]];
return [NSURL fileURLWithPathComponents:@[ self.libraryURL.path, [cape.identifier stringByAppendingPathExtension:@"cape"] ]];;
}
- (instancetype)initWithURL:(NSURL *)url {
if ((self = [self init])) {
self.libraryURL = url;
self.undoManager = [[NSUndoManager alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willSaveNotification:) name:MCLibraryWillSaveNotificationName object:nil];
[self loadLibrary];
}
@@ -46,6 +48,10 @@ const char MCLibraryIdentifierContext;
NSString *applied = [NSUserDefaults.standardUserDefaults stringForKey:MCPreferencesAppliedCursorKey];
for (NSString *filename in contents) {
// Ignore hidden files like .DS_Store
if ([filename hasPrefix:@"."])
continue;
NSURL *fileURL = [NSURL fileURLWithPathComponents:@[ capesPath, filename ]];
MCCursorLibrary *library = [MCCursorLibrary cursorLibraryWithContentsOfURL:fileURL];
@@ -60,17 +66,14 @@ const char MCLibraryIdentifierContext;
}
- (void)importCapeAtURL:(NSURL *)url {
MCCursorLibrary *lib = [MCCursorLibrary cursorLibraryWithContentsOfURL:url];
NSURL *destinationURL = [self URLForCape:lib];
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtURL:lib.fileURL toURL:destinationURL error:&error];
if (!error) {
lib.fileURL = destinationURL;
[self addCape:lib];
}
[self importCape:[MCCursorLibrary cursorLibraryWithContentsOfURL:url]];
}
- (void)importCape:(MCCursorLibrary *)lib {
if ([[self.capes valueForKeyPath:@"identifier"] containsObject:lib.identifier]) {
lib.identifier = [lib.identifier stringByAppendingFormat:@".%@", UUID()];
}
lib.fileURL = [self URLForCape:lib];
[lib writeToFile:lib.fileURL.path atomically:NO];
@@ -79,7 +82,7 @@ const char MCLibraryIdentifierContext;
- (void)addCape:(MCCursorLibrary *)cape {
if ([self.capes containsObject:cape]) {
if ([self.capes containsObject:cape] || [[self.capes valueForKeyPath:@"identifier"] containsObject:cape.identifier]) {
NSLog(@"Not adding %@ to the library because an object with that identifier already exists", cape.identifier);
return;
}
@@ -91,18 +94,18 @@ const char MCLibraryIdentifierContext;
NSSet *change = [NSSet setWithObject:cape];
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
[cape addObserver:self forKeyPath:@"identifier" options:NSKeyValueObservingOptionOld context:(void *)&MCLibraryIdentifierContext];
cape.library = self;
[self.capes addObject:cape];
[[self.undoManager prepareWithInvocationTarget:self] removeCape:cape];
if (!self.undoManager.isUndoing) {
[self.undoManager setActionName:[@"Add " stringByAppendingString:cape.name]];
}
[self didChangeValueForKey:@"capes" withSetMutation:NSKeyValueUnionSetMutation usingObjects:change];
[cape.undoManager removeAllActions];
}
@@ -112,9 +115,7 @@ const char MCLibraryIdentifierContext;
[self willChangeValueForKey:@"capes" withSetMutation:NSKeyValueMinusSetMutation usingObjects:change];
if (cape == self.appliedCape)
[self restoreCape];
[cape removeObserver:self forKeyPath:@"identifier" context:(void *)&MCLibraryIdentifierContext];
if (cape.library == self)
cape.library = nil;
@@ -151,21 +152,30 @@ const char MCLibraryIdentifierContext;
return [self.capes filteredSetUsingPredicate:pred];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == &MCLibraryIdentifierContext) {
// change the file url to reflect the new identifier
MCCursorLibrary *cape = object;
NSURL *oldURL = cape.fileURL;
[cape setFileURL:[self URLForCape:cape]];
NSError *error = nil;
[[NSFileManager defaultManager] moveItemAtURL:oldURL toURL:cape.fileURL error:&error];
if (error) {
NSLog(@"Failed to rename the identifier of the cape %@. Reverting to %@...", cape.identifier, change[NSKeyValueChangeOldKey]);
cape.identifier = change[NSKeyValueChangeOldKey];
cape.fileURL = [self URLForCape:cape];
}
- (void)willSaveNotification:(NSNotification *)note {
MCCursorLibrary *cape = note.object;
NSURL *oldURL = cape.fileURL;
[cape setFileURL:[self URLForCape:cape]];
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtURL:oldURL error:&error];
if (error) {
NSLog(@"error removing cape after rename: %@", error);
}
}
- (BOOL)dumpCursorsWithProgressBlock:(BOOL (^)(NSUInteger current, NSUInteger total))block {
NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"Mousecape Dump (%f).cape", NSDate.date.timeIntervalSince1970]];
if (dumpCursorsToFile(path, block)) {
__weak MCLibraryController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf importCapeAtURL:[NSURL fileURLWithPath:path]];
});
return YES;
}
return NO;
}
@end
@@ -122,6 +122,11 @@ const char MCLibraryNameContext;
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indices forKey:@"capes"];
[self.tableView removeRowsAtIndexes:indices withAnimation:NSTableViewAnimationSlideUp | NSTableViewAnimationEffectFade];
if (self.editWindowController.cursorLibrary == lib) {
self.editWindowController.cursorLibrary = nil;
[self.editWindowController close];
}
}
}
@@ -10,8 +10,10 @@
#import "MCLibraryViewController.h"
@interface MCLibraryWindowController : NSWindowController <NSWindowDelegate>
@property (assign) IBOutlet MCLibraryViewController *libraryViewController;
@property (assign) IBOutlet NSView *appliedAccessory;
@property (weak) IBOutlet MCLibraryViewController *libraryViewController;
@property (weak) IBOutlet NSView *appliedAccessory;
@property (weak) IBOutlet NSProgressIndicator *progressBar;
@property (weak) IBOutlet NSTextField *progressField;
@end
@interface MCAppliedCapeValueTransformer : NSValueTransformer
@@ -14,6 +14,10 @@
@implementation MCLibraryWindowController
- (void)awakeFromNib {
[self composeAccessory];
}
- (id)initWithWindow:(NSWindow *)window {
if ((self = [super initWithWindow:window])) {
@@ -22,9 +26,9 @@
}
- (void)windowDidLoad {
NSLog(@"window load");
[super windowDidLoad];
[self composeAccessory];
}
- (NSString *)windowNibName {
@@ -65,7 +69,7 @@
#pragma mark - Menu Actions
- (IBAction)applyCape:(NSMenuItem *)sender {
- (IBAction)applyCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -75,7 +79,7 @@
[self.libraryViewController.libraryController applyCape:cape];
}
- (IBAction)editCape:(NSMenuItem *)sender {
- (IBAction)editCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -85,7 +89,7 @@
[self.libraryViewController editCape:cape];
}
- (IBAction)removeCape:(NSMenuItem *)sender {
- (IBAction)removeCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -100,7 +104,7 @@
}
}
- (IBAction)duplicateCape:(NSMenuItem *)sender {
- (IBAction)duplicateCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -110,11 +114,11 @@
[self.libraryViewController.libraryController importCape:cape.copy];
}
- (IBAction)checkCape:(NSMenuItem *)sender {
- (IBAction)checkCapeAction:(NSMenuItem *)sender {
}
- (IBAction)showCape:(NSMenuItem *)sender {
- (IBAction)showCapeAction:(NSMenuItem *)sender {
MCCursorLibrary *cape = nil;
if (sender.tag == -1)
cape = self.libraryViewController.clickedCape;
@@ -124,6 +128,30 @@
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:@[ cape.fileURL ]];
}
- (IBAction)dumpCapeAction:(NSMenuItem *)sender {
[self.window beginSheet:self.progressBar.window completionHandler:nil];
__weak MCLibraryWindowController *weakSelf = self;
self.progressBar.doubleValue = 0.0;
[self.progressBar setIndeterminate:NO];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[weakSelf.libraryViewController.libraryController dumpCursorsWithProgressBlock:^BOOL (NSUInteger current, NSUInteger total) {
dispatch_sync(dispatch_get_main_queue(), ^{
weakSelf.progressField.stringValue = [NSString stringWithFormat:@"%lu of %lu", (unsigned long)current, (unsigned long)total];
weakSelf.progressBar.minValue = 0;
weakSelf.progressBar.maxValue = total;
weakSelf.progressBar.doubleValue = current;
});
return YES;
}];
dispatch_sync(dispatch_get_main_queue(), ^{
[weakSelf.window endSheet:self.progressBar.window];
[[NSCursor arrowCursor] set];
});
});
}
@end
@implementation MCAppliedCapeValueTransformer
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13C48" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6185.11" systemVersion="13D65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment version="1070" defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<deployment version="1070" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6185.11"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MCGeneralPreferencesController">
@@ -11,22 +11,48 @@
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="1">
<rect key="frame" x="0.0" y="0.0" width="480" height="118"/>
<rect key="frame" x="0.0" y="0.0" width="480" height="143"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ndv-TL-Pur">
<rect key="frame" x="18" y="106" width="206" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="I am... handed." id="a3X-1e-eOG">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<segmentedControl verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8pe-9P-fa1">
<rect key="frame" x="68" y="101" width="94" height="25"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="selectOne" id="Hdu-Yg-F0d">
<font key="font" metaFont="system"/>
<segments>
<segment label="right" selected="YES"/>
<segment label="left" tag="1"/>
</segments>
</segmentedCell>
<connections>
<binding destination="Dw0-Gt-5ak" name="selectedIndex" keyPath="values.MCHandedness" id="ZqA-zg-dh2">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="0"/>
<integer key="NSNoSelectionPlaceholder" value="0"/>
<integer key="NSNotApplicablePlaceholder" value="0"/>
<integer key="NSNullPlaceholder" value="0"/>
</dictionary>
</binding>
</connections>
</segmentedControl>
<slider verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JRx-YT-ae7">
<rect key="frame" x="18" y="19" width="392" height="27"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="18" y="15" width="392" height="27"/>
<sliderCell key="cell" continuous="YES" state="on" alignment="left" minValue="1" maxValue="16" doubleValue="1" tickMarkPosition="below" numberOfTickMarks="16" sliderType="linear" id="osm-63-Q66"/>
<connections>
<binding destination="-2" name="value" keyPath="cursorScale" id="PlF-RW-V9z"/>
</connections>
</slider>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hg4-8F-fVE">
<rect key="frame" x="20" y="52" width="82" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="20" y="48" width="82" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Cursor Scale" id="gxo-nh-UCg">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -34,8 +60,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yjb-oM-v3t">
<rect key="frame" x="18" y="81" width="265" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="18" y="77" width="265" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double Clicks capes" id="mFs-6l-Guo">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -43,9 +68,8 @@
</textFieldCell>
</textField>
<segmentedControl verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZYi-xB-wBd">
<rect key="frame" x="119" y="75" width="111" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<segmentedCell key="cell" alignment="left" style="texturedSquare" trackingMode="selectOne" id="oXj-Hj-PSJ">
<rect key="frame" x="119" y="71" width="111" height="25"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="selectOne" id="oXj-Hj-PSJ">
<font key="font" metaFont="system"/>
<segments>
<segment label="apply" width="54"/>
@@ -55,25 +79,20 @@
<connections>
<binding destination="Dw0-Gt-5ak" name="selectedIndex" keyPath="values.MCDoubleAction" id="GuD-im-CgM">
<dictionary key="options">
<integer key="NSNotApplicablePlaceholder" value="0"/>
<integer key="NSNoSelectionPlaceholder" value="0"/>
<integer key="NSNullPlaceholder" value="0"/>
<integer key="NSMultipleValuesPlaceholder" value="0"/>
<integer key="NSNoSelectionPlaceholder" value="0"/>
<integer key="NSNotApplicablePlaceholder" value="0"/>
<integer key="NSNullPlaceholder" value="0"/>
</dictionary>
</binding>
</connections>
</segmentedControl>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QBy-dj-wZ4">
<rect key="frame" x="416" y="25" width="44" height="19"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<rect key="frame" x="416" y="21" width="44" height="19"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="nlB-rR-gpk">
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#0.00" negativeFormat="#0.00" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="1" maximumIntegerDigits="2" minimumFractionDigits="2" maximumFractionDigits="2" id="ZjS-1g-txf">
<real key="roundingIncrement" value="0.0"/>
<numberFormatter key="formatter" formatterBehavior="custom10_4" positiveFormat="#0.00" negativeFormat="#0.00" usesGroupingSeparator="NO" paddingCharacter="*" groupingSize="0" minimumIntegerDigits="1" maximumIntegerDigits="2" minimumFractionDigits="2" maximumFractionDigits="2" decimalSeparator="." groupingSeparator="," currencyDecimalSeparator="." plusSign="+" minusSign="-" notANumberSymbol="NaN" perMillSymbol="‰" percentSymbol="%" exponentSymbol="E" positivePrefix="" positiveSuffix="" negativePrefix="-" negativeSuffix="" id="ZjS-1g-txf">
<real key="minimum" value="0.5"/>
<real key="maximum" value="16"/>
<metadata>
<bool key="localizesFormat" value="YES"/>
</metadata>
</numberFormatter>
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -84,7 +103,8 @@
</connections>
</textField>
</subviews>
<point key="canvasLocation" x="311" y="408.5"/>
</customView>
<userDefaultsController representsSharedInstance="YES" id="Dw0-Gt-5ak"/>
</objects>
</document>
</document>
@@ -33,11 +33,13 @@ extern MCCursorScale cursorScaleForScale(CGFloat scale);
- (void)setRepresentation:(NSImageRep *)imageRep forScale:(MCCursorScale)scale;
- (void)removeRepresentationForScale:(MCCursorScale)scale;
- (void)addFrame:(NSImageRep *)frame forScale:(MCCursorScale)scale;
- (NSImageRep *)representationForScale:(MCCursorScale)scale;
- (NSImageRep *)representationWithScale:(CGFloat)scale;
- (NSDictionary *)dictionaryRepresentation;
+ (NSImageRep *)composeRepresentationWithFrames:(NSArray *)frames;
// Derived Properties
- (NSImage *)imageWithAllReps;
+74 -2
View File
@@ -17,6 +17,7 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
@interface MCCursor ()
@property (readwrite, strong) NSMutableDictionary *representations;
- (NSInteger)framesForScale:(MCCursorScale)scale;
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary ofVersion:(CGFloat)version;
@end
@@ -185,12 +186,84 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
[self.representations setObject:imageRep forKey:@(scale)];
else
[self.representations removeObjectForKey:@(scale)];
if (self.representations.count == 1) {
// This is the first object, set the image size to this
NSSize size = NSMakeSize((double)imageRep.pixelsWide / (scale / 100.0), (double)imageRep.pixelsHigh / self.frameCount / (scale / 100.0));
if (!NSEqualSizes(size, NSZeroSize)) {
self.size = size;
}
}
[self didChangeValueForKey:key];
[self didChangeValueForKey:@"representations"];
}
- (void)addFrame:(NSImageRep *)frame forScale:(MCCursorScale)scale {
NSImageRep *rep = [self representationForScale:scale];
NSImageRep *newRep = [self.class composeRepresentationWithFrames:@[ rep, frame ]];
NSInteger frames = newRep.pixelsHigh / self.size.height;
if (self.frameCount < frames) {
self.frameCount = frames;
}
[self setRepresentation:newRep forScale:scale];
}
+ (NSImageRep *)composeRepresentationWithFrames:(NSArray *)frames {
if (frames.count == 0)
return nil;
if (frames.count == 1)
return frames.firstObject;
NSUInteger height = [[frames valueForKeyPath:@"@sum.pixelsHigh"] unsignedIntegerValue];
NSUInteger width = [(NSImageRep *)frames[0] pixelsWide];
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:width
pixelsHigh:height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:4 * width
bitsPerPixel:32];
NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:newRep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:ctx];
NSUInteger currentY = 0;
for (NSInteger idx = frames.count - 1; idx >= 0; idx--) {
NSImageRep *rep = frames[idx];
if (rep.pixelsWide != width) {
NSLog(@"Can't create representation from images of different widths");
return nil;
}
[rep drawInRect:NSMakeRect(0, currentY, rep.pixelsWide, rep.pixelsHigh)
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:1.0
respectFlipped:YES
hints:nil];
currentY += rep.pixelsHigh;
}
[NSGraphicsContext restoreGraphicsState];
return newRep;
}
- (NSInteger)framesForScale:(MCCursorScale)scale {
return [self representationForScale:scale].pixelsHigh / self.size.height;
}
- (void)removeRepresentationForScale:(MCCursorScale)scale {
[self setRepresentation:Nil forScale:scale];
[self setRepresentation:nil forScale:scale];
}
- (NSImageRep *)representationForScale:(MCCursorScale)scale {
@@ -203,7 +276,6 @@ MCCursorScale cursorScaleForScale(CGFloat scale) {
- (NSImage *)imageWithAllReps {
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(self.size.width, self.size.height * self.frameCount)];
image.matchesOnMultipleResolution = YES;
[image addRepresentations:self.representations.allValues];
return image;
}
@@ -9,6 +9,9 @@
#import <Foundation/Foundation.h>
#import "MCCursor.h"
extern NSString *const MCLibraryWillSaveNotificationName;
extern NSString *const MCLibraryDidSaveNotificationName;
@class MCLibraryController;
@interface MCCursorLibrary : NSObject <NSCopying>
@property (nonatomic, copy) NSString *name;
@@ -18,7 +21,7 @@
@property (nonatomic, copy) NSURL *fileURL;
@property (nonatomic, weak) MCLibraryController *library;
@property (nonatomic, readonly) NSUndoManager *undoManager;
@property (nonatomic, readonly) BOOL isDirty;
@property (nonatomic, readonly, getter=isDirty) BOOL dirty;
@property (nonatomic, assign, getter = isInCloud) BOOL inCloud;
@property (nonatomic, assign, getter = isHiDPI) BOOL hiDPI;
@@ -8,11 +8,16 @@
#import "MCCursorLibrary.h"
NSString *const MCLibraryWillSaveNotificationName = @"MCLibraryWillSave";
NSString *const MCLibraryDidSaveNotificationName = @"MCLibraryDidSave";
@interface MCCursorLibrary ()
@property (nonatomic, strong) NSUndoManager *undoManager;
@property (nonatomic, readwrite, strong) NSMutableSet *cursors;
@property (nonatomic, assign) NSUInteger changeCount;
@property (nonatomic, assign) NSUInteger lastChangeCount;
@property (nonatomic, strong) NSArray *observers;
@property (nonatomic, copy) NSString *oldIdentifier;
- (BOOL)_readFromDictionary:(NSDictionary *)dictionary;
- (void)addCursorsFromDictionary:(NSDictionary *)cursorDicts ofVersion:(CGFloat)doubleVersion;
@@ -28,7 +33,7 @@
@end
@implementation MCCursorLibrary
@dynamic isDirty;
@dynamic dirty;
+ (NSArray *)undoProperties {
return @[ @"identifier", @"name", @"author", @"hiDPI", @"version", @"inCloud" ];
@@ -88,18 +93,20 @@
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
__weak typeof(self) weakSelf = self;
[center addObserverForName:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob1 = [center addObserverForName:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeDone];
}];
[center addObserverForName:NSUndoManagerDidUndoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob2 = [center addObserverForName:NSUndoManagerDidUndoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeUndone];
}];
[center addObserverForName:NSUndoManagerDidRedoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
id ob3 = [center addObserverForName:NSUndoManagerDidRedoChangeNotification object:self.undoManager queue:nil usingBlock:^(NSNotification *note) {
[weakSelf updateChangeCount:NSChangeRedone];
}];
self.observers = @[ob1, ob2, ob3];
self.name = @"Unnamed";
self.author = NSUserName();
self.hiDPI = NO;
@@ -132,7 +139,7 @@
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"isDirty"]) {
if ([key isEqualToString:@"dirty"]) {
keyPaths = [keyPaths setByAddingObjectsFromArray: @[@"changeCount", @"lastChangeCount"]];
}
return keyPaths;
@@ -193,6 +200,10 @@
for (MCCursor *cursor in self.cursors) {
[self stopObservingCursor:cursor];
}
for (id observer in self.observers) {
[NSNotificationCenter.defaultCenter removeObserver:observer];
}
}
const char MCCursorLibraryPropertiesContext;
@@ -237,6 +248,10 @@ const char MCCursorPropertiesContext;
if (!self.undoManager.isUndoing) {
[self.undoManager setActionName:[[@"Change " stringByAppendingString:decamelized] capitalizedString]];
}
if ([keyPath isEqualToString:@"identifier"]) {
self.oldIdentifier = oldValue;
}
}
}
@@ -341,11 +356,13 @@ const char MCCursorPropertiesContext;
NSLocalizedDescriptionKey: NSLocalizedString(@"Save failed", nil),
NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"Multiple cursors with the name(s): %@ exist.", nil), duplicates] }];
}
// [self.undoManager removeAllActions];
[[NSNotificationCenter defaultCenter] postNotificationName:MCLibraryWillSaveNotificationName object:self];
BOOL success = [self writeToFile:self.fileURL.path atomically:NO];
if (success) {
[self updateChangeCount:NSChangeCleared];
[[NSNotificationCenter defaultCenter] postNotificationName:MCLibraryDidSaveNotificationName object:self];
return nil;
}
return [NSError errorWithDomain:MCErrorDomain code:MCErrorWriteFailCode userInfo:@{
@@ -33,9 +33,9 @@
return YES;
}
*error = [NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
*error = [[NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid format", @"Invalid format error description in edit window"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}];
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}] localizedDescription];
return NO;
}
@@ -66,9 +66,9 @@
return YES;
}
*error = [NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
*error = [[NSError errorWithDomain:MCErrorDomain code:MCErrorInvalidFormatCode userInfo:@{
NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid format", @"Invalid format error description in edit window"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}];
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Must follow format of: \"{0.0, 0.0}\"." , @"Invalid format error reason in edit window")}] localizedDescription];
return NO;
}
@@ -7,12 +7,16 @@
//
#import <Cocoa/Cocoa.h>
#import "MMAnimatingImageView.h"
@interface MCCapeCellView : NSTableCellView
@property (assign) IBOutlet NSTextField *titleField;
@property (assign) IBOutlet NSTextField *subtitleField;
@property (assign) IBOutlet NSImageView *appliedImageView;
@property IBOutlet NSTextField *titleField;
@property IBOutlet NSTextField *subtitleField;
@property IBOutlet NSImageView *appliedImageView;
@property IBOutlet NSImageView *resolutionImageView;
@property IBOutlet NSCollectionView *collectionView;
@end
@interface MCHDValueTransformer : NSValueTransformer
@end
@end
+35 -7
View File
@@ -7,13 +7,38 @@
//
#import "MCCapeCellView.h"
#import "MCCapePreviewItem.h"
@interface MCCapeCellView ()
@end
@interface MCSortValueTransformer : NSValueTransformer
@end
@implementation MCCapeCellView
- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
[super setBackgroundStyle:backgroundStyle];
- (void)viewDidMoveToWindow {
self.collectionView.itemPrototype = [MCCapePreviewItem new];
[self.collectionView bind:NSContentBinding toObject:self withKeyPath:@"objectValue.cursors" options:@{ NSValueTransformerBindingOption: [MCSortValueTransformer new] }];
//
self.collectionView.minItemSize = self.collectionView.itemPrototype.view.frame.size;
self.collectionView.maxItemSize = self.collectionView.minItemSize;
}
- (void)dealloc {
[self.collectionView unbind:NSContentBinding];
}
@end
@implementation MCSortValueTransformer
+ (Class)transformedValueClass {
return [NSSet class];
}
- (NSArray *)transformedValue:(NSSet *)value {
return [value sortedArrayUsingDescriptors: @[ [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)] ]];
}
@end
@@ -21,13 +46,16 @@
@implementation MCHDValueTransformer
+ (Class)transformedValueClass {
return [NSString class];
return [NSImage class];
}
- (NSString *)transformedValue:(NSNumber *)value {
- (NSImage *)transformedValue:(NSNumber *)value {
BOOL isHiDPI = value.boolValue;
return isHiDPI ? [NSImage imageNamed:@"HDTemplate"] : [NSImage imageNamed:@"SDTemplate"];
NSImage *image = isHiDPI ? [NSImage imageNamed:@"HDTemplate"] : [NSImage imageNamed:@"SDTemplate"];
image.template = YES;
return image;
}
@end
@@ -0,0 +1,14 @@
//
// MCCapePreviewItem.h
// Mousecape
//
// Created by Alex Zielenski on 3/10/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MMAnimatingImageView.h"
@interface MCCapePreviewItem : NSCollectionViewItem
@property (nonatomic, weak) IBOutlet MMAnimatingImageView *animatingImageView;
@end
@@ -0,0 +1,45 @@
//
// MCCapePreviewItem.m
// Mousecape
//
// Created by Alex Zielenski on 3/10/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import "MCCapePreviewItem.h"
@interface MCCapePreviewItem ()
@end
@implementation MCCapePreviewItem
- (id)init {
if ((self = [super init])) {
self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 40, 40)];
MMAnimatingImageView *im = [[MMAnimatingImageView alloc] initWithFrame:self.view.frame];
self.animatingImageView = im;
self.animatingImageView.shouldAllowDragging = NO;
[self.view addSubview:im];
[self.animatingImageView bind:@"image" toObject:self withKeyPath:@"representedObject.imageWithAllReps" options:nil];
[self.animatingImageView bind:@"frameCount" toObject:self withKeyPath:@"representedObject.frameCount" options:nil];
[self.animatingImageView bind:@"frameDuration" toObject:self withKeyPath:@"representedObject.frameDuration" options:nil];
[self.animatingImageView bind:@"shouldFlipHorizontally"
toObject:[NSUserDefaults standardUserDefaults]
withKeyPath:MCPreferencesHandednessKey
options:nil];
}
return self;
}
- (void)dealloc {
[self.animatingImageView unbind:@"shouldFlipHorizontally"];
[self.animatingImageView unbind:@"image"];
[self.animatingImageView unbind:@"frameCount"];
[self.animatingImageView unbind:@"frameDuration"];
}
@end
@@ -33,7 +33,9 @@
@property (assign) NSInteger frameCount;
@property (assign) CGFloat scale; // set to 0.0 if you want to inherit window scale
@property (assign) NSPoint hotSpot;
@property (assign) BOOL shouldFlipHorizontally;
@property (weak) IBOutlet id <MMAnimatingImageViewDelegate> delegate;
@property (assign) BOOL shouldAnimate;
@property (assign) BOOL shouldShowHotSpot;
@property (assign) BOOL shouldAllowDragging;
@end
@@ -9,6 +9,8 @@
#import "MMAnimatingImageView.h"
#import "MCSpriteLayer.h"
#define SHOULDCOPY NSEvent.modifierFlags & NSAlternateKeyMask
const char MCInvalidateContext;
@interface MMAnimatingImageView ()
@@ -17,7 +19,9 @@ const char MCInvalidateContext;
- (void)_initialize;
- (void)_invalidateFrame;
- (void)_invalidateAnimation;
- (void)_resetTransform;
- (void)registerTypes;
- (void)_dragAnimationEnded:(id)sender;
@end
@implementation MMAnimatingImageView
@@ -47,7 +51,7 @@ const char MCInvalidateContext;
- (void)_initialize {
self.shouldAnimate = YES;
[self registerTypes];
self.layer = [[MCSpriteLayer alloc] init];
@@ -58,15 +62,20 @@ const char MCInvalidateContext;
self.layer.delegate = self;
CALayer *hotSpotLayer = [CALayer layer];
hotSpotLayer.bounds = CGRectMake(0, 0, 4, 4);
hotSpotLayer.bounds = CGRectMake(0, 0, 3, 3);
hotSpotLayer.backgroundColor = [[NSColor redColor] CGColor];
hotSpotLayer.autoresizingMask = kCALayerNotSizable;
hotSpotLayer.anchorPoint = CGPointMake(0, 0);
hotSpotLayer.anchorPoint = CGPointMake(0.5, 0.5);
hotSpotLayer.borderColor = [[NSColor blackColor] CGColor];
hotSpotLayer.borderWidth = 0.5;
[self.layer addSublayer:hotSpotLayer];
self.hotSpotLayer = hotSpotLayer;
self.spriteLayer = (MCSpriteLayer *)self.layer;
self.shouldShowHotSpot = NO;
self.shouldAllowDragging = NO;
self.frameCount = 1;
self.frameDuration = 1;
@@ -76,6 +85,7 @@ const char MCInvalidateContext;
[self addObserver:self forKeyPath:@"frameCount" options:0 context:(void *)&MCInvalidateContext];
[self addObserver:self forKeyPath:@"frameDuration" options:0 context:(void *)&MCInvalidateContext];
[self addObserver:self forKeyPath:@"shouldAnimate" options:0 context:NULL];
[self addObserver:self forKeyPath:@"shouldFlipHorizontally" options:0 context:NULL];
}
- (void)dealloc {
@@ -85,22 +95,25 @@ const char MCInvalidateContext;
[self removeObserver:self forKeyPath:@"frameCount"];
[self removeObserver:self forKeyPath:@"frameDuration"];
[self removeObserver:self forKeyPath:@"shouldAnimate"];
[self removeObserver:self forKeyPath:@"shouldFlipHorizontally"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == &MCInvalidateContext) {
if ([keyPath isEqualToString:@"image"] || [keyPath isEqualToString:@"placeholderImage"]) {
self.spriteLayer.contents = !self.image ? self.placeholderImage : self.image;
self.spriteLayer.contents = self.image ?: self.placeholderImage;
}
[self _invalidateFrame];
[self _invalidateAnimation];
} else if ([keyPath isEqualToString:@"shouldAnimate"]) {
[self _invalidateAnimation];
} else if ([keyPath isEqualToString:@"shouldFlipHorizontally"]) {
[self _resetTransform];
}
}
- (BOOL)layer:(CALayer *)layer shouldInheritContentsScale:(CGFloat)newScale fromWindow:(NSWindow *)window {
return self.scale == 0.0 || !self.image;
return NO;
}
// Tell OSX that our view can accept images to be dragged in
@@ -126,24 +139,44 @@ const char MCInvalidateContext;
#pragma mark - Invalidators
- (void)_resetTransform {
if (self.shouldFlipHorizontally) {
self.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransformMake(-1, 0, 0, 1, self.layer.bounds.size.width, 0));
} else {
self.layer.transform = CATransform3DIdentity;
}
}
- (void)_invalidateFrame {
CGFloat scale = self.scale;
if (!self.scale || !self.image)
if (!self.scale || !self.image) {
scale = self.window.backingScaleFactor;
self.layer.contentsScale = scale;
}
if (scale == 0.0)
scale = 1.0;
if (self.scale && self.image)
scale = self.scale;
else if (!self.scale && self.image)
scale = [self.image recommendedLayerContentsScale:self.window.backingScaleFactor];
else
scale = [self.placeholderImage recommendedLayerContentsScale:self.window.backingScaleFactor];
self.layer.contentsScale = scale;
self.spriteLayer.contentsScale = self.layer.contentsScale;
if (self.image) {
CGSize effectiveSize = CGSizeMake(self.image.size.width, self.image.size.height / self.frameCount);
CGRect effectiveRect = CGRectIntegral(CGRectMake(self.layer.frame.size.width / 2.0 - effectiveSize.width / 2.0, self.layer.frame.size.height / 2.0 + effectiveSize.height / 2.0, effectiveSize.width, effectiveSize.height));
self.hotSpotLayer.position = CGPointMake(ceil(CGRectGetMinX(effectiveRect) + self.hotSpot.x - self.hotSpotLayer.frame.size.width / 2), ceil(CGRectGetMinY(effectiveRect) - self.hotSpot.y - self.hotSpotLayer.frame.size.height / 2));
self.hotSpotLayer.position = CGPointMake(CGRectGetMinX(effectiveRect) + self.hotSpot.x, CGRectGetMinY(effectiveRect) - self.hotSpot.y);
self.hotSpotLayer.opacity = 1.0;
} else {
self.hotSpotLayer.opacity = 0.0;
}
[self _resetTransform];
}
- (void)_invalidateAnimation {
@@ -171,42 +204,57 @@ const char MCInvalidateContext;
#pragma mark - NSDraggingSource
- (void)draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint {
}
- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
if (context == NSDraggingContextWithinApplication)
if (context == NSDraggingContextWithinApplication && self.shouldAllowDragging)
return NSDragOperationCopy;
if (self.shouldAllowDragging)
return NSDragOperationEvery;
return NSDragOperationNone;
}
- (void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation {
if (self.delegate && [self.delegate respondsToSelector:@selector(imageView:didDragOutImage:)] && operation == NSDragOperationNone && !NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor currentCursor] pop];
NSShowAnimationEffect(NSAnimationEffectPoof, screenPoint, NSZeroSize, nil, NULL, nil);
[self.delegate imageView:self didDragOutImage:self.image];
if (!NSPointInRect(screenPoint, self.window.frame)) {
if (SHOULDCOPY) {
[self _dragAnimationEnded:self];
} else if (self.delegate && [self.delegate respondsToSelector:@selector(imageView:didDragOutImage:)]) {
NSShowAnimationEffect(NSAnimationEffectPoof, screenPoint, NSZeroSize, self, @selector(_dragAnimationEnded:), nil);
[self.delegate imageView:self didDragOutImage:self.image];
}
}
}
- (void)_dragAnimationEnded:(id)sender {
[[NSCursor arrowCursor] set];
}
- (void)draggingSession:(NSDraggingSession *)session movedToPoint:(NSPoint)screenPoint {
if (!NSPointInRect(screenPoint, self.window.frame)) {
[[NSCursor disappearingItemCursor] push];
if (SHOULDCOPY)
[[NSCursor dragCopyCursor] set];
else
[[NSCursor disappearingItemCursor] set];
} else if ([NSCursor currentCursor] == [NSCursor disappearingItemCursor]) {
[[NSCursor currentCursor] pop];
[self _dragAnimationEnded:self];
}
}
- (BOOL)ignoreModifierKeysForDraggingSession:(NSDraggingSession *)session {
return YES;
return NO;
}
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent {
return YES;
return self.shouldAllowDragging;
}
- (void)mouseDown:(NSEvent *)event {
if (!self.image)
if (!self.image || !self.shouldAllowDragging)
return;
NSPasteboardItem *pbItem = [NSPasteboardItem new];
[pbItem setDataProvider:self forTypes:@[ NSPasteboardTypePNG, NSPasteboardTypeTIFF, @"public.image" ]];
[pbItem setDataProvider:self forTypes:@[ NSPasteboardTypePNG, NSPasteboardTypeTIFF, @"public.image", (__bridge NSString *)kPasteboardTypeFileURLPromise ]];
NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem];
@@ -229,12 +277,15 @@ const char MCInvalidateContext;
- (void)pasteboard:(NSPasteboard *)sender item:(NSPasteboardItem *)item provideDataForType:(NSString *)type {
if ([type compare: NSPasteboardTypeTIFF] == NSOrderedSame) {
[sender setData:[self.image TIFFRepresentation] forType:NSPasteboardTypeTIFF];
} else if ([type compare: NSPasteboardTypePNG] == NSOrderedSame) {
[sender setData:[self.image.representations.lastObject representationUsingType:NSPNGFileType properties:nil] forType:NSPasteboardTypePNG];
} else if ([type compare:@"public.image"] == NSOrderedSame) {
[sender writeObjects:@[ self.image ]];
} else if ([type compare:(__bridge NSString *)kPasteboardTypeFileURLPromise] == NSOrderedSame && SHOULDCOPY) {
NSURL *url = [[NSURL URLWithString:[item stringForType:@"com.apple.pastelocation"]] URLByAppendingPathComponent:[NSString stringWithFormat:@"Mousecape Image (%f).png", NSDate.date.timeIntervalSince1970]];
[[self.image.representations.firstObject representationUsingType:NSPNGFileType properties:nil] writeToFile:url.path atomically:NO];
}
}
#pragma mark - NSDragDestination
@@ -246,15 +297,16 @@ const char MCInvalidateContext;
// Only thing we have to do here is confirm that the dragged file is an image. We use NSImage's +canInitWithPasteboard: and we also check to see there is only one item being dragged
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && // No point in accepting the drop if the delegate doesn't support it/exist
[NSImage canInitWithPasteboard:sender.draggingPasteboard] && // Only Accept Images
sender.draggingPasteboard.pasteboardItems.count == 1) { // Only accept one item
return [self.delegate imageView:self draggingEntered:sender];
self.shouldAllowDragging) {
return [self.delegate imageView:self draggingEntered:sender];
}
return NSDragOperationNone;
}
// Give the delegate some more control
- (BOOL)prepareForDragOperation:(id<NSDraggingInfo>)sender {
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)]) {
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && self.shouldAllowDragging) {
return [self.delegate imageView:self shouldPrepareForDragOperation:sender];
}
return NO;
@@ -263,27 +315,28 @@ const char MCInvalidateContext;
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
if ([self.delegate conformsToProtocol:@protocol(MMAnimatingImageViewDelegate)] && // Only do the operation if a delegate exists to actually set the image.
[self.delegate imageView:self shouldPerformDragOperation:sender]) { // Only do the operation if a delegate wants us to do the operation.
// Get the image from the pasteboard
NSImage *im = [[NSImage alloc] initWithPasteboard:sender.draggingPasteboard];
// Make an array of the valid drops (NSBitmapImageRep)
NSMutableArray *acceptedDrops = [NSMutableArray arrayWithCapacity:im.representations.count];
for (NSImageRep *rep in im.representations) {
if (![rep isKindOfClass:[NSBitmapImageRep class]]) // We don't want PDFs
continue;
[acceptedDrops addObject:rep];
}
NSArray *imageArray = [sender.draggingPasteboard readObjectsForClasses:@[[NSImage class], [NSURL class]] options:nil];
NSMutableArray *acceptedDrops = [NSMutableArray arrayWithCapacity:imageArray.count];
for (NSInteger idx = 0; idx < imageArray.count; idx++) {
id obj = imageArray[idx];
if ([obj isKindOfClass:[NSImage class]]) {
[acceptedDrops addObject:[[obj representations] firstObject]];
} else {
// NSURL
[acceptedDrops addObject:[NSImageRep imageRepWithContentsOfURL:obj]];
}
}
if (acceptedDrops.count > 0) {
// We already confirmed that the delegate conforms to the protocol above. Now we can let the delegate
// decide what to do with the dropped images.
[self.delegate imageView:self didAcceptDroppedImages:acceptedDrops];
return YES;
}
return YES;
}
return NO;
-70
View File
@@ -1,70 +0,0 @@
//
// MousecapeTests.m
// MousecapeTests
//
// Created by Alex Zielenski on 2/1/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <XCTest/XCTest.h>
#import "MCCursorLibrary.h"
@interface MousecapeTests : XCTestCase
@property (strong) MCCursorLibrary *library;
@end
@implementation MousecapeTests
- (void)setUp
{
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
self.library = [MCCursorLibrary cursorLibraryWithContentsOfFile:[@(PROJECT_DIR) stringByAppendingPathComponent: @"com.maxrudberg.svanslosbluehazard.cape"]];
}
- (void)tearDown
{
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testLibraryCreation {
XCTAssertTrue(self.library != nil, @"Library must not be nil");
XCTAssertEqualObjects(self.library.author, @"Max Rudberg", @"Author must be taken from cape");
XCTAssertEqualObjects(self.library.identifier, @"com.maxrudberg.svanslosbluehazard", @"Identifier must be taken from cape");
XCTAssert([self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].count > 0, @"Must retrieve cursor correctly");
}
- (void)testCursorCreation {
MCCursor *cursor = [self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].anyObject;
XCTAssertTrue(cursor.representations.count == 4, @"Must have correct cursor count");
XCTAssertTrue(cursor.frameCount == 1, @"Must have correct frame count");
XCTAssertTrue(cursor.frameDuration == 1, @"Must have current frame duration");
XCTAssertTrue(NSEqualSizes(cursor.size, NSMakeSize(20, 24)), @"Must have correct size");
NSImageRep *smallest = [cursor representationForScale:MCCursorScale100];
XCTAssertTrue(NSEqualSizes(NSMakeSize(smallest.pixelsWide, smallest.pixelsHigh), cursor.size), @"Size must be equal to 1x rep");
}
- (void)testCursorOperations {
MCCursor *cursor = [[self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"] anyObject];
cursor.identifier = @"com.apple.cursor.2";
XCTAssertEqualObjects(cursor.name, nameForCursorIdentifier(@"com.apple.cursor.2"), @"Name must be correctly set");
XCTAssertEqual(cursor, [self.library cursorsWithIdentifier:@"com.apple.cursor.2"].anyObject, @"Object must not be copied");
XCTAssertEqualObjects(cursor, cursor, @"isEqualTo: must work");
XCTAssert([self.library cursorsWithIdentifier:@"com.apple.coregraphics.Arrow"].count == 0, @"Old cursor spot must not be occupied");
MCCursor *replacement = [[MCCursor alloc] init];
replacement.identifier = @"com.apple.cursor.2";
[self.library addCursor:replacement];
XCTAssertEqual(replacement, [self.library cursorsWithIdentifier:@"com.apple.cursor.2"].anyObject, @"Replacement cursor must be retrievable");
}
- (void)testSavingAndReading {
NSDictionary *dictionary = self.library.dictionaryRepresentation;
MCCursorLibrary *read = [MCCursorLibrary cursorLibraryWithDictionary:dictionary];
XCTAssertEqualObjects(self.library, read, @"Saving and reading must result in equal objects");
}
@end
@@ -1,2 +0,0 @@
/* Localized versions of Info.plist keys */
+1 -1
View File
@@ -38,7 +38,7 @@ CG_EXTERN CGError CoreCursorCopyImages(CGSConnectionID cid, CGSCursorID cursorID
#pragma mark - Cursor APIs reversed by Alex Zielenski on Lion 10.7.3
#pragma mark -
CG_EXTERN CGError CGSIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
CG_EXTERN CGError CGSIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered) __attribute__((weak_import));
#if defined(MAC_OS_X_VERSION_10_8)
CG_EXTERN CGError CGSCopyRegisteredCursorImages(CGSConnectionID cid, char *cursorName, CGSize *imageSize, CGPoint *hotSpot, NSUInteger *frameCount, CGFloat *frameDuration, CFArrayRef *imageArray);
+3
View File
@@ -69,4 +69,7 @@ extern NSDictionary *capeWithIdentifier(NSString *identifier);
extern void CGImageWriteToFile(CGImageRef image, CFStringRef path);
extern NSData *pngDataForImage(id image);
extern NSString *MMGet();
extern CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered);
extern BOOL MCCursorIsPointer(NSString *identifier);
#endif
+32 -6
View File
@@ -109,17 +109,18 @@ NSDictionary *capeWithIdentifier(NSString *identifier) {
CFArrayRef representations;
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)identifier.UTF8String, &registered);
if (!registered)
return nil;
CGError error = 0;
if (![identifier hasPrefix:@"com.apple.cursor"]) {
CGSCopyRegisteredCursorImages(CGSMainConnectionID(), (char*)identifier.UTF8String, &size, &hotSpot, &frameCount, &frameDuration, &representations);
error = CGSCopyRegisteredCursorImages(CGSMainConnectionID(), (char*)identifier.UTF8String, &size, &hotSpot, &frameCount, &frameDuration, &representations);
} else {
CoreCursorCopyImages(CGSMainConnectionID(), [[identifier pathExtension] intValue], &representations, &size, &hotSpot, &frameCount, &frameDuration);
error = CoreCursorCopyImages(CGSMainConnectionID(), [[identifier pathExtension] intValue], &representations, &size, &hotSpot, &frameCount, &frameDuration);
}
if (!representations)
if (error || !representations || !CFArrayGetCount(representations))
return nil;
NSDictionary *dict = @{MCCursorDictionaryFrameCountKey: @(frameCount), MCCursorDictionaryFrameDuratiomKey: @(frameDuration), MCCursorDictionaryHotSpotXKey: @(hotSpot.x), MCCursorDictionaryHotSpotYKey: @(hotSpot.y), MCCursorDictionaryPointsWideKey: @(size.width), MCCursorDictionaryPointsHighKey: @(size.height), MCCursorDictionaryRepresentationsKey: (__bridge NSArray *)representations};
@@ -129,7 +130,7 @@ NSDictionary *capeWithIdentifier(NSString *identifier) {
return dict;
}
NSDictionary *cursorMap() {
extern NSDictionary *cursorMap() {
static NSDictionary *cursorNameMap = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
@@ -200,3 +201,28 @@ NSString *cursorIdentifierForName(NSString *name) {
return keys[0];
return UUID();
}
CGError MCIsCursorRegistered(CGSConnectionID cid, char *cursorName, bool *registered) {
if (CGSIsCursorRegistered != NULL) {
return CGSIsCursorRegistered(cid, cursorName, registered);
}
size_t size = 0;
CGError err = 0;
err = CGSGetRegisteredCursorDataSize(cid, cursorName, &size);
*registered = !((BOOL)err) && size > 0;
return err;
}
BOOL MCCursorIsPointer(NSString *identifier) {
static NSArray *pointers = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSDictionary *c = cursorMap();
pointers = [@[ [c allKeysForObject:@"Alias"][0], [c allKeysForObject:@"Arrow"][0], [c allKeysForObject:@"Busy"][0], [c allKeysForObject:@"Closed"][0], [c allKeysForObject:@"Copy Drag"][0], [c allKeysForObject:@"Counting Down"][0], [c allKeysForObject:@"Counting Up"][0], [c allKeysForObject:@"Counting Up/Down"][0], [c allKeysForObject:@"Ctx Menu"][0], [c allKeysForObject:@"Forbidden"][0], [c allKeysForObject:@"Link"][0], [c allKeysForObject:@"Move"][0], [c allKeysForObject:@"Open"][0], [c allKeysForObject:@"Pointing"][0], [c allKeysForObject:@"Poof"][0], [c allKeysForObject:@"Wait"][0], [c allKeysForObject:@"Zoom In"][0], [c allKeysForObject:@"Zoom Out"] ] retain];
});
return [pointers containsObject:identifier];
}
+2 -1
View File
@@ -15,10 +15,11 @@ extern NSString *MCPreferencesAppliedCursorKey;
extern NSString *MCPreferencesAppliedClickActionKey;
extern NSString *MCPreferencesCursorScaleKey;
extern NSString *MCPreferencesDoubleActionKey;
extern NSString *MCPreferencesHandednessKey;
extern NSString *MCSuppressDeleteLibraryConfirmationKey;
extern NSString *MCSuppressDeleteCursorConfirmationKey;
extern id MCDefaultFor(NSString *key, NSString *user, NSString *host);
#define MCDefault(key) MCDefaultFor(key, (__bridge NSString *)kCFPreferencesCurrentUser, (__bridge NSString *)kCFPreferencesCurrentHost)
extern id MCDefault(NSString *key);
#define MCFlag(key) [MCDefault(key) boolValue]
extern void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host);
+8 -3
View File
@@ -12,6 +12,7 @@ NSString *MCPreferencesAppliedCursorKey = @"MCAppliedCursor";
NSString *MCPreferencesAppliedClickActionKey = @"MCLibraryClickAction";
NSString *MCPreferencesCursorScaleKey = @"MCCursorScale";
NSString *MCPreferencesDoubleActionKey = @"MCDoubleAction";
NSString *MCPreferencesHandednessKey = @"MCHandedness";
NSString *MCSuppressDeleteLibraryConfirmationKey = @"MCSuppressDeleteLibraryConfirmationKey";
NSString *MCSuppressDeleteCursorConfirmationKey = @"MCSuppressDeleteCursorConfirmationKey";
id MCDefaultFor(NSString *key, NSString *user, NSString *host) {
@@ -19,8 +20,12 @@ id MCDefaultFor(NSString *key, NSString *user, NSString *host) {
return [value autorelease];
}
void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host) {
CFPreferencesSetValue((CFStringRef)key, (CFPropertyListRef)value, (CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
// CFPreferencesSynchronize((CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
id MCDefault(NSString *key) {
return [(id)CFPreferencesCopyAppValue((CFStringRef)key, (CFStringRef)kMCDomain) autorelease];
}
void MCSetDefaultFor(id value, NSString *key, NSString *user, NSString *host) {
CFPreferencesSetValue((CFStringRef)key, (CFPropertyListRef)value, (CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
// CFPreferencesSynchronize((CFStringRef)kMCDomain, (CFStringRef)user, (CFStringRef)host);
}
+1 -1
View File
@@ -10,7 +10,7 @@
#define Mousecape_apply_h
extern BOOL applyCursorForIdentifier(NSUInteger frameCount, CGFloat frameDuration, CGPoint hotSpot, CGSize size, NSArray *images, NSString *ident, NSUInteger repeatCount);
extern BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier);
extern BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier, BOOL restore);
extern BOOL applyCape(NSDictionary *dictionary);
extern BOOL applyCapeAtPath(NSString *path);
+64 -21
View File
@@ -35,10 +35,14 @@ BOOL applyCursorForIdentifier(NSUInteger frameCount, CGFloat frameDuration, CGPo
return (err == kCGErrorSuccess);
}
BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier) {
if (!cursor)
BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier, BOOL restore) {
if (!cursor || !identifier) {
NSLog(@"bad seed");
return NO;
}
BOOL lefty = MCFlag(MCPreferencesHandednessKey);
BOOL pointer = MCCursorIsPointer(identifier);
NSNumber *frameCount = cursor[MCCursorDictionaryFrameCountKey];
NSNumber *frameDuration = cursor[MCCursorDictionaryFrameDuratiomKey];
// NSNumber *repeatCount = cursor[MCCursorDictionaryRepeatCountKey];
@@ -48,27 +52,66 @@ BOOL applyCapeForIdentifier(NSDictionary *cursor, NSString *identifier) {
CGSize size = CGSizeMake([cursor[MCCursorDictionaryPointsWideKey] doubleValue],
[cursor[MCCursorDictionaryPointsHighKey] doubleValue]);
NSArray *reps = cursor[MCCursorDictionaryRepresentationsKey];
NSMutableArray *images = [NSMutableArray array];
if (lefty && !restore && pointer) {
MMLog("Lefty mode for %s", identifier.UTF8String);
hotSpot.x = size.width - hotSpot.x - 1;
}
for (id object in reps) {
CFTypeID type = CFGetTypeID((__bridge CFTypeRef)object);
// special case if array has a type of CGImage already there is no need to convert it
if (type == CGImageGetTypeID()) {
images[images.count] = object;
continue;
if (!lefty || restore || !pointer) {
// special case if array has a type of CGImage already there is no need to convert it
if (type == CGImageGetTypeID()) {
images[images.count] = object;
continue;
}
CFDataRef pngData = (__bridge CFDataRef)object;
CGDataProviderRef pngProvider = CGDataProviderCreateWithCFData(pngData);
CGImageRef rep = CGImageCreateWithPNGDataProvider(pngProvider, NULL, false, kCGRenderingIntentDefault);
CGDataProviderRelease(pngProvider);
images[images.count] = (__bridge id)rep;
CGImageRelease(rep);
} else {
NSBitmapImageRep *rep;
if (type == CGImageGetTypeID()) {
rep = [[NSBitmapImageRep alloc] initWithCGImage:(__bridge CGImageRef)object];
} else {
rep = [[NSBitmapImageRep alloc] initWithData:object];
}
NSBitmapImageRep *newRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:rep.pixelsWide
pixelsHigh:rep.pixelsHigh
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:4 * rep.pixelsWide
bitsPerPixel:32];
NSGraphicsContext *ctx = [NSGraphicsContext graphicsContextWithBitmapImageRep:newRep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:ctx];
NSAffineTransform *transform = [NSAffineTransform transform];
[transform translateXBy:rep.pixelsWide yBy:0];
[transform scaleXBy:-1 yBy:1];
[transform concat];
[rep drawInRect:NSMakeRect(0, 0, rep.pixelsWide, rep.pixelsHigh)
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:1.0
respectFlipped:NO
hints:nil];
[NSGraphicsContext restoreGraphicsState];
images[images.count] = (__bridge id)[newRep CGImage];
}
CFDataRef pngData = (__bridge CFDataRef)object;
CGDataProviderRef pngProvider = CGDataProviderCreateWithCFData(pngData);
CGImageRef rep = CGImageCreateWithPNGDataProvider(pngProvider, NULL, false, kCGRenderingIntentDefault);
CGDataProviderRelease(pngProvider);
images[images.count] = (__bridge id)rep;
CGImageRelease(rep);
}
return applyCursorForIdentifier(frameCount.unsignedIntegerValue, frameDuration.doubleValue, hotSpot, size, images, identifier, 0);
@@ -89,7 +132,7 @@ BOOL applyCape(NSDictionary *dictionary) {
NSDictionary *cape = cursors[key];
MMLog("Hooking for %s", key.UTF8String);
BOOL success = applyCapeForIdentifier(cape, key);
BOOL success = applyCapeForIdentifier(cape, key, NO);
if (!success) {
MMLog(BOLD RED "Failed to hook identifier %s for some unknown reason. Bailing out..." RESET, key.UTF8String);
return NO;
+7 -7
View File
@@ -15,31 +15,31 @@ NSString *backupStringForIdentifier(NSString *identifier) {
void backupCursorForIdentifier(NSString *ident) {
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
// dont try to backup a nonexistant cursor
// dont try to backup a nonexistant cursor
if (!registered)
return;
NSString *backupIdent = backupStringForIdentifier(ident);
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)backupIdent.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)backupIdent.UTF8String, &registered);
// don't re-back it up
// don't re-back it up
if (registered)
return;
NSDictionary *cape = capeWithIdentifier(ident);
(void)applyCapeForIdentifier(cape, backupIdent);
(void)applyCapeForIdentifier(cape, backupIdent, YES);
}
void backupAllCursors() {
bool arrowRegistered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)backupStringForIdentifier(@"com.apple.coregraphics.Arrow").UTF8String, &arrowRegistered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)backupStringForIdentifier(@"com.apple.coregraphics.Arrow").UTF8String, &arrowRegistered);
if (arrowRegistered) {
MMLog("Skipping backup, backup already exists");
// we are already backed up
// we are already backed up
return;
}
// Backup main cursors first
+4 -1
View File
@@ -11,9 +11,12 @@
extern NSError *createCape(NSString *input, NSString *output, BOOL convert);
extern NSDictionary *processedCapeWithIdentifier(NSString *identifier);
extern void dumpCursorsToFile(NSString *path);
extern BOOL dumpCursorsToFile(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total));
extern BOOL dumpCursorsToFolder(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total));
extern NSDictionary *createCapeFromDirectory(NSString *path);
extern NSDictionary *createCapeFromMightyMouse(NSDictionary *mightyMouse, NSDictionary *metadata);
extern void exportCape(NSDictionary *cape, NSString *destination);
#endif
+99 -5
View File
@@ -253,7 +253,7 @@ NSDictionary *processedCapeWithIdentifier(NSString *identifier) {
return dict;
}
void dumpCursorsToFile(NSString *path) {
BOOL dumpCursorsToFile(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total)) {
MMLog("Dumping cursors...");
float originalScale;
@@ -261,17 +261,34 @@ void dumpCursorsToFile(NSString *path) {
CGSSetCursorScale(CGSMainConnectionID(), 16.0);
CGSHideCursor(CGSMainConnectionID());
NSInteger total = 9 + 45;
NSInteger current = 0;
NSMutableDictionary *cursors = [NSMutableDictionary dictionary];
NSUInteger i = 0;
NSString *key = nil;
while ((key = defaultCursors[i]) != nil) {
if (progress) {
current = i;
if (!progress(current, total)) {
return NO;
}
}
MMLog("Gathering data for %s", key.UTF8String);
cursors[key] = processedCapeWithIdentifier(key);
i++;
}
for (int x = 0x0; x < 0x100; x++) {
for (int x = 0; x < 45; x++) {
if (progress) {
current = i + x;
if (!progress(current, total)) {
return NO;
}
}
NSString *key = [@"com.apple.cursor." stringByAppendingFormat:@"%d", x];
CoreCursorSet(CGSMainConnectionID(), x);
@@ -283,7 +300,11 @@ void dumpCursorsToFile(NSString *path) {
cursors[key] = cape;
}
if (progress) {
progress(total, total);
}
NSMutableDictionary *cape = [NSMutableDictionary dictionary];
cape[MCCursorDictionaryAuthorKey] = @"Apple, Inc.";
cape[MCCursorDictionaryCapeNameKey] = @"Cursor Dump";
@@ -298,5 +319,78 @@ void dumpCursorsToFile(NSString *path) {
CGSSetCursorScale(CGSMainConnectionID(), originalScale);
CGSShowCursor(CGSMainConnectionID());
[cape writeToFile:path atomically:NO];
return [cape writeToFile:path atomically:NO];
}
BOOL dumpCursorsToFolder(NSString *path, BOOL (^progress)(NSUInteger current, NSUInteger total)) {
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
MMLog("Dumping cursors...");
float originalScale;
CGSGetCursorScale(CGSMainConnectionID(), &originalScale);
CGSSetCursorScale(CGSMainConnectionID(), 16.0);
CGSHideCursor(CGSMainConnectionID());
NSInteger total = 9 + 45;
NSInteger current = 0;
NSUInteger i = 0;
NSString *key = nil;
while ((key = defaultCursors[i]) != nil) {
current = i;
if (progress) {
if (!progress(current, total)) {
return NO;
}
}
MMLog("Gathering data for %s", key.UTF8String);
NSDictionary *cape = processedCapeWithIdentifier(key);
[[cape[MCCursorDictionaryRepresentationsKey] lastObject] writeToFile:[[path stringByAppendingPathComponent:key] stringByAppendingPathExtension:@"png"] atomically: NO];
i++;
}
for (int x = 0; x < 45; x++) {
current = i + x;
if (progress) {
if (!progress(current, total)) {
return NO;
}
}
NSString *key = [@"com.apple.cursor." stringByAppendingFormat:@"%d", x];
CoreCursorSet(CGSMainConnectionID(), x);
NSDictionary *cape = processedCapeWithIdentifier(key);
if (!cape)
continue;
MMLog("Gathering data for %s", key.UTF8String);
[[cape[MCCursorDictionaryRepresentationsKey] lastObject] writeToFile:[[path stringByAppendingPathComponent:key] stringByAppendingPathExtension:@"png"] atomically:NO];
}
if (progress) {
progress(total, total);
}
CGSSetCursorScale(CGSMainConnectionID(), originalScale);
CGSShowCursor(CGSMainConnectionID());
return YES;
}
extern void exportCape(NSDictionary *cape, NSString *destination) {
NSFileManager *manager = [NSFileManager defaultManager];
[manager createDirectoryAtPath:destination withIntermediateDirectories:YES attributes:nil error:nil];
NSDictionary *cursors = cape[MCCursorDictionaryCursorsKey];
for (NSString *key in cursors) {
NSArray *reps = cursors[key][MCCursorDictionaryRepresentationsKey];
for (NSUInteger idx = 0; idx < reps.count; idx++) {
NSData *data = reps[idx];
[data writeToFile:[destination stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_%lu.png", key, (unsigned long)idx]] atomically:NO];
}
}
}
+19 -3
View File
@@ -22,7 +22,7 @@
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
@autoreleasepool {
GBSettings *settings = [GBSettings settingsWithName:@"mousecape" parent:nil];
GBOptionsHelper *options = [[[GBOptionsHelper alloc] init] autorelease];
@@ -57,8 +57,9 @@ int main(int argc, char * argv[]) {
[options registerSeparator:@(BOLD "CONVERTING MIGHTYMOUSE TO CAPE" RESET)];
[options registerOption:'x' long:@"convert" description:@"Convert a .MightyMouse file to cape. Default output is to a new file of the same name" flags:GBValueRequired];
[options registerSeparator:@(BOLD "MISCELLANEOUS" RESET)];
[options registerOption:'e' long:@"export" description:@"Export a cape to a directory" flags:GBValueRequired];
[options registerOption:'?' long:@"help" description:@"Display this help and exit" flags:GBValueNone];
[options registerOption:'o' long:@"output" description:@"Use this option to tell where an output file goes. (For convert and create)" flags:GBValueRequired];
[options registerOption:'o' long:@"output" description:@"Use this option to tell where an output file goes. (For convert, create, and export)" flags:GBValueRequired];
[options registerOption:0 long:@"suppressCopyright" description:@"Suppress Copyright info" flags:GBValueNone | GBOptionNoHelp | GBOptionNoPrint];
[options registerOption:'s' long:@"scale" description:@"Scale the cursor to obscene multipliers or get the current scale" flags:GBValueOptional];
[options registerOption:0 long:@"listen" description:@"Keep mousecloak alive to apply the current Cape every user switch" flags:GBValueNone | GBOptionNoHelp | GBOptionNoPrint];
@@ -113,6 +114,7 @@ int main(int argc, char * argv[]) {
BOOL dump = [settings isKeyPresentAtThisLevel:@"dump"];
BOOL scale = [settings isKeyPresentAtThisLevel:@"scale"];
BOOL listen = [settings isKeyPresentAtThisLevel:@"listen"];
BOOL export = [settings isKeyPresentAtThisLevel:@"export"];
int amt = 0;
if (convert) amt++;
@@ -121,6 +123,7 @@ int main(int argc, char * argv[]) {
if (dump) amt++;
if (scale) amt++;
if (listen) amt++;
if (export) amt++;
if (amt > 1) {
MMLog(BOLD RED "One command at a time, son!" RESET);
@@ -147,8 +150,21 @@ int main(int argc, char * argv[]) {
}
goto fin;
} else if (export) {
NSString *input = [settings objectForKey:@"export"];
NSString *output = [settings isKeyPresentAtThisLevel:@"output"] ? [settings objectForKey:@"output"] : nil;
if (!output) {
MMLog(BOLD RED "You must specify an output directory with -o!" RESET);
} else {
exportCape([NSDictionary dictionaryWithContentsOfFile:input], output);
}
goto fin;
} else if (dump) {
dumpCursorsToFile([settings objectForKey:@"dump"]);
dumpCursorsToFile([settings objectForKey:@"dump"], ^BOOL (NSUInteger progress, NSUInteger total) {
MMLog("Dumped %lu of %lu", (unsigned long)progress, (unsigned long)total);
return YES;
});
} else if (scale) {
NSNumber *number = [settings objectForKey:@"scale"];
+4 -4
View File
@@ -16,16 +16,16 @@ NSString *restoreStringForIdentifier(NSString *identifier) {
void restoreCursorForIdentifier(NSString *ident) {
bool registered = false;
CGSIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
MCIsCursorRegistered(CGSMainConnectionID(), (char *)ident.UTF8String, &registered);
NSString *restoreIdent = restoreStringForIdentifier(ident);
NSDictionary *cape = capeWithIdentifier(ident);
MMLog("Restoring cursor %s from %s", restoreIdent.UTF8String, ident.UTF8String);
if (cape && registered) {
applyCapeForIdentifier(cape, restoreIdent);
applyCapeForIdentifier(cape, restoreIdent, YES);
}
CGSRemoveRegisteredCursor(CGSMainConnectionID(), (char *)ident.UTF8String, false);
}
@@ -6,17 +6,27 @@
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.alexzielenski.${PRODUCT_NAME:rfc1034identifier}</string>
<string>${PRODUCT_NAME}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>LSUIElement</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Alex Zielenski. All rights reserved.</string>
</dict>
</plist>
+17
View File
@@ -0,0 +1,17 @@
//
// main.m
// Mousecape
//
// Created by Alexander Zielenski on 6/18/14.
// Copyright (c) 2014 Alex Zielenski. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "listen.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
listener();
return EXIT_SUCCESS;
}
}
+5 -1
View File
@@ -19,13 +19,17 @@ There is an example cape file included in this Git Repo located [here for downlo
You can create a new cape document in the Mousecape app by hitting &#8984;N (Command-N) and editing it with &#8984;E. Click the "+" button to add cursors to customize and symply drag your images into the fields provided.
## How do animated cursors work?
When you want to animate a cursor, change the value in the frames field in the edit window and make sure frame duration is how you want it. Next, create an image that has all of your cursor frames stacked on top of each other vertically. Mousecape will traverse down the image for each frame, using a box the same size as whatever you put in the size field.
## How can I say thanks?
Tell your friends.
## Where can I get a copy of this sweet tool?
In the [releases section](https://github.com/alexzielenski/Mousecape/releases) of this GitHub page. There are stable reases there. **The current version is 0.0.2**.
In the [releases section](https://github.com/alexzielenski/Mousecape/releases) of this GitHub page. There are stable reases there. **The current version is 0.0.5**.
## LICENSE
+32
View File
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Mousecape Changelog</title>
<link>https://raw.githubusercontent.com/alexzielenski/Mousecape/master/appcast.xml</link>
<description>Most recent changes with links to updates.</description>
<language>en</language>
<item>
<title>Version 0.0.5</title>
<description>
<![CDATA[
<ul>
<li>New information in read me on how to animate cursors</li>
<li>[New] Ability to export cursors by holding the alt key when dragging from the edit window</li>
<li>[New] Ability to dump currently applied cursors from Capes menu</li>
<li>[Fix] Checking for existing identifiers already in library</li>
<li>[Fix] Inaccurate hotspot dot in edit window</li>
<li>[New] First image dragged in to edit window drop zone defines the cursor size</li>
<li>[New] Drag in multiple images of the same size to animate</li>
<li>[New] Holt alt key while dragging a cursor image in to add it as a frame</li>
<li>[Fix] Adding a cursor to the library by opening it without the app open</li>
<li>[Fix] Identifier renames not being saved</li>
<li>[New] Sort cursors within a cape by name in library window</li>
<li>[New] Preference for left-handed users that flips all pointer images</li>
</ul>
]]>
</description>
<pubDate>Sat, 26 Jul 2014 15:20:11 +0000</pubDate>
<enclosure url="https://github.com/alexzielenski/Mousecape/releases/download/0.0.5/Mousecape.zip" sparkle:version="1579" sparkle:shortVersionString="0.0.5" length="269044" type="application/octet-stream" />
</item>
</channel>
</rss>