diff --git a/Clocker.xcodeproj/project.pbxproj b/Clocker.xcodeproj/project.pbxproj index 1d81ea3..1e709c7 100755 --- a/Clocker.xcodeproj/project.pbxproj +++ b/Clocker.xcodeproj/project.pbxproj @@ -46,6 +46,7 @@ 9A5E6BAB1CAF8DFA006E7C5C /* iRate.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 9A5E6BAA1CAF8DFA006E7C5C /* iRate.bundle */; }; 9A63620A1C432F68004AD010 /* CLAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A6362091C432F68004AD010 /* CLAPI.m */; }; 9A79E9901CB34B6800BA7916 /* CLParentPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A79E98F1CB34B6800BA7916 /* CLParentPanelController.m */; }; + 9A82F3441CDFF8F600CC8906 /* pop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A82F33B1CDFF8CF00CC8906 /* pop.framework */; }; 9A8605AE1BEC148400A810A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605AD1BEC148400A810A4 /* main.m */; }; 9A8605B61BEC14BE00A810A4 /* MenubarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B41BEC14BE00A810A4 /* MenubarController.m */; }; 9A8605B71BEC14BE00A810A4 /* ApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B51BEC14BE00A810A4 /* ApplicationDelegate.m */; }; @@ -53,6 +54,11 @@ 9A8605BB1BEC14DC00A810A4 /* PanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605B91BEC14DC00A810A4 /* PanelController.m */; }; 9A8605BF1BEC14F600A810A4 /* BackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605BC1BEC14F600A810A4 /* BackgroundView.m */; }; 9A8605C01BEC14F600A810A4 /* Panel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A8605BD1BEC14F600A810A4 /* Panel.m */; }; + 9A86E2B41CE0351C00547EE7 /* EDSunriseSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A86E2B31CE0351C00547EE7 /* EDSunriseSet.m */; }; + 9A86E2C11CE04F4300547EE7 /* ShortcutRecorder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A86E2BC1CE04F1600547EE7 /* ShortcutRecorder.framework */; }; + 9A86E2C21CE04F4A00547EE7 /* PTHotKey.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A86E2BE1CE04F1600547EE7 /* PTHotKey.framework */; }; + 9A86E2C41CE04F7B00547EE7 /* ShortcutRecorder.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9A86E2BC1CE04F1600547EE7 /* ShortcutRecorder.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9A86E2C51CE04F7B00547EE7 /* PTHotKey.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9A86E2BE1CE04F1600547EE7 /* PTHotKey.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9A87DAC41C358FA800A8CF3B /* DateTools.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 9A87DAB41C358FA800A8CF3B /* DateTools.bundle */; }; 9A87DAC51C358FA800A8CF3B /* DTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A87DAB71C358FA800A8CF3B /* DTConstants.m */; }; 9A87DAC61C358FA800A8CF3B /* DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A87DAB91C358FA800A8CF3B /* DTError.m */; }; @@ -73,6 +79,8 @@ 9ABFB3801CA6882000E10745 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9ABFB37F1CA6882000E10745 /* ApplicationServices.framework */; }; 9AC678E41C1ABAB9003B4F6B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AC678E31C1ABAB9003B4F6B /* QuartzCore.framework */; }; 9ACE03EF1CB0ADE00039FC01 /* Firebase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9ACE03EE1CB0ADE00039FC01 /* Firebase.framework */; }; + 9AD6DE571CE114DA007A8401 /* CLScaleUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6DE561CE114DA007A8401 /* CLScaleUpButton.m */; }; + 9AD6DE651CE18EB4007A8401 /* CLArrowIndicators.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD6DE641CE18EB4007A8401 /* CLArrowIndicators.m */; }; 9AF9A16B1C250AB300EE7C2A /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AF9A16A1C250AB300EE7C2A /* Reachability.m */; }; DD4F7C0913C30F9F00825C6E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD4F7C0813C30F9F00825C6E /* Cocoa.framework */; }; /* End PBXBuildFile section */ @@ -85,6 +93,76 @@ remoteGlobalIDString = 9A20A0551C4E801500FB45AB; remoteInfo = "Clocker-Helper"; }; + 9A82F3361CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EC191218162FB53A00E0CC76; + remoteInfo = "pop-ios-static"; + }; + 9A82F3381CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0B6BE74819FFD3B900762101; + remoteInfo = "pop-ios-framework"; + }; + 9A82F33A1CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EC68857F18C7B60000C6194C; + remoteInfo = "pop-osx-framework"; + }; + 9A82F33C1CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0755AE4F1BEA15950094AB41; + remoteInfo = "pop-tvos-framework"; + }; + 9A82F33E1CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ECF01ED318C92B7F009E0AD1; + remoteInfo = "pop-tests-ios"; + }; + 9A82F3401CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EC7E319918C93D6500B38170; + remoteInfo = "pop-tests-osx"; + }; + 9A82F3421CDFF8CF00CC8906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0755AE8C1BEA19580094AB41; + remoteInfo = "pop-tests-tvos"; + }; + 9A86E2BB1CE04F1600547EE7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 939837800DA42965007F53F3; + remoteInfo = ShortcutRecorder.framework; + }; + 9A86E2BD1CE04F1600547EE7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = E273122E1349EC9000A84433; + remoteInfo = PTHotKey.framework; + }; + 9A86E2BF1CE04F1600547EE7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 0D6B2468180304DE00CE1142; + remoteInfo = Demo; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -98,6 +176,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9A86E2C31CE04F7100547EE7 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 9A86E2C41CE04F7B00547EE7 /* ShortcutRecorder.framework in CopyFiles */, + 9A86E2C51CE04F7B00547EE7 /* PTHotKey.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -186,6 +275,7 @@ 9A76543D1CDC2291000FB825 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hant"; path = "zh-Hant.lproj/CLFloatingWindow.xib"; sourceTree = ""; }; 9A79E98E1CB34B6800BA7916 /* CLParentPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CLParentPanelController.h; path = Clocker/CLParentPanelController.h; sourceTree = ""; }; 9A79E98F1CB34B6800BA7916 /* CLParentPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CLParentPanelController.m; path = Clocker/CLParentPanelController.m; sourceTree = ""; }; + 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = pop.xcodeproj; path = Clocker/pop/pop.xcodeproj; sourceTree = ""; }; 9A8605AD1BEC148400A810A4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Clocker/main.m; sourceTree = ""; }; 9A8605B41BEC14BE00A810A4 /* MenubarController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MenubarController.m; path = Clocker/MenubarController.m; sourceTree = ""; }; 9A8605B51BEC14BE00A810A4 /* ApplicationDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ApplicationDelegate.m; path = Clocker/ApplicationDelegate.m; sourceTree = ""; }; @@ -201,6 +291,9 @@ 9A8605C91BEC155B00A810A4 /* MenubarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenubarController.h; path = Clocker/MenubarController.h; sourceTree = ""; }; 9A8605CA1BEC155B00A810A4 /* ApplicationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ApplicationDelegate.h; path = Clocker/ApplicationDelegate.h; sourceTree = ""; }; 9A8605CC1BEC155B00A810A4 /* Clocker-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Clocker-Prefix.pch"; path = "Clocker/Clocker-Prefix.pch"; sourceTree = ""; }; + 9A86E2B21CE0351C00547EE7 /* EDSunriseSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EDSunriseSet.h; path = Clocker/EDSunriseSet.h; sourceTree = ""; }; + 9A86E2B31CE0351C00547EE7 /* EDSunriseSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EDSunriseSet.m; path = Clocker/EDSunriseSet.m; sourceTree = ""; }; + 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ShortcutRecorder.xcodeproj; path = "Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj"; sourceTree = ""; }; 9A87DAB41C358FA800A8CF3B /* DateTools.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = DateTools.bundle; path = "Clocker/Date Tools/DateTools-master/DateTools/DateTools.bundle"; sourceTree = ""; }; 9A87DAB51C358FA800A8CF3B /* DateTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DateTools.h; path = "Clocker/Date Tools/DateTools-master/DateTools/DateTools.h"; sourceTree = ""; }; 9A87DAB61C358FA800A8CF3B /* DTConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DTConstants.h; path = "Clocker/Date Tools/DateTools-master/DateTools/DTConstants.h"; sourceTree = ""; }; @@ -237,6 +330,10 @@ 9ABFB37F1CA6882000E10745 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; }; 9AC678E31C1ABAB9003B4F6B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 9ACE03EE1CB0ADE00039FC01 /* Firebase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Firebase.framework; path = Frameworks/Firebase.framework; sourceTree = ""; }; + 9AD6DE551CE114DA007A8401 /* CLScaleUpButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CLScaleUpButton.h; path = Clocker/CLScaleUpButton.h; sourceTree = ""; }; + 9AD6DE561CE114DA007A8401 /* CLScaleUpButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CLScaleUpButton.m; path = Clocker/CLScaleUpButton.m; sourceTree = ""; }; + 9AD6DE631CE18EB4007A8401 /* CLArrowIndicators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CLArrowIndicators.h; path = Clocker/CLArrowIndicators.h; sourceTree = ""; }; + 9AD6DE641CE18EB4007A8401 /* CLArrowIndicators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CLArrowIndicators.m; path = Clocker/CLArrowIndicators.m; sourceTree = ""; }; 9AF9A1691C250AB300EE7C2A /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = Clocker/Reachability/Reachability.h; sourceTree = ""; }; 9AF9A16A1C250AB300EE7C2A /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = Clocker/Reachability/Reachability.m; sourceTree = ""; }; DD4F7C0413C30F9F00825C6E /* Clocker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Clocker.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -249,6 +346,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9A86E2C21CE04F4A00547EE7 /* PTHotKey.framework in Frameworks */, + 9A86E2C11CE04F4300547EE7 /* ShortcutRecorder.framework in Frameworks */, + 9A82F3441CDFF8F600CC8906 /* pop.framework in Frameworks */, 9A9E876A1C1FEDDB00A7A2DF /* SystemConfiguration.framework in Frameworks */, 9A9E87621C1FEDB500A7A2DF /* CFNetwork.framework in Frameworks */, 9A5E6BA01CAF71C1006E7C5C /* libicucore.tbd in Frameworks */, @@ -274,6 +374,8 @@ 9A2000C61BFBCEF6002BFDE8 /* Utilties */ = { isa = PBXGroup; children = ( + 9A86E2B21CE0351C00547EE7 /* EDSunriseSet.h */, + 9A86E2B31CE0351C00547EE7 /* EDSunriseSet.m */, 9A5951BB1C1D0A8D009C17AA /* CommonStrings.m */, 9A5951BC1C1D0A8D009C17AA /* CommonStrings.h */, 9A6362081C432F68004AD010 /* CLAPI.h */, @@ -284,6 +386,10 @@ 9A10C6871CDAAB3000D474F1 /* CLPausableTimer.m */, 9A10C68D1CDAC8B500D474F1 /* CLPanelTextField.h */, 9A10C68E1CDAC8B500D474F1 /* CLPanelTextField.m */, + 9AD6DE551CE114DA007A8401 /* CLScaleUpButton.h */, + 9AD6DE561CE114DA007A8401 /* CLScaleUpButton.m */, + 9AD6DE631CE18EB4007A8401 /* CLArrowIndicators.h */, + 9AD6DE641CE18EB4007A8401 /* CLArrowIndicators.m */, ); name = Utilties; sourceTree = ""; @@ -349,6 +455,20 @@ name = Firebase; sourceTree = ""; }; + 9A82F32C1CDFF8CE00CC8906 /* Products */ = { + isa = PBXGroup; + children = ( + 9A82F3371CDFF8CF00CC8906 /* libpop.a */, + 9A82F3391CDFF8CF00CC8906 /* pop.framework */, + 9A82F33B1CDFF8CF00CC8906 /* pop.framework */, + 9A82F33D1CDFF8CF00CC8906 /* pop.framework */, + 9A82F33F1CDFF8CF00CC8906 /* pop-tests.xctest */, + 9A82F3411CDFF8CF00CC8906 /* pop-tests.xctest */, + 9A82F3431CDFF8CF00CC8906 /* pop-tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; 9A8605E01BEC15F400A810A4 /* XIB */ = { isa = PBXGroup; children = ( @@ -424,6 +544,16 @@ name = Controllers; sourceTree = ""; }; + 9A86E2B61CE04F1600547EE7 /* Products */ = { + isa = PBXGroup; + children = ( + 9A86E2BC1CE04F1600547EE7 /* ShortcutRecorder.framework */, + 9A86E2BE1CE04F1600547EE7 /* PTHotKey.framework */, + 9A86E2C01CE04F1600547EE7 /* Demo.app */, + ); + name = Products; + sourceTree = ""; + }; 9A87DA4F1C358F8200A8CF3B /* Date Tools */ = { isa = PBXGroup; children = ( @@ -468,6 +598,7 @@ DD4F7BF913C30F9F00825C6E = { isa = PBXGroup; children = ( + 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */, 9A5E6B9C1CAF7174006E7C5C /* Firebase */, 9A87DA4F1C358F8200A8CF3B /* Date Tools */, 9ABF586F1C29A7EB00BD0187 /* Model */, @@ -486,6 +617,7 @@ 9A5951FB1C1D5222009C17AA /* Check for Updated Version */, DD4F7C0513C30F9F00825C6E /* Products */, 9A25F7481C1A5E21007D369B /* Rate */, + 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */, 9A20A0691C4E801500FB45AB /* Clocker-Helper.xcodeproj */, ); sourceTree = ""; @@ -536,6 +668,7 @@ DD4F7C0213C30F9F00825C6E /* Resources */, 9A4379201BEC220200F4E27F /* ShellScript */, 9A20A0711C4E808500FB45AB /* CopyFiles */, + 9A86E2C31CE04F7100547EE7 /* CopyFiles */, ); buildRules = ( ); @@ -553,6 +686,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = CL; + LastSwiftUpdateCheck = 0720; LastUpgradeCheck = 0700; TargetAttributes = { DD4F7C0313C30F9F00825C6E = { @@ -586,6 +720,14 @@ ProductGroup = 9A20A06A1C4E801500FB45AB /* Products */; ProjectRef = 9A20A0691C4E801500FB45AB /* Clocker-Helper.xcodeproj */; }, + { + ProductGroup = 9A82F32C1CDFF8CE00CC8906 /* Products */; + ProjectRef = 9A82F32B1CDFF8CE00CC8906 /* pop.xcodeproj */; + }, + { + ProductGroup = 9A86E2B61CE04F1600547EE7 /* Products */; + ProjectRef = 9A86E2B51CE04F1600547EE7 /* ShortcutRecorder.xcodeproj */; + }, ); projectRoot = ""; targets = ( @@ -602,6 +744,76 @@ remoteRef = 9A20A06D1C4E801600FB45AB /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A82F3371CDFF8CF00CC8906 /* libpop.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libpop.a; + remoteRef = 9A82F3361CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F3391CDFF8CF00CC8906 /* pop.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = pop.framework; + remoteRef = 9A82F3381CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F33B1CDFF8CF00CC8906 /* pop.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = pop.framework; + remoteRef = 9A82F33A1CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F33D1CDFF8CF00CC8906 /* pop.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = pop.framework; + remoteRef = 9A82F33C1CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F33F1CDFF8CF00CC8906 /* pop-tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "pop-tests.xctest"; + remoteRef = 9A82F33E1CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F3411CDFF8CF00CC8906 /* pop-tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "pop-tests.xctest"; + remoteRef = 9A82F3401CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A82F3431CDFF8CF00CC8906 /* pop-tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "pop-tests.xctest"; + remoteRef = 9A82F3421CDFF8CF00CC8906 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A86E2BC1CE04F1600547EE7 /* ShortcutRecorder.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = ShortcutRecorder.framework; + remoteRef = 9A86E2BB1CE04F1600547EE7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A86E2BE1CE04F1600547EE7 /* PTHotKey.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PTHotKey.framework; + remoteRef = 9A86E2BD1CE04F1600547EE7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 9A86E2C01CE04F1600547EE7 /* Demo.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = Demo.app; + remoteRef = 9A86E2BF1CE04F1600547EE7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -668,9 +880,11 @@ 9A87DACA1C358FA800A8CF3B /* DTTimePeriodGroup.m in Sources */, 9A25F7471C1A5E17007D369B /* iRate.m in Sources */, 9A8605C01BEC14F600A810A4 /* Panel.m in Sources */, + 9AD6DE651CE18EB4007A8401 /* CLArrowIndicators.m in Sources */, 9A8605BA1BEC14DC00A810A4 /* StatusItemView.m in Sources */, 9A87DAC91C358FA800A8CF3B /* DTTimePeriodCollection.m in Sources */, 9A3247391C263F4F00CF6B6E /* CLAppearanceViewController.m in Sources */, + 9A86E2B41CE0351C00547EE7 /* EDSunriseSet.m in Sources */, 9ABA2B031C671D49009DC0EF /* CLMainWindowController.m in Sources */, 9A9E63861C2C673E009A299B /* CLAppFeedbackWindowController.m in Sources */, 9A8605BB1BEC14DC00A810A4 /* PanelController.m in Sources */, @@ -681,6 +895,7 @@ 9A20A07E1C4EAAEB00FB45AB /* CLIntroViewController.m in Sources */, 9A8605B71BEC14BE00A810A4 /* ApplicationDelegate.m in Sources */, 9A10C6881CDAAB3000D474F1 /* CLPausableTimer.m in Sources */, + 9AD6DE571CE114DA007A8401 /* CLScaleUpButton.m in Sources */, 9A5951F51C1D3D81009C17AA /* CLTimezoneCellView.m in Sources */, 9ABF58721C29A80600BD0187 /* CLTimezoneData.m in Sources */, 9A8605AE1BEC148400A810A4 /* main.m in Sources */, @@ -852,6 +1067,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = Clocker/Clocker.entitlements; CODE_SIGN_IDENTITY = ""; @@ -873,6 +1089,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; PRODUCT_NAME = Clocker; PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Clocker-Bridging-Header.h"; WRAPPER_EXTENSION = app; }; name = Distribution; @@ -953,6 +1170,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = Clocker/Clocker.entitlements; CODE_SIGN_IDENTITY = ""; @@ -976,6 +1194,8 @@ PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; PRODUCT_NAME = Clocker; PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Clocker-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -984,6 +1204,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_ENTITLEMENTS = Clocker/Clocker.entitlements; CODE_SIGN_IDENTITY = ""; @@ -1005,6 +1226,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker; PRODUCT_NAME = Clocker; PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = "Clocker-Bridging-Header.h"; WRAPPER_EXTENSION = app; }; name = Release; diff --git a/Clocker.xcodeproj/project.xcworkspace/xcshareddata/Clocker.xcscmblueprint b/Clocker.xcodeproj/project.xcworkspace/xcshareddata/Clocker.xcscmblueprint new file mode 100644 index 0000000..076dd6f --- /dev/null +++ b/Clocker.xcodeproj/project.xcworkspace/xcshareddata/Clocker.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "79BC31FA35C73FAE9D63749994DC7D1D9E35A66B", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "79BC31FA35C73FAE9D63749994DC7D1D9E35A66B" : 0, + "F2FE0AAE95F0B87896F2BEE0B176D4FC32D691A3" : 0 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "FE3C46F0-59C9-4F38-8281-63F46BD16224", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "79BC31FA35C73FAE9D63749994DC7D1D9E35A66B" : "Clocker\/", + "F2FE0AAE95F0B87896F2BEE0B176D4FC32D691A3" : "Clocker\/Clocker\/pop\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "Clocker", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Clocker.xcodeproj", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Abhishaker17\/Clocker.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "79BC31FA35C73FAE9D63749994DC7D1D9E35A66B" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/facebook\/pop.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "F2FE0AAE95F0B87896F2BEE0B176D4FC32D691A3" + } + ] +} \ No newline at end of file diff --git a/Clocker.xcodeproj/project.xcworkspace/xcuserdata/abhishekbanthia.xcuserdatad/UserInterfaceState.xcuserstate b/Clocker.xcodeproj/project.xcworkspace/xcuserdata/abhishekbanthia.xcuserdatad/UserInterfaceState.xcuserstate index b6e7177..34a6950 100644 Binary files a/Clocker.xcodeproj/project.xcworkspace/xcuserdata/abhishekbanthia.xcuserdatad/UserInterfaceState.xcuserstate and b/Clocker.xcodeproj/project.xcworkspace/xcuserdata/abhishekbanthia.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Clocker.xcodeproj/xcuserdata/abhishekbanthia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Clocker.xcodeproj/xcuserdata/abhishekbanthia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 508ac5c..fe2b454 100644 --- a/Clocker.xcodeproj/xcuserdata/abhishekbanthia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Clocker.xcodeproj/xcuserdata/abhishekbanthia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,72 +2,4 @@ - - - - - -<<<<<<< HEAD - - - - - - - - - - - - - - - - -======= ->>>>>>> master - diff --git a/Clocker/ShortcutRecorder-master/.gitignore b/Clocker/ShortcutRecorder-master/.gitignore new file mode 100755 index 0000000..5883e90 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/.gitignore @@ -0,0 +1,18 @@ +# Xcode +build/* +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +*.xcworkspace +!default.xcworkspace +xcuserdata +profile +*.moved-aside + +## Ignore incredibly annoying .DS_Store files +.DS_Store diff --git a/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.h b/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.h new file mode 100755 index 0000000..9e04d1b --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.h @@ -0,0 +1,28 @@ +// +// IKAppDelegate.h +// ShortcutRecorderDemo +// +// Created by ILya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import + + +@interface IKAppDelegate : NSObject + +@property (assign) IBOutlet NSWindow *window; + +@property (assign) IBOutlet NSButton *pingButton; + +@property (assign) IBOutlet NSMenuItem *pingItem; + +- (IBAction)showIBAutoLayout:(id)aSender; + +- (IBAction)showCodeAutoLayout:(id)aSender; + +- (IBAction)showAutoresizingMasks:(id)aSender; + +- (IBAction)ping:(id)aSender; + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.m b/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.m new file mode 100755 index 0000000..14d952d --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKAppDelegate.m @@ -0,0 +1,130 @@ +// +// IKAppDelegate.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import +#import +#import "IKAppDelegate.h" +#import "IKIBAutoLayoutWindowController.h" +#import "IKCodeAutoLayoutWindowController.h" +#import "IKIBAutoresizingMasksWindowController.h" + + +@implementation IKAppDelegate +{ + IKIBAutoLayoutWindowController *_ibAutoLayoutWindowController; + IKCodeAutoLayoutWindowController *_codeAutoLayoutWindowController; + IKIBAutoresizingMasksWindowController *_ibAutoresizingMasksWindowController; +} + +- (void)dealloc +{ + [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.globalPing"]; +} + +#pragma mark Methods + +- (IBAction)showIBAutoLayout:(id)aSender +{ + if (!_ibAutoLayoutWindowController) + _ibAutoLayoutWindowController = [[IKIBAutoLayoutWindowController alloc] initWithWindowNibName:@"IKIBAutoLayoutWindowController"]; + + [_ibAutoLayoutWindowController showWindow:aSender]; +} + +- (void)showCodeAutoLayout:(id)aSender +{ + if (!_codeAutoLayoutWindowController) + _codeAutoLayoutWindowController = [[IKCodeAutoLayoutWindowController alloc] initWithWindowNibName:@"IKCodeAutoLayoutWindowController"]; + + [_codeAutoLayoutWindowController showWindow:aSender]; +} + +- (void)showAutoresizingMasks:(id)aSender +{ + if (!_ibAutoresizingMasksWindowController) + _ibAutoresizingMasksWindowController = [[IKIBAutoresizingMasksWindowController alloc] initWithWindowNibName:@"IKIBAutoresizingMasksWindowController"]; + + [_ibAutoresizingMasksWindowController showWindow:aSender]; +} + +- (IBAction)ping:(id)aSender +{ + [[NSSound soundNamed:@"Ping"] play]; +} + + +#pragma mark NSApplicationDelegate + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ + return YES; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Insert code here to initialize your application +} + +- (void)applicationDidBecomeActive:(NSNotification *)aNotification +{ + [self.window makeKeyAndOrderFront:self]; +} + + +#pragma mark NSObject + +- (void)awakeFromNib +{ + NSUserDefaultsController *defaults = [NSUserDefaultsController sharedUserDefaultsController]; + + [self.pingButton bind:@"keyEquivalent" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentTransformer new]}]; + [self.pingButton bind:@"keyEquivalentModifierMask" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentModifierMaskTransformer new]}]; + + [self.pingItem bind:@"keyEquivalent" + toObject:defaults + withKeyPath:@"values.pingItem" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentTransformer new]}]; + [self.pingItem bind:@"keyEquivalentModifierMask" + toObject:defaults + withKeyPath:@"values.pingItem" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentModifierMaskTransformer new]}]; + + [defaults addObserver:self forKeyPath:@"values.globalPing" options:NSKeyValueObservingOptionInitial context:NULL]; +} + +- (void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject change:(NSDictionary *)aChange context:(void *)aContext +{ + if ([aKeyPath isEqualToString:@"values.globalPing"]) + { + PTHotKeyCenter *hotKeyCenter = [PTHotKeyCenter sharedCenter]; + PTHotKey *oldHotKey = [hotKeyCenter hotKeyWithIdentifier:aKeyPath]; + [hotKeyCenter unregisterHotKey:oldHotKey]; + + NSDictionary *newShortcut = [anObject valueForKeyPath:aKeyPath]; + + if (newShortcut && (NSNull *)newShortcut != [NSNull null]) + { + PTHotKey *newHotKey = [PTHotKey hotKeyWithIdentifier:aKeyPath + keyCombo:newShortcut + target:self + action:@selector(ping:)]; + [hotKeyCenter registerHotKey:newHotKey]; + } + } + else + [super observeValueForKeyPath:aKeyPath ofObject:anObject change:aChange context:aContext]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.h b/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.h new file mode 100755 index 0000000..c43f74c --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.h @@ -0,0 +1,15 @@ +// +// IKCodeAutoLayoutWindowController.h +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 21.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import "IKDemoWindowController.h" + + +@interface IKCodeAutoLayoutWindowController : IKDemoWindowController + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.m b/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.m new file mode 100755 index 0000000..cf5c252 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKCodeAutoLayoutWindowController.m @@ -0,0 +1,114 @@ +// +// IKCodeAutoLayoutWindowController.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 21.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import "IKCodeAutoLayoutWindowController.h" + + +@implementation IKCodeAutoLayoutWindowController + +#pragma mark NSWindowController + +- (void)awakeFromNib +{ + [super awakeFromNib]; + + SRRecorderControl *pingShortcutRecorder = [[SRRecorderControl alloc] initWithFrame:NSZeroRect]; + pingShortcutRecorder.delegate = self; + pingShortcutRecorder.enabled = NO; + [pingShortcutRecorder setAllowedModifierFlags:NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask + requiredModifierFlags:0 + allowsEmptyModifierFlags:NO]; + SRRecorderControl *globalPingShortcutRecorder = [[SRRecorderControl alloc] initWithFrame:NSZeroRect]; + globalPingShortcutRecorder.delegate = self; + SRRecorderControl *pingItemShortcutRecorder = [[SRRecorderControl alloc] initWithFrame:NSZeroRect]; + pingItemShortcutRecorder.delegate = self; + NSTextField *pingLabel = [[NSTextField alloc] initWithFrame:NSZeroRect]; + pingLabel.translatesAutoresizingMaskIntoConstraints = NO; + pingLabel.font = [NSFont systemFontOfSize:13]; + pingLabel.editable = NO; + pingLabel.selectable = NO; + pingLabel.bezeled = NO; + pingLabel.alignment = NSRightTextAlignment; + pingLabel.stringValue = @"Ping Button:"; + pingLabel.drawsBackground = NO; + [pingLabel setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationHorizontal]; + NSTextField *globalPingLabel = [[NSTextField alloc] initWithFrame:NSZeroRect]; + globalPingLabel.translatesAutoresizingMaskIntoConstraints = NO; + globalPingLabel.font = [NSFont systemFontOfSize:13]; + globalPingLabel.editable = NO; + globalPingLabel.selectable = NO; + globalPingLabel.bezeled = NO; + globalPingLabel.alignment = NSRightTextAlignment; + globalPingLabel.stringValue = @"Global Ping:"; + globalPingLabel.drawsBackground = NO; + [globalPingLabel setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationHorizontal]; + NSTextField *pingItemLabel = [[NSTextField alloc] initWithFrame:NSZeroRect]; + pingItemLabel.translatesAutoresizingMaskIntoConstraints = NO; + pingItemLabel.font = [NSFont systemFontOfSize:13]; + pingItemLabel.editable = NO; + pingItemLabel.selectable = NO; + pingItemLabel.bezeled = NO; + pingItemLabel.alignment = NSRightTextAlignment; + pingItemLabel.stringValue = @"Ping Item:"; + pingItemLabel.drawsBackground = NO; + [pingItemLabel setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationHorizontal]; + + NSView *v = self.window.contentView; + [v addSubview:pingShortcutRecorder]; + [v addSubview:globalPingShortcutRecorder]; + [v addSubview:pingItemShortcutRecorder]; + [v addSubview:pingLabel]; + [v addSubview:globalPingLabel]; + [v addSubview:pingItemLabel]; + + NSDictionary *views = NSDictionaryOfVariableBindings(pingShortcutRecorder, + globalPingShortcutRecorder, + pingItemShortcutRecorder, + pingLabel, + globalPingLabel, + pingItemLabel); + [v addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[pingLabel(==80)]-[pingShortcutRecorder(>=100)]-|" + options:NSLayoutFormatAlignAllBaseline + metrics:nil + views:views]]; + [v addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[globalPingLabel(==pingLabel)]-[globalPingShortcutRecorder(==pingShortcutRecorder)]-|" + options:NSLayoutFormatAlignAllBaseline + metrics:nil + views:views]]; + [v addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[pingItemLabel(==pingLabel)]-[pingItemShortcutRecorder(==pingShortcutRecorder)]-|" + options:NSLayoutFormatAlignAllBaseline + metrics:nil + views:views]]; + [v addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[pingShortcutRecorder(==25)]-[globalPingShortcutRecorder(==25)]-[pingItemShortcutRecorder(==25)]-|" + options:0 + metrics:nil + views:views]]; + + NSUserDefaultsController *defaults = [NSUserDefaultsController sharedUserDefaultsController]; + self.pingShortcutRecorder = pingShortcutRecorder; + [self.pingShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.ping" + options:nil]; + [self.pingShortcutRecorder bind:NSEnabledBinding + toObject:defaults + withKeyPath:@"values.isPingItemEnabled" + options:nil]; + self.globalPingShortcutRecorder = globalPingShortcutRecorder; + [self.globalPingShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.globalPing" + options:nil]; + self.pingItemShortcutRecorder = pingItemShortcutRecorder; + [self.pingItemShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.pingItem" + options:nil]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.h b/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.h new file mode 100755 index 0000000..e61af71 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.h @@ -0,0 +1,21 @@ +// +// IKDemoWindowController.h +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import + + +@interface IKDemoWindowController : NSWindowController + +@property (weak) IBOutlet SRRecorderControl *pingShortcutRecorder; + +@property (weak) IBOutlet SRRecorderControl *globalPingShortcutRecorder; + +@property (weak) IBOutlet SRRecorderControl *pingItemShortcutRecorder; + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.m b/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.m new file mode 100755 index 0000000..471fe16 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKDemoWindowController.m @@ -0,0 +1,126 @@ +// +// IKDemoWindowController.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import "IKDemoWindowController.h" + + +@implementation IKDemoWindowController +{ + SRValidator *_validator; +} + +#pragma mark SRRecorderControlDelegate + +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder canRecordShortcut:(NSDictionary *)aShortcut +{ + __autoreleasing NSError *error = nil; + BOOL isTaken = [_validator isKeyCode:[aShortcut[SRShortcutKeyCode] unsignedShortValue] andFlagsTaken:[aShortcut[SRShortcutModifierFlagsKey] unsignedIntegerValue] error:&error]; + + if (isTaken) + { + NSBeep(); + [self presentError:error + modalForWindow:self.window + delegate:nil + didPresentSelector:NULL + contextInfo:NULL]; + } + + return !isTaken; +} + +- (BOOL)shortcutRecorderShouldBeginRecording:(SRRecorderControl *)aRecorder +{ + [[PTHotKeyCenter sharedCenter] pause]; + return YES; +} + +- (void)shortcutRecorderDidEndRecording:(SRRecorderControl *)aRecorder +{ + [[PTHotKeyCenter sharedCenter] resume]; +} + +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder shouldUnconditionallyAllowModifierFlags:(NSEventModifierFlags)aModifierFlags forKeyCode:(unsigned short)aKeyCode +{ + // Keep required flags required. + if ((aModifierFlags & aRecorder.requiredModifierFlags) != aRecorder.requiredModifierFlags) + return NO; + + // Don't allow disallowed flags. + if ((aModifierFlags & aRecorder.allowedModifierFlags) != aModifierFlags) + return NO; + + switch (aKeyCode) + { + case kVK_F1: + case kVK_F2: + case kVK_F3: + case kVK_F4: + case kVK_F5: + case kVK_F6: + case kVK_F7: + case kVK_F8: + case kVK_F9: + case kVK_F10: + case kVK_F11: + case kVK_F12: + case kVK_F13: + case kVK_F14: + case kVK_F15: + case kVK_F16: + case kVK_F17: + case kVK_F18: + case kVK_F19: + case kVK_F20: + return YES; + default: + return NO; + } +} + + +#pragma mark SRValidatorDelegate + +- (BOOL)shortcutValidator:(SRValidator *)aValidator isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags reason:(NSString **)outReason +{ +#define IS_TAKEN(aRecorder) (recorder != (aRecorder) && SRShortcutEqualToShortcut(shortcut, [(aRecorder) objectValue])) + SRRecorderControl *recorder = (SRRecorderControl *)self.window.firstResponder; + + if (![recorder isKindOfClass:[SRRecorderControl class]]) + return NO; + + NSDictionary *shortcut = SRShortcutWithCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode); + + if (IS_TAKEN(_pingShortcutRecorder) || + IS_TAKEN(_globalPingShortcutRecorder) || + IS_TAKEN(_pingItemShortcutRecorder)) + { + *outReason = @"it's already used. To use this shortcut, first remove or change the other shortcut"; + return YES; + } + else + return NO; +#undef IS_TAKEN +} + +- (BOOL)shortcutValidatorShouldCheckMenu:(SRValidator *)aValidator +{ + return YES; +} + + +#pragma mark NSObject + +- (void)awakeFromNib +{ + [super awakeFromNib]; + _validator = [[SRValidator alloc] initWithDelegate:self]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.h b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.h new file mode 100755 index 0000000..fb0ebb5 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.h @@ -0,0 +1,15 @@ +// +// IKIBAutoLayoutWindowController.h +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import "IKDemoWindowController.h" + + +@interface IKIBAutoLayoutWindowController : IKDemoWindowController + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.m b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.m new file mode 100755 index 0000000..1c4f2dc --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoLayoutWindowController.m @@ -0,0 +1,43 @@ +// +// IKIBAutoLayoutWindowController.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import "IKIBAutoLayoutWindowController.h" + + +@implementation IKIBAutoLayoutWindowController + +#pragma mark NSObject + +- (void)awakeFromNib +{ + [super awakeFromNib]; + + NSUserDefaultsController *defaults = [NSUserDefaultsController sharedUserDefaultsController]; + + [self.pingShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.ping" + options:nil]; + [self.pingShortcutRecorder bind:NSEnabledBinding + toObject:defaults + withKeyPath:@"values.isPingItemEnabled" + options:nil]; + [self.pingShortcutRecorder setAllowedModifierFlags:NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask + requiredModifierFlags:0 + allowsEmptyModifierFlags:NO]; + [self.globalPingShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.globalPing" + options:nil]; + [self.pingItemShortcutRecorder bind:NSValueBinding + toObject:defaults + withKeyPath:@"values.pingItem" + options:nil]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.h b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.h new file mode 100755 index 0000000..285e918 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.h @@ -0,0 +1,15 @@ +// +// IKIBAutoresizingMasksWindowController.h +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 20.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import +#import "IKDemoWindowController.h" + + +@interface IKIBAutoresizingMasksWindowController : IKDemoWindowController + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.m b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.m new file mode 100755 index 0000000..ad04308 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/IKIBAutoresizingMasksWindowController.m @@ -0,0 +1,67 @@ +// +// IKIBAutoresizingMasksWindowController.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 20.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import "IKIBAutoresizingMasksWindowController.h" + + +@implementation IKIBAutoresizingMasksWindowController + +- (void)dealloc +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults removeObserver:self forKeyPath:@"ping"]; + [defaults removeObserver:self forKeyPath:@"globalPing"]; + [defaults removeObserver:self forKeyPath:@"pingItem"]; +} + + +#pragma mark SRRecorderControlDelegate + +- (void)shortcutRecorderDidEndRecording:(SRRecorderControl *)aRecorder +{ + if (aRecorder == self.pingShortcutRecorder) + [[NSUserDefaults standardUserDefaults] setValue:aRecorder.objectValue forKey:@"ping"]; + else if (aRecorder == self.globalPingShortcutRecorder) + [[NSUserDefaults standardUserDefaults] setValue:aRecorder.objectValue forKey:@"globalPing"]; + else if (aRecorder == self.pingItemShortcutRecorder) + [[NSUserDefaults standardUserDefaults] setValue:aRecorder.objectValue forKey:@"pingItem"]; +} + + +#pragma mark NSObject + +- (void)awakeFromNib +{ + [super awakeFromNib]; + + [self.pingShortcutRecorder setAllowedModifierFlags:NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask + requiredModifierFlags:0 + allowsEmptyModifierFlags:NO]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults addObserver:self forKeyPath:@"ping" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; + [defaults addObserver:self forKeyPath:@"globalPing" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; + [defaults addObserver:self forKeyPath:@"pingItem" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; + [defaults addObserver:self forKeyPath:@"isPingItemEnabled" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; +} + +- (void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject change:(NSDictionary *)aChange context:(void *)aContext +{ + if ([aKeyPath isEqualToString:@"ping"]) + self.pingShortcutRecorder.objectValue = aChange[NSKeyValueChangeNewKey]; + else if ([aKeyPath isEqualToString:@"globalPing"]) + self.globalPingShortcutRecorder.objectValue = aChange[NSKeyValueChangeNewKey]; + else if ([aKeyPath isEqualToString:@"pingItem"]) + self.pingItemShortcutRecorder.objectValue = aChange[NSKeyValueChangeNewKey]; + else if ([aKeyPath isEqualToString:@"isPingItemEnabled"]) + self.pingShortcutRecorder.enabled = ((id)aChange[NSKeyValueChangeNewKey] != [NSNull null]) && [aChange[NSKeyValueChangeNewKey] boolValue]; + else + [super observeValueForKeyPath:aKeyPath ofObject:anObject change:aChange context:aContext]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Demo/Info.plist b/Clocker/ShortcutRecorder-master/Demo/Info.plist new file mode 100755 index 0000000..a34881f --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.developer-tools + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 Ilya Kulakov. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/Clocker/ShortcutRecorder-master/Demo/Prefix.pch b/Clocker/ShortcutRecorder-master/Demo/Prefix.pch new file mode 100755 index 0000000..b407fcc --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'ShortcutRecorderDemo' target in the 'ShortcutRecorderDemo' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/Credits.rtf b/Clocker/ShortcutRecorder-master/Demo/en.lproj/Credits.rtf new file mode 100755 index 0000000..46576ef --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKCodeAutoLayoutWindowController.xib b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKCodeAutoLayoutWindowController.xib new file mode 100755 index 0000000..e1151ab --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKCodeAutoLayoutWindowController.xib @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoLayoutWindowController.xib b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoLayoutWindowController.xib new file mode 100755 index 0000000..26de025 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoLayoutWindowController.xib @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoresizingMasksWindowController.xib b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoresizingMasksWindowController.xib new file mode 100755 index 0000000..da9d8cc --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/IKIBAutoresizingMasksWindowController.xib @@ -0,0 +1,466 @@ + + + + 1080 + 12C60 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + NSCustomObject + NSCustomView + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + IKIBAutoresizingMasksWindowController + + + FirstResponder + + + NSApplication + + + 27 + 2 + {{196, 112}, {327, 131}} + -1535638528 + Interface Builder Autoresizing Masks Demo + NSPanel + + + {600, 131} + {200, 131} + + + 256 + + + + 266 + {{105, 86}, {202, 25}} + + + + _NS:9 + SRRecorderControl + + + + 266 + {{105, 53}, {202, 25}} + + + + _NS:9 + SRRecorderControl + + + + 268 + {{19, 91}, {81, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Ping Button: + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 58}, {83, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Global Ping: + + _NS:1535 + + + + + NO + + + + 268 + {{32, 25}, {68, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Ping Item: + + _NS:1535 + + + + + NO + + + + 266 + {{105, 20}, {202, 25}} + + + + _NS:9 + SRRecorderControl + + + {327, 131} + + + + YES + + + + 2 + {{150, 180}, {0, 0}} + + + + YES + + + _NS:21 + + {{0, 0}, {1366, 746}} + {200, 147} + {600, 147} + Interface Builder Autoresizing Masks Demo + YES + + + + + + + pingShortcutRecorder + + + + 31 + + + + globalPingShortcutRecorder + + + + 32 + + + + window + + + + 33 + + + + pingItemShortcutRecorder + + + + 42 + + + + title + + + + 35 + + + + delegate + + + + 37 + + + + title + + + + 34 + + + + delegate + + + + 36 + + + + delegate + + + + 41 + + + + title + + + + 43 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 7 + + + + + + + + 8 + + + + + + + + + + + + + 9 + + + + + + + + 10 + + + + + + + + 11 + + + + + + 12 + + + + + + 27 + + + + + 29 + + + + + 38 + + + + + + + + 39 + + + + + 40 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 43 + + + + + IKDemoWindowController + NSWindowController + + SRRecorderControl + SRRecorderControl + SRRecorderControl + + + + globalPingShortcutRecorder + SRRecorderControl + + + pingItemShortcutRecorder + SRRecorderControl + + + pingShortcutRecorder + SRRecorderControl + + + + IBProjectSource + ./Classes/IKDemoWindowController.h + + + + IKIBAutoresizingMasksWindowController + IKDemoWindowController + + IBProjectSource + ./Classes/IKIBAutoresizingMasksWindowController.h + + + + SRRecorderControl + NSView + + delegate + NSObject + + + delegate + + delegate + NSObject + + + + IBProjectSource + ./Classes/SRRecorderControl.h + + + + + 0 + IBCocoaFramework + YES + 3 + + diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/InfoPlist.strings b/Clocker/ShortcutRecorder-master/Demo/en.lproj/InfoPlist.strings new file mode 100755 index 0000000..477b28f --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Clocker/ShortcutRecorder-master/Demo/en.lproj/MainMenu.xib b/Clocker/ShortcutRecorder-master/Demo/en.lproj/MainMenu.xib new file mode 100755 index 0000000..4e418f6 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/en.lproj/MainMenu.xib @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Clocker/ShortcutRecorder-master/Demo/example-yosemite.png b/Clocker/ShortcutRecorder-master/Demo/example-yosemite.png new file mode 100755 index 0000000..10d542e Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Demo/example-yosemite.png differ diff --git a/Clocker/ShortcutRecorder-master/Demo/example.png b/Clocker/ShortcutRecorder-master/Demo/example.png new file mode 100755 index 0000000..0c7c078 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Demo/example.png differ diff --git a/Clocker/ShortcutRecorder-master/Demo/main.m b/Clocker/ShortcutRecorder-master/Demo/main.m new file mode 100755 index 0000000..f9c1243 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Demo/main.m @@ -0,0 +1,14 @@ +// +// main.m +// ShortcutRecorderDemo +// +// Created by Ilya Kulakov on 18.01.13. +// Copyright (c) 2013 Ilya Kulakov. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/Clocker/ShortcutRecorder-master/LICENSE.md b/Clocker/ShortcutRecorder-master/LICENSE.md new file mode 100755 index 0000000..8a5ff39 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/LICENSE.md @@ -0,0 +1,31 @@ +# ShortcutRecorder + +Copyright (c) 2006, Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the organization nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# PTHotKey + +Copyright (c) 2003 Quentin D. Carnicelli. +All rights reserved. diff --git a/Clocker/ShortcutRecorder-master/Library/Info.plist b/Clocker/ShortcutRecorder-master/Library/Info.plist new file mode 100755 index 0000000..22e5305 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ShortcutRecorder + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.17 + CFBundleSignature + ???? + CFBundleVersion + 2.17 + + diff --git a/Clocker/ShortcutRecorder-master/Library/Prefix.pch b/Clocker/ShortcutRecorder-master/Library/Prefix.pch new file mode 100755 index 0000000..cf39eed --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'ShortcutRecorder' target in the 'ShortcutRecorder' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Clocker/ShortcutRecorder-master/Library/SRCommon.h b/Clocker/ShortcutRecorder-master/Library/SRCommon.h new file mode 100755 index 0000000..e7482a1 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRCommon.h @@ -0,0 +1,116 @@ +// +// SRCommon.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim +// Ilya Kulakov + +#import +#import + + +/*! + Mask representing subset of Cocoa modifier flags suitable for shortcuts. + */ +static const NSEventModifierFlags SRCocoaModifierFlagsMask = NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask | NSControlKeyMask; + +/*! + Mask representing subset of Carbon modifier flags suitable for shortcuts. + */ +static const NSUInteger SRCarbonModifierFlagsMask = cmdKey | optionKey | shiftKey | controlKey; + + +/*! + Converts carbon modifier flags to cocoa. + */ +FOUNDATION_STATIC_INLINE NSEventModifierFlags SRCarbonToCocoaFlags(UInt32 aCarbonFlags) +{ + NSEventModifierFlags cocoaFlags = 0; + + if (aCarbonFlags & cmdKey) + cocoaFlags |= NSCommandKeyMask; + + if (aCarbonFlags & optionKey) + cocoaFlags |= NSAlternateKeyMask; + + if (aCarbonFlags & controlKey) + cocoaFlags |= NSControlKeyMask; + + if (aCarbonFlags & shiftKey) + cocoaFlags |= NSShiftKeyMask; + + return cocoaFlags; +} + +/*! + Converts cocoa modifier flags to carbon. + */ +FOUNDATION_STATIC_INLINE UInt32 SRCocoaToCarbonFlags(NSEventModifierFlags aCocoaFlags) +{ + UInt32 carbonFlags = 0; + + if (aCocoaFlags & NSCommandKeyMask) + carbonFlags |= cmdKey; + + if (aCocoaFlags & NSAlternateKeyMask) + carbonFlags |= optionKey; + + if (aCocoaFlags & NSControlKeyMask) + carbonFlags |= controlKey; + + if (aCocoaFlags & NSShiftKeyMask) + carbonFlags |= shiftKey; + + return carbonFlags; +} + + +/*! + Return Bundle where resources can be found. + + @discussion Throws NSInternalInconsistencyException if bundle cannot be found. +*/ +NSBundle *SRBundle(); + + +/*! + Convenient method to get localized string from the framework bundle. + */ +NSString *SRLoc(NSString *aKey); + + +/*! + Convenient method to get image from the framework bundle. + */ +NSImage *SRImage(NSString *anImageName); + +/*! + Returns string representation of shortcut with modifier flags replaced with their localized + readable equivalents (e.g. ? -> Option). + */ +NSString *SRReadableStringForCocoaModifierFlagsAndKeyCode(NSEventModifierFlags aModifierFlags, unsigned short aKeyCode); + +/*! + Returns string representation of shortcut with modifier flags replaced with their localized + readable equivalents (e.g. ? -> Option) and ASCII character for key code. + */ +NSString *SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(NSEventModifierFlags aModifierFlags, unsigned short aKeyCode); + +/*! + Determines if given key code with flags is equal to key equivalent and flags + (usually taken from NSButton or NSMenu). + + @discussion On Mac OS X some key combinations can have "alternates". E.g. option-A can be represented both as option-A and as . +*/ +BOOL SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(unsigned short aKeyCode, + NSEventModifierFlags aKeyCodeFlags, + NSString *aKeyEquivalent, + NSEventModifierFlags aKeyEquivalentModifierFlags); diff --git a/Clocker/ShortcutRecorder-master/Library/SRCommon.m b/Clocker/ShortcutRecorder-master/Library/SRCommon.m new file mode 100755 index 0000000..89ad166 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRCommon.m @@ -0,0 +1,175 @@ +// +// SRCommon.m +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim +// Ilya Kulakov + +#import "SRCommon.h" +#import "SRKeyCodeTransformer.h" + + +NSBundle *SRBundle() +{ + static dispatch_once_t onceToken; + static NSBundle *Bundle = nil; + dispatch_once(&onceToken, ^{ + Bundle = [NSBundle bundleWithIdentifier:@"com.kulakov.ShortcutRecorder"]; + + if (!Bundle) + { + // Could be a CocoaPods framework with embedded resources bundle. + // Look up "use_frameworks!" and "resources_bundle" in CocoaPods documentation. + Bundle = [NSBundle bundleWithIdentifier:@"org.cocoapods.ShortcutRecorder"]; + + if (!Bundle) + { + Class c = NSClassFromString(@"SRRecorderControl"); + + if (c) + { + Bundle = [NSBundle bundleForClass:c]; + } + } + + if (Bundle) + { + Bundle = [NSBundle bundleWithPath:[Bundle pathForResource:@"ShortcutRecorder" ofType:@"bundle"]]; + } + } + }); + + if (!Bundle) + { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"Unable to find bundle with resources." + userInfo:nil]; + } + else + { + return Bundle; + } +} + + +NSString *SRLoc(NSString *aKey) +{ + return NSLocalizedStringFromTableInBundle(aKey, @"ShortcutRecorder", SRBundle(), nil); +} + + +NSImage *SRImage(NSString *anImageName) +{ + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6) + return [[NSImage alloc] initByReferencingURL:[SRBundle() URLForImageResource:anImageName]]; + else + return [SRBundle() imageForResource:anImageName]; +} + + +NSString *SRReadableStringForCocoaModifierFlagsAndKeyCode(NSEventModifierFlags aModifierFlags, unsigned short aKeyCode) +{ + SRKeyCodeTransformer *t = [SRKeyCodeTransformer sharedPlainTransformer]; + NSString *c = [t transformedValue:@(aKeyCode)]; + + return [NSString stringWithFormat:@"%@%@%@%@%@", + (aModifierFlags & NSCommandKeyMask ? SRLoc(@"Command-") : @""), + (aModifierFlags & NSAlternateKeyMask ? SRLoc(@"Option-") : @""), + (aModifierFlags & NSControlKeyMask ? SRLoc(@"Control-") : @""), + (aModifierFlags & NSShiftKeyMask ? SRLoc(@"Shift-") : @""), + c]; +} + + +NSString *SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(NSEventModifierFlags aModifierFlags, unsigned short aKeyCode) +{ + SRKeyCodeTransformer *t = [SRKeyCodeTransformer sharedPlainASCIITransformer]; + NSString *c = [t transformedValue:@(aKeyCode)]; + + return [NSString stringWithFormat:@"%@%@%@%@%@", + (aModifierFlags & NSCommandKeyMask ? SRLoc(@"Command-") : @""), + (aModifierFlags & NSAlternateKeyMask ? SRLoc(@"Option-") : @""), + (aModifierFlags & NSControlKeyMask ? SRLoc(@"Control-") : @""), + (aModifierFlags & NSShiftKeyMask ? SRLoc(@"Shift-") : @""), + c]; +} + + +static BOOL _SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(unsigned short aKeyCode, + NSEventModifierFlags aKeyCodeFlags, + NSString *aKeyEquivalent, + NSEventModifierFlags aKeyEquivalentModifierFlags, + SRKeyCodeTransformer *aTransformer) +{ + if (!aKeyEquivalent) + return NO; + + aKeyCodeFlags &= SRCocoaModifierFlagsMask; + aKeyEquivalentModifierFlags &= SRCocoaModifierFlagsMask; + + if (aKeyCodeFlags == aKeyEquivalentModifierFlags) + { + NSString *keyCodeRepresentation = [aTransformer transformedValue:@(aKeyCode) + withImplicitModifierFlags:nil + explicitModifierFlags:@(aKeyCodeFlags)]; + return [keyCodeRepresentation isEqual:aKeyEquivalent]; + } + else if (!aKeyEquivalentModifierFlags || + (aKeyCodeFlags & aKeyEquivalentModifierFlags) == aKeyEquivalentModifierFlags) + { + // Some key equivalent modifier flags can be implicitly set by using special unicode characters. E.g. insetead of opt-a. + // However all modifier flags explictily set in key equivalent MUST be also set in key code flags. + // E.g. ctrl-/ctrl-opt-a and /opt-a match this condition, but cmd-/ctrl-opt-a doesn't. + NSString *keyCodeRepresentation = [aTransformer transformedValue:@(aKeyCode) + withImplicitModifierFlags:nil + explicitModifierFlags:@(aKeyCodeFlags)]; + + if ([keyCodeRepresentation isEqual:aKeyEquivalent]) + { + // Key code and key equivalent are not equal key code representation matches key equivalent, but modifier flags are not. + return NO; + } + else + { + NSEventModifierFlags possiblyImplicitFlags = aKeyCodeFlags & ~aKeyEquivalentModifierFlags; + keyCodeRepresentation = [aTransformer transformedValue:@(aKeyCode) + withImplicitModifierFlags:@(possiblyImplicitFlags) + explicitModifierFlags:@(aKeyEquivalentModifierFlags)]; + return [keyCodeRepresentation isEqual:aKeyEquivalent]; + } + } + else + return NO; +} + + +BOOL SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(unsigned short aKeyCode, + NSEventModifierFlags aKeyCodeFlags, + NSString *aKeyEquivalent, + NSEventModifierFlags aKeyEquivalentModifierFlags) +{ + BOOL isEqual = _SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(aKeyCode, + aKeyCodeFlags, + aKeyEquivalent, + aKeyEquivalentModifierFlags, + [SRKeyCodeTransformer sharedASCIITransformer]); + + if (!isEqual) + { + isEqual = _SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(aKeyCode, + aKeyCodeFlags, + aKeyEquivalent, + aKeyEquivalentModifierFlags, + [SRKeyCodeTransformer sharedTransformer]); + } + + return isEqual; +} diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.h b/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.h new file mode 100755 index 0000000..2a2ba1b --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.h @@ -0,0 +1,139 @@ +// +// SRKeyCodeTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Ilya Kulakov +// Silvio Rizzi + +#import +#import + + +/*! + Transforms key code into unicode character or plain string. + */ +@interface SRKeyCodeTransformer : NSValueTransformer + +/*! + Returns initialized key code transformer. + + @param aUsesASCII Determines whether transformer uses only ASCII capable keyboard input source. + + @param aUsesPlainStrings Determines whether key codes without readable glyphs (e.g. F1...F19) are transformed to + to unicode characters (NSF1FunctionKey...NSF19FunctionKey) suitable for setting key equivalents + of Cocoa controls or to plain strings (@"F1"...@"F19") suitable for drawing, logging and accessibility. + + @discussion This method is the designated initializer for SRKeyCodeTransformer. + */ +- (instancetype)initWithASCIICapableKeyboardInputSource:(BOOL)aUsesASCII plainStrings:(BOOL)aUsesPlainStrings; + +/*! + Determines whether transformer uses ASCII capable keyboard input source. + */ +@property (readonly) BOOL usesASCIICapableKeyboardInputSource; + +/*! + Determines whether key codes without readable glyphs are transformed to unicode characters + suitable for setting keqEquivalents or to plain strings suitable for drawing, logging and accessibility. + */ +@property (readonly) BOOL usesPlainStrings; + +/*! + Returns the shared transformer. + */ ++ (instancetype)sharedTransformer; + +/*! + Returns the shared transformer configured to use only ASCII capable keyboard input source. + */ ++ (instancetype)sharedASCIITransformer; + +/*! + Returns the shared transformer configured to transform key codes to plain strings. + */ ++ (SRKeyCodeTransformer *)sharedPlainTransformer; + +/*! + Returns the shared transformer configured to use only ASCII capable keyboard input source + and to transform key codes to plain strings. + */ ++ (SRKeyCodeTransformer *)sharedPlainASCIITransformer; + + +/*! + Returns mapping from special key codes to unicode characters. + */ ++ (NSDictionary *)specialKeyCodesToUnicodeCharactersMapping; + +/*! + Returns mapping from special key codes to plain strings. + */ ++ (NSDictionary *)specialKeyCodesToPlainStringsMapping; + +/*! + Determines whether key code is special. + + @param aKeyCode Key code to be checked. + */ +- (BOOL)isKeyCodeSpecial:(unsigned short)aKeyCode; + +/*! + Transforms given special key code into unicode character by taking into account modifier flags. + + @discussion E.g. the key code 0x30 is transformed to ⇥. But if shift is pressed, it is transformed to ⇤. + + @result Unicode character or plain string. nil if not a special key code. +*/ +- (NSString *)transformedSpecialKeyCode:(NSNumber *)aKeyCode withExplicitModifierFlags:(NSNumber *)aModifierFlags; + +/*! + Shorcut to [self transformedValue:aValue withImplicitModifierFlags:aModifierFlags explicitModifierFlags:0] + */ +- (NSString *)transformedValue:(NSNumber *)aValue withModifierFlags:(NSNumber *)aModifierFlags; + +/*! + Transfroms given key code into unicode character by taking into account modifier flags. + + @param aValue An instance of NSNumber (unsigned short) that represents key code. + + @param anImplicitModifierFlags An instance of NSNumber (NSEventModifierFlags) that represents implicit modifier flags like opt in å. + + @param anExplicitModifierFlags An instance of NSNumber (NSEventModifierFlags) that represents explicit modifier flags like shift in shift-⇤. + */ +- (NSString *)transformedValue:(NSNumber *)aValue withImplicitModifierFlags:(NSNumber *)anImplicitModifierFlags explicitModifierFlags:(NSNumber *)anExplicitModifierFlags; + +@end + + +/*! + These constants represents drawable unicode characters for key codes that do not have + appropriate constants in Carbon and Cocoa. + */ +typedef NS_ENUM(unichar, SRKeyCodeGlyph) +{ + SRKeyCodeGlyphTabRight = 0x21E5, // ⇥ + SRKeyCodeGlyphTabLeft = 0x21E4, // ⇤ + SRKeyCodeGlyphReturn = 0x2305, // ⌅ + SRKeyCodeGlyphReturnR2L = 0x21A9, // ↩ + SRKeyCodeGlyphDeleteLeft = 0x232B, // ⌫ + SRKeyCodeGlyphDeleteRight = 0x2326, // ⌦ + SRKeyCodeGlyphPadClear = 0x2327, // ⌧ + SRKeyCodeGlyphLeftArrow = 0x2190, // ← + SRKeyCodeGlyphRightArrow = 0x2192, // → + SRKeyCodeGlyphUpArrow = 0x2191, // ↑ + SRKeyCodeGlyphDownArrow = 0x2193, // ↓ + SRKeyCodeGlyphPageDown = 0x21DF, // ⇟ + SRKeyCodeGlyphPageUp = 0x21DE, // ⇞ + SRKeyCodeGlyphNorthwestArrow = 0x2196, // ↖ + SRKeyCodeGlyphSoutheastArrow = 0x2198, // ↘ + SRKeyCodeGlyphEscape = 0x238B, // ⎋ + SRKeyCodeGlyphSpace = 0x0020, // ' ' +}; diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.m b/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.m new file mode 100755 index 0000000..2595f7c --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyCodeTransformer.m @@ -0,0 +1,357 @@ +// +// SRKeyCodeTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Ilya Kulakov +// Silvio Rizzi + +#import "SRKeyCodeTransformer.h" +#import "SRCommon.h" + + +FOUNDATION_STATIC_INLINE NSString* _SRUnicharToString(unichar aChar) +{ + return [NSString stringWithFormat: @"%C", aChar]; +} + + +@implementation SRKeyCodeTransformer + +- (instancetype)initWithASCIICapableKeyboardInputSource:(BOOL)aUsesASCII plainStrings:(BOOL)aUsesPlainStrings +{ + self = [super init]; + + if (self) + { + _usesASCIICapableKeyboardInputSource = aUsesASCII; + _usesPlainStrings = aUsesPlainStrings; + } + + return self; +} + +- (instancetype)init +{ + return [self initWithASCIICapableKeyboardInputSource:NO plainStrings:NO]; +} + + +#pragma mark Methods + ++ (instancetype)sharedTransformer +{ + static dispatch_once_t OnceToken; + static SRKeyCodeTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithASCIICapableKeyboardInputSource:NO + plainStrings:NO]; + }); + return Transformer; +} + ++ (instancetype)sharedASCIITransformer +{ + static dispatch_once_t OnceToken; + static SRKeyCodeTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithASCIICapableKeyboardInputSource:YES + plainStrings:NO]; + }); + return Transformer; +} + ++ (instancetype)sharedPlainTransformer +{ + static dispatch_once_t OnceToken; + static SRKeyCodeTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithASCIICapableKeyboardInputSource:NO + plainStrings:YES]; + }); + return Transformer; +} + ++ (SRKeyCodeTransformer *)sharedPlainASCIITransformer +{ + static dispatch_once_t OnceToken; + static SRKeyCodeTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithASCIICapableKeyboardInputSource:YES + plainStrings:YES]; + }); + return Transformer; +} + ++ (NSDictionary *)specialKeyCodesToUnicodeCharactersMapping +{ + // Most of these keys are system constans. + // Values for rest of the keys were given by setting key equivalents in IB. + static dispatch_once_t OnceToken; + static NSDictionary *Mapping = nil; + dispatch_once(&OnceToken, ^{ + Mapping = @{ + @(kVK_F1): _SRUnicharToString(NSF1FunctionKey), + @(kVK_F2): _SRUnicharToString(NSF2FunctionKey), + @(kVK_F3): _SRUnicharToString(NSF3FunctionKey), + @(kVK_F4): _SRUnicharToString(NSF4FunctionKey), + @(kVK_F5): _SRUnicharToString(NSF5FunctionKey), + @(kVK_F6): _SRUnicharToString(NSF6FunctionKey), + @(kVK_F7): _SRUnicharToString(NSF7FunctionKey), + @(kVK_F8): _SRUnicharToString(NSF8FunctionKey), + @(kVK_F9): _SRUnicharToString(NSF9FunctionKey), + @(kVK_F10): _SRUnicharToString(NSF10FunctionKey), + @(kVK_F11): _SRUnicharToString(NSF11FunctionKey), + @(kVK_F12): _SRUnicharToString(NSF12FunctionKey), + @(kVK_F13): _SRUnicharToString(NSF13FunctionKey), + @(kVK_F14): _SRUnicharToString(NSF14FunctionKey), + @(kVK_F15): _SRUnicharToString(NSF15FunctionKey), + @(kVK_F16): _SRUnicharToString(NSF16FunctionKey), + @(kVK_F17): _SRUnicharToString(NSF17FunctionKey), + @(kVK_F18): _SRUnicharToString(NSF18FunctionKey), + @(kVK_F19): _SRUnicharToString(NSF19FunctionKey), + @(kVK_F20): _SRUnicharToString(NSF20FunctionKey), + @(kVK_Space): _SRUnicharToString(' '), + @(kVK_Delete): _SRUnicharToString(NSBackspaceCharacter), + @(kVK_ForwardDelete): _SRUnicharToString(NSDeleteCharacter), + @(kVK_ANSI_KeypadClear): _SRUnicharToString(NSClearLineFunctionKey), + @(kVK_LeftArrow): _SRUnicharToString(NSLeftArrowFunctionKey), + @(kVK_RightArrow): _SRUnicharToString(NSRightArrowFunctionKey), + @(kVK_UpArrow): _SRUnicharToString(NSUpArrowFunctionKey), + @(kVK_DownArrow): _SRUnicharToString(NSDownArrowFunctionKey), + @(kVK_End): _SRUnicharToString(NSEndFunctionKey), + @(kVK_Home): _SRUnicharToString(NSHomeFunctionKey), + @(kVK_Escape): _SRUnicharToString('\e'), + @(kVK_PageDown): _SRUnicharToString(NSPageDownFunctionKey), + @(kVK_PageUp): _SRUnicharToString(NSPageUpFunctionKey), + @(kVK_Return): _SRUnicharToString(NSCarriageReturnCharacter), + @(kVK_ANSI_KeypadEnter): _SRUnicharToString(NSEnterCharacter), + @(kVK_Tab): _SRUnicharToString(NSTabCharacter), + @(kVK_Help): _SRUnicharToString(NSHelpFunctionKey) + }; + }); + return Mapping; +} + ++ (NSDictionary *)specialKeyCodesToPlainStringsMapping +{ + static dispatch_once_t OnceToken; + static NSDictionary *Mapping = nil; + dispatch_once(&OnceToken, ^{ + Mapping = @{ + @(kVK_F1): @"F1", + @(kVK_F2): @"F2", + @(kVK_F3): @"F3", + @(kVK_F4): @"F4", + @(kVK_F5): @"F5", + @(kVK_F6): @"F6", + @(kVK_F7): @"F7", + @(kVK_F8): @"F8", + @(kVK_F9): @"F9", + @(kVK_F10): @"F10", + @(kVK_F11): @"F11", + @(kVK_F12): @"F12", + @(kVK_F13): @"F13", + @(kVK_F14): @"F14", + @(kVK_F15): @"F15", + @(kVK_F16): @"F16", + @(kVK_F17): @"F17", + @(kVK_F18): @"F18", + @(kVK_F19): @"F19", + @(kVK_F20): @"F20", + @(kVK_Space): SRLoc(@"Space"), + @(kVK_Delete): _SRUnicharToString(SRKeyCodeGlyphDeleteLeft), + @(kVK_ForwardDelete): _SRUnicharToString(SRKeyCodeGlyphDeleteRight), + @(kVK_ANSI_KeypadClear): _SRUnicharToString(SRKeyCodeGlyphPadClear), + @(kVK_LeftArrow): _SRUnicharToString(SRKeyCodeGlyphLeftArrow), + @(kVK_RightArrow): _SRUnicharToString(SRKeyCodeGlyphRightArrow), + @(kVK_UpArrow): _SRUnicharToString(SRKeyCodeGlyphUpArrow), + @(kVK_DownArrow): _SRUnicharToString(SRKeyCodeGlyphDownArrow), + @(kVK_End): _SRUnicharToString(SRKeyCodeGlyphSoutheastArrow), + @(kVK_Home): _SRUnicharToString(SRKeyCodeGlyphNorthwestArrow), + @(kVK_Escape): _SRUnicharToString(SRKeyCodeGlyphEscape), + @(kVK_PageDown): _SRUnicharToString(SRKeyCodeGlyphPageDown), + @(kVK_PageUp): _SRUnicharToString(SRKeyCodeGlyphPageUp), + @(kVK_Return): _SRUnicharToString(SRKeyCodeGlyphReturnR2L), + @(kVK_ANSI_KeypadEnter): _SRUnicharToString(SRKeyCodeGlyphReturn), + @(kVK_Tab): _SRUnicharToString(SRKeyCodeGlyphTabRight), + @(kVK_Help): @"?⃝" + }; + }); + return Mapping; +} + +- (BOOL)isKeyCodeSpecial:(unsigned short)aKeyCode +{ + switch (aKeyCode) + { + case kVK_F1: + case kVK_F2: + case kVK_F3: + case kVK_F4: + case kVK_F5: + case kVK_F6: + case kVK_F7: + case kVK_F8: + case kVK_F9: + case kVK_F10: + case kVK_F11: + case kVK_F12: + case kVK_F13: + case kVK_F14: + case kVK_F15: + case kVK_F16: + case kVK_F17: + case kVK_F18: + case kVK_F19: + case kVK_F20: + case kVK_Space: + case kVK_Delete: + case kVK_ForwardDelete: + case kVK_ANSI_KeypadClear: + case kVK_LeftArrow: + case kVK_RightArrow: + case kVK_UpArrow: + case kVK_DownArrow: + case kVK_End: + case kVK_Home: + case kVK_Escape: + case kVK_PageDown: + case kVK_PageUp: + case kVK_Return: + case kVK_ANSI_KeypadEnter: + case kVK_Tab: + case kVK_Help: + return YES; + default: + return NO; + } +} + + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation +{ + return NO; +} + ++ (Class)transformedValueClass; +{ + return [NSString class]; +} + +- (NSString *)transformedValue:(NSNumber *)aValue +{ + return [self transformedValue:aValue withModifierFlags:nil]; +} + +- (NSString *)transformedValue:(NSNumber *)aValue withModifierFlags:(NSNumber *)aModifierFlags +{ + return [self transformedValue:aValue withImplicitModifierFlags:aModifierFlags explicitModifierFlags:nil]; +} + +- (NSString *)transformedValue:(NSNumber *)aValue withImplicitModifierFlags:(NSNumber *)anImplicitModifierFlags explicitModifierFlags:(NSNumber *)anExplicitModifierFlags +{ + if ([anImplicitModifierFlags unsignedIntegerValue] & [anExplicitModifierFlags unsignedIntegerValue] & SRCocoaModifierFlagsMask) + { + [NSException raise:NSInvalidArgumentException format:@"anImplicitModifierFlags and anExplicitModifierFlags MUST NOT have common elements"]; + } + + if (![aValue isKindOfClass:[NSNumber class]]) + return @""; + + // Some key codes cannot be translated directly. + NSString *unmappedString = [self transformedSpecialKeyCode:aValue withExplicitModifierFlags:anExplicitModifierFlags]; + + if (unmappedString) + return unmappedString; + + CFDataRef layoutData = NULL; + + if (self.usesASCIICapableKeyboardInputSource) + { + TISInputSourceRef tisSource = TISCopyCurrentASCIICapableKeyboardLayoutInputSource(); + + if (!tisSource) + return @""; + + layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + CFRelease(tisSource); + } + else + { + TISInputSourceRef tisSource = TISCopyCurrentKeyboardLayoutInputSource(); + + if (!tisSource) + return @""; + + layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + CFRelease(tisSource); + + // For non-unicode layouts such as Chinese, Japanese, and Korean, get the ASCII capable layout + if (!layoutData) + { + tisSource = TISCopyCurrentASCIICapableKeyboardLayoutInputSource(); + + if (!tisSource) + return @""; + + layoutData = (CFDataRef)TISGetInputSourceProperty(tisSource, kTISPropertyUnicodeKeyLayoutData); + CFRelease(tisSource); + } + } + + if (!layoutData) + return @""; + + const UCKeyboardLayout *keyLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); + + static const UniCharCount MaxLength = 255; + UniCharCount actualLength = 0; + UniChar chars[MaxLength] = {0}; + + UInt32 deadKeyState = 0; + OSStatus err = UCKeyTranslate(keyLayout, + [aValue unsignedShortValue], + kUCKeyActionDisplay, + SRCocoaToCarbonFlags([anImplicitModifierFlags unsignedIntegerValue]) >> 8, + LMGetKbdType(), + kUCKeyTranslateNoDeadKeysBit, + &deadKeyState, + sizeof(chars) / sizeof(UniChar), + &actualLength, + chars); + if (err != noErr) + return @""; + + if (self.usesPlainStrings) + return [[NSString stringWithCharacters:chars length:actualLength] uppercaseString]; + else + return [NSString stringWithCharacters:chars length:actualLength]; +} + +- (NSString *)transformedSpecialKeyCode:(NSNumber *)aKeyCode withExplicitModifierFlags:(NSNumber *)anExplicitModifierFlags +{ + if ([anExplicitModifierFlags unsignedIntegerValue] & NSShiftKeyMask && [aKeyCode unsignedShortValue] == kVK_Tab) + { + if (self.usesPlainStrings) + return _SRUnicharToString(SRKeyCodeGlyphTabLeft); + else + return _SRUnicharToString(NSBackTabCharacter); + } + + if (self.usesPlainStrings) + return [[self class] specialKeyCodesToPlainStringsMapping][aKeyCode]; + else + return [[self class] specialKeyCodesToUnicodeCharactersMapping][aKeyCode]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.h b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.h new file mode 100755 index 0000000..f711816 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.h @@ -0,0 +1,21 @@ +// +// SRKeyEquivalentModifierMaskTransformer.h +// ShortcutRecorder +// +// Copyright 2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors to this file: +// Ilya Kulakov + +#import + + +/*! + Transform dictionary representation of shortcut into string suitable + for -setKeyEquivalentModifierMask: of NSButton and NSMenuItem. + */ +@interface SRKeyEquivalentModifierMaskTransformer : NSValueTransformer + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.m b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.m new file mode 100755 index 0000000..f552fed --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentModifierMaskTransformer.m @@ -0,0 +1,44 @@ +// +// SRKeyEquivalentModifierMaskTransformer.m +// ShortcutRecorder +// +// Copyright 2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// Ilya Kulakov + +#import "SRKeyEquivalentModifierMaskTransformer.h" +#import "SRKeyCodeTransformer.h" +#import "SRRecorderControl.h" + + +@implementation SRKeyEquivalentModifierMaskTransformer + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation +{ + return NO; +} + ++ (Class)transformedValueClass +{ + return [NSNumber class]; +} + +- (NSNumber *)transformedValue:(NSDictionary *)aValue +{ + if (![aValue isKindOfClass:[NSDictionary class]]) + return @(0); + + NSNumber *modifierFlags = aValue[SRShortcutModifierFlagsKey]; + + if (![modifierFlags isKindOfClass:[NSNumber class]]) + return @(0); + + return modifierFlags; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.h b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.h new file mode 100755 index 0000000..9ec68e3 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.h @@ -0,0 +1,21 @@ +// +// SRKeyEquivalentTransformer.h +// ShortcutRecorder +// +// Copyright 2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors to this file: +// Ilya Kulakov + +#import + + +/*! + Transform dictionary representation of shortcut into string suitable + for -setKeyEquivalent: of NSButton and NSMenuItem. + */ +@interface SRKeyEquivalentTransformer : NSValueTransformer + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.m b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.m new file mode 100755 index 0000000..e3fdb44 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRKeyEquivalentTransformer.m @@ -0,0 +1,53 @@ +// +// SRKeyEquivalentTransformer.m +// ShortcutRecorder +// +// Copyright 2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// Ilya Kulakov + +#import "SRKeyEquivalentTransformer.h" +#import "SRKeyCodeTransformer.h" +#import "SRRecorderControl.h" + + +@implementation SRKeyEquivalentTransformer + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation +{ + return NO; +} + ++ (Class)transformedValueClass +{ + return [NSString class]; +} + +- (NSString *)transformedValue:(NSDictionary *)aValue +{ + if (![aValue isKindOfClass:[NSDictionary class]]) + return @""; + + NSNumber *keyCode = aValue[SRShortcutKeyCode]; + + if (![keyCode isKindOfClass:[NSNumber class]]) + return @""; + + NSNumber *modifierFlags = aValue[SRShortcutModifierFlagsKey]; + + if (![modifierFlags isKindOfClass:[NSNumber class]]) + modifierFlags = @(0); + + SRKeyCodeTransformer *t = [SRKeyCodeTransformer sharedASCIITransformer]; + + return [t transformedValue:keyCode + withImplicitModifierFlags:nil + explicitModifierFlags:modifierFlags]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.h b/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.h new file mode 100755 index 0000000..0ca9d07 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.h @@ -0,0 +1,37 @@ +// +// SRModifierFlagsTransformer.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// Ilya Kulakov + +#import + + +/*! + Transforms mask of Cocoa modifier flags to string of unicode characters. + */ +@interface SRModifierFlagsTransformer : NSValueTransformer + +- (instancetype)initWithPlainStrings:(BOOL)aUsesPlainStrings; + +/*! + Determines whether modifier flags are transformed to unicode characters or to plain strings. + */ +@property (readonly) BOOL usesPlainStrings; + +/*! + Returns the shared transformer. + */ ++ (instancetype)sharedTransformer; + +/*! + Returns the shared plain transformer. + */ ++ (instancetype)sharedPlainTransformer; + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.m b/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.m new file mode 100755 index 0000000..0413887 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRModifierFlagsTransformer.m @@ -0,0 +1,108 @@ +// +// SRModifierFlagsTransformer.m +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// Ilya Kulakov + +#import "SRModifierFlagsTransformer.h" +#import "SRCommon.h" + + +@implementation SRModifierFlagsTransformer + +- (instancetype)initWithPlainStrings:(BOOL)aUsesPlainStrings +{ + self = [super init]; + + if (self) + { + _usesPlainStrings = aUsesPlainStrings; + } + + return self; +} + +- (instancetype)init +{ + return [self initWithPlainStrings:NO]; +} + + +#pragma mark Methods + ++ (instancetype)sharedTransformer +{ + static dispatch_once_t OnceToken; + static SRModifierFlagsTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithPlainStrings:NO]; + }); + return Transformer; +} + ++ (instancetype)sharedPlainTransformer +{ + static dispatch_once_t OnceToken; + static SRModifierFlagsTransformer *Transformer = nil; + dispatch_once(&OnceToken, ^{ + Transformer = [[self alloc] initWithPlainStrings:YES]; + }); + return Transformer; +} + + +#pragma mark NSValueTransformer + ++ (Class)transformedValueClass +{ + return [NSString class]; +} + ++ (BOOL)allowsReverseTransformation +{ + return NO; +} + +- (NSString *)transformedValue:(NSNumber *)aValue +{ + if (![aValue isKindOfClass:[NSNumber class]]) + return nil; + else if (self.usesPlainStrings) + { + NSEventModifierFlags modifierFlags = [aValue unsignedIntegerValue]; + NSMutableString *s = [NSMutableString string]; + + if (modifierFlags & NSControlKeyMask) + [s appendString:SRLoc(@"Control-")]; + + if (modifierFlags & NSAlternateKeyMask) + [s appendString:SRLoc(@"Option-")]; + + if (modifierFlags & NSShiftKeyMask) + [s appendString:SRLoc(@"Shift-")]; + + if (modifierFlags & NSCommandKeyMask) + [s appendString:SRLoc(@"Command-")]; + + if (s.length > 0) + [s deleteCharactersInRange:NSMakeRange(s.length - 1, 1)]; + + return s; + } + else + { + NSEventModifierFlags f = [aValue unsignedIntegerValue]; + return [NSString stringWithFormat:@"%@%@%@%@", + (f & NSControlKeyMask ? @"⌃" : @""), + (f & NSAlternateKeyMask ? @"⌥" : @""), + (f & NSShiftKeyMask ? @"⇧" : @""), + (f & NSCommandKeyMask ? @"⌘" : @"")]; + } +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.h b/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.h new file mode 100755 index 0000000..b1d3b63 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.h @@ -0,0 +1,436 @@ +// +// SRRecorderControl.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Ilya Kulakov + +#import +#import + + +/*! + Key code. + + @discussion NSNumber representation of unsigned short. + Required key of SRRecorderControl's objectValue. + */ +extern NSString *const SRShortcutKeyCode; + +/*! + Modifier flags. + + @discussion NSNumber representation of NSEventModifierFlags. + Optional key of SRRecorderControl's objectValue. + */ +extern NSString *const SRShortcutModifierFlagsKey; + +/*! + Interpretation of key code and modifier flags depending on system locale and input source + used when shortcut was taken. + + @discussion NSString. + Optional key of SRRecorderControl's objectValue. + */ +extern NSString *const SRShortcutCharacters; + +/*! + Interpretation of key code without modifier flags depending on system locale and input source + used when shortcut was taken. + + @discussion NSString. + Optional key of SRRecorderControl's objectValue. + */ +extern NSString *const SRShortcutCharactersIgnoringModifiers; + + +@protocol SRRecorderControlDelegate; + + +/*! + An SRRecorderControl object is a control (but not a subclass of NSControl) that allows you to record shortcuts. + + @discussion In addition to NSView bindings, exposes: + NSValueBinding. This binding supports 2 options: + - NSValueTransformerBindingOption + - NSValueTransformerNameBindingOption + NSEnabledBinding. This binding supports 2 options: + - NSValueTransformerBindingOption + - NSValueTransformerNameBindingOption + Note that at that moment, this binding _is not_ multivalue. + + Required height: 25 points + Recommended min width: 100 points + */ +IB_DESIGNABLE +@interface SRRecorderControl : NSView /* */ + +/*! + The receiver’s delegate. + + @discussion A recorder control delegate responds to editing-related messages. You can use to to prevent editing + in some cases or to validate typed shortcuts. + */ +@property (assign) IBOutlet NSObject *delegate; + +/*! + Returns an integer bit field indicating allowed modifier flags. + + @discussion Defaults to SRCocoaModifierFlagsMask. + */ +@property (readonly) IBInspectable NSEventModifierFlags allowedModifierFlags; + +/*! + Returns an integer bit field indicating required modifier flags. + + @discussion Defaults to 0. + */ +@property (readonly) IBInspectable NSEventModifierFlags requiredModifierFlags; + +/*! + Determines whether shortcuts without modifier flags are allowed. + + @discussion Defaults to NO. + */ +@property (readonly) IBInspectable BOOL allowsEmptyModifierFlags; + +/*! + Determines whether the control reinterpret key code and modifier flags + using ASCII capable input source. + + @discussion Defaults to YES. + If not set, the same key code may be draw differently depending on current input source. + E.g. with US English input source key code 0x0 is interpreted as "a", + however with Russian input source, it's interpreted as "ф". + */ +@property IBInspectable BOOL drawsASCIIEquivalentOfShortcut; + +/*! + Determines whether Escape is used to cancel recording. + + @discussion Defaults to YES. + If set, Escape without modifier flags cannot be recorded as shortcut. + */ +@property IBInspectable BOOL allowsEscapeToCancelRecording; + +/*! + Determines whether delete (or forward delete) is used to remove current shortcut and end recording. + + @discussion Defaults to YES. + If set, neither Delete nor Forward Delete without modifier flags can be recorded as shortcut. + */ +@property IBInspectable BOOL allowsDeleteToClearShortcutAndEndRecording; + +/*! + Determines whether control enabled and can be edited or not. + + @discussion Defaults to YES. + */ +@property (nonatomic, getter=isEnabled) IBInspectable BOOL enabled; + +/*! + Determines whether recording is in process. + */ +@property (nonatomic, readonly) BOOL isRecording; + +/*! + Returns dictionary representation of receiver's shortcut. + */ +@property (nonatomic, copy) NSDictionary *objectValue; + +/*! + Configures recording behavior of the control. + + @param newAllowedModifierFlags New allowed modifier flags. + + @param newRequiredModifierFlags New required modifier flags. + + @param newAllowsEmptyModifierFlags Determines whether empty modifier flags are allowed. + + @discussion Flags are filtered using SRCocoaModifierFlagsMask. Flags does not affect object values set manually. + + These restrictions can be ignored if delegate implements shortcutRecorder:shouldUnconditionallyAllowModifierFlags:forKeyCode: and returns YES for given modifier flags and key code. + + Throws NSInvalidArgumentException if either required flags are not allowed + or required flags are not empty and no modifier flags are allowed. + + @see SRRecorderControlDelegate + */ +- (void)setAllowedModifierFlags:(NSEventModifierFlags)newAllowedModifierFlags + requiredModifierFlags:(NSEventModifierFlags)newRequiredModifierFlags + allowsEmptyModifierFlags:(BOOL)newAllowsEmptyModifierFlags; + +/*! + Called to initialize internal state after either initWithFrame or awakeFromNib is called. + */ +- (void)_initInternalState; + +/*! + Turns on the recording mode. + + @discussion You SHOULD not call this method directly. + */ +- (BOOL)beginRecording; + +/*! + Turns off the recording mode. Current object value is preserved. + + @discussion You SHOULD not call this method directly. + */ +- (void)endRecording; + +/*! + Clears object value and turns off the recording mode. + + @discussion You SHOULD not call this method directly. + */ +- (void)clearAndEndRecording; + +/*! + Designated method to end recording. Sets a given object value, updates bindings and turns off the recording mode. + + @discussion You SHOULD not call this method directly. + */ +- (void)endRecordingWithObjectValue:(NSDictionary *)anObjectValue; + + +/*! + Returns shape of the control. + + @discussion Primarily used to draw appropriate focus ring. + */ +- (NSBezierPath *)controlShape; + +/*! + Returns rect for label with given attributes. + + @param aLabel Label for drawing. + + @param anAttributes A dictionary of NSAttributedString text attributes to be applied to the string. + */ +- (NSRect)rectForLabel:(NSString *)aLabel withAttributes:(NSDictionary *)anAttributes; + +/*! + Returns rect of the snap back button in the receiver coordinates. + */ +- (NSRect)snapBackButtonRect; + +/*! + Returns rect of the clear button in the receiver coordinates. + + @discussion Returned rect will have empty width (other values will be valid) if button should not be drawn. + */ +- (NSRect)clearButtonRect; + + +/*! + Returns label to be displayed by the receiver. + + @discussion Returned value depends on isRecording state objectValue and currenlty pressed keys and modifier flags. + */ +- (NSString *)label; + +/*! + Returns label for accessibility. + + @discussion Returned value depends on isRecording state objectValue and currenlty pressed keys and modifier flags. + */ +- (NSString *)accessibilityLabel; + +/*! + Returns string representation of object value. + */ +- (NSString *)stringValue; + +/*! + Returns string representation of object value for accessibility. + */ +- (NSString *)accessibilityStringValue; + +/*! + Returns attirbutes of label to be displayed by the receiver according to current state. + + @see normalLabelAttributes + + @see recordingLabelAttributes + + @see disabledLabelAttributes + */ +- (NSDictionary *)labelAttributes; + +/*! + Returns attributes of label to be displayed by the receiver in normal mode. + */ +- (NSDictionary *)normalLabelAttributes; + +/*! + Returns attributes of label to be displayed by the receiver in recording mode. + */ +- (NSDictionary *)recordingLabelAttributes; + +/*! + Returns attributes of label to be displayed by the receiver in disabled mode. + */ +- (NSDictionary *)disabledLabelAttributes; + + +/*! + Draws background of the receiver into current graphics context. + */ +- (void)drawBackground:(NSRect)aDirtyRect; + +/*! + Draws interior of the receiver into current graphics context. + */ +- (void)drawInterior:(NSRect)aDirtyRect; + +/*! + Draws label of the receiver into current graphics context. + */ +- (void)drawLabel:(NSRect)aDirtyRect; + +/*! + Draws snap back button of the receiver into current graphics context. + */ +- (void)drawSnapBackButton:(NSRect)aDirtyRect; + +/*! + Draws clear button of the receiver into current graphics context. + */ +- (void)drawClearButton:(NSRect)aDirtyRect; + + +/*! + Determines whether main button (representation of the receiver in normal mode) is highlighted. + */ +- (BOOL)isMainButtonHighlighted; + +/*! + Determines whether snap back button is highlighted. + */ +- (BOOL)isSnapBackButtonHighlighted; + +/*! + Determines whetehr clear button is highlighted. + */ +- (BOOL)isClearButtonHighlighted; + +/*! + Determines whether modifier flags are valid for key code according to the receiver settings. + + @param aModifierFlags Proposed modifier flags. + + @param aKeyCode Code of the pressed key. + + @see allowedModifierFlags + + @see allowsEmptyModifierFlags + + @see requiredModifierFlags + */ +- (BOOL)areModifierFlagsValid:(NSEventModifierFlags)aModifierFlags forKeyCode:(unsigned short)aKeyCode; + +/*! + A helper method to propagate view-driven changes back to model. + + @discussion This method makes it easier to propagate changes from a view + back to the model without overriding bind:toObject:withKeyPath:options: + + @see http://tomdalling.com/blog/cocoa/implementing-your-own-cocoa-bindings/ + */ +- (void)propagateValue:(id)aValue forBinding:(NSString *)aBinding; + +@end + + +@protocol SRRecorderControlDelegate + +@optional + +/*! + Asks the delegate if editing should begin in the specified shortcut recorder. + + @param aRecorder The shortcut recorder which editing is about to begin. + + @result YES if an editing session should be initiated; otherwise, NO to disallow editing. + + @discussion Implementation of this method by the delegate is optional. If it is not present, editing proceeds as if this method had returned YES. + */ +- (BOOL)shortcutRecorderShouldBeginRecording:(SRRecorderControl *)aRecorder; + +/*! + Gives a delegate opportunity to bypass rules specified by allowed and required modifier flags. + + @param aRecorder The shortcut recorder for which editing ended. + + @param aModifierFlags Proposed modifier flags. + + @param aKeyCode Code of the pressed key. + + @result YES if recorder should bypass key code with given modifier flags despite settings like required modifier flags, allowed modifier flags. + + @discussion Implementation of this method by the delegate is optional. + Normally, you wouldn't allow a user to record shourcut without modifier flags set: disallow 'a', but allow cmd-'a'. + However, some keys were designed to be key shortcuts by itself. E.g. Functional keys. By implementing this method a delegate can allow + these special keys to be set without modifier flags even when the control is configured to disallow empty modifier flags. + + @see allowedModifierFlags + + @see allowsEmptyModifierFlags + + @see requiredModifierFlags + */ +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder shouldUnconditionallyAllowModifierFlags:(NSEventModifierFlags)aModifierFlags forKeyCode:(unsigned short)aKeyCode; + +/*! + Asks the delegate if the shortcut can be set by the specified shortcut recorder. + + @param aRecorder The shortcut recorder which shortcut is beign to be recordered. + + @param aShortcut The Shortcut user typed. + + @result YES if shortcut can be recordered. Otherwise NO. + + @discussion Implementation of this method by the delegate is optional. If it is not present, shortcut is recordered as if this method had returned YES. + You may implement this method to filter shortcuts that were already set by other recorders. + + @see SRValidator + */ +- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder canRecordShortcut:(NSDictionary *)aShortcut; + +/*! + Tells the delegate that editing stopped for the specified shortcut recorder. + + @param aRecorder The shortcut recorder for which editing ended. + + @discussion Implementation of this method by the delegate is optional. + */ +- (void)shortcutRecorderDidEndRecording:(SRRecorderControl *)aRecorder; + +@end + + +FOUNDATION_STATIC_INLINE BOOL SRShortcutEqualToShortcut(NSDictionary *a, NSDictionary *b) +{ + if (a == b) + return YES; + else if (a && !b) + return NO; + else if (!a && b) + return NO; + else + return ([a[SRShortcutKeyCode] isEqual:b[SRShortcutKeyCode]] && [a[SRShortcutModifierFlagsKey] isEqual:b[SRShortcutModifierFlagsKey]]); +} + + +FOUNDATION_STATIC_INLINE NSDictionary *SRShortcutWithCocoaModifierFlagsAndKeyCode(NSEventModifierFlags aModifierFlags, unsigned short aKeyCode) +{ + return @{SRShortcutKeyCode: @(aKeyCode), SRShortcutModifierFlagsKey: @(aModifierFlags)}; +} diff --git a/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.m b/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.m new file mode 100755 index 0000000..07b793c --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRRecorderControl.m @@ -0,0 +1,1412 @@ +// +// SRRecorderControl.m +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Ilya Kulakov + +#include + +#import "SRRecorderControl.h" +#import "SRKeyCodeTransformer.h" +#import "SRModifierFlagsTransformer.h" + + +NSString *const SRShortcutKeyCode = @"keyCode"; + +NSString *const SRShortcutModifierFlagsKey = @"modifierFlags"; + +NSString *const SRShortcutCharacters = @"characters"; + +NSString *const SRShortcutCharactersIgnoringModifiers = @"charactersIgnoringModifiers"; + + +// Control Layout Constants + +static const CGFloat _SRRecorderControlYosemiteShapeXRadius = 2.0; + +static const CGFloat _SRRecorderControlYosemiteShapeYRadius = 2.0; + +static const CGFloat _SRRecorderControlShapeXRadius = 11.0; + +static const CGFloat _SRRecorderControlShapeYRadius = 12.0; + +static const CGFloat _SRRecorderControlHeight = 25.0; + +static const CGFloat _SRRecorderControlBottomShadowHeightInPixels = 1.0; + +// TODO: see baselineOffsetFromBottom +// static const CGFloat _SRRecorderControlBaselineOffset = 5.0; + +// Clear Button Layout Constants + +static const CGFloat _SRRecorderControlClearButtonWidth = 14.0; + +static const CGFloat _SRRecorderControlClearButtonHeight = 14.0; + +static const CGFloat _SRRecorderControlClearButtonRightOffset = 4.0; + +static const CGFloat _SRRecorderControlClearButtonLeftOffset = 1.0; + +static const NSSize _SRRecorderControlClearButtonSize = {.width = _SRRecorderControlClearButtonWidth, .height = _SRRecorderControlClearButtonHeight}; + + +// SanpBack Button Layout Constants + +static const CGFloat _SRRecorderControlSnapBackButtonWidth = 14.0; + +static const CGFloat _SRRecorderControlSnapBackButtonHeight = 14.0; + +static const CGFloat _SRRecorderControlSnapBackButtonRightOffset = 1.0; + +static const CGFloat _SRRecorderControlSnapBackButtonLeftOffset = 3.0; + +static const NSSize _SRRecorderControlSnapBackButtonSize = {.width = _SRRecorderControlSnapBackButtonWidth, .height = _SRRecorderControlSnapBackButtonHeight}; + + +static NSImage *_SRImages[19]; + + +typedef NS_ENUM(NSUInteger, _SRRecorderControlButtonTag) +{ + _SRRecorderControlInvalidButtonTag = -1, + _SRRecorderControlSnapBackButtonTag = 0, + _SRRecorderControlClearButtonTag = 1, + _SRRecorderControlMainButtonTag = 2 +}; + + +@implementation SRRecorderControl +{ + NSTrackingArea *_mainButtonTrackingArea; + NSTrackingArea *_snapBackButtonTrackingArea; + NSTrackingArea *_clearButtonTrackingArea; + + _SRRecorderControlButtonTag _mouseTrackingButtonTag; + NSToolTipTag _snapBackButtonToolTipTag; + + CGFloat _shapeXRadius; + CGFloat _shapeYRadious; +} + +- (instancetype)initWithFrame:(NSRect)aFrameRect +{ + self = [super initWithFrame:aFrameRect]; + + if (self) + { + [self _initInternalState]; + } + + return self; +} + +- (void)_initInternalState +{ + _allowsEmptyModifierFlags = NO; + _drawsASCIIEquivalentOfShortcut = YES; + _allowsEscapeToCancelRecording = YES; + _allowsDeleteToClearShortcutAndEndRecording = YES; + _enabled = YES; + _allowedModifierFlags = SRCocoaModifierFlagsMask; + _requiredModifierFlags = 0; + _mouseTrackingButtonTag = _SRRecorderControlInvalidButtonTag; + _snapBackButtonToolTipTag = NSIntegerMax; + + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) + { + self.translatesAutoresizingMaskIntoConstraints = NO; + + [self setContentHuggingPriority:NSLayoutPriorityDefaultLow + forOrientation:NSLayoutConstraintOrientationHorizontal]; + [self setContentHuggingPriority:NSLayoutPriorityRequired + forOrientation:NSLayoutConstraintOrientationVertical]; + + [self setContentCompressionResistancePriority:NSLayoutPriorityDefaultLow + forOrientation:NSLayoutConstraintOrientationHorizontal]; + [self setContentCompressionResistancePriority:NSLayoutPriorityRequired + forOrientation:NSLayoutConstraintOrientationVertical]; + } + + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) + { + _shapeXRadius = _SRRecorderControlShapeXRadius; + _shapeYRadious = _SRRecorderControlShapeYRadius; + } + else + { + _shapeXRadius = _SRRecorderControlYosemiteShapeXRadius; + _shapeYRadious = _SRRecorderControlYosemiteShapeYRadius; + } + + [self setToolTip:SRLoc(@"Click to record shortcut")]; + [self updateTrackingAreas]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + + +#pragma mark Properties + +- (void)setAllowedModifierFlags:(NSEventModifierFlags)newAllowedModifierFlags + requiredModifierFlags:(NSEventModifierFlags)newRequiredModifierFlags + allowsEmptyModifierFlags:(BOOL)newAllowsEmptyModifierFlags +{ + newAllowedModifierFlags &= SRCocoaModifierFlagsMask; + newRequiredModifierFlags &= SRCocoaModifierFlagsMask; + + if ((newAllowedModifierFlags & newRequiredModifierFlags) != newRequiredModifierFlags) + { + [NSException raise:NSInvalidArgumentException + format:@"Required flags (%lu) MUST be allowed (%lu)", newAllowedModifierFlags, newRequiredModifierFlags]; + } + + if (newAllowsEmptyModifierFlags && newRequiredModifierFlags != 0) + { + [NSException raise:NSInvalidArgumentException + format:@"Empty modifier flags MUST be disallowed if required modifier flags are not empty."]; + } + + _allowedModifierFlags = newAllowedModifierFlags; + _requiredModifierFlags = newRequiredModifierFlags; + _allowsEmptyModifierFlags = newAllowsEmptyModifierFlags; +} + +- (void)setEnabled:(BOOL)newEnabled +{ + _enabled = newEnabled; + [self setNeedsDisplay:YES]; + + if (!_enabled) + [self endRecording]; + + // Focus ring is only drawn when view is enabled + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) + [self noteFocusRingMaskChanged]; +} + +- (void)setObjectValue:(NSDictionary *)newObjectValue +{ + // Cocoa KVO and KVC frequently uses NSNull as object substituation of nil. + // SRRecorderControl expects either nil or valid object value, it's convenient + // to handle NSNull here and convert it into nil. + if ((NSNull *)newObjectValue == [NSNull null]) + newObjectValue = nil; + + _objectValue = [newObjectValue copy]; + [self propagateValue:_objectValue forBinding:NSValueBinding]; + + if (!self.isRecording) + { + NSAccessibilityPostNotification(self, NSAccessibilityTitleChangedNotification); + [self setNeedsDisplay:YES]; + } +} + + +#pragma mark Methods + +- (BOOL)beginRecording +{ + if (!self.enabled) + return NO; + + if (self.isRecording) + return YES; + + [self setNeedsDisplay:YES]; + + if ([self.delegate respondsToSelector:@selector(shortcutRecorderShouldBeginRecording:)]) + { + if (![self.delegate shortcutRecorderShouldBeginRecording:self]) + { + NSBeep(); + return NO; + } + } + + [self willChangeValueForKey:@"isRecording"]; + _isRecording = YES; + [self didChangeValueForKey:@"isRecording"]; + + [self updateTrackingAreas]; + [self setToolTip:SRLoc(@"Type shortcut")]; + NSAccessibilityPostNotification(self, NSAccessibilityTitleChangedNotification); + return YES; +} + +- (void)endRecording +{ + [self endRecordingWithObjectValue:self.objectValue]; +} + +- (void)clearAndEndRecording +{ + [self endRecordingWithObjectValue:nil]; +} + +- (void)endRecordingWithObjectValue:(NSDictionary *)anObjectValue +{ + if (!self.isRecording) + return; + + [self willChangeValueForKey:@"isRecording"]; + _isRecording = NO; + [self didChangeValueForKey:@"isRecording"]; + + self.objectValue = anObjectValue; + + [self updateTrackingAreas]; + [self setToolTip:SRLoc(@"Click to record shortcut")]; + [self setNeedsDisplay:YES]; + NSAccessibilityPostNotification(self, NSAccessibilityTitleChangedNotification); + + if (self.window.firstResponder == self && ![self canBecomeKeyView]) + [self.window makeFirstResponder:nil]; + + if ([self.delegate respondsToSelector:@selector(shortcutRecorderDidEndRecording:)]) + [self.delegate shortcutRecorderDidEndRecording:self]; +} + + +#pragma mark - + +- (NSBezierPath *)controlShape +{ + NSRect shapeBounds = self.bounds; + shapeBounds.size.height = _SRRecorderControlHeight - self.alignmentRectInsets.bottom; + + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) + { + shapeBounds = NSInsetRect(shapeBounds, 1.0, 1.0); + } + + return [NSBezierPath bezierPathWithRoundedRect:shapeBounds + xRadius:_shapeXRadius + yRadius:_shapeYRadious]; +} + +- (NSRect)rectForLabel:(NSString *)aLabel withAttributes:(NSDictionary *)anAttributes +{ + NSSize labelSize = [aLabel sizeWithAttributes:anAttributes]; + NSRect enclosingRect = NSInsetRect(self.bounds, _shapeXRadius, 0.0); + labelSize.width = fmin(ceil(labelSize.width), NSWidth(enclosingRect)); + labelSize.height = ceil(labelSize.height); + CGFloat fontBaselineOffsetFromTop = labelSize.height + [anAttributes[NSFontAttributeName] descender]; + CGFloat baselineOffsetFromTop = _SRRecorderControlHeight - self.baselineOffsetFromBottom; + NSRect labelRect = { + .origin = NSMakePoint(NSMidX(enclosingRect) - labelSize.width / 2.0, baselineOffsetFromTop - fontBaselineOffsetFromTop), + .size = labelSize + }; + labelRect = [self centerScanRect:labelRect]; + + // Ensure label and buttons do not overlap. + if (self.isRecording) + { + CGFloat rightOffsetFromButtons = NSMinX(self.snapBackButtonRect) - NSMaxX(labelRect); + + if (rightOffsetFromButtons < 0.0) + { + labelRect = NSOffsetRect(labelRect, rightOffsetFromButtons, 0.0); + + if (NSMinX(labelRect) < NSMinX(enclosingRect)) + { + labelRect.size.width -= NSMinX(enclosingRect) - NSMinX(labelRect); + labelRect.origin.x = NSMinX(enclosingRect); + } + } + } + +#ifdef DEBUG + if (labelRect.size.width < labelSize.width || labelRect.size.height < labelSize.height) + NSLog(@"WARNING: label rect (%@) is smaller than label size (%@). You may want to adjust size of the control.", NSStringFromRect(labelRect), NSStringFromSize(labelSize)); +#endif + + return labelRect; +} + +- (NSRect)snapBackButtonRect +{ + NSRect clearButtonRect = self.clearButtonRect; + NSRect bounds = self.bounds; + NSRect snapBackButtonRect = NSZeroRect; + snapBackButtonRect.origin.x = NSMinX(clearButtonRect) - _SRRecorderControlSnapBackButtonRightOffset - _SRRecorderControlSnapBackButtonSize.width - _SRRecorderControlSnapBackButtonLeftOffset; + snapBackButtonRect.origin.y = NSMinY(bounds); + snapBackButtonRect.size.width = fdim(NSMinX(clearButtonRect), NSMinX(snapBackButtonRect)); + snapBackButtonRect.size.height = _SRRecorderControlHeight; + return snapBackButtonRect; +} + +- (NSRect)clearButtonRect +{ + NSRect bounds = self.bounds; + + if ([self.objectValue count]) + { + NSRect clearButtonRect = NSZeroRect; + clearButtonRect.origin.x = NSMaxX(bounds) - _SRRecorderControlClearButtonRightOffset - _SRRecorderControlClearButtonSize.width - _SRRecorderControlClearButtonLeftOffset; + clearButtonRect.origin.y = NSMinY(bounds); + clearButtonRect.size.width = fdim(NSMaxX(bounds), NSMinX(clearButtonRect)); + clearButtonRect.size.height = _SRRecorderControlHeight; + return clearButtonRect; + } + else + { + return NSMakeRect(NSMaxX(bounds) - _SRRecorderControlClearButtonRightOffset - _SRRecorderControlClearButtonLeftOffset, + NSMinY(bounds), + 0.0, + _SRRecorderControlHeight); + } +} + + +#pragma mark - + +- (NSString *)label +{ + NSString *label = nil; + + if (self.isRecording) + { + NSEventModifierFlags modifierFlags = [NSEvent modifierFlags] & self.allowedModifierFlags; + + if (modifierFlags) + label = [[SRModifierFlagsTransformer sharedTransformer] transformedValue:@(modifierFlags)]; + else + label = self.stringValue; + + if (![label length]) + label = SRLoc(@"Type shortcut"); + } + else + { + label = self.stringValue; + + if (![label length]) + label = SRLoc(@"Click to record shortcut"); + } + + return label; +} + +- (NSString *)accessibilityLabel +{ + NSString *label = nil; + + if (self.isRecording) + { + NSEventModifierFlags modifierFlags = [NSEvent modifierFlags] & self.allowedModifierFlags; + label = [[SRModifierFlagsTransformer sharedPlainTransformer] transformedValue:@(modifierFlags)]; + + if (![label length]) + label = SRLoc(@"Type shortcut"); + } + else + { + label = self.accessibilityStringValue; + + if (![label length]) + label = SRLoc(@"Click to record shortcut"); + } + + return label; +} + +- (NSString *)stringValue +{ + if (![self.objectValue count]) + return nil; + + NSString *f = [[SRModifierFlagsTransformer sharedTransformer] transformedValue:self.objectValue[SRShortcutModifierFlagsKey]]; + SRKeyCodeTransformer *transformer = nil; + + if (self.drawsASCIIEquivalentOfShortcut) + transformer = [SRKeyCodeTransformer sharedPlainASCIITransformer]; + else + transformer = [SRKeyCodeTransformer sharedPlainTransformer]; + + NSString *c = [transformer transformedValue:self.objectValue[SRShortcutKeyCode] + withImplicitModifierFlags:nil + explicitModifierFlags:self.objectValue[SRShortcutModifierFlagsKey]]; + + return [NSString stringWithFormat:@"%@%@", f, c]; +} + +- (NSString *)accessibilityStringValue +{ + if (![self.objectValue count]) + return nil; + + NSString *f = [[SRModifierFlagsTransformer sharedPlainTransformer] transformedValue:self.objectValue[SRShortcutModifierFlagsKey]]; + NSString *c = nil; + + if (self.drawsASCIIEquivalentOfShortcut) + c = [[SRKeyCodeTransformer sharedPlainASCIITransformer] transformedValue:self.objectValue[SRShortcutKeyCode]]; + else + c = [[SRKeyCodeTransformer sharedPlainTransformer] transformedValue:self.objectValue[SRShortcutKeyCode]]; + + if ([f length] > 0) + return [NSString stringWithFormat:@"%@-%@", f, c]; + else + return [NSString stringWithFormat:@"%@", c]; +} + +- (NSDictionary *)labelAttributes +{ + if (self.enabled) + { + if (self.isRecording) + return [self recordingLabelAttributes]; + else + return [self normalLabelAttributes]; + } + else + return [self disabledLabelAttributes]; +} + +- (NSDictionary *)normalLabelAttributes +{ + static dispatch_once_t OnceToken; + static NSDictionary *NormalAttributes = nil; + dispatch_once(&OnceToken, ^{ + NSMutableParagraphStyle *p = [[NSMutableParagraphStyle alloc] init]; + p.alignment = NSCenterTextAlignment; + p.lineBreakMode = NSLineBreakByTruncatingTail; + p.baseWritingDirection = NSWritingDirectionLeftToRight; + NormalAttributes = @{ + NSParagraphStyleAttributeName: [p copy], + NSFontAttributeName: [NSFont labelFontOfSize:[NSFont systemFontSize]], + NSForegroundColorAttributeName: [NSColor controlTextColor] + }; + }); + return NormalAttributes; +} + +- (NSDictionary *)recordingLabelAttributes +{ + static dispatch_once_t OnceToken; + static NSDictionary *RecordingAttributes = nil; + dispatch_once(&OnceToken, ^{ + NSMutableParagraphStyle *p = [[NSMutableParagraphStyle alloc] init]; + p.alignment = NSCenterTextAlignment; + p.lineBreakMode = NSLineBreakByTruncatingTail; + p.baseWritingDirection = NSWritingDirectionLeftToRight; + RecordingAttributes = @{ + NSParagraphStyleAttributeName: [p copy], + NSFontAttributeName: [NSFont labelFontOfSize:[NSFont systemFontSize]], + NSForegroundColorAttributeName: [NSColor disabledControlTextColor] + }; + }); + return RecordingAttributes; +} + +- (NSDictionary *)disabledLabelAttributes +{ + static dispatch_once_t OnceToken; + static NSDictionary *DisabledAttributes = nil; + dispatch_once(&OnceToken, ^{ + NSMutableParagraphStyle *p = [[NSMutableParagraphStyle alloc] init]; + p.alignment = NSCenterTextAlignment; + p.lineBreakMode = NSLineBreakByTruncatingTail; + p.baseWritingDirection = NSWritingDirectionLeftToRight; + DisabledAttributes = @{ + NSParagraphStyleAttributeName: [p copy], + NSFontAttributeName: [NSFont labelFontOfSize:[NSFont systemFontSize]], + NSForegroundColorAttributeName: [NSColor disabledControlTextColor] + }; + }); + return DisabledAttributes; +} + + +#pragma mark - + +- (void)drawBackground:(NSRect)aDirtyRect +{ + NSRect frame = self.bounds; + frame.size.height = _SRRecorderControlHeight; + + if (![self needsToDrawRect:frame]) + return; + + [NSGraphicsContext saveGraphicsState]; + + if (self.isRecording) + { + NSDrawThreePartImage(frame, + _SRImages[3], + _SRImages[4], + _SRImages[5], + NO, + NSCompositeSourceOver, + 1.0, + self.isFlipped); + } + else + { + if (self.isMainButtonHighlighted) + { + if ([NSColor currentControlTint] == NSBlueControlTint) + { + NSDrawThreePartImage(frame, + _SRImages[0], + _SRImages[1], + _SRImages[2], + NO, + NSCompositeSourceOver, + 1.0, + self.isFlipped); + } + else + { + NSDrawThreePartImage(frame, + _SRImages[6], + _SRImages[7], + _SRImages[8], + NO, + NSCompositeSourceOver, + 1.0, + self.isFlipped); + } + } + else if (self.enabled) + { + NSDrawThreePartImage(frame, + _SRImages[9], + _SRImages[10], + _SRImages[11], + NO, + NSCompositeSourceOver, + 1.0, + self.isFlipped); + } + else + { + NSDrawThreePartImage(frame, + _SRImages[16], + _SRImages[17], + _SRImages[18], + NO, + NSCompositeSourceOver, + 1.0, + self.isFlipped); + } + } + + [NSGraphicsContext restoreGraphicsState]; +} + +- (void)drawInterior:(NSRect)aDirtyRect +{ + [self drawLabel:aDirtyRect]; + + if (self.isRecording) + { + [self drawSnapBackButton:aDirtyRect]; + [self drawClearButton:aDirtyRect]; + } +} + +- (void)drawLabel:(NSRect)aDirtyRect +{ + NSString *label = self.label; + NSDictionary *labelAttributes = self.labelAttributes; + NSRect labelRect = [self rectForLabel:label withAttributes:labelAttributes]; + + if (![self needsToDrawRect:labelRect]) + return; + + [NSGraphicsContext saveGraphicsState]; + [label drawInRect:labelRect withAttributes:labelAttributes]; + [NSGraphicsContext restoreGraphicsState]; +} + +- (void)drawSnapBackButton:(NSRect)aDirtyRect +{ + NSRect imageRect = self.snapBackButtonRect; + imageRect.origin.x += _SRRecorderControlSnapBackButtonLeftOffset; + imageRect.origin.y += floor(self.alignmentRectInsets.top + (NSHeight(imageRect) - _SRRecorderControlSnapBackButtonSize.height) / 2.0); + imageRect.size = _SRRecorderControlSnapBackButtonSize; + imageRect = [self centerScanRect:imageRect]; + + if (![self needsToDrawRect:imageRect]) + return; + + [NSGraphicsContext saveGraphicsState]; + + if (self.isSnapBackButtonHighlighted) + { + [_SRImages[14] drawInRect:imageRect + fromRect:NSZeroRect + operation:NSCompositeSourceOver + fraction:1.0]; + } + else + { + [_SRImages[15] drawInRect:imageRect + fromRect:NSZeroRect + operation:NSCompositeSourceOver + fraction:1.0]; + } + + [NSGraphicsContext restoreGraphicsState]; +} + +- (void)drawClearButton:(NSRect)aDirtyRect +{ + NSRect imageRect = self.clearButtonRect; + + // If there is no reason to draw clear button (e.g. no shortcut was set) + // rect will have empty width. + if (NSWidth(imageRect) == 0.0) + return; + + imageRect.origin.x += _SRRecorderControlClearButtonLeftOffset; + imageRect.origin.y += floor(self.alignmentRectInsets.top + (NSHeight(imageRect) - _SRRecorderControlClearButtonSize.height) / 2.0); + imageRect.size = _SRRecorderControlClearButtonSize; + imageRect = [self centerScanRect:imageRect]; + + if (![self needsToDrawRect:imageRect]) + return; + + [NSGraphicsContext saveGraphicsState]; + + if (self.isClearButtonHighlighted) + { + [_SRImages[12] drawInRect:imageRect + fromRect:NSZeroRect + operation:NSCompositeSourceOver + fraction:1.0]; + } + else + { + [_SRImages[13] drawInRect:imageRect + fromRect:NSZeroRect + operation:NSCompositeSourceOver + fraction:1.0]; + } + + [NSGraphicsContext restoreGraphicsState]; +} + +- (CGFloat)backingScaleFactor +{ + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6 || self.window == nil) + return 1.0; + else + return self.window.backingScaleFactor; +} + + +#pragma mark - + +- (BOOL)isMainButtonHighlighted +{ + if (_mouseTrackingButtonTag == _SRRecorderControlMainButtonTag) + { + NSPoint locationInView = [self convertPoint:self.window.mouseLocationOutsideOfEventStream + fromView:nil]; + return [self mouse:locationInView inRect:self.bounds]; + } + else + return NO; +} + +- (BOOL)isSnapBackButtonHighlighted +{ + if (_mouseTrackingButtonTag == _SRRecorderControlSnapBackButtonTag) + { + NSPoint locationInView = [self convertPoint:self.window.mouseLocationOutsideOfEventStream + fromView:nil]; + return [self mouse:locationInView inRect:self.snapBackButtonRect]; + } + else + return NO; +} + +- (BOOL)isClearButtonHighlighted +{ + if (_mouseTrackingButtonTag == _SRRecorderControlClearButtonTag) + { + NSPoint locationInView = [self convertPoint:self.window.mouseLocationOutsideOfEventStream + fromView:nil]; + return [self mouse:locationInView inRect:self.clearButtonRect]; + } + else + return NO; +} + +- (BOOL)areModifierFlagsValid:(NSEventModifierFlags)aModifierFlags forKeyCode:(unsigned short)aKeyCode +{ + aModifierFlags &= SRCocoaModifierFlagsMask; + + if ([self.delegate respondsToSelector:@selector(shortcutRecorder:shouldUnconditionallyAllowModifierFlags:forKeyCode:)] && + [self.delegate shortcutRecorder:self shouldUnconditionallyAllowModifierFlags:aModifierFlags forKeyCode:aKeyCode]) + { + return YES; + } + else if (aModifierFlags == 0 && !self.allowsEmptyModifierFlags) + return NO; + else if ((aModifierFlags & self.requiredModifierFlags) != self.requiredModifierFlags) + return NO; + else if ((aModifierFlags & self.allowedModifierFlags) != aModifierFlags) + return NO; + else + return YES; +} + + +#pragma mark - + +- (void)propagateValue:(id)aValue forBinding:(NSString *)aBinding +{ + NSParameterAssert(aBinding != nil); + + NSDictionary* bindingInfo = [self infoForBinding:aBinding]; + + if(!bindingInfo || (id)bindingInfo == [NSNull null]) + return; + + NSObject *boundObject = bindingInfo[NSObservedObjectKey]; + + if(!boundObject || (id)boundObject == [NSNull null]) + [NSException raise:NSInternalInconsistencyException format:@"NSObservedObjectKey MUST NOT be nil for binding \"%@\"", aBinding]; + + NSString* boundKeyPath = bindingInfo[NSObservedKeyPathKey]; + + if(!boundKeyPath || (id)boundKeyPath == [NSNull null]) + [NSException raise:NSInternalInconsistencyException format:@"NSObservedKeyPathKey MUST NOT be nil for binding \"%@\"", aBinding]; + + NSDictionary* bindingOptions = bindingInfo[NSOptionsKey]; + + if(bindingOptions) + { + NSValueTransformer* transformer = [bindingOptions valueForKey:NSValueTransformerBindingOption]; + + if(!transformer || (id)transformer == [NSNull null]) + { + NSString* transformerName = [bindingOptions valueForKey:NSValueTransformerNameBindingOption]; + + if(transformerName && (id)transformerName != [NSNull null]) + transformer = [NSValueTransformer valueTransformerForName:transformerName]; + } + + if(transformer && (id)transformer != [NSNull null]) + { + if([[transformer class] allowsReverseTransformation]) + aValue = [transformer reverseTransformedValue:aValue]; +#ifdef DEBUG + else + NSLog(@"WARNING: binding \"%@\" has value transformer, but it doesn't allow reverse transformations in %s", aBinding, __PRETTY_FUNCTION__); +#endif + } + } + + [boundObject setValue:aValue forKeyPath:boundKeyPath]; +} + ++ (BOOL)automaticallyNotifiesObserversOfValue +{ + return NO; +} + +- (void)setValue:(id)newValue +{ + if (NSIsControllerMarker(newValue)) + [NSException raise:NSInternalInconsistencyException format:@"SRRecorderControl's NSValueBinding does not support controller value markers."]; + + self.objectValue = newValue; +} + +- (id)value +{ + return self.objectValue; +} + + +#pragma mark NSAccessibility + +- (BOOL)accessibilityIsIgnored +{ + return NO; +} + +- (NSArray *)accessibilityAttributeNames +{ + static NSArray *AttributeNames = nil; + static dispatch_once_t OnceToken; + dispatch_once(&OnceToken, ^ + { + AttributeNames = [[super accessibilityAttributeNames] mutableCopy]; + NSArray *newAttributes = @[ + NSAccessibilityRoleAttribute, + NSAccessibilityTitleAttribute, + NSAccessibilityEnabledAttribute + ]; + + for (NSString *attributeName in newAttributes) + { + if (![AttributeNames containsObject:attributeName]) + [(NSMutableArray *)AttributeNames addObject:attributeName]; + } + + AttributeNames = [AttributeNames copy]; + }); + return AttributeNames; +} + +- (id)accessibilityAttributeValue:(NSString *)anAttributeName +{ + if ([anAttributeName isEqualToString:NSAccessibilityRoleAttribute]) + return NSAccessibilityButtonRole; + else if ([anAttributeName isEqualToString:NSAccessibilityTitleAttribute]) + return self.accessibilityLabel; + else if ([anAttributeName isEqualToString:NSAccessibilityEnabledAttribute]) + return @(self.enabled); + else + return [super accessibilityAttributeValue:anAttributeName]; +} + +- (NSArray *)accessibilityActionNames +{ + static NSArray *AllActions = nil; + static NSArray *ButtonStateActionNames = nil; + static NSArray *RecorderStateActionNames = nil; + + static dispatch_once_t OnceToken; + dispatch_once(&OnceToken, ^ + { + AllActions = @[ + NSAccessibilityPressAction, + NSAccessibilityCancelAction, + NSAccessibilityDeleteAction + ]; + + ButtonStateActionNames = @[ + NSAccessibilityPressAction + ]; + + RecorderStateActionNames = @[ + NSAccessibilityCancelAction, + NSAccessibilityDeleteAction + ]; + }); + + // List of supported actions names must be fixed for 10.6, but can vary for 10.7 and above. + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) + { + if (self.enabled) + { + if (self.isRecording) + return RecorderStateActionNames; + else + return ButtonStateActionNames; + } + else + return @[]; + } + else + return AllActions; +} + +- (NSString *)accessibilityActionDescription:(NSString *)anAction +{ + return NSAccessibilityActionDescription(anAction); +} + +- (void)accessibilityPerformAction:(NSString *)anAction +{ + if ([anAction isEqualToString:NSAccessibilityPressAction]) + [self beginRecording]; + else if (self.isRecording && [anAction isEqualToString:NSAccessibilityCancelAction]) + [self endRecording]; + else if (self.isRecording && [anAction isEqualToString:NSAccessibilityDeleteAction]) + [self clearAndEndRecording]; +} + + +#pragma mark NSToolTipOwner + +- (NSString *)view:(NSView *)aView stringForToolTip:(NSToolTipTag)aTag point:(NSPoint)aPoint userData:(void *)aData +{ + if (aTag == _snapBackButtonToolTipTag) + return SRLoc(@"Use old shortcut"); + else + return [super view:aView stringForToolTip:aTag point:aPoint userData:aData]; +} + + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)aCoder +{ + // Since Xcode 6.x, user can configure xib to Prefer Coder. + // In that case view will be instantiated with initWithCoder. + // + // awakeFromNib cannot be used to set up defaults for IBDesignable, + // because at the time it's called, it's impossible to know whether properties + // were set by a user in xib or they are compilation-time defaults. + self = [super initWithCoder:aCoder]; + + if (self) + { + [self _initInternalState]; + } + + return self; +} + + +#pragma mark NSView + +- (BOOL)isOpaque +{ + return NO; +} + +- (BOOL)isFlipped +{ + return YES; +} + +- (void)viewWillDraw +{ + [super viewWillDraw]; + + static dispatch_once_t OnceToken; + dispatch_once(&OnceToken, ^{ + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_9) + { + _SRImages[0] = SRImage(@"shortcut-recorder-bezel-blue-highlighted-left"); + _SRImages[1] = SRImage(@"shortcut-recorder-bezel-blue-highlighted-middle"); + _SRImages[2] = SRImage(@"shortcut-recorder-bezel-blue-highlighted-right"); + _SRImages[3] = SRImage(@"shortcut-recorder-bezel-editing-left"); + _SRImages[4] = SRImage(@"shortcut-recorder-bezel-editing-middle"); + _SRImages[5] = SRImage(@"shortcut-recorder-bezel-editing-right"); + _SRImages[6] = SRImage(@"shortcut-recorder-bezel-graphite-highlight-mask-left"); + _SRImages[7] = SRImage(@"shortcut-recorder-bezel-graphite-highlight-mask-middle"); + _SRImages[8] = SRImage(@"shortcut-recorder-bezel-graphite-highlight-mask-right"); + _SRImages[9] = SRImage(@"shortcut-recorder-bezel-left"); + _SRImages[10] = SRImage(@"shortcut-recorder-bezel-middle"); + _SRImages[11] = SRImage(@"shortcut-recorder-bezel-right"); + _SRImages[12] = SRImage(@"shortcut-recorder-clear-highlighted"); + _SRImages[13] = SRImage(@"shortcut-recorder-clear"); + _SRImages[14] = SRImage(@"shortcut-recorder-snapback-highlighted"); + _SRImages[15] = SRImage(@"shortcut-recorder-snapback"); + _SRImages[16] = SRImage(@"shortcut-recorder-bezel-disabled-left"); + _SRImages[17] = SRImage(@"shortcut-recorder-bezel-disabled-middle"); + _SRImages[18] = SRImage(@"shortcut-recorder-bezel-disabled-right"); + } + else + { + _SRImages[0] = SRImage(@"shortcut-recorder-yosemite-bezel-blue-highlighted-left"); + _SRImages[1] = SRImage(@"shortcut-recorder-yosemite-bezel-blue-highlighted-middle"); + _SRImages[2] = SRImage(@"shortcut-recorder-yosemite-bezel-blue-highlighted-right"); + _SRImages[3] = SRImage(@"shortcut-recorder-yosemite-bezel-editing-left"); + _SRImages[4] = SRImage(@"shortcut-recorder-yosemite-bezel-editing-middle"); + _SRImages[5] = SRImage(@"shortcut-recorder-yosemite-bezel-editing-right"); + _SRImages[6] = SRImage(@"shortcut-recorder-yosemite-bezel-graphite-highlight-mask-left"); + _SRImages[7] = SRImage(@"shortcut-recorder-yosemite-bezel-graphite-highlight-mask-middle"); + _SRImages[8] = SRImage(@"shortcut-recorder-yosemite-bezel-graphite-highlight-mask-right"); + _SRImages[9] = SRImage(@"shortcut-recorder-yosemite-bezel-left"); + _SRImages[10] = SRImage(@"shortcut-recorder-yosemite-bezel-middle"); + _SRImages[11] = SRImage(@"shortcut-recorder-yosemite-bezel-right"); + _SRImages[12] = SRImage(@"shortcut-recorder-yosemite-clear-highlighted"); + _SRImages[13] = SRImage(@"shortcut-recorder-yosemite-clear"); + _SRImages[14] = SRImage(@"shortcut-recorder-yosemite-snapback-highlighted"); + _SRImages[15] = SRImage(@"shortcut-recorder-yosemite-snapback"); + _SRImages[16] = SRImage(@"shortcut-recorder-yosemite-bezel-disabled-left"); + _SRImages[17] = SRImage(@"shortcut-recorder-yosemite-bezel-disabled-middle"); + _SRImages[18] = SRImage(@"shortcut-recorder-yosemite-bezel-disabled-right"); + } + }); +} + +- (void)drawRect:(NSRect)aDirtyRect +{ + [self drawBackground:aDirtyRect]; + [self drawInterior:aDirtyRect]; + + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6) + { + if (self.enabled && self.window.firstResponder == self) + { + [NSGraphicsContext saveGraphicsState]; + NSSetFocusRingStyle(NSFocusRingOnly); + [self.controlShape fill]; + [NSGraphicsContext restoreGraphicsState]; + } + } +} + +- (void)drawFocusRingMask +{ + if (self.enabled && self.window.firstResponder == self) + [self.controlShape fill]; +} + +- (NSRect)focusRingMaskBounds +{ + if (self.enabled && self.window.firstResponder == self) + return self.controlShape.bounds; + else + return NSZeroRect; +} + +- (NSEdgeInsets)alignmentRectInsets +{ + return NSEdgeInsetsMake(0.0, 0.0, _SRRecorderControlBottomShadowHeightInPixels / self.backingScaleFactor, 0.0); +} + +- (CGFloat)baselineOffsetFromBottom +{ + // True method to calculate is presented below. Unfortunately Cocoa implementation of Mac OS X 10.8.2 expects this value to be persistant. + // If baselineOffsetFromBottom depends on some other properties and may return different values for different calls, + // NSLayoutFormatAlignAllBaseline may not work. For this reason we return the constant. + // If you're going to change layout of the view, uncomment the line below, look what it typically returns and update the constant. + // TODO: Hopefully it will be fixed some day in Cocoa and therefore in SRRecorderControl. +// CGFloat baseline = fdim(NSHeight(self.bounds), _SRRecorderControlHeight) + floor(_SRRecorderControlBaselineOffset - [self.labelAttributes[NSFontAttributeName] descender]); + return 8.0; +} + +- (NSSize)intrinsicContentSize +{ + return NSMakeSize(NSWidth([self rectForLabel:SRLoc(@"Click to record shortcut") withAttributes:self.normalLabelAttributes]) + _shapeXRadius + _shapeXRadius, + _SRRecorderControlHeight); +} + +- (void)updateTrackingAreas +{ + static const NSTrackingAreaOptions TrackingOptions = NSTrackingMouseEnteredAndExited | NSTrackingActiveWhenFirstResponder | NSTrackingEnabledDuringMouseDrag; + + if (_mainButtonTrackingArea) + [self removeTrackingArea:_mainButtonTrackingArea]; + + _mainButtonTrackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds + options:TrackingOptions + owner:self + userInfo:nil]; + [self addTrackingArea:_mainButtonTrackingArea]; + + if (_snapBackButtonTrackingArea) + { + [self removeTrackingArea:_snapBackButtonTrackingArea]; + _snapBackButtonTrackingArea = nil; + } + + if (_clearButtonTrackingArea) + { + [self removeTrackingArea:_clearButtonTrackingArea]; + _clearButtonTrackingArea = nil; + } + + if (_snapBackButtonToolTipTag != NSIntegerMax) + { + [self removeToolTip:_snapBackButtonToolTipTag]; + _snapBackButtonToolTipTag = NSIntegerMax; + } + + if (self.isRecording) + { + _snapBackButtonTrackingArea = [[NSTrackingArea alloc] initWithRect:self.snapBackButtonRect + options:TrackingOptions + owner:self + userInfo:nil]; + [self addTrackingArea:_snapBackButtonTrackingArea]; + _clearButtonTrackingArea = [[NSTrackingArea alloc] initWithRect:self.clearButtonRect + options:TrackingOptions + owner:self + userInfo:nil]; + [self addTrackingArea:_clearButtonTrackingArea]; + + // Since this method is used to set up tracking rects of aux buttons, the rest of the code is aware + // it should be called whenever geometry or apperance changes. Therefore it's a good place to set up tooltip rects. + _snapBackButtonToolTipTag = [self addToolTipRect:[_snapBackButtonTrackingArea rect] owner:self userData:NULL]; + } +} + +- (void)viewWillMoveToWindow:(NSWindow *)aWindow +{ + // We want control to end recording whenever window resigns first responder status. + // Otherwise we could end up with "dangling" recording. + if (self.window) + { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:NSWindowDidResignKeyNotification + object:self.window]; + } + + if (aWindow) + { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(endRecording) + name:NSWindowDidResignKeyNotification + object:aWindow]; + } + + [super viewWillMoveToWindow:aWindow]; +} + + +#pragma mark NSResponder + +- (BOOL)acceptsFirstResponder +{ + return self.enabled; +} + +- (BOOL)becomeFirstResponder +{ + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6) + [self setKeyboardFocusRingNeedsDisplayInRect:self.bounds]; + + return [super becomeFirstResponder]; +} + +- (BOOL)resignFirstResponder +{ + if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6) + [self setKeyboardFocusRingNeedsDisplayInRect:self.bounds]; + + [self endRecording]; + _mouseTrackingButtonTag = _SRRecorderControlInvalidButtonTag; + return [super resignFirstResponder]; +} + +- (BOOL)acceptsFirstMouse:(NSEvent *)anEvent +{ + return YES; +} + +- (BOOL)canBecomeKeyView +{ + // SRRecorderControl uses the button metaphor, but buttons cannot become key unless + // Full Keyboard Access is enabled. Respect this. + return [super canBecomeKeyView] && [NSApp isFullKeyboardAccessEnabled]; +} + +- (BOOL)needsPanelToBecomeKey +{ + return YES; +} + +- (void)mouseDown:(NSEvent *)anEvent +{ + if (!self.enabled) + { + [super mouseDown:anEvent]; + return; + } + + NSPoint locationInView = [self convertPoint:anEvent.locationInWindow fromView:nil]; + + if (self.isRecording) + { + if ([self mouse:locationInView inRect:self.snapBackButtonRect]) + { + _mouseTrackingButtonTag = _SRRecorderControlSnapBackButtonTag; + [self setNeedsDisplayInRect:self.snapBackButtonRect]; + } + else if ([self mouse:locationInView inRect:self.clearButtonRect]) + { + _mouseTrackingButtonTag = _SRRecorderControlClearButtonTag; + [self setNeedsDisplayInRect:self.clearButtonRect]; + } + else + [super mouseDown:anEvent]; + } + else if ([self mouse:locationInView inRect:self.bounds]) + { + _mouseTrackingButtonTag = _SRRecorderControlMainButtonTag; + [self setNeedsDisplay:YES]; + } + else + [super mouseDown:anEvent]; +} + +- (void)mouseUp:(NSEvent *)anEvent +{ + if (!self.enabled) + { + [super mouseUp:anEvent]; + return; + } + + if (_mouseTrackingButtonTag != _SRRecorderControlInvalidButtonTag) + { + if (!self.window.isKeyWindow) + { + // It's possible to receive this event after window resigned its key status + // e.g. when shortcut brings new window and makes it key. + [self setNeedsDisplay:YES]; + } + else + { + NSPoint locationInView = [self convertPoint:anEvent.locationInWindow fromView:nil]; + + if (_mouseTrackingButtonTag == _SRRecorderControlMainButtonTag && + [self mouse:locationInView inRect:self.bounds]) + { + [self beginRecording]; + } + else if (_mouseTrackingButtonTag == _SRRecorderControlSnapBackButtonTag && + [self mouse:locationInView inRect:self.snapBackButtonRect]) + { + [self endRecording]; + } + else if (_mouseTrackingButtonTag == _SRRecorderControlClearButtonTag && + [self mouse:locationInView inRect:self.clearButtonRect]) + { + [self clearAndEndRecording]; + } + } + + _mouseTrackingButtonTag = _SRRecorderControlInvalidButtonTag; + } + else + [super mouseUp:anEvent]; +} + +- (void)mouseEntered:(NSEvent *)anEvent +{ + if (!self.enabled) + { + [super mouseEntered:anEvent]; + return; + } + + if ((_mouseTrackingButtonTag == _SRRecorderControlMainButtonTag && anEvent.trackingArea == _mainButtonTrackingArea) || + (_mouseTrackingButtonTag == _SRRecorderControlSnapBackButtonTag && anEvent.trackingArea == _snapBackButtonTrackingArea) || + (_mouseTrackingButtonTag == _SRRecorderControlClearButtonTag && anEvent.trackingArea == _clearButtonTrackingArea)) + { + [self setNeedsDisplayInRect:anEvent.trackingArea.rect]; + } + + [super mouseEntered:anEvent]; +} + +- (void)mouseExited:(NSEvent *)anEvent +{ + if (!self.enabled) + { + [super mouseExited:anEvent]; + return; + } + + if ((_mouseTrackingButtonTag == _SRRecorderControlMainButtonTag && anEvent.trackingArea == _mainButtonTrackingArea) || + (_mouseTrackingButtonTag == _SRRecorderControlSnapBackButtonTag && anEvent.trackingArea == _snapBackButtonTrackingArea) || + (_mouseTrackingButtonTag == _SRRecorderControlClearButtonTag && anEvent.trackingArea == _clearButtonTrackingArea)) + { + [self setNeedsDisplayInRect:anEvent.trackingArea.rect]; + } + + [super mouseExited:anEvent]; +} + +- (void)keyDown:(NSEvent *)anEvent +{ + if (![self performKeyEquivalent:anEvent]) + [super keyDown:anEvent]; +} + +- (BOOL)performKeyEquivalent:(NSEvent *)anEvent +{ + if (!self.enabled) + return NO; + + if (self.window.firstResponder != self) + return NO; + + if (_mouseTrackingButtonTag != _SRRecorderControlInvalidButtonTag) + return NO; + + if (self.isRecording) + { + if (anEvent.keyCode == USHRT_MAX) + { + // This shouldn't really happen ever, but was rarely observed. + // See https://github.com/Kentzo/ShortcutRecorder/issues/40 + return NO; + } + else if (self.allowsEscapeToCancelRecording && + anEvent.keyCode == kVK_Escape && + (anEvent.modifierFlags & SRCocoaModifierFlagsMask) == 0) + { + [self endRecording]; + return YES; + } + else if (self.allowsDeleteToClearShortcutAndEndRecording && + (anEvent.keyCode == kVK_Delete || anEvent.keyCode == kVK_ForwardDelete) && + (anEvent.modifierFlags & SRCocoaModifierFlagsMask) == 0) + { + [self clearAndEndRecording]; + return YES; + } + else if ([self areModifierFlagsValid:anEvent.modifierFlags forKeyCode:anEvent.keyCode]) + { + NSDictionary *newObjectValue = @{ + SRShortcutKeyCode: @(anEvent.keyCode), + SRShortcutModifierFlagsKey: @(anEvent.modifierFlags & SRCocoaModifierFlagsMask), + SRShortcutCharacters: anEvent.characters, + SRShortcutCharactersIgnoringModifiers: anEvent.charactersIgnoringModifiers + }; + + if ([self.delegate respondsToSelector:@selector(shortcutRecorder:canRecordShortcut:)]) + { + if (![self.delegate shortcutRecorder:self canRecordShortcut:newObjectValue]) + { + // We acutally handled key equivalent, because client likely performs some action + // to represent an error (e.g. beep and error dialog). + // Do not end editing, because if client do not use additional window to show an error + // first responder will not change. Allow a user to make another attempt. + return YES; + } + } + + [self endRecordingWithObjectValue:newObjectValue]; + return YES; + } + } + else if (anEvent.keyCode == kVK_Space) + return [self beginRecording]; + + return NO; +} + +- (void)flagsChanged:(NSEvent *)anEvent +{ + if (self.isRecording) + { + NSEventModifierFlags modifierFlags = anEvent.modifierFlags & SRCocoaModifierFlagsMask; + if (modifierFlags != 0 && ![self areModifierFlagsValid:modifierFlags forKeyCode:anEvent.keyCode]) + NSBeep(); + + [self setNeedsDisplay:YES]; + } + + [super flagsChanged:anEvent]; +} + + +#pragma mark NSObject + ++ (void)initialize +{ + if (self == [SRRecorderControl class]) + { + [self exposeBinding:NSValueBinding]; + [self exposeBinding:NSEnabledBinding]; + } +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRValidator.h b/Clocker/ShortcutRecorder-master/Library/SRValidator.h new file mode 100755 index 0000000..ac85a71 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRValidator.h @@ -0,0 +1,131 @@ +// +// SRValidator.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim +// Silvio Rizzi +// Ilya Kulakov + +#import + + +@protocol SRValidatorDelegate; + +/*! + Implements logic to check whether shortcut is taken by other parts of the application and system. + */ +@interface SRValidator : NSObject + +@property (assign) NSObject *delegate; + +- (instancetype)initWithDelegate:(NSObject *)aDelegate; + +/*! + Determines whether shortcut is taken. + + @discussion Key is checked in the following order: + 1. If delegate implements shortcutValidator:isKeyCode:andFlagsTaken:reason: + 2. If delegate allows system-wide shortcuts are checked + 3. If delegate allows application menu it checked + + @see SRValidatorDelegate + */ +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags error:(NSError **)outError; + +/*! + Determines whether shortcut is taken in delegate. + + @discussion If delegate does not implement appropriate method, returns immediately. + */ +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagTakenInDelegate:(NSEventModifierFlags)aFlags error:(NSError **)outError; + +/*! + Determines whether shortcut is taken by system-wide shortcuts. + + @discussion Does not check whether delegate allows or disallows checking in system shortcuts. + */ +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTakenInSystemShortcuts:(NSEventModifierFlags)aFlags error:(NSError **)outError; + +/*! + Determines whether shortcut is taken by application menu item. + + @discussion Does not check whether delegate allows or disallows checking in application menu. + */ +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlags:(NSEventModifierFlags)aFlags takenInMenu:(NSMenu *)aMenu error:(NSError **)outError; + +@end + + +@protocol SRValidatorDelegate + +@optional + +/*! + Asks the delegate if aKeyCode and aFlags are valid. + + @param aValidator The validator that validates key code and flags. + + @param aKeyCode Key code to validate. + + @param aFlags Flags to validate. + + @param outReason If delegate decides that shortcut is invalid, it may pass here an error message. + + @result YES if shortcut is valid. Otherwise NO. + + @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. + */ +- (BOOL)shortcutValidator:(SRValidator *)aValidator isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags reason:(NSString **)outReason; + +/*! + Asks the delegate whether validator should check key equivalents of app's menu items. + + @param aValidator The validator that going to check app's menu items. + + @result YES if validator should check key equivalents of app's menu items. Otherwise NO. + + @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. + */ +- (BOOL)shortcutValidatorShouldCheckMenu:(SRValidator *)aValidator; + +/*! + Asks the delegate whether it should check system shortcuts. + + @param aValidator The validator that going to check system shortcuts. + + @result YES if validator should check system shortcuts. Otherwise NO. + + @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. + */ +- (BOOL)shortcutValidatorShouldCheckSystemShortcuts:(SRValidator *)aValidator; + +/*! + Asks the delegate whether it should use ASCII representation of key code when making error messages. + + @param aValidator The validator that is about to make an error message. + + @result YES if validator should use ASCII representation. Otherwise NO. + + @discussion Implementation of this method by the delegate is optional. If it is not present, ASCII representation of key code is used. + */ +- (BOOL)shortcutValidatorShouldUseASCIIStringForKeyCodes:(SRValidator *)aValidator; + +@end + + +@interface NSMenuItem (SRValidator) + +/*! + Returns full path to the menu item. E.g. "Window ➝ Zoom" + */ +- (NSString *)SR_path; + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/SRValidator.m b/Clocker/ShortcutRecorder-master/Library/SRValidator.m new file mode 100755 index 0000000..6172170 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/SRValidator.m @@ -0,0 +1,233 @@ +// +// SRValidator.h +// ShortcutRecorder +// +// Copyright 2006-2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors: +// David Dauer +// Jesper +// Jamie Kirkpatrick +// Andy Kim +// Silvio Rizzi +// Ilya Kulakov + +#import "SRValidator.h" +#import "SRCommon.h" +#import "SRKeyCodeTransformer.h" + + +@implementation SRValidator + +- (instancetype)initWithDelegate:(NSObject *)aDelegate; +{ + self = [super init]; + + if (self) + { + _delegate = aDelegate; + } + + return self; +} + +- (instancetype)init +{ + return [self initWithDelegate:nil]; +} + + +#pragma mark Methods + +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags error:(NSError **)outError; +{ + if ([self isKeyCode:aKeyCode andFlagTakenInDelegate:aFlags error:outError]) + return YES; + + if ((![self.delegate respondsToSelector:@selector(shortcutValidatorShouldCheckSystemShortcuts:)] || + [self.delegate shortcutValidatorShouldCheckSystemShortcuts:self]) && + [self isKeyCode:aKeyCode andFlagsTakenInSystemShortcuts:aFlags error:outError]) + { + return YES; + } + + if ((![self.delegate respondsToSelector:@selector(shortcutValidatorShouldCheckMenu:)] || + [self.delegate shortcutValidatorShouldCheckMenu:self]) && + [self isKeyCode:aKeyCode andFlags:aFlags takenInMenu:[NSApp mainMenu] error:outError]) + { + return YES; + } + + return NO; +} + +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagTakenInDelegate:(NSEventModifierFlags)aFlags error:(NSError **)outError +{ + if (self.delegate) + { + NSString *delegateReason = nil; + if ([self.delegate respondsToSelector:@selector(shortcutValidator:isKeyCode:andFlagsTaken:reason:)] && + [self.delegate shortcutValidator:self + isKeyCode:aKeyCode + andFlagsTaken:aFlags + reason:&delegateReason]) + { + if (outError) + { + BOOL isASCIIOnly = YES; + + if ([self.delegate respondsToSelector:@selector(shortcutValidatorShouldUseASCIIStringForKeyCodes:)]) + isASCIIOnly = [self.delegate shortcutValidatorShouldUseASCIIStringForKeyCodes:self]; + + NSString *shortcut = isASCIIOnly ? SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode) : SRReadableStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode); + NSString *failureReason = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used!"), + shortcut]; + NSString *description = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used because %@."), + shortcut, + [delegateReason length] ? delegateReason : @"it's already used"]; + NSDictionary *userInfo = @{ + NSLocalizedFailureReasonErrorKey : failureReason, + NSLocalizedDescriptionKey: description + }; + *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + + return YES; + } + } + + return NO; +} + +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTakenInSystemShortcuts:(NSEventModifierFlags)aFlags error:(NSError **)outError +{ + CFArrayRef s = NULL; + OSStatus err = CopySymbolicHotKeys(&s); + + if (err != noErr) + return YES; + + NSArray *symbolicHotKeys = (NSArray *)CFBridgingRelease(s); + aFlags &= SRCocoaModifierFlagsMask; + + for (NSDictionary *symbolicHotKey in symbolicHotKeys) + { + if ((__bridge CFBooleanRef)symbolicHotKey[(__bridge NSString *)kHISymbolicHotKeyEnabled] != kCFBooleanTrue) + continue; + + unsigned short symbolicHotKeyCode = [symbolicHotKey[(__bridge NSString *)kHISymbolicHotKeyCode] integerValue]; + + if (symbolicHotKeyCode == aKeyCode) + { + UInt32 symbolicHotKeyFlags = [symbolicHotKey[(__bridge NSString *)kHISymbolicHotKeyModifiers] unsignedIntValue]; + symbolicHotKeyFlags &= SRCarbonModifierFlagsMask; + + if (SRCarbonToCocoaFlags(symbolicHotKeyFlags) == aFlags) + { + if (outError) + { + BOOL isASCIIOnly = YES; + + if ([self.delegate respondsToSelector:@selector(shortcutValidatorShouldUseASCIIStringForKeyCodes:)]) + isASCIIOnly = [self.delegate shortcutValidatorShouldUseASCIIStringForKeyCodes:self]; + + NSString *shortcut = isASCIIOnly ? SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode) : SRReadableStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode); + NSString *failureReason = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used!"), + shortcut]; + NSString *description = [NSString stringWithFormat: + SRLoc(@"The key combination \"%@\" can't be used because it's already used by a system-wide keyboard shortcut. If you really want to use this key combination, most shortcuts can be changed in the Keyboard panel in System Preferences."), + shortcut]; + NSDictionary *userInfo = @{ + NSLocalizedFailureReasonErrorKey: failureReason, + NSLocalizedDescriptionKey: description + }; + *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + + return YES; + } + } + } + + return NO; +} + +- (BOOL)isKeyCode:(unsigned short)aKeyCode andFlags:(NSEventModifierFlags)aFlags takenInMenu:(NSMenu *)aMenu error:(NSError **)outError +{ + aFlags &= SRCocoaModifierFlagsMask; + + for (NSMenuItem *menuItem in [aMenu itemArray]) + { + if (menuItem.hasSubmenu && [self isKeyCode:aKeyCode andFlags:aFlags takenInMenu:menuItem.submenu error:outError]) + return YES; + + NSString *keyEquivalent = menuItem.keyEquivalent; + + if (![keyEquivalent length]) + continue; + + NSEventModifierFlags keyEquivalentModifierMask = menuItem.keyEquivalentModifierMask; + + if (SRKeyCodeWithFlagsEqualToKeyEquivalentWithFlags(aKeyCode, aFlags, keyEquivalent, keyEquivalentModifierMask)) + { + if (outError) + { + BOOL isASCIIOnly = YES; + + if ([self.delegate respondsToSelector:@selector(shortcutValidatorShouldUseASCIIStringForKeyCodes:)]) + isASCIIOnly = [self.delegate shortcutValidatorShouldUseASCIIStringForKeyCodes:self]; + + NSString *shortcut = isASCIIOnly ? SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode) : SRReadableStringForCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode); + NSString *failureReason = [NSString stringWithFormat:SRLoc(@"The key combination \"%@\" can't be used!"), shortcut]; + NSString *description = [NSString stringWithFormat:SRLoc(@"The key combination \"%@\" can't be used because it's already used by the menu item \"%@\"."), shortcut, menuItem.SR_path]; + NSDictionary *userInfo = @{ + NSLocalizedFailureReasonErrorKey: failureReason, + NSLocalizedDescriptionKey: description + }; + *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:0 userInfo:userInfo]; + } + + return YES; + } + } + + return NO; +} + +@end + + +@implementation NSMenuItem (SRValidator) + +- (NSString *)SR_path +{ + NSMutableArray *items = [NSMutableArray array]; + static const NSUInteger Limit = 1000; + NSMenuItem *currentMenuItem = self; + NSUInteger i = 0; + + do + { + [items insertObject:currentMenuItem atIndex:0]; + currentMenuItem = currentMenuItem.parentItem; + ++i; + } + while (currentMenuItem && i < Limit); + + NSMutableString *path = [NSMutableString string]; + + for (NSMenuItem *menuItem in items) + [path appendFormat:@"%@➝", menuItem.title]; + + if ([path length] > 1) + [path deleteCharactersInRange:NSMakeRange([path length] - 1, 1)]; + + return path; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/Library/ShortcutRecorder.h b/Clocker/ShortcutRecorder-master/Library/ShortcutRecorder.h new file mode 100755 index 0000000..149a7f6 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Library/ShortcutRecorder.h @@ -0,0 +1,54 @@ +// +// ShortcutRecorder.h +// ShortcutRecorder +// Copyright 2012 Contributors. All rights reserved. +// +// License: BSD +// +// Contributors to this file: +// Jesper +// Ilya Kulakov + +#import +#import +#import +#import +#import +#import +#import +#import + + +#ifndef IBInspectable + #define IBInspectable +#endif + +#ifndef IB_DESIGNABLE + #define IB_DESIGNABLE +#endif + +#ifndef NSAppKitVersionNumber10_6 + #define NSAppKitVersionNumber10_6 1038 +#endif + +#ifndef NSAppKitVersionNumber10_9 + #define NSAppKitVersionNumber10_9 1265 +#endif + +#ifndef NSEDGEINSETS_DEFINED + typedef struct NSEdgeInsets { + CGFloat top; + CGFloat left; + CGFloat bottom; + CGFloat right; + } NSEdgeInsets; + + NS_INLINE NSEdgeInsets NSEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) { + NSEdgeInsets e; + e.top = top; + e.left = left; + e.bottom = bottom; + e.right = right; + return e; + } +#endif diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/Info.plist b/Clocker/ShortcutRecorder-master/PTHotKey/Info.plist new file mode 100755 index 0000000..b0dfc27 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.5 + CFBundleSignature + ???? + CFBundleVersion + 1.5 + + diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.h b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.h new file mode 100755 index 0000000..f0840e8 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.h @@ -0,0 +1,31 @@ +// +// PTHotKey+ShortcutRecorder.h +// ShortcutRecorder +// +// Created by Ilya Kulakov on 27.02.11. +// Copyright 2011 Wireload. All rights reserved. +// + +#import +#import "PTHotKey.h" + + +@interface PTHotKey (ShortcutRecorder) + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction; + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction + keyUpAction:(SEL)aKeyUpAction; + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction + withObject:(id)anObject; +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.m b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.m new file mode 100755 index 0000000..f78bace --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey+ShortcutRecorder.m @@ -0,0 +1,53 @@ +// +// PTHotKey+ShortcutRecorder.m +// ShortcutRecorder +// +// Created by Ilya Kulakov on 27.02.11. +// Copyright 2011 Wireload. All rights reserved. +// + +#import "PTHotKey+ShortcutRecorder.h" +#import "SRRecorderControl.h" + + +@implementation PTHotKey (ShortcutRecorder) + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction +{ + return [PTHotKey hotKeyWithIdentifier:anIdentifier keyCombo:aKeyCombo target:aTarget action:anAction withObject:nil]; +} + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction + withObject:(id)anObject +{ + NSInteger keyCode = [[aKeyCombo objectForKey:@"keyCode"] integerValue]; + NSUInteger modifiers = SRCocoaToCarbonFlags([[aKeyCombo objectForKey:@"modifierFlags"] unsignedIntegerValue]); + PTKeyCombo *newKeyCombo = [[PTKeyCombo alloc] initWithKeyCode:keyCode modifiers:modifiers]; + PTHotKey *newHotKey = [[PTHotKey alloc] initWithIdentifier:anIdentifier keyCombo:newKeyCombo]; + [newHotKey setTarget:aTarget]; + [newHotKey setAction:anAction]; + [newHotKey setObject:anObject]; + return newHotKey; +} + ++ (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier + keyCombo:(NSDictionary *)aKeyCombo + target:(id)aTarget + action:(SEL)anAction + keyUpAction:(SEL)aKeyUpAction +{ + PTHotKey *newHotKey = [PTHotKey hotKeyWithIdentifier:anIdentifier + keyCombo:aKeyCombo + target:aTarget + action:anAction]; + [newHotKey setKeyUpAction:aKeyUpAction]; + return newHotKey; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.h b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.h new file mode 100755 index 0000000..014626d --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.h @@ -0,0 +1,60 @@ +// +// PTHotKey.h +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// +// Contributors: +// Andy Kim + +#import +#import +#import "PTKeyCombo.h" + +@interface PTHotKey : NSObject +{ + NSString* mIdentifier; + NSString* mName; + PTKeyCombo* mKeyCombo; + id mTarget; + id mObject; + SEL mAction; + SEL mKeyUpAction; + + UInt32 mCarbonHotKeyID; + EventHotKeyRef mCarbonEventHotKeyRef; +} + +- (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo; +- (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo withObject: (id)object; +- (id)init; + +- (void)setIdentifier: (id)ident; +- (id)identifier; + +- (void)setName: (NSString*)name; +- (NSString*)name; + +- (void)setKeyCombo: (PTKeyCombo*)combo; +- (PTKeyCombo*)keyCombo; + +- (void)setTarget: (id)target; +- (id)target; +- (void)setObject: (id)object; +- (id)object; +- (void)setAction: (SEL)action; +- (SEL)action; +- (void)setKeyUpAction: (SEL)action; +- (SEL)keyUpAction; + +- (UInt32)carbonHotKeyID; +- (void)setCarbonHotKeyID: (UInt32)hotKeyID; + +- (EventHotKeyRef)carbonEventHotKeyRef; +- (void)setCarbonEventHotKeyRef:(EventHotKeyRef)hotKeyRef; + +- (void)invoke; +- (void)uninvoke; + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.m b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.m new file mode 100755 index 0000000..744cec9 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKey.m @@ -0,0 +1,156 @@ +// +// PTHotKey.m +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// + +#import "PTHotKey.h" + +#import "PTHotKeyCenter.h" +#import "PTKeyCombo.h" + +@implementation PTHotKey + +- (id)init +{ + return [self initWithIdentifier: nil keyCombo: nil withObject:nil]; +} + +- (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo +{ + return [self initWithIdentifier: identifier keyCombo: combo withObject:nil]; + +} + +- (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo withObject: (id)object +{ + self = [super init]; + + if( self ) + { + [self setIdentifier: identifier]; + [self setKeyCombo: combo]; + [self setObject: object]; + } + + return self; +} + + +- (NSString*)description +{ + return [NSString stringWithFormat: @"<%@: %@, %@>", NSStringFromClass( [self class] ), [self identifier], [self keyCombo]]; +} + +#pragma mark - + +- (void)setIdentifier: (id)ident +{ + mIdentifier = ident; +} + +- (id)identifier +{ + return mIdentifier; +} + +- (void)setKeyCombo: (PTKeyCombo*)combo +{ + if( combo == nil ) + combo = [PTKeyCombo clearKeyCombo]; + + mKeyCombo = combo; +} + +- (PTKeyCombo*)keyCombo +{ + return mKeyCombo; +} + +- (void)setName: (NSString*)name +{ + mName = name; +} + +- (NSString*)name +{ + return mName; +} + +- (void)setTarget: (id)target +{ + mTarget = target; +} + +- (id)target +{ + return mTarget; +} + +- (void)setObject:(id)object +{ + mObject = object; +} + +- (id)object +{ + return mObject; +} + +- (void)setAction: (SEL)action +{ + mAction = action; +} + +- (SEL)action +{ + return mAction; +} + +- (void)setKeyUpAction: (SEL)action +{ + mKeyUpAction = action; +} + +- (SEL)keyUpAction +{ + return mKeyUpAction; +} + +- (UInt32)carbonHotKeyID +{ + return mCarbonHotKeyID; +} + +- (void)setCarbonHotKeyID: (UInt32)hotKeyID; +{ + mCarbonHotKeyID = hotKeyID; +} + +- (EventHotKeyRef)carbonEventHotKeyRef +{ + return mCarbonEventHotKeyRef; +} + +- (void)setCarbonEventHotKeyRef: (EventHotKeyRef)hotKeyRef +{ + mCarbonEventHotKeyRef = hotKeyRef; +} + +#pragma mark - + +- (void)invoke +{ + if(mAction) + [NSApp sendAction:mAction to:mTarget from:self]; +} + +- (void)uninvoke +{ + if(mKeyUpAction) + [NSApp sendAction:mKeyUpAction to:mTarget from:self]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.h b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.h new file mode 100755 index 0000000..d2ff857 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.h @@ -0,0 +1,44 @@ +// +// PTHotKeyCenter.h +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// +// Contributors: +// Quentin D. Carnicelli +// Finlay Dobbie +// Vincent Pottier +// Andy Kim + +#import +#import + +@class PTHotKey; + +@interface PTHotKeyCenter : NSObject +{ + NSMutableDictionary* mHotKeys; //Keys are carbon hot key IDs + BOOL mEventHandlerInstalled; + UInt32 mHotKeyCount; // Used to assign new hot key ID + BOOL mIsPaused; + EventHandlerRef mEventHandler; +} + ++ (PTHotKeyCenter *)sharedCenter; + +- (BOOL)registerHotKey: (PTHotKey*)hotKey; +- (void)unregisterHotKey: (PTHotKey*)hotKey; + +- (NSArray*)allHotKeys; +- (PTHotKey*)hotKeyWithIdentifier: (id)ident; + +- (void)sendEvent: (NSEvent*)event; + +- (void)pause; + +- (void)resume; + +- (BOOL)isPaused; + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.m b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.m new file mode 100755 index 0000000..e233c0f --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTHotKeyCenter.m @@ -0,0 +1,334 @@ +// +// PTHotKeyCenter.m +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// + +#import "PTHotKeyCenter.h" +#import "PTHotKey.h" +#import "PTKeyCombo.h" + +@interface PTHotKeyCenter (Private) +- (PTHotKey*)_hotKeyForCarbonHotKey: (EventHotKeyRef)carbonHotKey; +- (PTHotKey*)_hotKeyForCarbonHotKeyID: (EventHotKeyID)hotKeyID; + +- (void)_updateEventHandler; +- (void)_hotKeyDown: (PTHotKey*)hotKey; +- (void)_hotKeyUp: (PTHotKey*)hotKey; +static OSStatus hotKeyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void* refCon ); +@end + +@implementation PTHotKeyCenter + +static PTHotKeyCenter *_sharedHotKeyCenter = nil; + ++ (PTHotKeyCenter*)sharedCenter +{ + if( _sharedHotKeyCenter == nil ) + { + _sharedHotKeyCenter = [[self alloc] init]; + } + + return _sharedHotKeyCenter; +} + +- (id)init +{ + self = [super init]; + + if( self ) + { + mHotKeys = [[NSMutableDictionary alloc] init]; + } + + return self; +} + + +#pragma mark - + +- (BOOL)registerHotKey: (PTHotKey*)hotKey +{ + if ( mIsPaused == NO ) + { + OSStatus err; + EventHotKeyID hotKeyID; + EventHotKeyRef carbonHotKey; + + if( [[self allHotKeys] containsObject: hotKey] == YES ) + [self unregisterHotKey: hotKey]; + + if( [[hotKey keyCombo] isValidHotKeyCombo] == NO ) + return YES; + + hotKeyID.signature = 'PTHk'; + hotKeyID.id = ++mHotKeyCount; + + err = RegisterEventHotKey( (SInt32)[[hotKey keyCombo] keyCode], + (UInt32)[[hotKey keyCombo] modifiers], + hotKeyID, + GetEventDispatcherTarget(), + 0, + &carbonHotKey ); + + if( err ) + return NO; + + [hotKey setCarbonHotKeyID:hotKeyID.id]; + [hotKey setCarbonEventHotKeyRef:carbonHotKey]; + + if( hotKey ) + [mHotKeys setObject: hotKey forKey: [NSNumber numberWithInteger:hotKeyID.id]]; + + [self _updateEventHandler]; + } + else + { + EventHotKeyID hotKeyID = {'PTHk', ++mHotKeyCount}; + [hotKey setCarbonHotKeyID:hotKeyID.id]; + + if( hotKey ) + [mHotKeys setObject: hotKey forKey: [NSNumber numberWithInteger:hotKeyID.id]]; + } + return YES; +} + +- (void)unregisterHotKey: (PTHotKey*)hotKey +{ + if ( mIsPaused == NO ) + { + EventHotKeyRef carbonHotKey; + + if( [[self allHotKeys] containsObject: hotKey] == NO ) + return; + + carbonHotKey = [hotKey carbonEventHotKeyRef]; + + if( carbonHotKey ) + { + UnregisterEventHotKey( carbonHotKey ); + //Watch as we ignore 'err': + + [mHotKeys removeObjectForKey: [NSNumber numberWithInteger:[hotKey carbonHotKeyID]]]; + + [hotKey setCarbonHotKeyID:0]; + [hotKey setCarbonEventHotKeyRef:NULL]; + + [self _updateEventHandler]; + + //See that? Completely ignored + } + } + else + { + [mHotKeys removeObjectForKey: [NSNumber numberWithInteger:[hotKey carbonHotKeyID]]]; + + [hotKey setCarbonHotKeyID:0]; + [hotKey setCarbonEventHotKeyRef:NULL]; + } +} + +- (NSArray*)allHotKeys +{ + return [mHotKeys allValues]; +} + +- (PTHotKey*)hotKeyWithIdentifier: (id)ident +{ + NSEnumerator* hotKeysEnum = [[self allHotKeys] objectEnumerator]; + PTHotKey* hotKey; + + if( !ident ) + return nil; + + while( (hotKey = [hotKeysEnum nextObject]) != nil ) + { + if( [[hotKey identifier] isEqual: ident] ) + return hotKey; + } + + return nil; +} + +#pragma mark - + +- (PTHotKey*)_hotKeyForCarbonHotKey: (EventHotKeyRef)carbonHotKeyRef +{ + NSEnumerator *e = [mHotKeys objectEnumerator]; + PTHotKey *hotkey = nil; + + while( (hotkey = [e nextObject]) ) + { + if( [hotkey carbonEventHotKeyRef] == carbonHotKeyRef ) + return hotkey; + } + + return nil; +} + +- (PTHotKey*)_hotKeyForCarbonHotKeyID: (EventHotKeyID)hotKeyID +{ + return [mHotKeys objectForKey:[NSNumber numberWithInteger:hotKeyID.id]]; +} + +- (void)_updateEventHandler +{ + if( [mHotKeys count] && mEventHandlerInstalled == NO ) + { + EventTypeSpec eventSpec[2] = { + { kEventClassKeyboard, kEventHotKeyPressed }, + { kEventClassKeyboard, kEventHotKeyReleased } + }; + + InstallEventHandler( GetEventDispatcherTarget(), + (EventHandlerProcPtr)hotKeyEventHandler, + 2, eventSpec, nil, &mEventHandler); + + mEventHandlerInstalled = YES; + } +} + +- (void)_hotKeyDown: (PTHotKey*)hotKey +{ + [hotKey invoke]; +} + +- (void)_hotKeyUp: (PTHotKey*)hotKey +{ + [hotKey uninvoke]; +} + +- (void)sendEvent: (NSEvent*)event +{ + // Not sure why this is needed? - Andy Kim (Aug 23, 2009) + + short subType; + EventHotKeyRef carbonHotKey; + + if( [event type] == NSSystemDefined ) + { + subType = [event subtype]; + + if( subType == 6 ) //6 is hot key down + { + carbonHotKey= (EventHotKeyRef)[event data1]; //data1 is our hot key ref + if( carbonHotKey != nil ) + { + PTHotKey* hotKey = [self _hotKeyForCarbonHotKey: carbonHotKey]; + [self _hotKeyDown: hotKey]; + } + } + else if( subType == 9 ) //9 is hot key up + { + carbonHotKey= (EventHotKeyRef)[event data1]; + if( carbonHotKey != nil ) + { + PTHotKey* hotKey = [self _hotKeyForCarbonHotKey: carbonHotKey]; + [self _hotKeyUp: hotKey]; + } + } + } +} + +- (OSStatus)sendCarbonEvent: (EventRef)event +{ + OSStatus err; + EventHotKeyID hotKeyID; + PTHotKey* hotKey; + + NSAssert( GetEventClass( event ) == kEventClassKeyboard, @"Unknown event class" ); + + err = GetEventParameter( event, + kEventParamDirectObject, + typeEventHotKeyID, + nil, + sizeof(EventHotKeyID), + nil, + &hotKeyID ); + if( err ) + return err; + + if( hotKeyID.signature != 'PTHk' ) + return eventNotHandledErr; + + if (hotKeyID.id == 0) + return eventNotHandledErr; + + hotKey = [self _hotKeyForCarbonHotKeyID:hotKeyID]; + + switch( GetEventKind( event ) ) + { + case kEventHotKeyPressed: + [self _hotKeyDown: hotKey]; + break; + + case kEventHotKeyReleased: + [self _hotKeyUp: hotKey]; + break; + + default: + return eventNotHandledErr; + break; + } + + return noErr; +} + +- (void)pause +{ + if ( mIsPaused ) + return; + + mIsPaused = YES; + for (NSNumber *hotKeyID in mHotKeys) + { + PTHotKey *hotKey = [mHotKeys objectForKey:hotKeyID]; + EventHotKeyRef carbonHotKey = [hotKey carbonEventHotKeyRef]; + UnregisterEventHotKey( carbonHotKey ); + [hotKey setCarbonEventHotKeyRef:NULL]; + } + if (mEventHandler != NULL) + { + RemoveEventHandler(mEventHandler); + mEventHandler = NULL; + mEventHandlerInstalled = NO; + } +} + +- (void)resume +{ + if ( mIsPaused == NO) + return; + + mIsPaused = NO; + for (NSNumber *hotKeyIDNumber in mHotKeys) + { + PTHotKey *hotKey = [mHotKeys objectForKey:hotKeyIDNumber]; + EventHotKeyRef carbonHotKey = NULL; + EventHotKeyID hotKeyID; + hotKeyID.signature = 'PTHk'; + hotKeyID.id = [hotKey carbonHotKeyID]; + RegisterEventHotKey( (SInt32)[[hotKey keyCombo] keyCode], + (UInt32)[[hotKey keyCombo] modifiers], + hotKeyID, + GetEventDispatcherTarget(), + 0, + &carbonHotKey ); + [hotKey setCarbonEventHotKeyRef:carbonHotKey]; + } + [self _updateEventHandler]; +} + +- (BOOL)isPaused +{ + return mIsPaused; +} + +static OSStatus hotKeyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void* refCon ) +{ + return [[PTHotKeyCenter sharedCenter] sendCarbonEvent: inEvent]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.h b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.h new file mode 100755 index 0000000..27e7ba7 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.h @@ -0,0 +1,26 @@ +// +// PTKeyCodeTranslator.h +// Chercher +// +// Created by Finlay Dobbie on Sat Oct 11 2003. +// Copyright (c) 2003 Cliché Software. All rights reserved. +// + +#import + +@interface PTKeyCodeTranslator : NSObject +{ + TISInputSourceRef keyboardLayout; + const UCKeyboardLayout *uchrData; + UInt32 keyTranslateState; + UInt32 deadKeyState; +} + ++ (id)currentTranslator; + +- (id)initWithKeyboardLayout:(TISInputSourceRef)aLayout; +- (NSString *)translateKeyCode:(short)keyCode; + +- (TISInputSourceRef)keyboardLayout; + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.m b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.m new file mode 100755 index 0000000..7969240 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCodeTranslator.m @@ -0,0 +1,71 @@ +// +// PTKeyCodeTranslator.m +// Chercher +// +// Created by Finlay Dobbie on Sat Oct 11 2003. +// Copyright (c) 2003 Cliché Software. All rights reserved. +// + +#import "PTKeyCodeTranslator.h" + + +@implementation PTKeyCodeTranslator + ++ (id)currentTranslator +{ + static PTKeyCodeTranslator *current = nil; + TISInputSourceRef currentLayout = TISCopyCurrentKeyboardLayoutInputSource(); + + if (current == nil) { + current = [[PTKeyCodeTranslator alloc] initWithKeyboardLayout:currentLayout]; + } else if ([current keyboardLayout] != currentLayout) { + current = [[PTKeyCodeTranslator alloc] initWithKeyboardLayout:currentLayout]; + } + + CFRelease(currentLayout); + + return current; +} + +- (id)initWithKeyboardLayout:(TISInputSourceRef)aLayout +{ + if ((self = [super init]) != nil) { + keyboardLayout = aLayout; + + CFRetain(keyboardLayout); + + CFDataRef uchr = TISGetInputSourceProperty( keyboardLayout , kTISPropertyUnicodeKeyLayoutData ); + uchrData = ( const UCKeyboardLayout* )CFDataGetBytePtr(uchr); + } + + return self; +} + +- (void)dealloc +{ + + CFRelease(keyboardLayout); + +} + +- (NSString *)translateKeyCode:(short)keyCode { + UniCharCount maxStringLength = 4, actualStringLength; + UniChar unicodeString[4]; + UCKeyTranslate( uchrData, keyCode, kUCKeyActionDisplay, 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, maxStringLength, &actualStringLength, unicodeString ); + return [NSString stringWithCharacters:unicodeString length:1]; +} + +- (TISInputSourceRef)keyboardLayout { + return keyboardLayout; +} + +- (NSString *)description { + NSString *kind; + kind = @"uchr"; + + NSString *layoutName; + layoutName = (__bridge NSString *)(TISGetInputSourceProperty( keyboardLayout, kTISPropertyLocalizedName )); + return [NSString stringWithFormat:@"PTKeyCodeTranslator layout=%@ (%@)", layoutName, kind]; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.h b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.h new file mode 100755 index 0000000..4af0163 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.h @@ -0,0 +1,38 @@ +// +// PTKeyCombo.h +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// + +#import + +@interface PTKeyCombo : NSObject +{ + NSInteger mKeyCode; + NSUInteger mModifiers; +} + ++ (id)clearKeyCombo; ++ (id)keyComboWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers; +- (id)initWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers; + +- (id)initWithPlistRepresentation: (id)plist; +- (id)plistRepresentation; + +- (BOOL)isEqual: (PTKeyCombo*)combo; + +- (NSInteger)keyCode; +- (NSUInteger)modifiers; + +- (BOOL)isClearCombo; +- (BOOL)isValidHotKeyCombo; + +@end + + +@interface PTKeyCombo (UserDisplayAdditions) +- (NSString*)keyCodeString; +- (NSUInteger)modifierMask; +@end diff --git a/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.m b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.m new file mode 100755 index 0000000..fb07157 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/PTHotKey/PTKeyCombo.m @@ -0,0 +1,127 @@ +// +// PTKeyCombo.m +// Protein +// +// Created by Quentin Carnicelli on Sat Aug 02 2003. +// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. +// + +#import "PTKeyCombo.h" +#import "PTKeyCodeTranslator.h" + +@implementation PTKeyCombo + ++ (id)clearKeyCombo +{ + return [self keyComboWithKeyCode: -1 modifiers: -1]; +} + ++ (id)keyComboWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers +{ + return [[self alloc] initWithKeyCode: keyCode modifiers: modifiers]; +} + +- (id)initWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers +{ + self = [super init]; + + if( self ) + { + switch ( keyCode ) + { + case kVK_F1: + case kVK_F2: + case kVK_F3: + case kVK_F4: + case kVK_F5: + case kVK_F6: + case kVK_F7: + case kVK_F8: + case kVK_F9: + case kVK_F10: + case kVK_F11: + case kVK_F12: + case kVK_F13: + case kVK_F14: + case kVK_F15: + case kVK_F16: + case kVK_F17: + case kVK_F18: + case kVK_F19: + case kVK_F20: + mModifiers = modifiers | NSFunctionKeyMask; + break; + default: + mModifiers = modifiers; + break; + } + + mKeyCode = keyCode; + } + + return self; +} + +- (id)initWithPlistRepresentation: (id)plist +{ + int keyCode, modifiers; + + if( !plist || ![plist count] ) + { + keyCode = -1; + modifiers = -1; + } + else + { + keyCode = [[plist objectForKey: @"keyCode"] intValue]; + if( keyCode < 0 ) keyCode = -1; + + modifiers = [[plist objectForKey: @"modifiers"] intValue]; + if( modifiers <= 0 ) modifiers = -1; + } + + return [self initWithKeyCode: keyCode modifiers: modifiers]; +} + +- (id)plistRepresentation +{ + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger: [self keyCode]], @"keyCode", + [NSNumber numberWithInteger: [self modifiers]], @"modifiers", + nil]; +} + +- (id)copyWithZone:(NSZone*)zone; +{ + return self; +} + +- (BOOL)isEqual: (PTKeyCombo*)combo +{ + return [self keyCode] == [combo keyCode] && + [self modifiers] == [combo modifiers]; +} + +#pragma mark - + +- (NSInteger)keyCode +{ + return mKeyCode; +} + +- (NSUInteger)modifiers +{ + return mModifiers; +} + +- (BOOL)isValidHotKeyCombo +{ + return mKeyCode >= 0 && mModifiers > 0; +} + +- (BOOL)isClearCombo +{ + return mKeyCode == -1 && mModifiers == 0; +} + +@end diff --git a/Clocker/ShortcutRecorder-master/README.md b/Clocker/ShortcutRecorder-master/README.md new file mode 100755 index 0000000..63608b2 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/README.md @@ -0,0 +1,112 @@ +ShortcutRecorder 2 +==================== +![pre-Yosemite ShortcutRecorder Preview](Demo/example.png) +![Yosemite ShortcutRecorder Preview](Demo/example-yosemite.png) + +The only user interface control to record shortcuts. For Mac OS X 10.6+, 64bit. + +- :microscope: Support for Xcode 6 Quick Help +- :microscope: Support for Xcode 6 Interface Builder integration +- Fresh Look & Feel (brought to you by [Wireload](http://wireload.net) and [John Wells](https://github.com/jwells89)) +- With Retina support +- Auto Layout ready +- Correct drawing on Layer-backed and Layer-hosted views +- Accessibility for people with disabilities +- Revised codebase with Automatic Reference Counting support +- Translated into 24 languages + +Includes framework to set global shortcuts (PTHotKey). + +Get Sources +----------- +The preferred way to add the ShortcutRecorder to your project is to use git submodules: +`git submodule add git://github.com/Kentzo/ShortcutRecorder.git` +You can download sources from the site as well. + +Integrate into your project +--------------------------- +First, add ShortcutRecorder.xcodeproj to your workspace via Xcode ([Apple docs](https://developer.apple.com/library/mac/recipes/xcode_help-structure_navigator/articles/Adding_an_Existing_Project_to_a_Workspace.html)). Don't have a workspace? No problem, just add ShortcutRecorder.xcodeproj via the "Add Files to" dialog. + +Next step is to ensure your target is linked against the ShortcutRecorder or/and PTHotKey frameworks ([Apple docs](http://developer.apple.com/library/ios/#recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html#//apple_ref/doc/uid/TP40010155-CH17)). Desired frameworks will be listed under *Workspace*. + +Now it's time to make frameworks part of your app. To do this, you need to add custom Build Phase ([Apple docs](http://developer.apple.com/library/ios/#recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html)). Remember to set *Destination* to *Frameworks* and clean up *Subpath*. + +Finally, ensure your app will find frameworks upon start. Open Build Settings of your target, look up *Runtime Search Paths*. Add `@executable_path/../Frameworks` to the list of paths. + +Add control in Interface Builder +-------------------------------- +Since Xcode 4 Apple removed Interface Builder Plugins. You can only use it to add and position/resize ShortcutRecorder control. To do this, add Custom View and set its class to SRRecorderControl. + +SRRecorderControl has fixed height of 25 points so ensure you do not use autoresizing masks/layout rules which allows vertical resizing. I recommend you to pin height in case you're using Auto Layout. + +Usage +----- +First, we want to keep value of the control across relaunches of the app. We can simply achieve this by using NSUserDefaultsController and bindings: + + [self.pingShortcutRecorder bind:NSValueBinding + toObject:[NSUserDefaultsController sharedUserDefaultsController] + withKeyPath:@"values.ping" + options:nil]; + +The value can be used to set key equivalent of NSMenuItem or NSButton. It can also be used to register a global shortcut. + +Setting key equivalent of NSMenuItem using bindings: + + [self.pingItem bind:@"keyEquivalent" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentTransformer new]}]; + [self.pingItem bind:@"keyEquivalentModifierMask" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentModifierMaskTransformer new]}]; + +Setting key equivalent of NSButton using bindings: + + [self.pingButton bind:@"keyEquivalent" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentTransformer new]}]; + [self.pingButton bind:@"keyEquivalentModifierMask" + toObject:defaults + withKeyPath:@"values.ping" + options:@{NSValueTransformerBindingOption: [SRKeyEquivalentModifierMaskTransformer new]}]; + +Setting global shortcut using PTHotKeyCenter: + + PTHotKeyCenter *hotKeyCenter = [PTHotKeyCenter sharedCenter]; + PTHotKey *oldHotKey = [hotKeyCenter hotKeyWithIdentifier:aKeyPath]; + [hotKeyCenter unregisterHotKey:oldHotKey]; + + PTHotKey *newHotKey = [PTHotKey hotKeyWithIdentifier:aKeyPath + keyCombo:newShortcut + target:self + action:@selector(ping:)]; + [hotKeyCenter registerHotKey:newHotKey]; + +Key Equivalents and Keyboard Layout +---------------------------------------------------- +While ShortcutRecorder keeps your shortcuts as combination of *key code* and modifier masks, key equivalents are expressed using *key character* and modifier mask. The difference is that position of key code on keyboard does not depend on current keyboard layout while position of key character does. + +ShortcutRecorder includes two special transformers to simplify binding to the key equivalents of NSMenuItem and NSButton: + +- SRKeyEquivalentTransformer +- SRKeyEquivalentModifierMaskTransformer + +SRKeyEquivalentTransformer uses ASCII keyboard layout to convert key code into character, therefore resulting character does not depend on keyboard layout. +The drawback is that position of the character on keyboard may change depending on layout and used modifier keys (primarly Option and Shift). + +NSButton +-------- +If you're going to bind ShortcutRecorder to key equivalent of NSButton, I encourage you to require `NSCommandKeyMask`. +This is because NSButton handles key equivalents very strange. Rather than investigating full information of the keyboard event, it just asks for `charactersIgnoringModifiers` +and compares returned value with its `keyEquivalent`. Unfortunately, Cocoa returns layout-independent (ASCII) representation of characters only when NSCommandKeyMask is set. +If it's not set, assigned shortcut likely won't work with other layouts. + +Questions +--------- +Still have questions? [Create an issue](https://github.com/Kentzo/ShortcutRecorder/issues/new) immediately and feel free to ping me. + +Paid Support +------------ +If functional you need is missing but you're ready to pay for it, feel free to contact me. If not, create an issue anyway, I'll take a look as soon as I can. diff --git a/Clocker/ShortcutRecorder-master/Resources/LICENSE.txt b/Clocker/ShortcutRecorder-master/Resources/LICENSE.txt new file mode 100755 index 0000000..e28d398 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/Resources/LICENSE.txt @@ -0,0 +1,40 @@ +Copyright (c) 2006, contributors to ShortcutRecorder. (See the contributors listed in detail later in the file, or see .) + +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The name of the contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +===================================================================== + +Contributors to Shortcut Recorder, in no order in particular: +Jesper, waffle software, . Initial idea and concept, first shot at implementation using NSView. +David Dauer, . Refinement, cleaner reimplementation, documentation, IB Palette. +Jamie Kirkpatrick, Kirk Consulting Ltd, . Further modularisation and re-factoring, and general bug fixes. +Ilya Kulakov, . ShortcutRecorder 2.0 and further support. +Alexander Ljungberg, . Graphics for ShortcutRecorder 2.0 + +===================================================================== + +Some rights reserved: + +For more information, visit diff --git a/Clocker/ShortcutRecorder-master/Resources/ShorcutRecorder Yosemite.sketch b/Clocker/ShortcutRecorder-master/Resources/ShorcutRecorder Yosemite.sketch new file mode 100755 index 0000000..a55e52f Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ShorcutRecorder Yosemite.sketch differ diff --git a/Clocker/ShortcutRecorder-master/Resources/ca.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/ca.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..6cd8220 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ca.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/cs.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/cs.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..5202df6 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/cs.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/de.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/de.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..ee3c980 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/de.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/el.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/el.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..dc8c866 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/el.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/en.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/en.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..7eb37fe Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/en.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/es-MX.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/es-MX.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..6412e1e Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/es-MX.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/es.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/es.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..81e155a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/es.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/fr.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/fr.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..918d17c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/fr.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/it.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/it.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..708c410 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/it.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/ja.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/ja.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..d525171 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ja.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/ko.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/ko.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..a9b1314 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ko.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/nb.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/nb.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..ab39042 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/nb.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/nl.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/nl.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..369c097 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/nl.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/pl.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/pl.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..8ace441 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/pl.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/pt-BR.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/pt-BR.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..1da231a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/pt-BR.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/pt.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/pt.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..38bf326 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/pt.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/ro.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/ro.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..16c5696 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ro.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/ru.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/ru.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..1a9abbf Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/ru.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left.png new file mode 100755 index 0000000..eaadfb5 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left@2x.png new file mode 100755 index 0000000..885f146 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle.png new file mode 100755 index 0000000..73f9a56 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle@2x.png new file mode 100755 index 0000000..89eeb2c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right.png new file mode 100755 index 0000000..7bf420a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right@2x.png new file mode 100755 index 0000000..0cf0f26 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-blue-highlighted-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left.png new file mode 100755 index 0000000..0c8b20b Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left@2x.png new file mode 100755 index 0000000..3ac03ea Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle.png new file mode 100755 index 0000000..65a0ac9 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle@2x.png new file mode 100755 index 0000000..97c1005 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right.png new file mode 100755 index 0000000..dc04deb Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right@2x.png new file mode 100755 index 0000000..3fb8a2d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-disabled-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left.png new file mode 100755 index 0000000..f7ed0de Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left@2x.png new file mode 100755 index 0000000..5fb8da6 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle.png new file mode 100755 index 0000000..fa8b0cb Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle@2x.png new file mode 100755 index 0000000..6996953 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right.png new file mode 100755 index 0000000..647728d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right@2x.png new file mode 100755 index 0000000..daae5d1 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-disabled-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left.png new file mode 100755 index 0000000..9303478 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left@2x.png new file mode 100755 index 0000000..3b32839 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle.png new file mode 100755 index 0000000..63a91f2 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle@2x.png new file mode 100755 index 0000000..5c79fa6 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right.png new file mode 100755 index 0000000..f725ae2 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right@2x.png new file mode 100755 index 0000000..a70597d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-editing-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left.png new file mode 100755 index 0000000..eaadfb5 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left@2x.png new file mode 100755 index 0000000..885f146 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle.png new file mode 100755 index 0000000..73f9a56 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle@2x.png new file mode 100755 index 0000000..89eeb2c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right.png new file mode 100755 index 0000000..7bf420a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right@2x.png new file mode 100755 index 0000000..0cf0f26 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-graphite-highlighted-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left.png new file mode 100755 index 0000000..cc85dae Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left@2x.png new file mode 100755 index 0000000..b06b7c3 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle.png new file mode 100755 index 0000000..55d236a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle@2x.png new file mode 100755 index 0000000..8d7c2c2 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right.png new file mode 100755 index 0000000..5414d0e Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right@2x.png new file mode 100755 index 0000000..c9b63ef Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-bezel-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted.png new file mode 100755 index 0000000..126f601 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted@2x.png new file mode 100755 index 0000000..b665476 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear-highlighted@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear.png new file mode 100755 index 0000000..7f60c2a Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear@2x.png new file mode 100755 index 0000000..cf88356 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-clear@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted.png new file mode 100755 index 0000000..c460c4d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted@2x.png new file mode 100755 index 0000000..de4c7db Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback-highlighted@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback.png new file mode 100755 index 0000000..5fa0341 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback@2x.png new file mode 100755 index 0000000..6084dba Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-snapback@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left.png new file mode 100755 index 0000000..6114d21 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png new file mode 100755 index 0000000..a5e793c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png new file mode 100755 index 0000000..c02991d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png new file mode 100755 index 0000000..3d5ef1b Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right.png new file mode 100755 index 0000000..7a14764 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png new file mode 100755 index 0000000..92d7442 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left.png new file mode 100755 index 0000000..07107f1 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left@2x.png new file mode 100755 index 0000000..a100989 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle.png new file mode 100755 index 0000000..7b53eec Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle@2x.png new file mode 100755 index 0000000..a3c7590 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right.png new file mode 100755 index 0000000..3ee5945 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right@2x.png new file mode 100755 index 0000000..89c50e7 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-disabled-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left.png new file mode 100755 index 0000000..0630fbe Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png new file mode 100755 index 0000000..7e01bfa Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle.png new file mode 100755 index 0000000..5d2d020 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png new file mode 100755 index 0000000..4f1a642 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right.png new file mode 100755 index 0000000..d87f922 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png new file mode 100755 index 0000000..49b42db Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left.png new file mode 100755 index 0000000..24de773 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left@2x.png new file mode 100755 index 0000000..388938e Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle.png new file mode 100755 index 0000000..5a58323 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle@2x.png new file mode 100755 index 0000000..b580e22 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right.png new file mode 100755 index 0000000..3eb5ada Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right@2x.png new file mode 100755 index 0000000..27468db Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-editing-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png new file mode 100755 index 0000000..6114d21 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png new file mode 100755 index 0000000..a5e793c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png new file mode 100755 index 0000000..c02991d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png new file mode 100755 index 0000000..3d5ef1b Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png new file mode 100755 index 0000000..7a14764 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png new file mode 100755 index 0000000..92d7442 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left.png new file mode 100755 index 0000000..c87b3d7 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left@2x.png new file mode 100755 index 0000000..fe8137b Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-left@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle.png new file mode 100755 index 0000000..96ba523 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle@2x.png new file mode 100755 index 0000000..f79971c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-middle@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right.png new file mode 100755 index 0000000..2b3f592 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right@2x.png new file mode 100755 index 0000000..195fba4 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-bezel-right@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted.png new file mode 100755 index 0000000..92af0d2 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted@2x.png new file mode 100755 index 0000000..ba8643c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear-highlighted@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear.png new file mode 100755 index 0000000..b075024 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear@2x.png new file mode 100755 index 0000000..e3ad3cf Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-clear@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted.png new file mode 100755 index 0000000..8df3a78 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted@2x.png new file mode 100755 index 0000000..903a720 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback-highlighted@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback.png new file mode 100755 index 0000000..cce3d7c Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback@2x.png b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback@2x.png new file mode 100755 index 0000000..919589d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/shortcut-recorder-yosemite-snapback@2x.png differ diff --git a/Clocker/ShortcutRecorder-master/Resources/sk.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/sk.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..c38cac3 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/sk.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/sv.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/sv.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..50f85f9 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/sv.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/th.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/th.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..2d78c1d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/th.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/zh-Hans.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/zh-Hans.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..e71821d Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/zh-Hans.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/Resources/zh-Hant.lproj/ShortcutRecorder.strings b/Clocker/ShortcutRecorder-master/Resources/zh-Hant.lproj/ShortcutRecorder.strings new file mode 100755 index 0000000..0d54437 Binary files /dev/null and b/Clocker/ShortcutRecorder-master/Resources/zh-Hant.lproj/ShortcutRecorder.strings differ diff --git a/Clocker/ShortcutRecorder-master/ShortcutRecorder.podspec b/Clocker/ShortcutRecorder-master/ShortcutRecorder.podspec new file mode 100755 index 0000000..dd0da2b --- /dev/null +++ b/Clocker/ShortcutRecorder-master/ShortcutRecorder.podspec @@ -0,0 +1,23 @@ +Pod::Spec.new do |s| + s.name = 'ShortcutRecorder' + s.homepage = 'https://github.com/Kentzo/ShortcutRecorder' + s.summary = '' + s.version = '2.17' + s.source = { :git => 'git://github.com/Kentzo/ShortcutRecorder.git', :branch => 'master' } + s.author = { 'Ilya Kulakov' => 'kulakov.ilya@gmail.com' } + s.frameworks = 'Carbon', 'Cocoa' + s.platform = :osx, "10.6" + + s.subspec 'Core' do |core| + core.source_files = 'Library/*.{h,m}' + core.resource_bundles = { "ShortcutRecorder" => ['Resources/*.lproj', 'Resources/*.png'] } + core.requires_arc = true + core.prefix_header_file = 'Library/Prefix.pch' + end + + s.subspec 'PTHotKey' do |hotkey| + hotkey.source_files = 'PTHotKey/*.{h,m}' + hotkey.requires_arc = false + hotkey.dependency 'ShortcutRecorder/Core' + end +end diff --git a/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/project.pbxproj b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/project.pbxproj new file mode 100755 index 0000000..f89bf68 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/project.pbxproj @@ -0,0 +1,1185 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0D39CBD91803EA6C0001F249 /* ShortcutRecorder.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 939837800DA42965007F53F3 /* ShortcutRecorder.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 0D39CBDA1803EA6E0001F249 /* PTHotKey.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = E273122E1349EC9000A84433 /* PTHotKey.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 0D6B2469180304DE00CE1142 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2741AE01673C90B00A139BD /* Cocoa.framework */; }; + 0D6B24B4180304FA00CE1142 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B249B180304FA00CE1142 /* Credits.rtf */; }; + 0D6B24B5180304FA00CE1142 /* IKCodeAutoLayoutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B249D180304FA00CE1142 /* IKCodeAutoLayoutWindowController.xib */; }; + 0D6B24B6180304FA00CE1142 /* IKIBAutoLayoutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B249F180304FA00CE1142 /* IKIBAutoLayoutWindowController.xib */; }; + 0D6B24B7180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B24A1180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.xib */; }; + 0D6B24B8180304FA00CE1142 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B24A3180304FA00CE1142 /* InfoPlist.strings */; }; + 0D6B24B9180304FA00CE1142 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6B24A5180304FA00CE1142 /* MainMenu.xib */; }; + 0D6B24BA180304FA00CE1142 /* IKAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24A8180304FA00CE1142 /* IKAppDelegate.m */; }; + 0D6B24BB180304FA00CE1142 /* IKCodeAutoLayoutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24AA180304FA00CE1142 /* IKCodeAutoLayoutWindowController.m */; }; + 0D6B24BC180304FA00CE1142 /* IKDemoWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24AC180304FA00CE1142 /* IKDemoWindowController.m */; }; + 0D6B24BD180304FA00CE1142 /* IKIBAutoLayoutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24AE180304FA00CE1142 /* IKIBAutoLayoutWindowController.m */; }; + 0D6B24BE180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24B0180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.m */; }; + 0D6B24C0180304FA00CE1142 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6B24B2180304FA00CE1142 /* main.m */; }; + 0D6B24C11803053800CE1142 /* ShortcutRecorder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 939837800DA42965007F53F3 /* ShortcutRecorder.framework */; }; + 0D6B24C31803057100CE1142 /* PTHotKey.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E273122E1349EC9000A84433 /* PTHotKey.framework */; }; + 939837950DA429EC007F53F3 /* SRRecorderControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8E29C109CDB9360085E9ED /* SRRecorderControl.m */; }; + 939837980DA429EC007F53F3 /* SRKeyCodeTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C3670D0A246B4900B69171 /* SRKeyCodeTransformer.m */; }; + 939837990DA429EC007F53F3 /* SRValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C3670F0A246B4900B69171 /* SRValidator.m */; }; + 9398379A0DA429EC007F53F3 /* SRCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C367110A246B4900B69171 /* SRCommon.m */; }; + 939839390DA4350B007F53F3 /* ShortcutRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = 939837B50DA42DFB007F53F3 /* ShortcutRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9398393B0DA4350B007F53F3 /* SRRecorderControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8E29C009CDB9360085E9ED /* SRRecorderControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9398393E0DA4350B007F53F3 /* SRKeyCodeTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C3670C0A246B4900B69171 /* SRKeyCodeTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9398393F0DA4350B007F53F3 /* SRValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C3670E0A246B4900B69171 /* SRValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 939839400DA4350B007F53F3 /* SRCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C367100A246B4900B69171 /* SRCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BA547C271A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C011A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left.png */; }; + BA547C281A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C021A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png */; }; + BA547C291A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C031A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png */; }; + BA547C2A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C041A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png */; }; + BA547C2B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C051A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right.png */; }; + BA547C2C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C061A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png */; }; + BA547C2D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C071A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left.png */; }; + BA547C2E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C081A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left@2x.png */; }; + BA547C2F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C091A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle.png */; }; + BA547C301A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle@2x.png */; }; + BA547C311A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right.png */; }; + BA547C321A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right@2x.png */; }; + BA547C331A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left.png */; }; + BA547C341A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left@2x.png */; }; + BA547C351A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C0F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle.png */; }; + BA547C361A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C101A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle@2x.png */; }; + BA547C371A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C111A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right.png */; }; + BA547C381A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C121A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right@2x.png */; }; + BA547C391A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C131A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png */; }; + BA547C3A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C141A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png */; }; + BA547C3B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C151A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png */; }; + BA547C3C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C161A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png */; }; + BA547C3D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C171A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png */; }; + BA547C3E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C181A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png */; }; + BA547C3F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C191A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left.png */; }; + BA547C401A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left@2x.png */; }; + BA547C411A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle.png */; }; + BA547C421A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle@2x.png */; }; + BA547C431A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right.png */; }; + BA547C441A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right@2x.png */; }; + BA547C451A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C1F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted.png */; }; + BA547C461A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C201A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted@2x.png */; }; + BA547C471A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C211A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear.png */; }; + BA547C481A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C221A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear@2x.png */; }; + BA547C491A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C231A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted.png */; }; + BA547C4A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C241A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted@2x.png */; }; + BA547C4B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C251A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback.png */; }; + BA547C4C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BA547C261A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback@2x.png */; }; + E20A897917F3322300502E33 /* shortcut-recorder-bezel-disabled-left.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897317F3322300502E33 /* shortcut-recorder-bezel-disabled-left.png */; }; + E20A897A17F3322300502E33 /* shortcut-recorder-bezel-disabled-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897417F3322300502E33 /* shortcut-recorder-bezel-disabled-left@2x.png */; }; + E20A897B17F3322300502E33 /* shortcut-recorder-bezel-disabled-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897517F3322300502E33 /* shortcut-recorder-bezel-disabled-middle.png */; }; + E20A897C17F3322300502E33 /* shortcut-recorder-bezel-disabled-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897617F3322300502E33 /* shortcut-recorder-bezel-disabled-middle@2x.png */; }; + E20A897D17F3322300502E33 /* shortcut-recorder-bezel-disabled-right.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897717F3322300502E33 /* shortcut-recorder-bezel-disabled-right.png */; }; + E20A897E17F3322300502E33 /* shortcut-recorder-bezel-disabled-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E20A897817F3322300502E33 /* shortcut-recorder-bezel-disabled-right@2x.png */; }; + E225E4671679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4471679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left.png */; }; + E225E4681679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4481679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left@2x.png */; }; + E225E4691679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4491679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle.png */; }; + E225E46A1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44A1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle@2x.png */; }; + E225E46B1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44B1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right.png */; }; + E225E46C1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44C1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right@2x.png */; }; + E225E46D1679E30E00A00529 /* shortcut-recorder-bezel-editing-left.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44D1679E30E00A00529 /* shortcut-recorder-bezel-editing-left.png */; }; + E225E46E1679E30E00A00529 /* shortcut-recorder-bezel-editing-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44E1679E30E00A00529 /* shortcut-recorder-bezel-editing-left@2x.png */; }; + E225E46F1679E30E00A00529 /* shortcut-recorder-bezel-editing-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E44F1679E30E00A00529 /* shortcut-recorder-bezel-editing-middle.png */; }; + E225E4701679E30E00A00529 /* shortcut-recorder-bezel-editing-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4501679E30E00A00529 /* shortcut-recorder-bezel-editing-middle@2x.png */; }; + E225E4711679E30E00A00529 /* shortcut-recorder-bezel-editing-right.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4511679E30E00A00529 /* shortcut-recorder-bezel-editing-right.png */; }; + E225E4721679E30E00A00529 /* shortcut-recorder-bezel-editing-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4521679E30E00A00529 /* shortcut-recorder-bezel-editing-right@2x.png */; }; + E225E4731679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4531679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left.png */; }; + E225E4741679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4541679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left@2x.png */; }; + E225E4751679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4551679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle.png */; }; + E225E4761679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4561679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle@2x.png */; }; + E225E4771679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4571679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right.png */; }; + E225E4781679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4581679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right@2x.png */; }; + E225E4791679E30E00A00529 /* shortcut-recorder-bezel-left.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4591679E30E00A00529 /* shortcut-recorder-bezel-left.png */; }; + E225E47A1679E30E00A00529 /* shortcut-recorder-bezel-left@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45A1679E30E00A00529 /* shortcut-recorder-bezel-left@2x.png */; }; + E225E47B1679E30E00A00529 /* shortcut-recorder-bezel-middle.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45B1679E30E00A00529 /* shortcut-recorder-bezel-middle.png */; }; + E225E47C1679E30E00A00529 /* shortcut-recorder-bezel-middle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45C1679E30E00A00529 /* shortcut-recorder-bezel-middle@2x.png */; }; + E225E47D1679E30E00A00529 /* shortcut-recorder-bezel-right.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45D1679E30E00A00529 /* shortcut-recorder-bezel-right.png */; }; + E225E47E1679E30E00A00529 /* shortcut-recorder-bezel-right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45E1679E30E00A00529 /* shortcut-recorder-bezel-right@2x.png */; }; + E225E47F1679E30E00A00529 /* shortcut-recorder-clear-highlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E45F1679E30E00A00529 /* shortcut-recorder-clear-highlighted.png */; }; + E225E4801679E30E00A00529 /* shortcut-recorder-clear-highlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4601679E30E00A00529 /* shortcut-recorder-clear-highlighted@2x.png */; }; + E225E4811679E30E00A00529 /* shortcut-recorder-clear.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4611679E30E00A00529 /* shortcut-recorder-clear.png */; }; + E225E4821679E30E00A00529 /* shortcut-recorder-clear@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4621679E30E00A00529 /* shortcut-recorder-clear@2x.png */; }; + E225E4831679E30E00A00529 /* shortcut-recorder-snapback-highlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4631679E30E00A00529 /* shortcut-recorder-snapback-highlighted.png */; }; + E225E4841679E30E00A00529 /* shortcut-recorder-snapback-highlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4641679E30E00A00529 /* shortcut-recorder-snapback-highlighted@2x.png */; }; + E225E4851679E30E00A00529 /* shortcut-recorder-snapback.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4651679E30E00A00529 /* shortcut-recorder-snapback.png */; }; + E225E4861679E30E00A00529 /* shortcut-recorder-snapback@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E225E4661679E30E00A00529 /* shortcut-recorder-snapback@2x.png */; }; + E273123A1349EDB500A84433 /* PTHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8E2A0309CDBADE0085E9ED /* PTHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E273123B1349EDB500A84433 /* PTHotKeyCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8E2A0509CDBADE0085E9ED /* PTHotKeyCenter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E273123C1349EDB500A84433 /* PTKeyCodeTranslator.h in Headers */ = {isa = PBXBuildFile; fileRef = A1125B75104C8AF3005C6F7B /* PTKeyCodeTranslator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E273123D1349EDB500A84433 /* PTKeyCombo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8E2A0709CDBADE0085E9ED /* PTKeyCombo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E27312401349EDCA00A84433 /* PTHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8E2A0409CDBADE0085E9ED /* PTHotKey.m */; }; + E27312411349EDCA00A84433 /* PTHotKeyCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8E2A0609CDBADE0085E9ED /* PTHotKeyCenter.m */; }; + E27312421349EDCA00A84433 /* PTKeyCodeTranslator.m in Sources */ = {isa = PBXBuildFile; fileRef = A1125B76104C8AF3005C6F7B /* PTKeyCodeTranslator.m */; }; + E27312431349EDCA00A84433 /* PTKeyCombo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8E2A0809CDBADE0085E9ED /* PTKeyCombo.m */; }; + E273124C1349EE6500A84433 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E273124B1349EE6500A84433 /* Carbon.framework */; }; + E2741AC51673C79F00A139BD /* ShortcutRecorder.strings in Resources */ = {isa = PBXBuildFile; fileRef = E2741AC31673C79F00A139BD /* ShortcutRecorder.strings */; }; + E2741ADF1673C83800A139BD /* LICENSE.txt in Resources */ = {isa = PBXBuildFile; fileRef = E2741ADE1673C83800A139BD /* LICENSE.txt */; }; + E2741AE11673C90B00A139BD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2741AE01673C90B00A139BD /* Cocoa.framework */; }; + E2741AE61673C94E00A139BD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E273124B1349EE6500A84433 /* Carbon.framework */; }; + E28113AD167B8A9D001E118E /* SRModifierFlagsTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = E28113AB167B8A9D001E118E /* SRModifierFlagsTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E28113AE167B8A9D001E118E /* SRModifierFlagsTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = E28113AC167B8A9D001E118E /* SRModifierFlagsTransformer.m */; }; + E2BE924D16ABEFE400827E8C /* SRKeyEquivalentTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = E2BE924B16ABEFE400827E8C /* SRKeyEquivalentTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2BE924E16ABEFE400827E8C /* SRKeyEquivalentTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE924C16ABEFE400827E8C /* SRKeyEquivalentTransformer.m */; }; + E2BE925216ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = E2BE925016ABF84100827E8C /* SRKeyEquivalentModifierMaskTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2BE925316ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2BE925116ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.m */; }; + E2BE927C16AC052000827E8C /* PTHotKey+ShortcutRecorder.h in Headers */ = {isa = PBXBuildFile; fileRef = E279508E131A7498008AE1DA /* PTHotKey+ShortcutRecorder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2BE927D16AC052600827E8C /* PTHotKey+ShortcutRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = E279508F131A7498008AE1DA /* PTHotKey+ShortcutRecorder.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 0D39CBD81803EA5F0001F249 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 0D39CBD91803EA6C0001F249 /* ShortcutRecorder.framework in Copy Frameworks */, + 0D39CBDA1803EA6E0001F249 /* PTHotKey.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0B8E29C009CDB9360085E9ED /* SRRecorderControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRRecorderControl.h; path = Library/SRRecorderControl.h; sourceTree = ""; }; + 0B8E29C109CDB9360085E9ED /* SRRecorderControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRRecorderControl.m; path = Library/SRRecorderControl.m; sourceTree = ""; }; + 0B8E2A0309CDBADE0085E9ED /* PTHotKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PTHotKey.h; sourceTree = ""; }; + 0B8E2A0409CDBADE0085E9ED /* PTHotKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PTHotKey.m; sourceTree = ""; }; + 0B8E2A0509CDBADE0085E9ED /* PTHotKeyCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PTHotKeyCenter.h; sourceTree = ""; }; + 0B8E2A0609CDBADE0085E9ED /* PTHotKeyCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PTHotKeyCenter.m; sourceTree = ""; }; + 0B8E2A0709CDBADE0085E9ED /* PTKeyCombo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PTKeyCombo.h; sourceTree = ""; }; + 0B8E2A0809CDBADE0085E9ED /* PTKeyCombo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PTKeyCombo.m; sourceTree = ""; }; + 0D6B2468180304DE00CE1142 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D6B246B180304DE00CE1142 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 0D6B246C180304DE00CE1142 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 0D6B246D180304DE00CE1142 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0D6B2487180304DE00CE1142 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 0D6B249C180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 0D6B249E180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/IKCodeAutoLayoutWindowController.xib; sourceTree = ""; }; + 0D6B24A0180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/IKIBAutoLayoutWindowController.xib; sourceTree = ""; }; + 0D6B24A2180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/IKIBAutoresizingMasksWindowController.xib; sourceTree = ""; }; + 0D6B24A4180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 0D6B24A6180304FA00CE1142 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 0D6B24A7180304FA00CE1142 /* IKAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IKAppDelegate.h; sourceTree = ""; }; + 0D6B24A8180304FA00CE1142 /* IKAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IKAppDelegate.m; sourceTree = ""; }; + 0D6B24A9180304FA00CE1142 /* IKCodeAutoLayoutWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IKCodeAutoLayoutWindowController.h; sourceTree = ""; }; + 0D6B24AA180304FA00CE1142 /* IKCodeAutoLayoutWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IKCodeAutoLayoutWindowController.m; sourceTree = ""; }; + 0D6B24AB180304FA00CE1142 /* IKDemoWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IKDemoWindowController.h; sourceTree = ""; }; + 0D6B24AC180304FA00CE1142 /* IKDemoWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IKDemoWindowController.m; sourceTree = ""; }; + 0D6B24AD180304FA00CE1142 /* IKIBAutoLayoutWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IKIBAutoLayoutWindowController.h; sourceTree = ""; }; + 0D6B24AE180304FA00CE1142 /* IKIBAutoLayoutWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IKIBAutoLayoutWindowController.m; sourceTree = ""; }; + 0D6B24AF180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IKIBAutoresizingMasksWindowController.h; sourceTree = ""; }; + 0D6B24B0180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IKIBAutoresizingMasksWindowController.m; sourceTree = ""; }; + 0D6B24B1180304FA00CE1142 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0D6B24B2180304FA00CE1142 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 0D6B24B3180304FA00CE1142 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = Library/Prefix.pch; sourceTree = ""; }; + 74C3670C0A246B4900B69171 /* SRKeyCodeTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRKeyCodeTransformer.h; path = Library/SRKeyCodeTransformer.h; sourceTree = ""; }; + 74C3670D0A246B4900B69171 /* SRKeyCodeTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRKeyCodeTransformer.m; path = Library/SRKeyCodeTransformer.m; sourceTree = ""; }; + 74C3670E0A246B4900B69171 /* SRValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRValidator.h; path = Library/SRValidator.h; sourceTree = ""; }; + 74C3670F0A246B4900B69171 /* SRValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRValidator.m; path = Library/SRValidator.m; sourceTree = ""; }; + 74C367100A246B4900B69171 /* SRCommon.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SRCommon.h; path = Library/SRCommon.h; sourceTree = ""; }; + 74C367110A246B4900B69171 /* SRCommon.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = SRCommon.m; path = Library/SRCommon.m; sourceTree = ""; }; + 939837800DA42965007F53F3 /* ShortcutRecorder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShortcutRecorder.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 939837B50DA42DFB007F53F3 /* ShortcutRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ShortcutRecorder.h; path = Library/ShortcutRecorder.h; sourceTree = SOURCE_ROOT; }; + A1125B75104C8AF3005C6F7B /* PTKeyCodeTranslator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PTKeyCodeTranslator.h; sourceTree = ""; }; + A1125B76104C8AF3005C6F7B /* PTKeyCodeTranslator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PTKeyCodeTranslator.m; sourceTree = ""; }; + BA547C011A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-left.png"; sourceTree = ""; }; + BA547C021A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png"; sourceTree = ""; }; + BA547C031A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png"; sourceTree = ""; }; + BA547C041A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png"; sourceTree = ""; }; + BA547C051A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-right.png"; sourceTree = ""; }; + BA547C061A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png"; sourceTree = ""; }; + BA547C071A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-left.png"; sourceTree = ""; }; + BA547C081A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-left@2x.png"; sourceTree = ""; }; + BA547C091A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-middle.png"; sourceTree = ""; }; + BA547C0A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-middle@2x.png"; sourceTree = ""; }; + BA547C0B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-right.png"; sourceTree = ""; }; + BA547C0C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-disabled-right@2x.png"; sourceTree = ""; }; + BA547C0D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-left.png"; sourceTree = ""; }; + BA547C0E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-left@2x.png"; sourceTree = ""; }; + BA547C0F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-middle.png"; sourceTree = ""; }; + BA547C101A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-middle@2x.png"; sourceTree = ""; }; + BA547C111A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-right.png"; sourceTree = ""; }; + BA547C121A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-editing-right@2x.png"; sourceTree = ""; }; + BA547C131A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png"; sourceTree = ""; }; + BA547C141A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png"; sourceTree = ""; }; + BA547C151A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png"; sourceTree = ""; }; + BA547C161A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png"; sourceTree = ""; }; + BA547C171A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png"; sourceTree = ""; }; + BA547C181A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png"; sourceTree = ""; }; + BA547C191A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-left.png"; sourceTree = ""; }; + BA547C1A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-left@2x.png"; sourceTree = ""; }; + BA547C1B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-middle.png"; sourceTree = ""; }; + BA547C1C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-middle@2x.png"; sourceTree = ""; }; + BA547C1D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-right.png"; sourceTree = ""; }; + BA547C1E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-bezel-right@2x.png"; sourceTree = ""; }; + BA547C1F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-clear-highlighted.png"; sourceTree = ""; }; + BA547C201A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-clear-highlighted@2x.png"; sourceTree = ""; }; + BA547C211A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-clear.png"; sourceTree = ""; }; + BA547C221A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-clear@2x.png"; sourceTree = ""; }; + BA547C231A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-snapback-highlighted.png"; sourceTree = ""; }; + BA547C241A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-snapback-highlighted@2x.png"; sourceTree = ""; }; + BA547C251A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-snapback.png"; sourceTree = ""; }; + BA547C261A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-yosemite-snapback@2x.png"; sourceTree = ""; }; + E20A897317F3322300502E33 /* shortcut-recorder-bezel-disabled-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-left.png"; sourceTree = ""; }; + E20A897417F3322300502E33 /* shortcut-recorder-bezel-disabled-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-left@2x.png"; sourceTree = ""; }; + E20A897517F3322300502E33 /* shortcut-recorder-bezel-disabled-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-middle.png"; sourceTree = ""; }; + E20A897617F3322300502E33 /* shortcut-recorder-bezel-disabled-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-middle@2x.png"; sourceTree = ""; }; + E20A897717F3322300502E33 /* shortcut-recorder-bezel-disabled-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-right.png"; sourceTree = ""; }; + E20A897817F3322300502E33 /* shortcut-recorder-bezel-disabled-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-disabled-right@2x.png"; sourceTree = ""; }; + E225E4471679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-left.png"; sourceTree = ""; }; + E225E4481679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-left@2x.png"; sourceTree = ""; }; + E225E4491679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-middle.png"; sourceTree = ""; }; + E225E44A1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-middle@2x.png"; sourceTree = ""; }; + E225E44B1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-right.png"; sourceTree = ""; }; + E225E44C1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-blue-highlighted-right@2x.png"; sourceTree = ""; }; + E225E44D1679E30E00A00529 /* shortcut-recorder-bezel-editing-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-left.png"; sourceTree = ""; }; + E225E44E1679E30E00A00529 /* shortcut-recorder-bezel-editing-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-left@2x.png"; sourceTree = ""; }; + E225E44F1679E30E00A00529 /* shortcut-recorder-bezel-editing-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-middle.png"; sourceTree = ""; }; + E225E4501679E30E00A00529 /* shortcut-recorder-bezel-editing-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-middle@2x.png"; sourceTree = ""; }; + E225E4511679E30E00A00529 /* shortcut-recorder-bezel-editing-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-right.png"; sourceTree = ""; }; + E225E4521679E30E00A00529 /* shortcut-recorder-bezel-editing-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-editing-right@2x.png"; sourceTree = ""; }; + E225E4531679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-left.png"; sourceTree = ""; }; + E225E4541679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-left@2x.png"; sourceTree = ""; }; + E225E4551679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-middle.png"; sourceTree = ""; }; + E225E4561679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-middle@2x.png"; sourceTree = ""; }; + E225E4571679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-right.png"; sourceTree = ""; }; + E225E4581679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-graphite-highlighted-right@2x.png"; sourceTree = ""; }; + E225E4591679E30E00A00529 /* shortcut-recorder-bezel-left.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-left.png"; sourceTree = ""; }; + E225E45A1679E30E00A00529 /* shortcut-recorder-bezel-left@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-left@2x.png"; sourceTree = ""; }; + E225E45B1679E30E00A00529 /* shortcut-recorder-bezel-middle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-middle.png"; sourceTree = ""; }; + E225E45C1679E30E00A00529 /* shortcut-recorder-bezel-middle@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-middle@2x.png"; sourceTree = ""; }; + E225E45D1679E30E00A00529 /* shortcut-recorder-bezel-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-right.png"; sourceTree = ""; }; + E225E45E1679E30E00A00529 /* shortcut-recorder-bezel-right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-bezel-right@2x.png"; sourceTree = ""; }; + E225E45F1679E30E00A00529 /* shortcut-recorder-clear-highlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-clear-highlighted.png"; sourceTree = ""; }; + E225E4601679E30E00A00529 /* shortcut-recorder-clear-highlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-clear-highlighted@2x.png"; sourceTree = ""; }; + E225E4611679E30E00A00529 /* shortcut-recorder-clear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-clear.png"; sourceTree = ""; }; + E225E4621679E30E00A00529 /* shortcut-recorder-clear@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-clear@2x.png"; sourceTree = ""; }; + E225E4631679E30E00A00529 /* shortcut-recorder-snapback-highlighted.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-snapback-highlighted.png"; sourceTree = ""; }; + E225E4641679E30E00A00529 /* shortcut-recorder-snapback-highlighted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-snapback-highlighted@2x.png"; sourceTree = ""; }; + E225E4651679E30E00A00529 /* shortcut-recorder-snapback.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-snapback.png"; sourceTree = ""; }; + E225E4661679E30E00A00529 /* shortcut-recorder-snapback@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "shortcut-recorder-snapback@2x.png"; sourceTree = ""; }; + E273122E1349EC9000A84433 /* PTHotKey.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PTHotKey.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E273122F1349EC9000A84433 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = PTHotKey/Info.plist; sourceTree = SOURCE_ROOT; }; + E273124B1349EE6500A84433 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + E2741AC41673C79F00A139BD /* en */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AC61673C7A400A139BD /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AC71673C7A600A139BD /* el */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AC81673C7A800A139BD /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AC91673C7AA00A139BD /* it */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACA1673C7AC00A139BD /* ja */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACB1673C7AD00A139BD /* ko */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACC1673C7AF00A139BD /* nb */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACD1673C7B200A139BD /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACE1673C7B300A139BD /* pl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ACF1673C7B500A139BD /* pt-BR */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/ShortcutRecorder.strings"; sourceTree = ""; }; + E2741AD01673C7B600A139BD /* ro */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD11673C7B800A139BD /* ru */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD21673C7BB00A139BD /* sk */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD31673C7BC00A139BD /* sv */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD41673C7BD00A139BD /* th */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD51673C7BF00A139BD /* zh-Hans */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ShortcutRecorder.strings"; sourceTree = ""; }; + E2741AD61673C7C000A139BD /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD71673C7C200A139BD /* es-MX */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/ShortcutRecorder.strings"; sourceTree = ""; }; + E2741AD81673C7C300A139BD /* ca */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741AD91673C7C600A139BD /* cs */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ADA1673C7C800A139BD /* pt */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/ShortcutRecorder.strings; sourceTree = ""; }; + E2741ADB1673C7CA00A139BD /* zh-Hant */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/ShortcutRecorder.strings"; sourceTree = ""; }; + E2741ADE1673C83800A139BD /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; + E2741AE01673C90B00A139BD /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + E2741AE81673CCBA00A139BD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Library/Info.plist; sourceTree = ""; }; + E279508E131A7498008AE1DA /* PTHotKey+ShortcutRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PTHotKey+ShortcutRecorder.h"; sourceTree = ""; }; + E279508F131A7498008AE1DA /* PTHotKey+ShortcutRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PTHotKey+ShortcutRecorder.m"; sourceTree = ""; }; + E28113AB167B8A9D001E118E /* SRModifierFlagsTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRModifierFlagsTransformer.h; path = Library/SRModifierFlagsTransformer.h; sourceTree = ""; }; + E28113AC167B8A9D001E118E /* SRModifierFlagsTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRModifierFlagsTransformer.m; path = Library/SRModifierFlagsTransformer.m; sourceTree = ""; }; + E2BE924B16ABEFE400827E8C /* SRKeyEquivalentTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRKeyEquivalentTransformer.h; path = Library/SRKeyEquivalentTransformer.h; sourceTree = ""; }; + E2BE924C16ABEFE400827E8C /* SRKeyEquivalentTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRKeyEquivalentTransformer.m; path = Library/SRKeyEquivalentTransformer.m; sourceTree = ""; }; + E2BE925016ABF84100827E8C /* SRKeyEquivalentModifierMaskTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SRKeyEquivalentModifierMaskTransformer.h; path = Library/SRKeyEquivalentModifierMaskTransformer.h; sourceTree = ""; }; + E2BE925116ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SRKeyEquivalentModifierMaskTransformer.m; path = Library/SRKeyEquivalentModifierMaskTransformer.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0D6B2465180304DE00CE1142 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6B24C31803057100CE1142 /* PTHotKey.framework in Frameworks */, + 0D6B24C11803053800CE1142 /* ShortcutRecorder.framework in Frameworks */, + 0D6B2469180304DE00CE1142 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9398377E0DA42965007F53F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E2741AE61673C94E00A139BD /* Carbon.framework in Frameworks */, + E2741AE11673C90B00A139BD /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E273122C1349EC9000A84433 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E273124C1349EE6500A84433 /* Carbon.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* ShortcutRecorder */ = { + isa = PBXGroup; + children = ( + 29B97317FDCFA39411CA2CEA /* Resources */, + BA10595B1689CEB000A3DDF5 /* Supporting Files */, + 939837B50DA42DFB007F53F3 /* ShortcutRecorder.h */, + 74C3670C0A246B4900B69171 /* SRKeyCodeTransformer.h */, + 74C3670D0A246B4900B69171 /* SRKeyCodeTransformer.m */, + E28113AB167B8A9D001E118E /* SRModifierFlagsTransformer.h */, + E28113AC167B8A9D001E118E /* SRModifierFlagsTransformer.m */, + E2BE924B16ABEFE400827E8C /* SRKeyEquivalentTransformer.h */, + E2BE924C16ABEFE400827E8C /* SRKeyEquivalentTransformer.m */, + E2BE925016ABF84100827E8C /* SRKeyEquivalentModifierMaskTransformer.h */, + E2BE925116ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.m */, + 0B8E29C009CDB9360085E9ED /* SRRecorderControl.h */, + 0B8E29C109CDB9360085E9ED /* SRRecorderControl.m */, + 74C3670E0A246B4900B69171 /* SRValidator.h */, + 74C3670F0A246B4900B69171 /* SRValidator.m */, + 74C367100A246B4900B69171 /* SRCommon.h */, + 74C367110A246B4900B69171 /* SRCommon.m */, + ); + name = ShortcutRecorder; + sourceTree = ""; + }; + 0D6B246A180304DE00CE1142 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 0D6B246B180304DE00CE1142 /* AppKit.framework */, + 0D6B246C180304DE00CE1142 /* CoreData.framework */, + 0D6B246D180304DE00CE1142 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 0D6B249A180304FA00CE1142 /* Demo */ = { + isa = PBXGroup; + children = ( + 0D6B24C4180305A300CE1142 /* Resources */, + 0D6B24C5180305AA00CE1142 /* Supporting Files */, + 0D6B24A7180304FA00CE1142 /* IKAppDelegate.h */, + 0D6B24A8180304FA00CE1142 /* IKAppDelegate.m */, + 0D6B24A9180304FA00CE1142 /* IKCodeAutoLayoutWindowController.h */, + 0D6B24AA180304FA00CE1142 /* IKCodeAutoLayoutWindowController.m */, + 0D6B24AB180304FA00CE1142 /* IKDemoWindowController.h */, + 0D6B24AC180304FA00CE1142 /* IKDemoWindowController.m */, + 0D6B24AD180304FA00CE1142 /* IKIBAutoLayoutWindowController.h */, + 0D6B24AE180304FA00CE1142 /* IKIBAutoLayoutWindowController.m */, + 0D6B24AF180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.h */, + 0D6B24B0180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.m */, + ); + path = Demo; + sourceTree = ""; + }; + 0D6B24C4180305A300CE1142 /* Resources */ = { + isa = PBXGroup; + children = ( + 0D6B249B180304FA00CE1142 /* Credits.rtf */, + 0D6B249D180304FA00CE1142 /* IKCodeAutoLayoutWindowController.xib */, + 0D6B249F180304FA00CE1142 /* IKIBAutoLayoutWindowController.xib */, + 0D6B24A1180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.xib */, + 0D6B24A3180304FA00CE1142 /* InfoPlist.strings */, + 0D6B24A5180304FA00CE1142 /* MainMenu.xib */, + ); + name = Resources; + sourceTree = ""; + }; + 0D6B24C5180305AA00CE1142 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 0D6B24B1180304FA00CE1142 /* Info.plist */, + 0D6B24B2180304FA00CE1142 /* main.m */, + 0D6B24B3180304FA00CE1142 /* Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 0DB3F54B1802EE0B00576055 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E2741AE01673C90B00A139BD /* Cocoa.framework */, + E273124B1349EE6500A84433 /* Carbon.framework */, + 0D6B2487180304DE00CE1142 /* XCTest.framework */, + 0D6B246A180304DE00CE1142 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 939837800DA42965007F53F3 /* ShortcutRecorder.framework */, + E273122E1349EC9000A84433 /* PTHotKey.framework */, + 0D6B2468180304DE00CE1142 /* Demo.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* ShortcutRecorder */ = { + isa = PBXGroup; + children = ( + E2741AE71673CC3D00A139BD /* PTHotKey */, + 080E96DDFE201D6D7F000001 /* ShortcutRecorder */, + 0D6B249A180304FA00CE1142 /* Demo */, + 0DB3F54B1802EE0B00576055 /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = ShortcutRecorder; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + BA547C011A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left.png */, + BA547C021A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png */, + BA547C031A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png */, + BA547C041A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png */, + BA547C051A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right.png */, + BA547C061A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png */, + BA547C071A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left.png */, + BA547C081A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left@2x.png */, + BA547C091A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle.png */, + BA547C0A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle@2x.png */, + BA547C0B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right.png */, + BA547C0C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right@2x.png */, + BA547C0D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left.png */, + BA547C0E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left@2x.png */, + BA547C0F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle.png */, + BA547C101A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle@2x.png */, + BA547C111A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right.png */, + BA547C121A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right@2x.png */, + BA547C131A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png */, + BA547C141A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png */, + BA547C151A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png */, + BA547C161A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png */, + BA547C171A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png */, + BA547C181A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png */, + BA547C191A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left.png */, + BA547C1A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left@2x.png */, + BA547C1B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle.png */, + BA547C1C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle@2x.png */, + BA547C1D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right.png */, + BA547C1E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right@2x.png */, + BA547C1F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted.png */, + BA547C201A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted@2x.png */, + BA547C211A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear.png */, + BA547C221A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear@2x.png */, + BA547C231A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted.png */, + BA547C241A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted@2x.png */, + BA547C251A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback.png */, + BA547C261A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback@2x.png */, + E20A897317F3322300502E33 /* shortcut-recorder-bezel-disabled-left.png */, + E20A897417F3322300502E33 /* shortcut-recorder-bezel-disabled-left@2x.png */, + E20A897517F3322300502E33 /* shortcut-recorder-bezel-disabled-middle.png */, + E20A897617F3322300502E33 /* shortcut-recorder-bezel-disabled-middle@2x.png */, + E20A897717F3322300502E33 /* shortcut-recorder-bezel-disabled-right.png */, + E20A897817F3322300502E33 /* shortcut-recorder-bezel-disabled-right@2x.png */, + E225E4471679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left.png */, + E225E4481679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left@2x.png */, + E225E4491679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle.png */, + E225E44A1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle@2x.png */, + E225E44B1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right.png */, + E225E44C1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right@2x.png */, + E225E44D1679E30E00A00529 /* shortcut-recorder-bezel-editing-left.png */, + E225E44E1679E30E00A00529 /* shortcut-recorder-bezel-editing-left@2x.png */, + E225E44F1679E30E00A00529 /* shortcut-recorder-bezel-editing-middle.png */, + E225E4501679E30E00A00529 /* shortcut-recorder-bezel-editing-middle@2x.png */, + E225E4511679E30E00A00529 /* shortcut-recorder-bezel-editing-right.png */, + E225E4521679E30E00A00529 /* shortcut-recorder-bezel-editing-right@2x.png */, + E225E4531679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left.png */, + E225E4541679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left@2x.png */, + E225E4551679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle.png */, + E225E4561679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle@2x.png */, + E225E4571679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right.png */, + E225E4581679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right@2x.png */, + E225E4591679E30E00A00529 /* shortcut-recorder-bezel-left.png */, + E225E45A1679E30E00A00529 /* shortcut-recorder-bezel-left@2x.png */, + E225E45B1679E30E00A00529 /* shortcut-recorder-bezel-middle.png */, + E225E45C1679E30E00A00529 /* shortcut-recorder-bezel-middle@2x.png */, + E225E45D1679E30E00A00529 /* shortcut-recorder-bezel-right.png */, + E225E45E1679E30E00A00529 /* shortcut-recorder-bezel-right@2x.png */, + E225E45F1679E30E00A00529 /* shortcut-recorder-clear-highlighted.png */, + E225E4601679E30E00A00529 /* shortcut-recorder-clear-highlighted@2x.png */, + E225E4611679E30E00A00529 /* shortcut-recorder-clear.png */, + E225E4621679E30E00A00529 /* shortcut-recorder-clear@2x.png */, + E225E4631679E30E00A00529 /* shortcut-recorder-snapback-highlighted.png */, + E225E4641679E30E00A00529 /* shortcut-recorder-snapback-highlighted@2x.png */, + E225E4651679E30E00A00529 /* shortcut-recorder-snapback.png */, + E225E4661679E30E00A00529 /* shortcut-recorder-snapback@2x.png */, + E2741ADE1673C83800A139BD /* LICENSE.txt */, + E2741AC31673C79F00A139BD /* ShortcutRecorder.strings */, + ); + path = Resources; + sourceTree = SOURCE_ROOT; + }; + BA10595B1689CEB000A3DDF5 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 32CA4F630368D1EE00C91783 /* Prefix.pch */, + E2741AE81673CCBA00A139BD /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + BA10595C1689CEBF00A3DDF5 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + E273122F1349EC9000A84433 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + E2741AE71673CC3D00A139BD /* PTHotKey */ = { + isa = PBXGroup; + children = ( + BA10595C1689CEBF00A3DDF5 /* Supporting Files */, + 0B8E2A0309CDBADE0085E9ED /* PTHotKey.h */, + 0B8E2A0409CDBADE0085E9ED /* PTHotKey.m */, + 0B8E2A0509CDBADE0085E9ED /* PTHotKeyCenter.h */, + 0B8E2A0609CDBADE0085E9ED /* PTHotKeyCenter.m */, + A1125B75104C8AF3005C6F7B /* PTKeyCodeTranslator.h */, + A1125B76104C8AF3005C6F7B /* PTKeyCodeTranslator.m */, + 0B8E2A0709CDBADE0085E9ED /* PTKeyCombo.h */, + 0B8E2A0809CDBADE0085E9ED /* PTKeyCombo.m */, + E279508E131A7498008AE1DA /* PTHotKey+ShortcutRecorder.h */, + E279508F131A7498008AE1DA /* PTHotKey+ShortcutRecorder.m */, + ); + path = PTHotKey; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 9398394A0DA4351C007F53F3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 939839390DA4350B007F53F3 /* ShortcutRecorder.h in Headers */, + 9398393B0DA4350B007F53F3 /* SRRecorderControl.h in Headers */, + E28113AD167B8A9D001E118E /* SRModifierFlagsTransformer.h in Headers */, + E2BE924D16ABEFE400827E8C /* SRKeyEquivalentTransformer.h in Headers */, + E2BE925216ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.h in Headers */, + 9398393E0DA4350B007F53F3 /* SRKeyCodeTransformer.h in Headers */, + 9398393F0DA4350B007F53F3 /* SRValidator.h in Headers */, + 939839400DA4350B007F53F3 /* SRCommon.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E27312291349EC9000A84433 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E273123A1349EDB500A84433 /* PTHotKey.h in Headers */, + E273123B1349EDB500A84433 /* PTHotKeyCenter.h in Headers */, + E273123C1349EDB500A84433 /* PTKeyCodeTranslator.h in Headers */, + E273123D1349EDB500A84433 /* PTKeyCombo.h in Headers */, + E2BE927C16AC052000827E8C /* PTHotKey+ShortcutRecorder.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0D6B2467180304DE00CE1142 /* Demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D6B2498180304DF00CE1142 /* Build configuration list for PBXNativeTarget "Demo" */; + buildPhases = ( + 0D6B2464180304DE00CE1142 /* Sources */, + 0D6B2465180304DE00CE1142 /* Frameworks */, + 0D6B2466180304DE00CE1142 /* Resources */, + 0D39CBD81803EA5F0001F249 /* Copy Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Demo; + productName = Demo; + productReference = 0D6B2468180304DE00CE1142 /* Demo.app */; + productType = "com.apple.product-type.application"; + }; + 9398377F0DA42965007F53F3 /* ShortcutRecorder.framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 939837840DA42965007F53F3 /* Build configuration list for PBXNativeTarget "ShortcutRecorder.framework" */; + buildPhases = ( + E2BADF0A134F13CD00F65E14 /* Resources */, + 9398377D0DA42965007F53F3 /* Sources */, + 9398377E0DA42965007F53F3 /* Frameworks */, + 9398394A0DA4351C007F53F3 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ShortcutRecorder.framework; + productName = ShortcutRecorder.framework; + productReference = 939837800DA42965007F53F3 /* ShortcutRecorder.framework */; + productType = "com.apple.product-type.framework"; + }; + E273122D1349EC9000A84433 /* PTHotKey.framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = E27312381349EC9000A84433 /* Build configuration list for PBXNativeTarget "PTHotKey.framework" */; + buildPhases = ( + E273122B1349EC9000A84433 /* Sources */, + E273122C1349EC9000A84433 /* Frameworks */, + E27312291349EC9000A84433 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PTHotKey.framework; + productName = PTHotKey; + productReference = E273122E1349EC9000A84433 /* PTHotKey.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0720; + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ShortcutRecorder" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + sv, + Dutch, + ru, + de, + el, + en, + fr, + it, + ja, + ko, + nb, + nl, + pl, + "pt-BR", + ro, + sk, + th, + "zh-Hans", + es, + "es-MX", + ca, + cs, + pt, + "zh-Hant", + Base, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* ShortcutRecorder */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9398377F0DA42965007F53F3 /* ShortcutRecorder.framework */, + E273122D1349EC9000A84433 /* PTHotKey.framework */, + 0D6B2467180304DE00CE1142 /* Demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0D6B2466180304DE00CE1142 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6B24B7180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.xib in Resources */, + 0D6B24B4180304FA00CE1142 /* Credits.rtf in Resources */, + 0D6B24B6180304FA00CE1142 /* IKIBAutoLayoutWindowController.xib in Resources */, + 0D6B24B5180304FA00CE1142 /* IKCodeAutoLayoutWindowController.xib in Resources */, + 0D6B24B8180304FA00CE1142 /* InfoPlist.strings in Resources */, + 0D6B24B9180304FA00CE1142 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E2BADF0A134F13CD00F65E14 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BA547C3C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png in Resources */, + E20A897E17F3322300502E33 /* shortcut-recorder-bezel-disabled-right@2x.png in Resources */, + BA547C371A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right.png in Resources */, + E2741AC51673C79F00A139BD /* ShortcutRecorder.strings in Resources */, + BA547C351A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle.png in Resources */, + E2741ADF1673C83800A139BD /* LICENSE.txt in Resources */, + BA547C3E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png in Resources */, + BA547C481A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear@2x.png in Resources */, + E20A897C17F3322300502E33 /* shortcut-recorder-bezel-disabled-middle@2x.png in Resources */, + E225E4671679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left.png in Resources */, + BA547C441A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right@2x.png in Resources */, + E225E4681679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-left@2x.png in Resources */, + BA547C291A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png in Resources */, + BA547C451A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted.png in Resources */, + BA547C3B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png in Resources */, + E225E4691679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle.png in Resources */, + E225E46A1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-middle@2x.png in Resources */, + E225E46B1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right.png in Resources */, + E20A897B17F3322300502E33 /* shortcut-recorder-bezel-disabled-middle.png in Resources */, + E225E46C1679E30E00A00529 /* shortcut-recorder-bezel-blue-highlighted-right@2x.png in Resources */, + E225E46D1679E30E00A00529 /* shortcut-recorder-bezel-editing-left.png in Resources */, + E225E46E1679E30E00A00529 /* shortcut-recorder-bezel-editing-left@2x.png in Resources */, + E225E46F1679E30E00A00529 /* shortcut-recorder-bezel-editing-middle.png in Resources */, + E225E4701679E30E00A00529 /* shortcut-recorder-bezel-editing-middle@2x.png in Resources */, + BA547C421A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle@2x.png in Resources */, + E225E4711679E30E00A00529 /* shortcut-recorder-bezel-editing-right.png in Resources */, + BA547C361A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-middle@2x.png in Resources */, + BA547C321A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right@2x.png in Resources */, + BA547C4A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted@2x.png in Resources */, + E225E4721679E30E00A00529 /* shortcut-recorder-bezel-editing-right@2x.png in Resources */, + E225E4731679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left.png in Resources */, + BA547C2F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle.png in Resources */, + E225E4741679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-left@2x.png in Resources */, + E225E4751679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle.png in Resources */, + E225E4761679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-middle@2x.png in Resources */, + BA547C341A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left@2x.png in Resources */, + E225E4771679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right.png in Resources */, + BA547C431A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-right.png in Resources */, + BA547C2B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right.png in Resources */, + BA547C461A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear-highlighted@2x.png in Resources */, + BA547C381A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-right@2x.png in Resources */, + E225E4781679E30E00A00529 /* shortcut-recorder-bezel-graphite-highlighted-right@2x.png in Resources */, + BA547C281A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png in Resources */, + BA547C301A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-middle@2x.png in Resources */, + BA547C3D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png in Resources */, + E225E4791679E30E00A00529 /* shortcut-recorder-bezel-left.png in Resources */, + E225E47A1679E30E00A00529 /* shortcut-recorder-bezel-left@2x.png in Resources */, + BA547C391A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png in Resources */, + BA547C471A5FD45B00C45C31 /* shortcut-recorder-yosemite-clear.png in Resources */, + E225E47B1679E30E00A00529 /* shortcut-recorder-bezel-middle.png in Resources */, + BA547C2C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png in Resources */, + E225E47C1679E30E00A00529 /* shortcut-recorder-bezel-middle@2x.png in Resources */, + BA547C2A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png in Resources */, + E225E47D1679E30E00A00529 /* shortcut-recorder-bezel-right.png in Resources */, + BA547C3A1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png in Resources */, + E225E47E1679E30E00A00529 /* shortcut-recorder-bezel-right@2x.png in Resources */, + BA547C271A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-blue-highlighted-left.png in Resources */, + BA547C311A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-right.png in Resources */, + E225E47F1679E30E00A00529 /* shortcut-recorder-clear-highlighted.png in Resources */, + E225E4801679E30E00A00529 /* shortcut-recorder-clear-highlighted@2x.png in Resources */, + E20A897A17F3322300502E33 /* shortcut-recorder-bezel-disabled-left@2x.png in Resources */, + BA547C3F1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left.png in Resources */, + BA547C331A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-editing-left.png in Resources */, + BA547C401A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-left@2x.png in Resources */, + E20A897D17F3322300502E33 /* shortcut-recorder-bezel-disabled-right.png in Resources */, + E225E4811679E30E00A00529 /* shortcut-recorder-clear.png in Resources */, + BA547C2D1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left.png in Resources */, + BA547C491A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback-highlighted.png in Resources */, + BA547C2E1A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-disabled-left@2x.png in Resources */, + E225E4821679E30E00A00529 /* shortcut-recorder-clear@2x.png in Resources */, + E225E4831679E30E00A00529 /* shortcut-recorder-snapback-highlighted.png in Resources */, + E225E4841679E30E00A00529 /* shortcut-recorder-snapback-highlighted@2x.png in Resources */, + E225E4851679E30E00A00529 /* shortcut-recorder-snapback.png in Resources */, + E225E4861679E30E00A00529 /* shortcut-recorder-snapback@2x.png in Resources */, + BA547C4C1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback@2x.png in Resources */, + BA547C411A5FD45B00C45C31 /* shortcut-recorder-yosemite-bezel-middle.png in Resources */, + BA547C4B1A5FD45B00C45C31 /* shortcut-recorder-yosemite-snapback.png in Resources */, + E20A897917F3322300502E33 /* shortcut-recorder-bezel-disabled-left.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0D6B2464180304DE00CE1142 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6B24BC180304FA00CE1142 /* IKDemoWindowController.m in Sources */, + 0D6B24BA180304FA00CE1142 /* IKAppDelegate.m in Sources */, + 0D6B24BE180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.m in Sources */, + 0D6B24BD180304FA00CE1142 /* IKIBAutoLayoutWindowController.m in Sources */, + 0D6B24C0180304FA00CE1142 /* main.m in Sources */, + 0D6B24BB180304FA00CE1142 /* IKCodeAutoLayoutWindowController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9398377D0DA42965007F53F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 939837950DA429EC007F53F3 /* SRRecorderControl.m in Sources */, + 939837980DA429EC007F53F3 /* SRKeyCodeTransformer.m in Sources */, + 939837990DA429EC007F53F3 /* SRValidator.m in Sources */, + 9398379A0DA429EC007F53F3 /* SRCommon.m in Sources */, + E28113AE167B8A9D001E118E /* SRModifierFlagsTransformer.m in Sources */, + E2BE924E16ABEFE400827E8C /* SRKeyEquivalentTransformer.m in Sources */, + E2BE925316ABF84200827E8C /* SRKeyEquivalentModifierMaskTransformer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E273122B1349EC9000A84433 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E27312401349EDCA00A84433 /* PTHotKey.m in Sources */, + E27312411349EDCA00A84433 /* PTHotKeyCenter.m in Sources */, + E27312421349EDCA00A84433 /* PTKeyCodeTranslator.m in Sources */, + E27312431349EDCA00A84433 /* PTKeyCombo.m in Sources */, + E2BE927D16AC052600827E8C /* PTHotKey+ShortcutRecorder.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0D6B249B180304FA00CE1142 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 0D6B249C180304FA00CE1142 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 0D6B249D180304FA00CE1142 /* IKCodeAutoLayoutWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6B249E180304FA00CE1142 /* en */, + ); + name = IKCodeAutoLayoutWindowController.xib; + sourceTree = ""; + }; + 0D6B249F180304FA00CE1142 /* IKIBAutoLayoutWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6B24A0180304FA00CE1142 /* en */, + ); + name = IKIBAutoLayoutWindowController.xib; + sourceTree = ""; + }; + 0D6B24A1180304FA00CE1142 /* IKIBAutoresizingMasksWindowController.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6B24A2180304FA00CE1142 /* en */, + ); + name = IKIBAutoresizingMasksWindowController.xib; + sourceTree = ""; + }; + 0D6B24A3180304FA00CE1142 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0D6B24A4180304FA00CE1142 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 0D6B24A5180304FA00CE1142 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6B24A6180304FA00CE1142 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; + E2741AC31673C79F00A139BD /* ShortcutRecorder.strings */ = { + isa = PBXVariantGroup; + children = ( + E2741AC41673C79F00A139BD /* en */, + E2741AC61673C7A400A139BD /* de */, + E2741AC71673C7A600A139BD /* el */, + E2741AC81673C7A800A139BD /* fr */, + E2741AC91673C7AA00A139BD /* it */, + E2741ACA1673C7AC00A139BD /* ja */, + E2741ACB1673C7AD00A139BD /* ko */, + E2741ACC1673C7AF00A139BD /* nb */, + E2741ACD1673C7B200A139BD /* nl */, + E2741ACE1673C7B300A139BD /* pl */, + E2741ACF1673C7B500A139BD /* pt-BR */, + E2741AD01673C7B600A139BD /* ro */, + E2741AD11673C7B800A139BD /* ru */, + E2741AD21673C7BB00A139BD /* sk */, + E2741AD31673C7BC00A139BD /* sv */, + E2741AD41673C7BD00A139BD /* th */, + E2741AD51673C7BF00A139BD /* zh-Hans */, + E2741AD61673C7C000A139BD /* es */, + E2741AD71673C7C200A139BD /* es-MX */, + E2741AD81673C7C300A139BD /* ca */, + E2741AD91673C7C600A139BD /* cs */, + E2741ADA1673C7C800A139BD /* pt */, + E2741ADB1673C7CA00A139BD /* zh-Hant */, + ); + name = ShortcutRecorder.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0D6B2494180304DF00CE1142 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Demo/Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + INFOPLIST_FILE = Demo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = "com.kulakov.ShortcutRecorder.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 0D6B2495180304DF00CE1142 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Demo/Prefix.pch; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + INFOPLIST_FILE = Demo/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_BUNDLE_IDENTIFIER = "com.kulakov.ShortcutRecorder.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 939837820DA42965007F53F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 2.6; + DYLIB_CURRENT_VERSION = 2.17; + FRAMEWORK_VERSION = A; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Library/Prefix.pch; + INFOPLIST_FILE = Library/Info.plist; + INSTALL_PATH = "@rpath"; + PRODUCT_BUNDLE_IDENTIFIER = com.kulakov.ShortcutRecorder; + PRODUCT_NAME = ShortcutRecorder; + PROVISIONING_PROFILE = ""; + }; + name = Debug; + }; + 939837830DA42965007F53F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 2.6; + DYLIB_CURRENT_VERSION = 2.17; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Library/Prefix.pch; + INFOPLIST_FILE = Library/Info.plist; + INSTALL_PATH = "@rpath"; + PRODUCT_BUNDLE_IDENTIFIER = com.kulakov.ShortcutRecorder; + PRODUCT_NAME = ShortcutRecorder; + PROVISIONING_PROFILE = ""; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_X86_VECTOR_INSTRUCTIONS = ssse3; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SKIP_INSTALL = YES; + WARNING_CFLAGS = "-Wall"; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_X86_VECTOR_INSTRUCTIONS = ssse3; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.6; + SDKROOT = macosx; + SKIP_INSTALL = YES; + WARNING_CFLAGS = "-Wall"; + }; + name = Release; + }; + E27312361349EC9000A84433 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1.5; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + INFOPLIST_FILE = PTHotKey/Info.plist; + INSTALL_PATH = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = com.kulakov.PTHotKey; + PRODUCT_NAME = PTHotKey; + }; + name = Debug; + }; + E27312371349EC9000A84433 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1.5; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + INFOPLIST_FILE = PTHotKey/Info.plist; + INSTALL_PATH = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.6; + OTHER_LDFLAGS = ( + "-framework", + Foundation, + "-framework", + AppKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = com.kulakov.PTHotKey; + PRODUCT_NAME = PTHotKey; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0D6B2498180304DF00CE1142 /* Build configuration list for PBXNativeTarget "Demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D6B2494180304DF00CE1142 /* Debug */, + 0D6B2495180304DF00CE1142 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 939837840DA42965007F53F3 /* Build configuration list for PBXNativeTarget "ShortcutRecorder.framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 939837820DA42965007F53F3 /* Debug */, + 939837830DA42965007F53F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ShortcutRecorder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E27312381349EC9000A84433 /* Build configuration list for PBXNativeTarget "PTHotKey.framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E27312361349EC9000A84433 /* Debug */, + E27312371349EC9000A84433 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/PTHotKey.framework.xcscheme b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/PTHotKey.framework.xcscheme new file mode 100755 index 0000000..e5c8033 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/PTHotKey.framework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/ShortcutRecorder.framework.xcscheme b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/ShortcutRecorder.framework.xcscheme new file mode 100755 index 0000000..cfc22b2 --- /dev/null +++ b/Clocker/ShortcutRecorder-master/ShortcutRecorder.xcodeproj/xcshareddata/xcschemes/ShortcutRecorder.framework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +