├── .gitignore ├── Credits.md ├── Funky.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── Funky.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── Funky ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Funky-128x128.png │ │ ├── Funky-128x128@2x.png │ │ ├── Funky-16x16.png │ │ ├── Funky-16x16@2x.png │ │ ├── Funky-256x256.png │ │ ├── Funky-256x256@2x.png │ │ ├── Funky-32x32.png │ │ ├── Funky-32x32@2x.png │ │ ├── Funky-512x512.png │ │ └── Funky-512x512@2x.png │ ├── Contents.json │ ├── FunkyStatusActiveTemplate.imageset │ │ ├── Contents.json │ │ ├── FunkyStatusActiveTemplate.png │ │ └── FunkyStatusActiveTemplate@2x.png │ └── FunkyStatusTemplate.imageset │ │ ├── Contents.json │ │ ├── FunkyStatusTemplate.png │ │ └── FunkyStatusTemplate@2x.png ├── Base.lproj │ └── MainMenu.xib ├── FKAppDelegate.h ├── FKAppDelegate.m ├── FKBinaryIcon.icns ├── FKBundle.h ├── FKBundle.m ├── FKBundleTableCellView.h ├── FKBundleTableCellView.m ├── FKExecutablePathWindowController.h ├── FKExecutablePathWindowController.m ├── FKExecutablePathWindowController.xib ├── FKHelper.h ├── FKHelper.m ├── FKPreferencesAdvancedViewController.h ├── FKPreferencesAdvancedViewController.m ├── FKPreferencesAdvancedViewController.xib ├── FKPreferencesAppsViewController.h ├── FKPreferencesAppsViewController.m ├── FKPreferencesAppsViewController.xib ├── FKPreferencesGeneralViewController.h ├── FKPreferencesGeneralViewController.m ├── FKPreferencesGeneralViewController.xib ├── FKPreferencesWindowController.h ├── FKPreferencesWindowController.m ├── FKPreferencesWindowController.xib ├── Funky.entitlements ├── Info.plist ├── RVNReceiptValidation.h ├── RVNReceiptValidation.m └── main.m ├── FunkyHelper ├── AppDelegate.h ├── AppDelegate.m ├── FunkyHelper.entitlements ├── Info.plist ├── Main.xib └── main.m ├── FunkyTests ├── FunkyTests.m └── Info.plist ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── Crashlytics │ ├── Crashlytics.framework │ │ ├── README │ │ └── submit │ ├── OSX │ │ └── Crashlytics.framework │ │ │ ├── Crashlytics │ │ │ ├── Headers │ │ │ ├── Modules │ │ │ ├── Resources │ │ │ ├── Versions │ │ │ ├── A │ │ │ │ ├── Crashlytics │ │ │ │ ├── Headers │ │ │ │ │ ├── ANSCompatibility.h │ │ │ │ │ ├── Answers.h │ │ │ │ │ ├── CLSAttributes.h │ │ │ │ │ ├── CLSLogging.h │ │ │ │ │ ├── CLSReport.h │ │ │ │ │ ├── CLSStackFrame.h │ │ │ │ │ └── Crashlytics.h │ │ │ │ ├── Modules │ │ │ │ │ └── module.modulemap │ │ │ │ └── Resources │ │ │ │ │ └── Info.plist │ │ │ └── Current │ │ │ ├── run │ │ │ ├── submit │ │ │ └── uploadDSYM │ ├── README.md │ └── submit ├── Fabric │ ├── Fabric.framework │ │ ├── README │ │ └── run │ ├── OSX │ │ └── Fabric.framework │ │ │ ├── Fabric │ │ │ ├── Headers │ │ │ ├── Modules │ │ │ ├── Resources │ │ │ ├── Versions │ │ │ ├── A │ │ │ │ ├── Fabric │ │ │ │ ├── Headers │ │ │ │ │ ├── FABAttributes.h │ │ │ │ │ └── Fabric.h │ │ │ │ ├── Modules │ │ │ │ │ └── module.modulemap │ │ │ │ └── Resources │ │ │ │ │ └── Info.plist │ │ │ └── Current │ │ │ ├── run │ │ │ └── uploadDSYM │ ├── README.md │ ├── run │ ├── upload-symbols │ └── uploadDSYM ├── Local Podspecs │ └── ShortcutRecorder.podspec.json ├── Manifest.lock ├── Pods.xcodeproj │ └── project.pbxproj ├── ShortcutRecorder │ ├── LICENSE.md │ ├── Library │ │ ├── Prefix.pch │ │ ├── SRCommon.h │ │ ├── SRCommon.m │ │ ├── SRKeyCodeTransformer.h │ │ ├── SRKeyCodeTransformer.m │ │ ├── SRKeyEquivalentModifierMaskTransformer.h │ │ ├── SRKeyEquivalentModifierMaskTransformer.m │ │ ├── SRKeyEquivalentTransformer.h │ │ ├── SRKeyEquivalentTransformer.m │ │ ├── SRModifierFlagsTransformer.h │ │ ├── SRModifierFlagsTransformer.m │ │ ├── SRRecorderControl.h │ │ ├── SRRecorderControl.m │ │ ├── SRValidator.h │ │ ├── SRValidator.m │ │ └── ShortcutRecorder.h │ ├── PTHotKey │ │ ├── PTHotKey+ShortcutRecorder.h │ │ ├── PTHotKey+ShortcutRecorder.m │ │ ├── PTHotKey.h │ │ ├── PTHotKey.m │ │ ├── PTHotKeyCenter.h │ │ ├── PTHotKeyCenter.m │ │ ├── PTKeyCodeTranslator.h │ │ ├── PTKeyCodeTranslator.m │ │ ├── PTKeyCombo.h │ │ └── PTKeyCombo.m │ ├── README.md │ └── Resources │ │ ├── ca.lproj │ │ └── ShortcutRecorder.strings │ │ ├── cs.lproj │ │ └── ShortcutRecorder.strings │ │ ├── de.lproj │ │ └── ShortcutRecorder.strings │ │ ├── el.lproj │ │ └── ShortcutRecorder.strings │ │ ├── en.lproj │ │ └── ShortcutRecorder.strings │ │ ├── es-MX.lproj │ │ └── ShortcutRecorder.strings │ │ ├── es.lproj │ │ └── ShortcutRecorder.strings │ │ ├── fr.lproj │ │ └── ShortcutRecorder.strings │ │ ├── it.lproj │ │ └── ShortcutRecorder.strings │ │ ├── ja.lproj │ │ └── ShortcutRecorder.strings │ │ ├── ko.lproj │ │ └── ShortcutRecorder.strings │ │ ├── nb.lproj │ │ └── ShortcutRecorder.strings │ │ ├── nl.lproj │ │ └── ShortcutRecorder.strings │ │ ├── pl.lproj │ │ └── ShortcutRecorder.strings │ │ ├── pt-BR.lproj │ │ └── ShortcutRecorder.strings │ │ ├── pt.lproj │ │ └── ShortcutRecorder.strings │ │ ├── ro.lproj │ │ └── ShortcutRecorder.strings │ │ ├── ru.lproj │ │ └── ShortcutRecorder.strings │ │ ├── shortcut-recorder-bezel-blue-highlighted-left.png │ │ ├── shortcut-recorder-bezel-blue-highlighted-left@2x.png │ │ ├── shortcut-recorder-bezel-blue-highlighted-middle.png │ │ ├── shortcut-recorder-bezel-blue-highlighted-middle@2x.png │ │ ├── shortcut-recorder-bezel-blue-highlighted-right.png │ │ ├── shortcut-recorder-bezel-blue-highlighted-right@2x.png │ │ ├── shortcut-recorder-bezel-disabled-left.png │ │ ├── shortcut-recorder-bezel-disabled-left@2x.png │ │ ├── shortcut-recorder-bezel-disabled-middle.png │ │ ├── shortcut-recorder-bezel-disabled-middle@2x.png │ │ ├── shortcut-recorder-bezel-disabled-right.png │ │ ├── shortcut-recorder-bezel-disabled-right@2x.png │ │ ├── shortcut-recorder-bezel-editing-disabled-left.png │ │ ├── shortcut-recorder-bezel-editing-disabled-left@2x.png │ │ ├── shortcut-recorder-bezel-editing-disabled-middle.png │ │ ├── shortcut-recorder-bezel-editing-disabled-middle@2x.png │ │ ├── shortcut-recorder-bezel-editing-disabled-right.png │ │ ├── shortcut-recorder-bezel-editing-disabled-right@2x.png │ │ ├── shortcut-recorder-bezel-editing-left.png │ │ ├── shortcut-recorder-bezel-editing-left@2x.png │ │ ├── shortcut-recorder-bezel-editing-middle.png │ │ ├── shortcut-recorder-bezel-editing-middle@2x.png │ │ ├── shortcut-recorder-bezel-editing-right.png │ │ ├── shortcut-recorder-bezel-editing-right@2x.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-left.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-left@2x.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-middle.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-middle@2x.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-right.png │ │ ├── shortcut-recorder-bezel-graphite-highlighted-right@2x.png │ │ ├── shortcut-recorder-bezel-left.png │ │ ├── shortcut-recorder-bezel-left@2x.png │ │ ├── shortcut-recorder-bezel-middle.png │ │ ├── shortcut-recorder-bezel-middle@2x.png │ │ ├── shortcut-recorder-bezel-right.png │ │ ├── shortcut-recorder-bezel-right@2x.png │ │ ├── shortcut-recorder-clear-highlighted.png │ │ ├── shortcut-recorder-clear-highlighted@2x.png │ │ ├── shortcut-recorder-clear.png │ │ ├── shortcut-recorder-clear@2x.png │ │ ├── shortcut-recorder-snapback-highlighted.png │ │ ├── shortcut-recorder-snapback-highlighted@2x.png │ │ ├── shortcut-recorder-snapback.png │ │ ├── shortcut-recorder-snapback@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-left.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-right.png │ │ ├── shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-left.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-right.png │ │ ├── shortcut-recorder-yosemite-bezel-disabled-right@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-left.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-right.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-left.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-right.png │ │ ├── shortcut-recorder-yosemite-bezel-editing-right@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png │ │ ├── shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-left.png │ │ ├── shortcut-recorder-yosemite-bezel-left@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-middle.png │ │ ├── shortcut-recorder-yosemite-bezel-middle@2x.png │ │ ├── shortcut-recorder-yosemite-bezel-right.png │ │ ├── shortcut-recorder-yosemite-bezel-right@2x.png │ │ ├── shortcut-recorder-yosemite-clear-highlighted.png │ │ ├── shortcut-recorder-yosemite-clear-highlighted@2x.png │ │ ├── shortcut-recorder-yosemite-clear.png │ │ ├── shortcut-recorder-yosemite-clear@2x.png │ │ ├── shortcut-recorder-yosemite-snapback-highlighted.png │ │ ├── shortcut-recorder-yosemite-snapback-highlighted@2x.png │ │ ├── shortcut-recorder-yosemite-snapback.png │ │ ├── shortcut-recorder-yosemite-snapback@2x.png │ │ ├── sk.lproj │ │ └── ShortcutRecorder.strings │ │ ├── sv.lproj │ │ └── ShortcutRecorder.strings │ │ ├── th.lproj │ │ └── ShortcutRecorder.strings │ │ ├── zh-Hans.lproj │ │ └── ShortcutRecorder.strings │ │ └── zh-Hant.lproj │ │ └── ShortcutRecorder.strings └── Target Support Files │ ├── Pods-Funky │ ├── Info.plist │ ├── Pods-Funky-acknowledgements.markdown │ ├── Pods-Funky-acknowledgements.plist │ ├── Pods-Funky-dummy.m │ ├── Pods-Funky-frameworks.sh │ ├── Pods-Funky-resources.sh │ ├── Pods-Funky-umbrella.h │ ├── Pods-Funky.debug.xcconfig │ ├── Pods-Funky.modulemap │ └── Pods-Funky.release.xcconfig │ └── ShortcutRecorder │ ├── Info.plist │ ├── ResourceBundle-ShortcutRecorder-Info.plist │ ├── ShortcutRecorder-dummy.m │ ├── ShortcutRecorder-prefix.pch │ ├── ShortcutRecorder-umbrella.h │ ├── ShortcutRecorder.modulemap │ └── ShortcutRecorder.xcconfig ├── Privacy.md └── Readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | # CocoaPods 31 | # 32 | # We recommend against adding the Pods directory to your .gitignore. However 33 | # you should judge for yourself, the pros and cons are mentioned at: 34 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 35 | # 36 | # Pods/ 37 | 38 | # Carthage 39 | # 40 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 41 | # Carthage/Checkouts 42 | 43 | Carthage/Build 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 51 | 52 | fastlane/report.xml 53 | fastlane/screenshots 54 | 55 | #Code Injection 56 | # 57 | # After new code Injection tools there's a generated folder /iOSInjectionProject 58 | # https://github.com/johnno1962/injectionforxcode 59 | 60 | iOSInjectionProject/ 61 | -------------------------------------------------------------------------------- /Credits.md: -------------------------------------------------------------------------------- 1 | # Credits 2 | 3 | Funky uses the following open-source third-party libraries 4 | 5 | 6 | ## ShortcutRecorder 7 | 8 | - **Source:** [https://github.com/JanX2/ShortcutRecorder/](https://github.com/JanX2/ShortcutRecorder/) 9 | - **License**: [https://github.com/JanX2/ShortcutRecorder/blob/master/LICENSE.md](https://github.com/JanX2/ShortcutRecorder/blob/master/LICENSE.md) 10 | -------------------------------------------------------------------------------- /Funky.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Funky.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Funky.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "Funky-16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "Funky-16x16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "Funky-32x32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "Funky-32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "Funky-128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "Funky-128x128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "Funky-256x256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "Funky-256x256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "Funky-512x512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "Funky-512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-128x128.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-128x128@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-16x16.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-16x16@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-256x256.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-256x256@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-32x32.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-32x32@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-512x512.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/AppIcon.appiconset/Funky-512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/AppIcon.appiconset/Funky-512x512@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusActiveTemplate.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunkyStatusActiveTemplate.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunkyStatusActiveTemplate@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusActiveTemplate.imageset/FunkyStatusActiveTemplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/FunkyStatusActiveTemplate.imageset/FunkyStatusActiveTemplate.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusActiveTemplate.imageset/FunkyStatusActiveTemplate@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/FunkyStatusActiveTemplate.imageset/FunkyStatusActiveTemplate@2x.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusTemplate.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "FunkyStatusTemplate.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "FunkyStatusTemplate@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusTemplate.imageset/FunkyStatusTemplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/FunkyStatusTemplate.imageset/FunkyStatusTemplate.png -------------------------------------------------------------------------------- /Funky/Assets.xcassets/FunkyStatusTemplate.imageset/FunkyStatusTemplate@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/Assets.xcassets/FunkyStatusTemplate.imageset/FunkyStatusTemplate@2x.png -------------------------------------------------------------------------------- /Funky/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /Funky/FKAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKAppDelegate.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 01/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define FKBundlesKeyPath @"FKBundles" 12 | #define FKToggleAppShortcutKeyPath @"FKToggleAppShortcut" 13 | #define FKToggleAppShortcutKeyIdentifier @"FKToggleAppHotKey" 14 | #define FKLaunchOnLoginKeyPath @"FKLaunchOnLogin" 15 | 16 | @class FKPreferencesWindowController, FKBundle; 17 | 18 | @interface FKAppDelegate : NSObject 19 | 20 | @property (strong) FKPreferencesWindowController *preferencesWindowController; 21 | @property (strong) NSStatusItem *statusItem; 22 | @property (assign) BOOL launchOnLogin; 23 | 24 | @property (strong) IBOutlet NSMenuItem *toggleCurrentAppMenuItem; 25 | 26 | @end 27 | 28 | -------------------------------------------------------------------------------- /Funky/FKBinaryIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Funky/FKBinaryIcon.icns -------------------------------------------------------------------------------- /Funky/FKBundle.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKBundle.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 20/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define FKBundleNameKey @"name" 12 | #define FKBundlePathKey @"path" 13 | #define FKBundleExecutablePathKey @"executablePath" 14 | #define FKBundleIdentifierKey @"identifier" 15 | #define FKBundleImageKey @"image" 16 | 17 | @interface FKBundle : NSObject 18 | 19 | @property (nonatomic, strong) NSString *name; 20 | @property (nonatomic, strong) NSString *path; 21 | @property (nonatomic, strong) NSString *identifier; 22 | @property (nonatomic, strong) NSString *executablePath; 23 | @property (nonatomic, strong) NSImage *image; 24 | 25 | @property (nonatomic, readonly) BOOL available; 26 | 27 | + (instancetype __autoreleasing)bundleWithURL:(NSURL *)URL; 28 | + (instancetype __autoreleasing)bundleWithExecutableURL:(NSURL *)URL; 29 | 30 | - (instancetype)initWithURL:(NSURL *)URL; 31 | - (instancetype)initWithExecutableURL:(NSURL *)URL; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Funky/FKBundle.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKBundle.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 20/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "FKBundle.h" 12 | 13 | @implementation FKBundle 14 | 15 | + (instancetype)bundleWithURL:(NSURL *)URL { 16 | return [[FKBundle alloc] initWithURL:URL]; 17 | } 18 | 19 | + (instancetype)bundleWithExecutableURL:(NSURL *)URL { 20 | return [[FKBundle alloc] initWithExecutableURL:URL]; 21 | } 22 | 23 | - (instancetype)initWithExecutableURL:(NSURL *)URL { 24 | NSURL *expectedBundleURL = URL.URLByDeletingLastPathComponent.URLByDeletingLastPathComponent.URLByDeletingLastPathComponent; 25 | self = [self initWithURL:expectedBundleURL]; 26 | if ( [self.executablePath isEqualToString:URL.path] ) { 27 | return self; 28 | } 29 | 30 | self = [super init]; 31 | if ( self != nil ) { 32 | self.name = URL.lastPathComponent; 33 | self.path = URL.path; 34 | self.executablePath = URL.path; 35 | self.image = [[NSImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"FKBinaryIcon" withExtension:@"icns"]]; 36 | } 37 | return self; 38 | } 39 | 40 | - (instancetype)initWithURL:(NSURL *)URL { 41 | self = [super init]; 42 | if ( self != nil ) { 43 | NSBundle *bundle = [NSBundle bundleWithURL:URL]; 44 | self.identifier = [bundle.bundleIdentifier copy]; 45 | self.name = [bundle objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey]; 46 | self.path = [bundle.bundlePath copy]; 47 | self.executablePath = [bundle.executablePath copy]; 48 | self.image = [[NSWorkspace sharedWorkspace] iconForFile:bundle.bundlePath] ? : [NSImage imageNamed:NSImageNameApplicationIcon]; 49 | } 50 | return self; 51 | } 52 | 53 | - (instancetype)initWithCoder:(NSCoder *)decoder { 54 | self = [super init]; 55 | if ( self != nil ) { 56 | self.name = [decoder decodeObjectForKey:FKBundleNameKey]; 57 | self.path = [decoder decodeObjectForKey:FKBundlePathKey]; 58 | self.identifier = [decoder decodeObjectForKey:FKBundleIdentifierKey]; 59 | 60 | self.executablePath = [decoder decodeObjectForKey:FKBundleExecutablePathKey]; 61 | if ( self.executablePath.length == 0 ) { 62 | self.executablePath = [NSBundle bundleWithPath:self.path].executablePath; 63 | } 64 | 65 | if ( [self.path isEqualToString:self.executablePath] ) { 66 | self.image = [[NSImage alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"FKBinaryIcon" withExtension:@"icns"]]; 67 | } else { 68 | self.image = [[NSWorkspace sharedWorkspace] iconForFile:self.path] ? : [NSImage imageNamed:NSImageNameApplicationIcon]; 69 | } 70 | 71 | } 72 | return self; 73 | } 74 | 75 | - (void)encodeWithCoder:(NSCoder *)coder { 76 | [coder encodeObject:self.name forKey:FKBundleNameKey]; 77 | [coder encodeObject:self.path forKey:FKBundlePathKey]; 78 | [coder encodeObject:self.identifier forKey:FKBundleIdentifierKey]; 79 | [coder encodeObject:self.executablePath forKey:FKBundleExecutablePathKey]; 80 | } 81 | 82 | - (NSString *)description { 83 | return [NSString stringWithFormat:@"%@ %@", super.description, self.name]; 84 | } 85 | 86 | - (BOOL)isEqual:(id)object { 87 | return [self isEqualTo:object]; 88 | } 89 | 90 | - (BOOL)isEqualTo:(id)object { 91 | if ( ![object isKindOfClass:[self class]] ) { 92 | return NO; 93 | } 94 | return [self.identifier isEqualToString:((FKBundle *) object).identifier]; 95 | } 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /Funky/FKBundleTableCellView.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKBundleTableCellView.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 22/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FKBundleTableCellView : NSTableCellView 12 | 13 | @property (weak) IBOutlet NSTextField *titleLabel; 14 | @property (weak) IBOutlet NSTextField *pathLabel; 15 | @property (weak) IBOutlet NSImageView *thumbnailImageView; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Funky/FKBundleTableCellView.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKBundleTableCellView.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 22/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import "FKBundleTableCellView.h" 10 | 11 | @implementation FKBundleTableCellView 12 | 13 | - (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { 14 | [super setBackgroundStyle:backgroundStyle]; 15 | self.titleLabel.textColor = (backgroundStyle == NSBackgroundStyleLight ? [NSColor labelColor] : [NSColor selectedTextColor]); 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Funky/FKExecutablePathWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKExecutablePathWindowController.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 17/05/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FKExecutablePathWindowController : NSWindowController 12 | 13 | @property (nonatomic, strong) NSString * selectedPath; 14 | 15 | - (IBAction)confirmPath:(id)sender; 16 | - (IBAction)cancel:(id)sender; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Funky/FKExecutablePathWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKExecutablePathWindowController.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 17/05/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import "FKExecutablePathWindowController.h" 10 | 11 | @interface FKExecutablePathWindowController () 12 | 13 | @end 14 | 15 | @implementation FKExecutablePathWindowController 16 | 17 | 18 | - (IBAction)confirmPath:(id)sender { 19 | [NSApp endSheet:self.window returnCode:NSOKButton]; 20 | [self close]; 21 | } 22 | 23 | - (IBAction)cancel:(id)sender { 24 | [NSApp endSheet:self.window returnCode:NSCancelButton]; 25 | [self close]; 26 | } 27 | 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Funky/FKHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKHelper.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 02/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define FKHelperErrorDomain @"FKHelperErrorDomain" 12 | #define FKHelperMachErrorDomain @"FKHelperMachErrorDomain" 13 | 14 | #define FKHelperMachErrorNoClass 101 15 | #define FKHelperMachErrorNoServices 102 16 | 17 | @interface FKHelper : NSObject 18 | 19 | + (instancetype)sharedHelper; 20 | 21 | - (BOOL)setFnKeyState:(BOOL)state error:(NSError * __autoreleasing *)error; 22 | - (pid_t)parentProcessForPID:(NSUInteger)pid error:(NSError * __autoreleasing *)error; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /Funky/FKHelper.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKHelper.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 02/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | #import "FKHelper.h" 13 | 14 | @interface FKHelper () 15 | 16 | - (NSError *)machErrorWithResult:(kern_return_t)res; 17 | - (NSError *)posixError; 18 | 19 | @end 20 | 21 | @implementation FKHelper 22 | 23 | + (instancetype)sharedHelper { 24 | static FKHelper *sharedHelper; 25 | static dispatch_once_t onceToken; 26 | dispatch_once(&onceToken, ^{ 27 | sharedHelper = [[FKHelper alloc] init]; 28 | }); 29 | return sharedHelper; 30 | } 31 | 32 | - (NSError *)machErrorWithResult:(kern_return_t)res { 33 | NSString *description = [NSString stringWithUTF8String:mach_error_string(res)] ? : [NSString stringWithFormat:@"Unknown kernel result code: %d", res]; 34 | NSError *error = [NSError errorWithDomain:FKHelperMachErrorDomain code:@(res).integerValue userInfo:@{NSLocalizedDescriptionKey: description}]; 35 | return error; 36 | } 37 | 38 | - (NSError *)posixError { 39 | int errorNo = errno; 40 | NSString *description = [NSString stringWithUTF8String:strerror(errorNo)]; 41 | NSError *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:@(errorNo).integerValue userInfo:@{NSLocalizedDescriptionKey: description}]; 42 | return error; 43 | } 44 | 45 | - (BOOL)setFnKeyState:(BOOL)state error:(NSError *__autoreleasing *)error { 46 | 47 | kern_return_t ret; 48 | mach_port_t port; 49 | 50 | ret = IOMasterPort(bootstrap_port, &port); 51 | if ( ret != KERN_SUCCESS ) { 52 | if ( error != NULL ) { 53 | *error = [self machErrorWithResult:ret]; 54 | } 55 | return NO; 56 | } 57 | 58 | CFDictionaryRef class = IOServiceMatching(kIOHIDSystemClass); 59 | if ( class == NULL ) { 60 | if ( error != NULL ) { 61 | *error = [NSError errorWithDomain:FKHelperMachErrorDomain code:FKHelperMachErrorNoClass userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"No matching IO Class: %s", kIOHIDSystemClass]}]; 62 | } 63 | return NO; 64 | } 65 | 66 | io_iterator_t iterator; 67 | ret = IOServiceGetMatchingServices(port, class, &iterator); 68 | if ( ret != KERN_SUCCESS ) { 69 | if ( error != NULL ) { 70 | *error = [self machErrorWithResult:ret]; 71 | } 72 | return NO; 73 | } 74 | 75 | io_service_t service = IOIteratorNext(iterator); 76 | IOObjectRelease(iterator); 77 | 78 | if ( !service ){ 79 | if ( error != NULL ) { 80 | *error = [NSError errorWithDomain:FKHelperMachErrorDomain code:FKHelperMachErrorNoServices userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"No matching services for class %s", kIOHIDSystemClass]}]; 81 | } 82 | return NO; 83 | } 84 | 85 | io_connect_t connect; 86 | ret = IOServiceOpen(service, mach_task_self(), kIOHIDParamConnectType, &connect); 87 | if ( ret != KERN_SUCCESS ) { 88 | if ( error != NULL ) { 89 | *error = [self machErrorWithResult:ret]; 90 | } 91 | return NO; 92 | } 93 | 94 | unsigned int val = state; 95 | ret = IOHIDSetParameter(connect, CFSTR(kIOHIDFKeyModeKey), &val, sizeof(val)); 96 | if ( ret != KERN_SUCCESS ) { 97 | if ( error != NULL ) { 98 | *error = [self machErrorWithResult:ret]; 99 | } 100 | IOServiceClose(connect); 101 | return NO; 102 | } 103 | 104 | IOServiceClose(connect); 105 | return YES; 106 | } 107 | 108 | - (pid_t)parentProcessForPID:(NSUInteger)pid error:(NSError * __autoreleasing *)error { 109 | struct kinfo_proc info; 110 | size_t length = sizeof(struct kinfo_proc); 111 | int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, @(pid).intValue }; 112 | 113 | kern_return_t ret; 114 | ret = sysctl(mib, 4, &info, &length, NULL, 0); 115 | 116 | if ( ret != KERN_SUCCESS) { 117 | if ( error != NULL ) { 118 | *error = [self posixError]; 119 | } 120 | return INT32_MAX; 121 | } 122 | 123 | if ( length == 0 ) { 124 | if ( error != NULL ) { 125 | *error = nil; 126 | } 127 | return INT32_MAX; 128 | } 129 | 130 | return info.kp_eproc.e_ppid; 131 | } 132 | 133 | @end 134 | -------------------------------------------------------------------------------- /Funky/FKPreferencesAdvancedViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesAdvancedViewController.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 07/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FKPreferencesAdvancedViewController : NSViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Funky/FKPreferencesAdvancedViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesAdvancedViewController.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 07/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import "FKPreferencesAdvancedViewController.h" 10 | 11 | @interface FKPreferencesAdvancedViewController () 12 | 13 | @end 14 | 15 | @implementation FKPreferencesAdvancedViewController 16 | 17 | - (void)awakeFromNib { 18 | 19 | } 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Funky/FKPreferencesAdvancedViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Funky/FKPreferencesAppsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesAppsViewController.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 05/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FKPreferencesAppsViewController : NSViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Funky/FKPreferencesGeneralViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesGeneralViewController.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 05/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FKPreferencesGeneralViewController : NSViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Funky/FKPreferencesGeneralViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesGeneralViewController.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 05/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "FKPreferencesGeneralViewController.h" 12 | #import "FKAppDelegate.h" 13 | 14 | @interface FKPreferencesGeneralViewController () 15 | 16 | @property (nonatomic, weak) IBOutlet SRRecorderControl *toggleAppShortcut; 17 | 18 | @end 19 | 20 | @implementation FKPreferencesGeneralViewController 21 | 22 | - (void)awakeFromNib { 23 | [super awakeFromNib]; 24 | 25 | [self.toggleAppShortcut bind:NSValueBinding toObject:[NSUserDefaults standardUserDefaults] withKeyPath:FKToggleAppShortcutKeyPath options:nil]; 26 | } 27 | 28 | - (void)dealloc { 29 | [self.toggleAppShortcut unbind:NSValueBinding]; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Funky/FKPreferencesGeneralViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Funky/FKPreferencesWindowController.h: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesWindowController.h 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 3/5/17. 6 | // Copyright (c) 2017 Cătălin Stan. All rights reserved. 7 | 8 | #import 9 | 10 | @interface FKPreferencesWindowController : NSWindowController 11 | 12 | - (instancetype)initWithWindowNibName:(NSString *)windowNibName currentViewIdx:(NSUInteger)idx; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Funky/FKPreferencesWindowController.m: -------------------------------------------------------------------------------- 1 | // 2 | // FKPreferencesWindowController.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 3/5/17. 6 | // Copyright (c) 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import "FKPreferencesWindowController.h" 10 | #import "FKAppDelegate.h" 11 | 12 | @interface FKPreferencesWindowController () { 13 | BOOL shouldRecalculateWindowY; 14 | NSUInteger currentViewIdx; 15 | } 16 | 17 | @property (weak) IBOutlet NSToolbar *toolbar; 18 | 19 | @property (strong) NSViewController *currentViewController; 20 | @property (strong) NSButton *quitButton; 21 | 22 | @property (readonly) CGFloat toolbarHeight; 23 | @property (readonly) CGFloat titleHeight; 24 | 25 | - (IBAction)loadView:(id)sender; 26 | 27 | + (NSDictionary *)toolbarItems; 28 | 29 | @end 30 | 31 | @implementation FKPreferencesWindowController 32 | 33 | - (instancetype)initWithWindowNibName:(NSString *)windowNibName currentViewIdx:(NSUInteger)idx { 34 | self = [self initWithWindowNibName:windowNibName]; 35 | if ( self != nil ) { 36 | currentViewIdx = MAX(MIN([FKPreferencesWindowController toolbarItems].count, idx), 0); 37 | } 38 | return self; 39 | } 40 | 41 | - (CGFloat)toolbarHeight { 42 | static CGFloat toolbarHeight; 43 | static dispatch_once_t onceToken; 44 | dispatch_once(&onceToken, ^{ 45 | toolbarHeight = self.window.frame.size.height - [self titleHeight] - self.window.contentView.frame.size.height; 46 | }); 47 | return toolbarHeight; 48 | } 49 | 50 | - (CGFloat)titleHeight { 51 | static CGFloat titleHeight; 52 | static dispatch_once_t onceToken; 53 | dispatch_once(&onceToken, ^{ 54 | NSRect frame = NSMakeRect (0, 0, 100, 100); 55 | NSRect contentRect = [NSWindow contentRectForFrameRect: frame styleMask: NSTitledWindowMask]; 56 | titleHeight = frame.size.height - contentRect.size.height; 57 | }); 58 | return titleHeight; 59 | } 60 | 61 | + (NSDictionary *)toolbarItems { 62 | static NSDictionary *toolbarItems; 63 | static dispatch_once_t onceToken; 64 | dispatch_once(&onceToken, ^{ 65 | toolbarItems = @{ 66 | @"General": [NSImage imageNamed:NSImageNamePreferencesGeneral], 67 | @"Apps": [NSImage imageNamed:NSImageNameApplicationIcon], 68 | // @"Advanced": [NSImage imageNamed:NSImageNameAdvanced] 69 | }; 70 | }); 71 | return toolbarItems; 72 | } 73 | 74 | - (void)awakeFromNib { 75 | self.quitButton = [[NSButton alloc] initWithFrame:NSZeroRect]; 76 | self.quitButton.title = @"Quit"; 77 | self.quitButton.target = NSApp; 78 | self.quitButton.action = @selector(terminate:); 79 | self.quitButton.keyEquivalent = @"q"; 80 | self.quitButton.keyEquivalentModifierMask = NSCommandKeyMask; 81 | [self.window.contentView addSubview:self.quitButton]; 82 | 83 | [self.window standardWindowButton:NSWindowCloseButton].keyEquivalent = @"w"; 84 | [self.window standardWindowButton:NSWindowCloseButton].keyEquivalentModifierMask = NSCommandKeyMask; 85 | 86 | self.toolbar.selectedItemIdentifier = self.toolbar.items[currentViewIdx].itemIdentifier; 87 | [self loadView:self.toolbar.items[currentViewIdx]]; 88 | } 89 | 90 | - (void)windowWillClose:(NSNotification *)notification { 91 | FKAppDelegate *delegate = (FKAppDelegate *) NSApp.delegate; 92 | delegate.preferencesWindowController = nil; 93 | } 94 | 95 | - (instancetype)initWithWindowNibName:(NSString *)windowNibName { 96 | self = [super initWithWindowNibName:windowNibName]; 97 | if ( self ) { 98 | } 99 | return self; 100 | } 101 | 102 | - (IBAction)loadView:(id)sender { 103 | NSToolbarItem *item = (NSToolbarItem*) sender; 104 | NSString *viewControllerClassName = [NSString stringWithFormat:@"FKPreferences%@ViewController", item.label]; 105 | Class viewControllerClass = NSClassFromString(viewControllerClassName); 106 | 107 | if ( viewControllerClass == nil ) { 108 | NSLog(@"Unable to load class: %@", viewControllerClassName); 109 | return; 110 | } 111 | 112 | if ( [self.currentViewController isKindOfClass:viewControllerClass] ) { 113 | return; 114 | } 115 | 116 | NSString *title = self.window.title; 117 | 118 | self.window.title = [NSString stringWithFormat: @"Loading %@ ...", ((NSToolbarItem*) sender).label]; 119 | [self.window setViewsNeedDisplay:YES]; 120 | 121 | if ( self.currentViewController != nil) { 122 | [self.currentViewController.view removeFromSuperview]; 123 | self.currentViewController = nil; 124 | } 125 | 126 | NSRect windowFrame = self.window.frame; 127 | 128 | self.currentViewController = [[viewControllerClass alloc] initWithNibName:nil bundle:nil]; 129 | NSRect newViewFrame = self.currentViewController.view.frame; 130 | newViewFrame.size.width = windowFrame.size.width; 131 | newViewFrame.origin.y = 0; 132 | 133 | windowFrame.size.height = self.titleHeight + self.toolbarHeight + self.currentViewController.view.frame.size.height; 134 | if ( shouldRecalculateWindowY ) { 135 | windowFrame.origin.y -= windowFrame.size.height - self.window.frame.size.height; 136 | } 137 | shouldRecalculateWindowY = YES; 138 | 139 | [self.window setFrame:windowFrame display:YES animate:YES]; 140 | [self.window.contentView addSubview:self.currentViewController.view]; 141 | [self.currentViewController.view setFrame:newViewFrame]; 142 | 143 | [self.window layoutIfNeeded]; 144 | self.window.title = title; 145 | [self.window setViewsNeedDisplay:YES]; 146 | } 147 | 148 | #pragma mark - NSToolbarDelegate 149 | 150 | - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { 151 | 152 | NSString *itemClassName = [NSString stringWithFormat:@"FKPreferences%@ViewController", itemIdentifier]; 153 | Class itemClass = NSClassFromString(itemClassName); 154 | if ( !itemClass ) { 155 | NSLog(@" * Unable to find %@. Skipping %@ toolbar item.", itemClassName, itemIdentifier); 156 | return nil; 157 | } 158 | 159 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; 160 | item.label = NSLocalizedString(itemIdentifier,); 161 | item.image = [FKPreferencesWindowController toolbarItems][itemIdentifier]; 162 | item.autovalidates = YES; 163 | 164 | if ( flag ) { 165 | item.action = @selector(loadView:); 166 | } 167 | 168 | return item; 169 | } 170 | 171 | - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar { 172 | return [FKPreferencesWindowController toolbarItems].allKeys; 173 | } 174 | 175 | - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { 176 | return [FKPreferencesWindowController toolbarItems].allKeys; 177 | } 178 | 179 | - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar { 180 | return [FKPreferencesWindowController toolbarItems].allKeys; 181 | } 182 | 183 | 184 | @end 185 | -------------------------------------------------------------------------------- /Funky/FKPreferencesWindowController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Funky/Funky.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.icloud-container-identifiers 6 | 7 | com.apple.developer.ubiquity-kvstore-identifier 8 | $(TeamIdentifierPrefix)$(CFBundleIdentifier) 9 | com.apple.security.app-sandbox 10 | 11 | com.apple.security.files.user-selected.read-only 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.temporary-exception.sbpl 16 | 17 | (allow iokit-set-properties (iokit-property "HIDFKeyMode")) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Funky/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.1 21 | CFBundleVersion 22 | 6 23 | Fabric 24 | 25 | APIKey 26 | 41b2b87be52ab143a0c7a2fe9c4d179d3799509a 27 | Kits 28 | 29 | 30 | KitInfo 31 | 32 | KitName 33 | Crashlytics 34 | 35 | 36 | 37 | LSApplicationCategoryType 38 | public.app-category.productivity 39 | LSMinimumSystemVersion 40 | $(MACOSX_DEPLOYMENT_TARGET) 41 | LSUIElement 42 | 43 | NSHumanReadableCopyright 44 | Copyright © 2017 Cătălin Stan. All rights reserved. 45 | NSMainNibFile 46 | MainMenu 47 | NSPrincipalClass 48 | NSApplication 49 | 50 | 51 | -------------------------------------------------------------------------------- /Funky/RVNReceiptValidation.h: -------------------------------------------------------------------------------- 1 | // 2 | // RVNReceiptValidation.h 3 | // 4 | // Created by Satoshi Numata on 12/06/30. 5 | // Copyright (c) 2012 Sazameki and Satoshi Numata, Ph.D. All rights reserved. 6 | // 7 | // This sample shows how to write the Mac App Store receipt validation code. 8 | // Replace kRVNBundleID and kRVNBundleVersion with your own ones. 9 | // 10 | // This sample is provided because the coding sample found in "Validating Mac App Store Receipts" 11 | // is somehow out-of-date today and some functions are deprecated in Mac OS X 10.7. 12 | // (cf. Validating Mac App Store Receipts: ) 13 | // 14 | // You must want to make it much more robustness with some techniques, such as obfuscation 15 | // with your "own" way. If you use and share the same codes with your friends, attackers 16 | // will be able to make a special tool to patch application binaries so easily. 17 | // Again, this sample gives you the very basic idea that which APIs can be used for the validation. 18 | // 19 | // Don't forget to add IOKit.framework and Security.framework to your project. 20 | // The main() function should be replaced with the (commented out) main() code at the bottom of this sample. 21 | // This sample assume that you are using Automatic Reference Counting for memory management. 22 | // 23 | // Have a nice Cocoa flavor, guys!! 24 | // 25 | #import 26 | 27 | #import 28 | #import 29 | #import 30 | #import 31 | #import 32 | 33 | #import 34 | 35 | void RVNValidate(void); -------------------------------------------------------------------------------- /Funky/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Funky 4 | // 5 | // Created by Cătălin Stan on 01/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RVNReceiptValidation.h" 11 | 12 | // Set this to 1 to skip Mac AppStore receipt validation 13 | #ifndef DEVELOPMENT 14 | # define DEVELOPMENT 0 15 | #endif 16 | 17 | int main(int argc, const char * argv[]) { 18 | @try { 19 | #if !DEBUG && !DEVELOPMENT 20 | RVNValidate(); 21 | #endif 22 | return NSApplicationMain(argc, argv); 23 | } @catch (NSException *e) { 24 | NSLog(@"%@", e.reason); 25 | return EXIT_FAILURE; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /FunkyHelper/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // FunkyHelper 4 | // 5 | // Created by Cătălin Stan on 17/05/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /FunkyHelper/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // FunkyHelper 4 | // 5 | // Created by Cătălin Stan on 17/05/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #define FKMainAppName @"Funky" 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 20 | 21 | NSString* mainBundleIdentifier = [NSBundle mainBundle].bundleIdentifier.stringByDeletingPathExtension; 22 | NSArray *runningApps = [[NSWorkspace sharedWorkspace] runningApplications]; 23 | 24 | #if DEBUG 25 | NSLog(@"Running apps:%@", [runningApps valueForKeyPath:@"bundleIdentifier"]); 26 | #endif 27 | 28 | __block BOOL alreadyRunning = NO; 29 | [runningApps enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSRunningApplication * _Nonnull app, NSUInteger idx, BOOL * _Nonnull stop) { 30 | if ([app.bundleIdentifier isEqualToString:mainBundleIdentifier]) { 31 | alreadyRunning = YES; 32 | *stop = YES; 33 | } 34 | }]; 35 | 36 | 37 | NSLog(@"%@ is running ... %@", mainBundleIdentifier, alreadyRunning ? @"YES" : @"NO"); 38 | 39 | if (!alreadyRunning) { 40 | NSMutableArray *pathComponents = [NSMutableArray arrayWithArray:[NSBundle mainBundle].bundlePath.pathComponents]; 41 | [pathComponents removeLastObject]; 42 | [pathComponents removeLastObject]; 43 | [pathComponents removeLastObject]; 44 | [pathComponents addObject:@"MacOS"]; 45 | [pathComponents addObject:FKMainAppName]; 46 | NSString *executablePath = [NSString pathWithComponents:pathComponents]; 47 | 48 | BOOL isDir = NO; 49 | BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:executablePath isDirectory:&isDir]; 50 | 51 | NSLog(@"Attempting to launch: %@", executablePath); 52 | 53 | if ( !exists ) { 54 | NSLog(@"File does not exist."); 55 | } else if ( isDir ) { 56 | NSLog(@"File exists but is a directory"); 57 | } else { 58 | [[NSWorkspace sharedWorkspace] launchApplication:executablePath]; 59 | } 60 | } 61 | 62 | NSLog(@"Exiting"); 63 | [NSApp terminate:nil]; 64 | 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /FunkyHelper/FunkyHelper.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /FunkyHelper/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.productivity 25 | LSBackgroundOnly 26 | 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | NSHumanReadableCopyright 30 | Copyright © 2017 Cătălin Stan. All rights reserved. 31 | NSMainNibFile 32 | Main 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /FunkyHelper/Main.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /FunkyHelper/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // FunkyHelper 4 | // 5 | // Created by Cătălin Stan on 17/05/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /FunkyTests/FunkyTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // FunkyTests.m 3 | // FunkyTests 4 | // 5 | // Created by Cătălin Stan on 01/03/2017. 6 | // Copyright © 2017 Cătălin Stan. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FunkyTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation FunkyTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /FunkyTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017–2018 Cătălin Stan (https://catalinstan.com/) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, '10.8' 2 | use_frameworks! 3 | 4 | target 'Funky' do 5 | pod 'Crashlytics', '~> 3.12.0' 6 | pod 'Fabric', '~> 1.9.0' 7 | pod 'ShortcutRecorder', :git => 'https://github.com/Kentzo/ShortcutRecorder', :branch => 'master' 8 | end 9 | 10 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.12.0): 3 | - Fabric (~> 1.9.0) 4 | - Fabric (1.9.0) 5 | - ShortcutRecorder (2.17): 6 | - ShortcutRecorder/Core (= 2.17) 7 | - ShortcutRecorder/PTHotKey (= 2.17) 8 | - ShortcutRecorder/Core (2.17) 9 | - ShortcutRecorder/PTHotKey (2.17): 10 | - ShortcutRecorder/Core 11 | 12 | DEPENDENCIES: 13 | - Crashlytics (~> 3.12.0) 14 | - Fabric (~> 1.9.0) 15 | - ShortcutRecorder (from `https://github.com/Kentzo/ShortcutRecorder`, branch `master`) 16 | 17 | SPEC REPOS: 18 | https://github.com/cocoapods/specs.git: 19 | - Crashlytics 20 | - Fabric 21 | 22 | EXTERNAL SOURCES: 23 | ShortcutRecorder: 24 | :branch: master 25 | :git: https://github.com/Kentzo/ShortcutRecorder 26 | 27 | CHECKOUT OPTIONS: 28 | ShortcutRecorder: 29 | :commit: c978ce9bb482c31acfabe23baa2b075808a1fdd8 30 | :git: https://github.com/Kentzo/ShortcutRecorder 31 | 32 | SPEC CHECKSUMS: 33 | Crashlytics: 07fb167b1694128c1c9a5a5cc319b0e9c3ca0933 34 | Fabric: f988e33c97f08930a413e08123064d2e5f68d655 35 | ShortcutRecorder: c0e1ae0e97917925feab04e8817d2be6ef1b0548 36 | 37 | PODFILE CHECKSUM: 84bf582a2f5e83a99e035bfde35f42af6b80449b 38 | 39 | COCOAPODS: 1.5.3 40 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our submit script to a new location for Cocoapods projects: ${PODS_ROOT}/Crashlytics/submit. To avoid breaking functionality that references the old location of the submit, we've placed this dummy script that calls to the correct location, while providing a helpful warning if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Crashlytics/Crashlytics.framework/submit: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The submit binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Crashlytics/submit'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the submit binary to fix this issue." 3 | else 4 | echo "warning: The submit script is now located at '$"{"PODS_ROOT"}"/Crashlytics/submit'. To remove this warning, update your path to point to this new location." 5 | sh "${PODS_ROOT}/Crashlytics/submit" "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Crashlytics: -------------------------------------------------------------------------------- 1 | Versions/Current/Crashlytics -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Crashlytics: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Crashlytics -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/ANSCompatibility.h: -------------------------------------------------------------------------------- 1 | // 2 | // ANSCompatibility.h 3 | // AnswersKit 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #if !__has_feature(nullability) 11 | #define nonnull 12 | #define nullable 13 | #define _Nullable 14 | #define _Nonnull 15 | #endif 16 | 17 | #ifndef NS_ASSUME_NONNULL_BEGIN 18 | #define NS_ASSUME_NONNULL_BEGIN 19 | #endif 20 | 21 | #ifndef NS_ASSUME_NONNULL_END 22 | #define NS_ASSUME_NONNULL_END 23 | #endif 24 | 25 | #if __has_feature(objc_generics) 26 | #define ANS_GENERIC_NSARRAY(type) NSArray 27 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 28 | #else 29 | #define ANS_GENERIC_NSARRAY(type) NSArray 30 | #define ANS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 31 | #endif 32 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSAttributes.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #pragma once 9 | 10 | #define CLS_DEPRECATED(x) __attribute__ ((deprecated(x))) 11 | 12 | #if !__has_feature(nullability) 13 | #define nonnull 14 | #define nullable 15 | #define _Nullable 16 | #define _Nonnull 17 | #endif 18 | 19 | #ifndef NS_ASSUME_NONNULL_BEGIN 20 | #define NS_ASSUME_NONNULL_BEGIN 21 | #endif 22 | 23 | #ifndef NS_ASSUME_NONNULL_END 24 | #define NS_ASSUME_NONNULL_END 25 | #endif 26 | 27 | #if __has_feature(objc_generics) 28 | #define CLS_GENERIC_NSARRAY(type) NSArray 29 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 30 | #else 31 | #define CLS_GENERIC_NSARRAY(type) NSArray 32 | #define CLS_GENERIC_NSDICTIONARY(key_type,object_key) NSDictionary 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSLogging.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSLogging.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | #ifdef __OBJC__ 8 | #import "CLSAttributes.h" 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | #endif 13 | 14 | 15 | 16 | /** 17 | * 18 | * The CLS_LOG macro provides as easy way to gather more information in your log messages that are 19 | * sent with your crash data. CLS_LOG prepends your custom log message with the function name and 20 | * line number where the macro was used. If your app was built with the DEBUG preprocessor macro 21 | * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog. 22 | * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only. 23 | * 24 | * Example output: 25 | * -[AppDelegate login:] line 134 $ login start 26 | * 27 | * If you would like to change this macro, create a new header file, unset our define and then define 28 | * your own version. Make sure this new header file is imported after the Crashlytics header file. 29 | * 30 | * #undef CLS_LOG 31 | * #define CLS_LOG(__FORMAT__, ...) CLSNSLog... 32 | * 33 | **/ 34 | #ifdef __OBJC__ 35 | #ifdef DEBUG 36 | #define CLS_LOG(__FORMAT__, ...) CLSNSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 37 | #else 38 | #define CLS_LOG(__FORMAT__, ...) CLSLog((@"%s line %d $ " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 39 | #endif 40 | #endif 41 | 42 | /** 43 | * 44 | * Add logging that will be sent with your crash data. This logging will not show up in the system.log 45 | * and will only be visible in your Crashlytics dashboard. 46 | * 47 | **/ 48 | 49 | #ifdef __OBJC__ 50 | OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 51 | OBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); 52 | 53 | /** 54 | * 55 | * Add logging that will be sent with your crash data. This logging will show up in the system.log 56 | * and your Crashlytics dashboard. It is not recommended for Release builds. 57 | * 58 | **/ 59 | OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2); 60 | OBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0); 61 | 62 | 63 | NS_ASSUME_NONNULL_END 64 | #endif 65 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSReport.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSReport.h 3 | // Crashlytics 4 | // 5 | // Copyright (c) 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "CLSAttributes.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details. 15 | **/ 16 | @protocol CLSCrashReport 17 | 18 | @property (nonatomic, copy, readonly) NSString *identifier; 19 | @property (nonatomic, copy, readonly) NSDictionary *customKeys; 20 | @property (nonatomic, copy, readonly) NSString *bundleVersion; 21 | @property (nonatomic, copy, readonly) NSString *bundleShortVersionString; 22 | @property (nonatomic, readonly, nullable) NSDate *crashedOnDate; 23 | @property (nonatomic, copy, readonly) NSString *OSVersion; 24 | @property (nonatomic, copy, readonly) NSString *OSBuildVersion; 25 | 26 | @end 27 | 28 | /** 29 | * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can 30 | * use this class to get information about the event, and can also set some values after the 31 | * event has occurred. 32 | **/ 33 | @interface CLSReport : NSObject 34 | 35 | - (instancetype)init NS_UNAVAILABLE; 36 | + (instancetype)new NS_UNAVAILABLE; 37 | 38 | /** 39 | * Returns the session identifier for the report. 40 | **/ 41 | @property (nonatomic, copy, readonly) NSString *identifier; 42 | 43 | /** 44 | * Returns the custom key value data for the report. 45 | **/ 46 | @property (nonatomic, copy, readonly) NSDictionary *customKeys; 47 | 48 | /** 49 | * Returns the CFBundleVersion of the application that generated the report. 50 | **/ 51 | @property (nonatomic, copy, readonly) NSString *bundleVersion; 52 | 53 | /** 54 | * Returns the CFBundleShortVersionString of the application that generated the report. 55 | **/ 56 | @property (nonatomic, copy, readonly) NSString *bundleShortVersionString; 57 | 58 | /** 59 | * Returns the date that the report was created. 60 | **/ 61 | @property (nonatomic, copy, readonly) NSDate *dateCreated; 62 | 63 | /** 64 | * Returns the os version that the application crashed on. 65 | **/ 66 | @property (nonatomic, copy, readonly) NSString *OSVersion; 67 | 68 | /** 69 | * Returns the os build version that the application crashed on. 70 | **/ 71 | @property (nonatomic, copy, readonly) NSString *OSBuildVersion; 72 | 73 | /** 74 | * Returns YES if the report contains any crash information, otherwise returns NO. 75 | **/ 76 | @property (nonatomic, assign, readonly) BOOL isCrash; 77 | 78 | /** 79 | * You can use this method to set, after the event, additional custom keys. The rules 80 | * and semantics for this method are the same as those documented in Crashlytics.h. Be aware 81 | * that the maximum size and count of custom keys is still enforced, and you can overwrite keys 82 | * and/or cause excess keys to be deleted by using this method. 83 | **/ 84 | - (void)setObjectValue:(nullable id)value forKey:(NSString *)key; 85 | 86 | /** 87 | * Record an application-specific user identifier. See Crashlytics.h for details. 88 | **/ 89 | @property (nonatomic, copy, nullable) NSString * userIdentifier; 90 | 91 | /** 92 | * Record a user name. See Crashlytics.h for details. 93 | **/ 94 | @property (nonatomic, copy, nullable) NSString * userName; 95 | 96 | /** 97 | * Record a user email. See Crashlytics.h for details. 98 | **/ 99 | @property (nonatomic, copy, nullable) NSString * userEmail; 100 | 101 | @end 102 | 103 | NS_ASSUME_NONNULL_END 104 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Headers/CLSStackFrame.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSStackFrame.h 3 | // Crashlytics 4 | // 5 | // Copyright 2015 Crashlytics, Inc. All rights reserved. 6 | // 7 | 8 | #import 9 | #import "CLSAttributes.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /** 14 | * 15 | * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to 16 | * record information about non-ObjC/C++ exceptions. All information included here will be displayed 17 | * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the 18 | * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities 19 | * in the process. 20 | * 21 | **/ 22 | @interface CLSStackFrame : NSObject 23 | 24 | + (instancetype)stackFrame; 25 | + (instancetype)stackFrameWithAddress:(NSUInteger)address; 26 | + (instancetype)stackFrameWithSymbol:(NSString *)symbol; 27 | 28 | @property (nonatomic, copy, nullable) NSString *symbol; 29 | @property (nonatomic, copy, nullable) NSString *rawSymbol; 30 | @property (nonatomic, copy, nullable) NSString *library; 31 | @property (nonatomic, copy, nullable) NSString *fileName; 32 | @property (nonatomic, assign) uint32_t lineNumber; 33 | @property (nonatomic, assign) uint64_t offset; 34 | @property (nonatomic, assign) uint64_t address; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Crashlytics { 2 | header "Crashlytics.h" 3 | header "Answers.h" 4 | header "ANSCompatibility.h" 5 | header "CLSLogging.h" 6 | header "CLSReport.h" 7 | header "CLSStackFrame.h" 8 | header "CLSAttributes.h" 9 | 10 | export * 11 | 12 | link "z" 13 | link "c++" 14 | } 15 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 17G65 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Crashlytics 11 | CFBundleIdentifier 12 | com.twitter.crashlytics.mac 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Crashlytics 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 3.12.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 136 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 10O35n 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 18B50b 37 | DTSDKName 38 | macosx10.14 39 | DTXcode 40 | 1010 41 | DTXcodeBuild 42 | 10O35n 43 | NSHumanReadableCopyright 44 | Copyright © 2016 Crashlytics, Inc. All rights reserved. 45 | UIDeviceFamily 46 | 47 | 1 48 | 2 49 | 3 50 | 4 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Crashlytics/OSX/Crashlytics.framework/submit -------------------------------------------------------------------------------- /Pods/Crashlytics/OSX/Crashlytics.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Crashlytics/OSX/Crashlytics.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Crashlytics/README.md: -------------------------------------------------------------------------------- 1 | ![Crashlytics Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-crashlytics-header.png) 2 | 3 | Part of [Google Fabric](https://get.fabric.io), [Crashlytics](http://try.crashlytics.com/) offers the most powerful, yet lightest weight crash reporting solution for iOS. Crashlytics also provides real-time analytics through [Answers](https://answers.io/) and app distributions to testers using [Beta](http://try.crashlytics.com/beta/). 4 | 5 | ## Setup 6 | 7 | 1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app. 8 | 9 | 1. Open Fabric.app, login and select the Crashlytics SDK. 10 | 11 | ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) 12 | 13 | 1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. 14 | 15 | ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) 16 | 17 | 1. Select the Podfile option and follow the installation instructions to update your Podfile. **Note:** the Crashlytics Pod includes Answers. If you have Answers included as a separate Pod it should be removed from your Podfile to avoid duplicate symbol errors. 18 | 19 | ``` 20 | pod 'Fabric' 21 | pod 'Crashlytics' 22 | ``` 23 | 24 | 1. Run `pod install` 25 | 26 | 1. Add a Run Script Build Phase and build your app. 27 | 28 | ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) 29 | 30 | 1. Initialize the SDK by inserting code outlined in the Fabric.app. 31 | 32 | 1. Run your app to finish the installation. 33 | 34 | ## Resources 35 | 36 | * [Documentation](https://docs.fabric.io/apple/crashlytics/overview.html) 37 | * [Forums](https://stackoverflow.com/questions/tagged/google-fabric) 38 | * [Website](http://try.crashlytics.com/) 39 | * Follow us on Twitter: [@fabric](https://twitter.com/fabric) and [@crashlytics](https://twitter.com/crashlytics) 40 | -------------------------------------------------------------------------------- /Pods/Crashlytics/submit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Crashlytics/submit -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/README: -------------------------------------------------------------------------------- 1 | We've now combined all our supported platforms into a single podspec. As a result, we moved our run script to a new location for Cocoapods projects: ${PODS_ROOT}/Fabric/run. To avoid breaking builds that reference the old location of the run script, we've placed this dummy script that calls to the correct location, while providing a helpful warning in Xcode if it is invoked. This bridge for backwards compatibility will be removed in a future release, so please heed the warning! 2 | -------------------------------------------------------------------------------- /Pods/Fabric/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | if [[ -z $PODS_ROOT ]]; then 2 | echo "error: The run binary delivered by cocoapods is in a new location, under '$"{"PODS_ROOT"}"/Fabric/run'. This script was put in place for backwards compatibility, but it relies on PODS_ROOT, which does not have a value in your current setup. Please update the path to the run binary to fix this issue." 3 | else 4 | echo "warning: The run script is now located at '$"{"PODS_ROOT"}"/Fabric/run'. To remove this warning, update your Run Script Build Phase to point to this new location." 5 | sh "${PODS_ROOT}/Fabric/run" "$@" 6 | fi 7 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Fabric: -------------------------------------------------------------------------------- 1 | Versions/Current/Fabric -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Fabric: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Fabric/OSX/Fabric.framework/Versions/A/Fabric -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Headers/FABAttributes.h: -------------------------------------------------------------------------------- 1 | // 2 | // FABAttributes.h 3 | // Fabric 4 | // 5 | // Copyright (C) 2015 Twitter, Inc. 6 | // 7 | // Licensed under the Apache License, Version 2.0 (the "License"); 8 | // you may not use this file except in compliance with the License. 9 | // You may obtain a copy of the License at 10 | // 11 | // http://www.apache.org/licenses/LICENSE-2.0 12 | // 13 | // Unless required by applicable law or agreed to in writing, software 14 | // distributed under the License is distributed on an "AS IS" BASIS, 15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | // See the License for the specific language governing permissions and 17 | // limitations under the License. 18 | // 19 | 20 | #pragma once 21 | 22 | #define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) 23 | 24 | #if !__has_feature(nullability) 25 | #define nonnull 26 | #define nullable 27 | #define _Nullable 28 | #define _Nonnull 29 | #endif 30 | 31 | #ifndef NS_ASSUME_NONNULL_BEGIN 32 | #define NS_ASSUME_NONNULL_BEGIN 33 | #endif 34 | 35 | #ifndef NS_ASSUME_NONNULL_END 36 | #define NS_ASSUME_NONNULL_END 37 | #endif 38 | 39 | 40 | /** 41 | * The following macros are defined here to provide 42 | * backwards compatability. If you are still using 43 | * them you should migrate to the native nullability 44 | * macros. 45 | */ 46 | #define fab_nullable nullable 47 | #define fab_nonnull nonnull 48 | #define FAB_NONNULL __fab_nonnull 49 | #define FAB_NULLABLE __fab_nullable 50 | #define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN 51 | #define FAB_END_NONNULL NS_ASSUME_NONNULL_END 52 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Headers/Fabric.h: -------------------------------------------------------------------------------- 1 | // 2 | // Fabric.h 3 | // Fabric 4 | // 5 | // Copyright (C) 2015 Twitter, Inc. 6 | // 7 | // Licensed under the Apache License, Version 2.0 (the "License"); 8 | // you may not use this file except in compliance with the License. 9 | // You may obtain a copy of the License at 10 | // 11 | // http://www.apache.org/licenses/LICENSE-2.0 12 | // 13 | // Unless required by applicable law or agreed to in writing, software 14 | // distributed under the License is distributed on an "AS IS" BASIS, 15 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | // See the License for the specific language governing permissions and 17 | // limitations under the License. 18 | // 19 | 20 | #import 21 | #import "FABAttributes.h" 22 | 23 | NS_ASSUME_NONNULL_BEGIN 24 | 25 | #if TARGET_OS_IPHONE 26 | #if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 27 | #error "Fabric's minimum iOS version is 6.0" 28 | #endif 29 | #else 30 | #if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 31 | #error "Fabric's minimum OS X version is 10.7" 32 | #endif 33 | #endif 34 | 35 | /** 36 | * Fabric Base. Coordinates configuration and starts all provided kits. 37 | */ 38 | @interface Fabric : NSObject 39 | 40 | /** 41 | * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. 42 | * 43 | * For example, in Objective-C: 44 | * 45 | * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` 46 | * 47 | * Swift: 48 | * 49 | * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` 50 | * 51 | * Only the first call to this method is honored. Subsequent calls are no-ops. 52 | * 53 | * @param kitClasses An array of kit Class objects 54 | * 55 | * @return Returns the shared Fabric instance. In most cases this can be ignored. 56 | */ 57 | + (instancetype)with:(NSArray *)kitClasses; 58 | 59 | /** 60 | * Returns the Fabric singleton object. 61 | */ 62 | + (instancetype)sharedSDK; 63 | 64 | /** 65 | * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. 66 | */ 67 | @property (nonatomic, assign) BOOL debug; 68 | 69 | /** 70 | * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. 71 | */ 72 | - (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); 73 | 74 | /** 75 | * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. 76 | */ 77 | + (instancetype)new FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); 78 | 79 | @end 80 | 81 | NS_ASSUME_NONNULL_END 82 | 83 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Fabric { 2 | umbrella header "Fabric.h" 3 | 4 | export * 5 | module * { export * } 6 | } -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 17G65 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Fabric 11 | CFBundleIdentifier 12 | io.fabric.sdk.mac 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Fabric 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.9.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 74 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 10O35n 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 18B50b 37 | DTSDKName 38 | macosx10.14 39 | DTXcode 40 | 1010 41 | DTXcodeBuild 42 | 10O35n 43 | NSHumanReadableCopyright 44 | Copyright © 2015 Twitter. All rights reserved. 45 | UIDeviceFamily 46 | 47 | 1 48 | 2 49 | 3 50 | 4 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/OSX/Fabric.framework/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Fabric/OSX/Fabric.framework/uploadDSYM -------------------------------------------------------------------------------- /Pods/Fabric/README.md: -------------------------------------------------------------------------------- 1 | ![Fabric Header](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-header.png) 2 | 3 | # Fabric 4 | 5 | ## Overview 6 | 7 | [Fabric](https://get.fabric.io) provides developers with the tools they need to build the best apps. Developed and maintained by Google and the team that built Crashlytics, Fabric provides an easy way to manage all your SDKs so that you’ll never have to worry about tedious configurations or juggling different accounts. We let you get right into coding and building the next big app. 8 | 9 | For a full list of SDK provided through Fabric visit [https://fabric.io/kits](https://fabric.io/kits). 10 | 11 | ## Setup 12 | 13 | The Fabric Pod is a dependency for all Fabric SDKs and is included when installing any Fabric related Pods. General setup instructions are shown below; however, these vary depending on the selected SDK. 14 | 15 | 1. Visit [https://fabric.io/sign_up](https://fabric.io/sign_up) to create your Fabric account and to download Fabric.app. 16 | 17 | 1. Open Fabric.app, login and select an SDK to install. 18 | 19 | ![Fabric Plugin](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-fabric-plugin.png) 20 | 21 | 1. The Fabric app automatically detects when a project uses CocoaPods and gives you the option to install via the Podfile or Xcode. 22 | 23 | ![Fabric Installation Options](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-pod-installation-option.png) 24 | 25 | 1. Select the Podfile option and follow the installation instructions to update your Podfile. Note: the example below is for the Crashlytics SDK. The instructions will vary based on the selected SDK. 26 | 27 | ![Fabric Podfile Instructions](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-podfile-instructions.png) 28 | 29 | 1. Add a Run Script Build Phase and build your app. 30 | 31 | ![Fabric Run Script Build Phase](https://docs.fabric.io/ios/cocoapod-readmes/cocoapods-rsbp.png) 32 | 33 | 1. Initialize the SDK by inserting code outlined in Fabric.app. 34 | 35 | 1. Run your app to finish the installation. 36 | 37 | ## Resources 38 | 39 | * [Documentation](https://docs.fabric.io/) 40 | * [Forums](https://stackoverflow.com/questions/tagged/google-fabric) 41 | * [Website](https://get.fabric.io) 42 | * Follow us on Twitter: [@fabric](https://twitter.com/fabric) 43 | -------------------------------------------------------------------------------- /Pods/Fabric/run: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # run 4 | # 5 | # Copyright (c) 2015 Crashlytics. All rights reserved. 6 | 7 | # Figure out where we're being called from 8 | DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) 9 | 10 | # Quote path in case of spaces or special chars 11 | DIR="\"${DIR}" 12 | 13 | PATH_SEP="/" 14 | VALIDATE_COMMAND="uploadDSYM\" $@ validate run-script" 15 | UPLOAD_COMMAND="uploadDSYM\" $@ run-script" 16 | 17 | # Ensure params are as expected, run in sync mode to validate 18 | eval $DIR$PATH_SEP$VALIDATE_COMMAND 19 | return_code=$? 20 | 21 | if [[ $return_code != 0 ]]; then 22 | exit $return_code 23 | fi 24 | 25 | # Verification passed, upload dSYM in background to prevent Xcode from waiting 26 | # Note: Validation is performed again before upload. 27 | # Output can still be found in Console.app 28 | eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & 29 | -------------------------------------------------------------------------------- /Pods/Fabric/upload-symbols: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Fabric/upload-symbols -------------------------------------------------------------------------------- /Pods/Fabric/uploadDSYM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/Fabric/uploadDSYM -------------------------------------------------------------------------------- /Pods/Local Podspecs/ShortcutRecorder.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ShortcutRecorder", 3 | "homepage": "https://github.com/Kentzo/ShortcutRecorder", 4 | "summary": "The only user interface control to record shortcuts. For Mac OS X 10.6+, 64bit", 5 | "version": "2.17", 6 | "source": { 7 | "git": "git://github.com/Kentzo/ShortcutRecorder.git", 8 | "branch": "master" 9 | }, 10 | "authors": { 11 | "Ilya Kulakov": "kulakov.ilya@gmail.com" 12 | }, 13 | "frameworks": [ 14 | "Carbon", 15 | "Cocoa" 16 | ], 17 | "platforms": { 18 | "osx": "10.6" 19 | }, 20 | "subspecs": [ 21 | { 22 | "name": "Core", 23 | "source_files": "Library/*.{h,m}", 24 | "resource_bundles": { 25 | "ShortcutRecorder": [ 26 | "Resources/*.lproj", 27 | "Resources/*.png" 28 | ] 29 | }, 30 | "requires_arc": true, 31 | "prefix_header_file": "Library/Prefix.pch" 32 | }, 33 | { 34 | "name": "PTHotKey", 35 | "source_files": "PTHotKey/*.{h,m}", 36 | "requires_arc": false, 37 | "dependencies": { 38 | "ShortcutRecorder/Core": [ 39 | 40 | ] 41 | } 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Crashlytics (3.12.0): 3 | - Fabric (~> 1.9.0) 4 | - Fabric (1.9.0) 5 | - ShortcutRecorder (2.17): 6 | - ShortcutRecorder/Core (= 2.17) 7 | - ShortcutRecorder/PTHotKey (= 2.17) 8 | - ShortcutRecorder/Core (2.17) 9 | - ShortcutRecorder/PTHotKey (2.17): 10 | - ShortcutRecorder/Core 11 | 12 | DEPENDENCIES: 13 | - Crashlytics (~> 3.12.0) 14 | - Fabric (~> 1.9.0) 15 | - ShortcutRecorder (from `https://github.com/Kentzo/ShortcutRecorder`, branch `master`) 16 | 17 | SPEC REPOS: 18 | https://github.com/cocoapods/specs.git: 19 | - Crashlytics 20 | - Fabric 21 | 22 | EXTERNAL SOURCES: 23 | ShortcutRecorder: 24 | :branch: master 25 | :git: https://github.com/Kentzo/ShortcutRecorder 26 | 27 | CHECKOUT OPTIONS: 28 | ShortcutRecorder: 29 | :commit: c978ce9bb482c31acfabe23baa2b075808a1fdd8 30 | :git: https://github.com/Kentzo/ShortcutRecorder 31 | 32 | SPEC CHECKSUMS: 33 | Crashlytics: 07fb167b1694128c1c9a5a5cc319b0e9c3ca0933 34 | Fabric: f988e33c97f08930a413e08123064d2e5f68d655 35 | ShortcutRecorder: c0e1ae0e97917925feab04e8817d2be6ef1b0548 36 | 37 | PODFILE CHECKSUM: 84bf582a2f5e83a99e035bfde35f42af6b80449b 38 | 39 | COCOAPODS: 1.5.3 40 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/LICENSE.md: -------------------------------------------------------------------------------- 1 | # ShortcutRecorder 2 | 3 | Copyright (c) 2006, Contributors 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | * Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the distribution. 13 | * Neither the name of the organization nor the 14 | names of its contributors may be used to endorse or promote products 15 | derived from this software without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY 21 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | 28 | # PTHotKey 29 | 30 | Copyright (c) 2003 Quentin D. Carnicelli. 31 | All rights reserved. 32 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ShortcutRecorder' target in the 'ShortcutRecorder' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRCommon.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Library/SRCommon.h -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRCommon.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Library/SRCommon.m -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRKeyCodeTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SRKeyCodeTransformer.h 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2006-2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // David Dauer 11 | // Jesper 12 | // Jamie Kirkpatrick 13 | // Ilya Kulakov 14 | // Silvio Rizzi 15 | 16 | #import 17 | #import 18 | 19 | 20 | /*! 21 | Transforms key code into unicode character or plain string. 22 | */ 23 | @interface SRKeyCodeTransformer : NSValueTransformer 24 | 25 | /*! 26 | Returns initialized key code transformer. 27 | 28 | @param aUsesASCII Determines whether transformer uses only ASCII capable keyboard input source. 29 | 30 | @param aUsesPlainStrings Determines whether key codes without readable glyphs (e.g. F1...F19) are transformed to 31 | to unicode characters (NSF1FunctionKey...NSF19FunctionKey) suitable for setting key equivalents 32 | of Cocoa controls or to plain strings (@"F1"...@"F19") suitable for drawing, logging and accessibility. 33 | 34 | @discussion This method is the designated initializer for SRKeyCodeTransformer. 35 | */ 36 | - (instancetype)initWithASCIICapableKeyboardInputSource:(BOOL)aUsesASCII plainStrings:(BOOL)aUsesPlainStrings NS_DESIGNATED_INITIALIZER; 37 | 38 | /*! 39 | Determines whether transformer uses ASCII capable keyboard input source. 40 | */ 41 | @property (readonly) BOOL usesASCIICapableKeyboardInputSource; 42 | 43 | /*! 44 | Determines whether key codes without readable glyphs are transformed to unicode characters 45 | suitable for setting keqEquivalents or to plain strings suitable for drawing, logging and accessibility. 46 | */ 47 | @property (readonly) BOOL usesPlainStrings; 48 | 49 | /*! 50 | Returns the shared transformer. 51 | */ 52 | + (instancetype)sharedTransformer; 53 | 54 | /*! 55 | Returns the shared transformer configured to use only ASCII capable keyboard input source. 56 | */ 57 | + (instancetype)sharedASCIITransformer; 58 | 59 | /*! 60 | Returns the shared transformer configured to transform key codes to plain strings. 61 | */ 62 | + (SRKeyCodeTransformer *)sharedPlainTransformer; 63 | 64 | /*! 65 | Returns the shared transformer configured to use only ASCII capable keyboard input source 66 | and to transform key codes to plain strings. 67 | */ 68 | + (SRKeyCodeTransformer *)sharedPlainASCIITransformer; 69 | 70 | 71 | /*! 72 | Returns mapping from special key codes to unicode characters. 73 | */ 74 | + (NSDictionary *)specialKeyCodesToUnicodeCharactersMapping; 75 | 76 | /*! 77 | Returns mapping from special key codes to plain strings. 78 | */ 79 | + (NSDictionary *)specialKeyCodesToPlainStringsMapping; 80 | 81 | /*! 82 | Determines whether key code is special. 83 | 84 | @param aKeyCode Key code to be checked. 85 | */ 86 | - (BOOL)isKeyCodeSpecial:(unsigned short)aKeyCode; 87 | 88 | /*! 89 | Transforms given special key code into unicode character by taking into account modifier flags. 90 | 91 | @discussion E.g. the key code 0x30 is transformed to ⇥. But if shift is pressed, it is transformed to ⇤. 92 | 93 | @result Unicode character or plain string. nil if not a special key code. 94 | */ 95 | - (NSString *)transformedSpecialKeyCode:(NSNumber *)aKeyCode withExplicitModifierFlags:(NSNumber *)aModifierFlags; 96 | 97 | /*! 98 | Shorcut to [self transformedValue:aValue withImplicitModifierFlags:aModifierFlags explicitModifierFlags:0] 99 | */ 100 | - (NSString *)transformedValue:(NSNumber *)aValue withModifierFlags:(NSNumber *)aModifierFlags; 101 | 102 | /*! 103 | Transfroms given key code into unicode character by taking into account modifier flags. 104 | 105 | @param aValue An instance of NSNumber (unsigned short) that represents key code. 106 | 107 | @param anImplicitModifierFlags An instance of NSNumber (NSEventModifierFlags) that represents implicit modifier flags like opt in å. 108 | 109 | @param anExplicitModifierFlags An instance of NSNumber (NSEventModifierFlags) that represents explicit modifier flags like shift in shift-⇤. 110 | */ 111 | - (NSString *)transformedValue:(NSNumber *)aValue withImplicitModifierFlags:(NSNumber *)anImplicitModifierFlags explicitModifierFlags:(NSNumber *)anExplicitModifierFlags; 112 | 113 | @end 114 | 115 | 116 | /*! 117 | These constants represents drawable unicode characters for key codes that do not have 118 | appropriate constants in Carbon and Cocoa. 119 | */ 120 | typedef NS_ENUM(unichar, SRKeyCodeGlyph) 121 | { 122 | SRKeyCodeGlyphTabRight = 0x21E5, // ⇥ 123 | SRKeyCodeGlyphTabLeft = 0x21E4, // ⇤ 124 | SRKeyCodeGlyphReturn = 0x2305, // ⌅ 125 | SRKeyCodeGlyphReturnR2L = 0x21A9, // ↩ 126 | SRKeyCodeGlyphDeleteLeft = 0x232B, // ⌫ 127 | SRKeyCodeGlyphDeleteRight = 0x2326, // ⌦ 128 | SRKeyCodeGlyphPadClear = 0x2327, // ⌧ 129 | SRKeyCodeGlyphLeftArrow = 0x2190, // ← 130 | SRKeyCodeGlyphRightArrow = 0x2192, // → 131 | SRKeyCodeGlyphUpArrow = 0x2191, // ↑ 132 | SRKeyCodeGlyphDownArrow = 0x2193, // ↓ 133 | SRKeyCodeGlyphPageDown = 0x21DF, // ⇟ 134 | SRKeyCodeGlyphPageUp = 0x21DE, // ⇞ 135 | SRKeyCodeGlyphNorthwestArrow = 0x2196, // ↖ 136 | SRKeyCodeGlyphSoutheastArrow = 0x2198, // ↘ 137 | SRKeyCodeGlyphEscape = 0x238B, // ⎋ 138 | SRKeyCodeGlyphSpace = 0x0020, // ' ' 139 | }; 140 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRKeyEquivalentModifierMaskTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SRKeyEquivalentModifierMaskTransformer.h 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors to this file: 10 | // Ilya Kulakov 11 | 12 | #import 13 | 14 | 15 | /*! 16 | Transform dictionary representation of shortcut into string suitable 17 | for -setKeyEquivalentModifierMask: of NSButton and NSMenuItem. 18 | */ 19 | @interface SRKeyEquivalentModifierMaskTransformer : NSValueTransformer 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRKeyEquivalentModifierMaskTransformer.m: -------------------------------------------------------------------------------- 1 | // 2 | // SRKeyEquivalentModifierMaskTransformer.m 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // Ilya Kulakov 11 | 12 | #import "SRKeyEquivalentModifierMaskTransformer.h" 13 | #import "SRKeyCodeTransformer.h" 14 | #import "SRRecorderControl.h" 15 | 16 | 17 | @implementation SRKeyEquivalentModifierMaskTransformer 18 | 19 | #pragma mark NSValueTransformer 20 | 21 | + (BOOL)allowsReverseTransformation 22 | { 23 | return NO; 24 | } 25 | 26 | + (Class)transformedValueClass 27 | { 28 | return [NSNumber class]; 29 | } 30 | 31 | - (NSNumber *)transformedValue:(NSDictionary *)aValue 32 | { 33 | if (![aValue isKindOfClass:[NSDictionary class]]) 34 | return @(0); 35 | 36 | NSNumber *modifierFlags = aValue[SRShortcutModifierFlagsKey]; 37 | 38 | if (![modifierFlags isKindOfClass:[NSNumber class]]) 39 | return @(0); 40 | 41 | return modifierFlags; 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRKeyEquivalentTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SRKeyEquivalentTransformer.h 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors to this file: 10 | // Ilya Kulakov 11 | 12 | #import 13 | 14 | 15 | /*! 16 | Transform dictionary representation of shortcut into string suitable 17 | for -setKeyEquivalent: of NSButton and NSMenuItem. 18 | */ 19 | @interface SRKeyEquivalentTransformer : NSValueTransformer 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRKeyEquivalentTransformer.m: -------------------------------------------------------------------------------- 1 | // 2 | // SRKeyEquivalentTransformer.m 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // Ilya Kulakov 11 | 12 | #import "SRKeyEquivalentTransformer.h" 13 | #import "SRKeyCodeTransformer.h" 14 | #import "SRRecorderControl.h" 15 | 16 | 17 | @implementation SRKeyEquivalentTransformer 18 | 19 | #pragma mark NSValueTransformer 20 | 21 | + (BOOL)allowsReverseTransformation 22 | { 23 | return NO; 24 | } 25 | 26 | + (Class)transformedValueClass 27 | { 28 | return [NSString class]; 29 | } 30 | 31 | - (NSString *)transformedValue:(NSDictionary *)aValue 32 | { 33 | if (![aValue isKindOfClass:[NSDictionary class]]) 34 | return @""; 35 | 36 | NSNumber *keyCode = aValue[SRShortcutKeyCode]; 37 | 38 | if (![keyCode isKindOfClass:[NSNumber class]]) 39 | return @""; 40 | 41 | NSNumber *modifierFlags = aValue[SRShortcutModifierFlagsKey]; 42 | 43 | if (![modifierFlags isKindOfClass:[NSNumber class]]) 44 | modifierFlags = @(0); 45 | 46 | SRKeyCodeTransformer *t = [SRKeyCodeTransformer sharedASCIITransformer]; 47 | 48 | return [t transformedValue:keyCode 49 | withImplicitModifierFlags:nil 50 | explicitModifierFlags:modifierFlags]; 51 | } 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRModifierFlagsTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // SRModifierFlagsTransformer.h 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2006-2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // Ilya Kulakov 11 | 12 | #import 13 | 14 | 15 | /*! 16 | Transforms mask of Cocoa modifier flags to string of unicode characters. 17 | */ 18 | @interface SRModifierFlagsTransformer : NSValueTransformer 19 | 20 | - (instancetype)initWithPlainStrings:(BOOL)aUsesPlainStrings NS_DESIGNATED_INITIALIZER; 21 | 22 | /*! 23 | Determines whether modifier flags are transformed to unicode characters or to plain strings. 24 | */ 25 | @property (readonly) BOOL usesPlainStrings; 26 | 27 | /*! 28 | Returns the shared transformer. 29 | */ 30 | + (instancetype)sharedTransformer; 31 | 32 | /*! 33 | Returns the shared plain transformer. 34 | */ 35 | + (instancetype)sharedPlainTransformer; 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRModifierFlagsTransformer.m: -------------------------------------------------------------------------------- 1 | // 2 | // SRModifierFlagsTransformer.m 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2006-2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // Ilya Kulakov 11 | 12 | #import "SRModifierFlagsTransformer.h" 13 | #import "SRCommon.h" 14 | 15 | 16 | @implementation SRModifierFlagsTransformer 17 | 18 | - (instancetype)initWithPlainStrings:(BOOL)aUsesPlainStrings 19 | { 20 | self = [super init]; 21 | 22 | if (self) 23 | { 24 | _usesPlainStrings = aUsesPlainStrings; 25 | } 26 | 27 | return self; 28 | } 29 | 30 | - (instancetype)init 31 | { 32 | return [self initWithPlainStrings:NO]; 33 | } 34 | 35 | 36 | #pragma mark Methods 37 | 38 | + (instancetype)sharedTransformer 39 | { 40 | static dispatch_once_t OnceToken; 41 | static SRModifierFlagsTransformer *Transformer = nil; 42 | dispatch_once(&OnceToken, ^{ 43 | Transformer = [[self alloc] initWithPlainStrings:NO]; 44 | }); 45 | return Transformer; 46 | } 47 | 48 | + (instancetype)sharedPlainTransformer 49 | { 50 | static dispatch_once_t OnceToken; 51 | static SRModifierFlagsTransformer *Transformer = nil; 52 | dispatch_once(&OnceToken, ^{ 53 | Transformer = [[self alloc] initWithPlainStrings:YES]; 54 | }); 55 | return Transformer; 56 | } 57 | 58 | 59 | #pragma mark NSValueTransformer 60 | 61 | + (Class)transformedValueClass 62 | { 63 | return [NSString class]; 64 | } 65 | 66 | + (BOOL)allowsReverseTransformation 67 | { 68 | return NO; 69 | } 70 | 71 | - (NSString *)transformedValue:(NSNumber *)aValue 72 | { 73 | if (![aValue isKindOfClass:[NSNumber class]]) 74 | return nil; 75 | else if (self.usesPlainStrings) 76 | { 77 | NSEventModifierFlags modifierFlags = aValue.unsignedIntegerValue; 78 | NSMutableString *s = [NSMutableString string]; 79 | 80 | if (modifierFlags & NSControlKeyMask) 81 | [s appendString:SRLoc(@"Control-")]; 82 | 83 | if (modifierFlags & NSAlternateKeyMask) 84 | [s appendString:SRLoc(@"Option-")]; 85 | 86 | if (modifierFlags & NSShiftKeyMask) 87 | [s appendString:SRLoc(@"Shift-")]; 88 | 89 | if (modifierFlags & NSCommandKeyMask) 90 | [s appendString:SRLoc(@"Command-")]; 91 | 92 | if (s.length > 0) 93 | [s deleteCharactersInRange:NSMakeRange(s.length - 1, 1)]; 94 | 95 | return s; 96 | } 97 | else 98 | { 99 | NSEventModifierFlags f = aValue.unsignedIntegerValue; 100 | return [NSString stringWithFormat:@"%@%@%@%@", 101 | (f & NSControlKeyMask ? @"⌃" : @""), 102 | (f & NSAlternateKeyMask ? @"⌥" : @""), 103 | (f & NSShiftKeyMask ? @"⇧" : @""), 104 | (f & NSCommandKeyMask ? @"⌘" : @"")]; 105 | } 106 | } 107 | 108 | @end 109 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/SRValidator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SRValidator.h 3 | // ShortcutRecorder 4 | // 5 | // Copyright 2006-2012 Contributors. All rights reserved. 6 | // 7 | // License: BSD 8 | // 9 | // Contributors: 10 | // David Dauer 11 | // Jesper 12 | // Jamie Kirkpatrick 13 | // Andy Kim 14 | // Silvio Rizzi 15 | // Ilya Kulakov 16 | 17 | #import 18 | 19 | 20 | @protocol SRValidatorDelegate; 21 | 22 | /*! 23 | Implements logic to check whether shortcut is taken by other parts of the application and system. 24 | */ 25 | @interface SRValidator : NSObject 26 | 27 | @property (assign) NSObject *delegate; 28 | 29 | - (instancetype)initWithDelegate:(NSObject *)aDelegate NS_DESIGNATED_INITIALIZER; 30 | 31 | /*! 32 | Determines whether shortcut is taken. 33 | 34 | @discussion Key is checked in the following order: 35 | 1. If delegate implements shortcutValidator:isKeyCode:andFlagsTaken:reason: 36 | 2. If delegate allows system-wide shortcuts are checked 37 | 3. If delegate allows application menu it checked 38 | 39 | @see SRValidatorDelegate 40 | */ 41 | - (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags error:(NSError **)outError; 42 | 43 | /*! 44 | Determines whether shortcut is taken in delegate. 45 | 46 | @discussion If delegate does not implement appropriate method, returns immediately. 47 | */ 48 | - (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagTakenInDelegate:(NSEventModifierFlags)aFlags error:(NSError **)outError; 49 | 50 | /*! 51 | Determines whether shortcut is taken by system-wide shortcuts. 52 | 53 | @discussion Does not check whether delegate allows or disallows checking in system shortcuts. 54 | */ 55 | - (BOOL)isKeyCode:(unsigned short)aKeyCode andFlagsTakenInSystemShortcuts:(NSEventModifierFlags)aFlags error:(NSError **)outError; 56 | 57 | /*! 58 | Determines whether shortcut is taken by application menu item. 59 | 60 | @discussion Does not check whether delegate allows or disallows checking in application menu. 61 | */ 62 | - (BOOL)isKeyCode:(unsigned short)aKeyCode andFlags:(NSEventModifierFlags)aFlags takenInMenu:(NSMenu *)aMenu error:(NSError **)outError; 63 | 64 | @end 65 | 66 | 67 | @protocol SRValidatorDelegate 68 | 69 | @optional 70 | 71 | /*! 72 | Asks the delegate if aKeyCode and aFlags are valid. 73 | 74 | @param aValidator The validator that validates key code and flags. 75 | 76 | @param aKeyCode Key code to validate. 77 | 78 | @param aFlags Flags to validate. 79 | 80 | @param outReason If delegate decides that shortcut is invalid, it may pass here an error message. 81 | 82 | @result YES if shortcut is valid. Otherwise NO. 83 | 84 | @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. 85 | */ 86 | - (BOOL)shortcutValidator:(SRValidator *)aValidator isKeyCode:(unsigned short)aKeyCode andFlagsTaken:(NSEventModifierFlags)aFlags reason:(NSString **)outReason; 87 | 88 | /*! 89 | Asks the delegate whether validator should check key equivalents of app's menu items. 90 | 91 | @param aValidator The validator that going to check app's menu items. 92 | 93 | @result YES if validator should check key equivalents of app's menu items. Otherwise NO. 94 | 95 | @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. 96 | */ 97 | - (BOOL)shortcutValidatorShouldCheckMenu:(SRValidator *)aValidator; 98 | 99 | /*! 100 | Asks the delegate whether it should check system shortcuts. 101 | 102 | @param aValidator The validator that going to check system shortcuts. 103 | 104 | @result YES if validator should check system shortcuts. Otherwise NO. 105 | 106 | @discussion Implementation of this method by the delegate is optional. If it is not present, checking proceeds as if this method had returned YES. 107 | */ 108 | - (BOOL)shortcutValidatorShouldCheckSystemShortcuts:(SRValidator *)aValidator; 109 | 110 | /*! 111 | Asks the delegate whether it should use ASCII representation of key code when making error messages. 112 | 113 | @param aValidator The validator that is about to make an error message. 114 | 115 | @result YES if validator should use ASCII representation. Otherwise NO. 116 | 117 | @discussion Implementation of this method by the delegate is optional. If it is not present, ASCII representation of key code is used. 118 | */ 119 | - (BOOL)shortcutValidatorShouldUseASCIIStringForKeyCodes:(SRValidator *)aValidator; 120 | 121 | @end 122 | 123 | 124 | @interface NSMenuItem (SRValidator) 125 | 126 | /*! 127 | Returns full path to the menu item. E.g. "Window ➝ Zoom" 128 | */ 129 | - (NSString *)SR_path; 130 | 131 | @end 132 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Library/ShortcutRecorder.h: -------------------------------------------------------------------------------- 1 | // 2 | // ShortcutRecorder.h 3 | // ShortcutRecorder 4 | // Copyright 2012 Contributors. All rights reserved. 5 | // 6 | // License: BSD 7 | // 8 | // Contributors to this file: 9 | // Jesper 10 | // Ilya Kulakov 11 | 12 | #import 13 | #import 14 | #import 15 | #import 16 | #import 17 | #import 18 | #import 19 | #import 20 | 21 | 22 | #ifndef IBInspectable 23 | #define IBInspectable 24 | #endif 25 | 26 | #ifndef IB_DESIGNABLE 27 | #define IB_DESIGNABLE 28 | #endif 29 | 30 | #ifndef NSAppKitVersionNumber10_6 31 | #define NSAppKitVersionNumber10_6 1038 32 | #endif 33 | 34 | #ifndef NSAppKitVersionNumber10_9 35 | #define NSAppKitVersionNumber10_9 1265 36 | #endif 37 | 38 | #ifndef NSEDGEINSETS_DEFINED 39 | typedef struct NSEdgeInsets { 40 | CGFloat top; 41 | CGFloat left; 42 | CGFloat bottom; 43 | CGFloat right; 44 | } NSEdgeInsets; 45 | 46 | NS_INLINE NSEdgeInsets NSEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) { 47 | NSEdgeInsets e; 48 | e.top = top; 49 | e.left = left; 50 | e.bottom = bottom; 51 | e.right = right; 52 | return e; 53 | } 54 | #endif 55 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTHotKey+ShortcutRecorder.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTHotKey+ShortcutRecorder.h 3 | // ShortcutRecorder 4 | // 5 | // Created by Ilya Kulakov on 27.02.11. 6 | // Copyright 2011 Wireload. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PTHotKey.h" 11 | 12 | 13 | @interface PTHotKey (ShortcutRecorder) 14 | 15 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 16 | keyCombo:(NSDictionary *)aKeyCombo 17 | target:(id)aTarget 18 | action:(SEL)anAction; 19 | 20 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 21 | keyCombo:(NSDictionary *)aKeyCombo 22 | target:(id)aTarget 23 | action:(SEL)anAction 24 | keyUpAction:(SEL)aKeyUpAction; 25 | 26 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 27 | keyCombo:(NSDictionary *)aKeyCombo 28 | target:(id)aTarget 29 | action:(SEL)anAction 30 | withObject:(id)anObject; 31 | @end 32 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTHotKey+ShortcutRecorder.m: -------------------------------------------------------------------------------- 1 | // 2 | // PTHotKey+ShortcutRecorder.m 3 | // ShortcutRecorder 4 | // 5 | // Created by Ilya Kulakov on 27.02.11. 6 | // Copyright 2011 Wireload. All rights reserved. 7 | // 8 | 9 | #import "PTHotKey+ShortcutRecorder.h" 10 | #import "SRRecorderControl.h" 11 | 12 | 13 | @implementation PTHotKey (ShortcutRecorder) 14 | 15 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 16 | keyCombo:(NSDictionary *)aKeyCombo 17 | target:(id)aTarget 18 | action:(SEL)anAction 19 | { 20 | return [PTHotKey hotKeyWithIdentifier:anIdentifier keyCombo:aKeyCombo target:aTarget action:anAction withObject:nil]; 21 | } 22 | 23 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 24 | keyCombo:(NSDictionary *)aKeyCombo 25 | target:(id)aTarget 26 | action:(SEL)anAction 27 | withObject:(id)anObject 28 | { 29 | NSInteger keyCode = [[aKeyCombo objectForKey:@"keyCode"] integerValue]; 30 | NSUInteger modifiers = SRCocoaToCarbonFlags([[aKeyCombo objectForKey:@"modifierFlags"] unsignedIntegerValue]); 31 | PTKeyCombo *newKeyCombo = [[PTKeyCombo alloc] initWithKeyCode:keyCode modifiers:modifiers]; 32 | PTHotKey *newHotKey = [[PTHotKey alloc] initWithIdentifier:anIdentifier keyCombo:newKeyCombo]; 33 | [newHotKey setTarget:aTarget]; 34 | [newHotKey setAction:anAction]; 35 | [newHotKey setObject:anObject]; 36 | return newHotKey; 37 | } 38 | 39 | + (PTHotKey *)hotKeyWithIdentifier:(id)anIdentifier 40 | keyCombo:(NSDictionary *)aKeyCombo 41 | target:(id)aTarget 42 | action:(SEL)anAction 43 | keyUpAction:(SEL)aKeyUpAction 44 | { 45 | PTHotKey *newHotKey = [PTHotKey hotKeyWithIdentifier:anIdentifier 46 | keyCombo:aKeyCombo 47 | target:aTarget 48 | action:anAction]; 49 | [newHotKey setKeyUpAction:aKeyUpAction]; 50 | return newHotKey; 51 | } 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTHotKey.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTHotKey.h 3 | // Protein 4 | // 5 | // Created by Quentin Carnicelli on Sat Aug 02 2003. 6 | // Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. 7 | // 8 | // Contributors: 9 | // Andy Kim 10 | 11 | #import 12 | #import 13 | #import "PTKeyCombo.h" 14 | 15 | @interface PTHotKey : NSObject 16 | { 17 | NSString* mIdentifier; 18 | NSString* mName; 19 | PTKeyCombo* mKeyCombo; 20 | id mTarget; 21 | id mObject; 22 | SEL mAction; 23 | SEL mKeyUpAction; 24 | 25 | UInt32 mCarbonHotKeyID; 26 | EventHotKeyRef mCarbonEventHotKeyRef; 27 | } 28 | 29 | - (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo; 30 | - (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo withObject: (id)object; 31 | - (id)init; 32 | 33 | - (void)setIdentifier: (id)ident; 34 | - (id)identifier; 35 | 36 | - (void)setName: (NSString*)name; 37 | - (NSString*)name; 38 | 39 | - (void)setKeyCombo: (PTKeyCombo*)combo; 40 | - (PTKeyCombo*)keyCombo; 41 | 42 | - (void)setTarget: (id)target; 43 | - (id)target; 44 | - (void)setObject: (id)object; 45 | - (id)object; 46 | - (void)setAction: (SEL)action; 47 | - (SEL)action; 48 | - (void)setKeyUpAction: (SEL)action; 49 | - (SEL)keyUpAction; 50 | 51 | - (UInt32)carbonHotKeyID; 52 | - (void)setCarbonHotKeyID: (UInt32)hotKeyID; 53 | 54 | - (EventHotKeyRef)carbonEventHotKeyRef; 55 | - (void)setCarbonEventHotKeyRef:(EventHotKeyRef)hotKeyRef; 56 | 57 | - (void)invoke; 58 | - (void)uninvoke; 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTHotKey.m: -------------------------------------------------------------------------------- 1 | // 2 | // PTHotKey.m 3 | // Protein 4 | // 5 | // Created by Quentin Carnicelli on Sat Aug 02 2003. 6 | // Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. 7 | // 8 | 9 | #import "PTHotKey.h" 10 | 11 | #import "PTHotKeyCenter.h" 12 | #import "PTKeyCombo.h" 13 | 14 | @implementation PTHotKey 15 | 16 | - (id)init 17 | { 18 | return [self initWithIdentifier: nil keyCombo: nil withObject:nil]; 19 | } 20 | 21 | - (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo 22 | { 23 | return [self initWithIdentifier: identifier keyCombo: combo withObject:nil]; 24 | 25 | } 26 | 27 | - (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo withObject: (id)object 28 | { 29 | self = [super init]; 30 | 31 | if( self ) 32 | { 33 | [self setIdentifier: identifier]; 34 | [self setKeyCombo: combo]; 35 | [self setObject: object]; 36 | } 37 | 38 | return self; 39 | } 40 | 41 | 42 | - (NSString*)description 43 | { 44 | return [NSString stringWithFormat: @"<%@: %@, %@>", NSStringFromClass( [self class] ), [self identifier], [self keyCombo]]; 45 | } 46 | 47 | #pragma mark - 48 | 49 | - (void)setIdentifier: (id)ident 50 | { 51 | mIdentifier = ident; 52 | } 53 | 54 | - (id)identifier 55 | { 56 | return mIdentifier; 57 | } 58 | 59 | - (void)setKeyCombo: (PTKeyCombo*)combo 60 | { 61 | if( combo == nil ) 62 | combo = [PTKeyCombo clearKeyCombo]; 63 | 64 | mKeyCombo = combo; 65 | } 66 | 67 | - (PTKeyCombo*)keyCombo 68 | { 69 | return mKeyCombo; 70 | } 71 | 72 | - (void)setName: (NSString*)name 73 | { 74 | mName = name; 75 | } 76 | 77 | - (NSString*)name 78 | { 79 | return mName; 80 | } 81 | 82 | - (void)setTarget: (id)target 83 | { 84 | mTarget = target; 85 | } 86 | 87 | - (id)target 88 | { 89 | return mTarget; 90 | } 91 | 92 | - (void)setObject:(id)object 93 | { 94 | mObject = object; 95 | } 96 | 97 | - (id)object 98 | { 99 | return mObject; 100 | } 101 | 102 | - (void)setAction: (SEL)action 103 | { 104 | mAction = action; 105 | } 106 | 107 | - (SEL)action 108 | { 109 | return mAction; 110 | } 111 | 112 | - (void)setKeyUpAction: (SEL)action 113 | { 114 | mKeyUpAction = action; 115 | } 116 | 117 | - (SEL)keyUpAction 118 | { 119 | return mKeyUpAction; 120 | } 121 | 122 | - (UInt32)carbonHotKeyID 123 | { 124 | return mCarbonHotKeyID; 125 | } 126 | 127 | - (void)setCarbonHotKeyID: (UInt32)hotKeyID; 128 | { 129 | mCarbonHotKeyID = hotKeyID; 130 | } 131 | 132 | - (EventHotKeyRef)carbonEventHotKeyRef 133 | { 134 | return mCarbonEventHotKeyRef; 135 | } 136 | 137 | - (void)setCarbonEventHotKeyRef: (EventHotKeyRef)hotKeyRef 138 | { 139 | mCarbonEventHotKeyRef = hotKeyRef; 140 | } 141 | 142 | #pragma mark - 143 | 144 | - (void)invoke 145 | { 146 | if(mAction) 147 | [NSApp sendAction:mAction to:mTarget from:self]; 148 | } 149 | 150 | - (void)uninvoke 151 | { 152 | if(mKeyUpAction) 153 | [NSApp sendAction:mKeyUpAction to:mTarget from:self]; 154 | } 155 | 156 | @end 157 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTHotKeyCenter.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTHotKeyCenter.h 3 | // Protein 4 | // 5 | // Created by Quentin Carnicelli on Sat Aug 02 2003. 6 | // Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. 7 | // 8 | // Contributors: 9 | // Quentin D. Carnicelli 10 | // Finlay Dobbie 11 | // Vincent Pottier 12 | // Andy Kim 13 | 14 | #import 15 | #import 16 | 17 | @class PTHotKey; 18 | 19 | @interface PTHotKeyCenter : NSObject 20 | { 21 | NSMutableDictionary* mHotKeys; //Keys are carbon hot key IDs 22 | BOOL mEventHandlerInstalled; 23 | UInt32 mHotKeyCount; // Used to assign new hot key ID 24 | BOOL mIsPaused; 25 | EventHandlerRef mEventHandler; 26 | } 27 | 28 | + (PTHotKeyCenter *)sharedCenter; 29 | 30 | - (BOOL)registerHotKey: (PTHotKey*)hotKey; 31 | - (void)unregisterHotKey: (PTHotKey*)hotKey; 32 | 33 | - (NSArray*)allHotKeys; 34 | - (PTHotKey*)hotKeyWithIdentifier: (id)ident; 35 | 36 | - (void)sendEvent: (NSEvent*)event; 37 | 38 | - (void)pause; 39 | 40 | - (void)resume; 41 | 42 | - (BOOL)isPaused; 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTKeyCodeTranslator.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTKeyCodeTranslator.h 3 | // Chercher 4 | // 5 | // Created by Finlay Dobbie on Sat Oct 11 2003. 6 | // Copyright (c) 2003 Cliché Software. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PTKeyCodeTranslator : NSObject 12 | { 13 | TISInputSourceRef keyboardLayout; 14 | const UCKeyboardLayout *uchrData; 15 | UInt32 keyTranslateState; 16 | UInt32 deadKeyState; 17 | } 18 | 19 | + (id)currentTranslator; 20 | 21 | - (id)initWithKeyboardLayout:(TISInputSourceRef)aLayout; 22 | - (NSString *)translateKeyCode:(short)keyCode; 23 | 24 | - (TISInputSourceRef)keyboardLayout; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTKeyCodeTranslator.m: -------------------------------------------------------------------------------- 1 | // 2 | // PTKeyCodeTranslator.m 3 | // Chercher 4 | // 5 | // Created by Finlay Dobbie on Sat Oct 11 2003. 6 | // Copyright (c) 2003 Cliché Software. All rights reserved. 7 | // 8 | 9 | #import "PTKeyCodeTranslator.h" 10 | 11 | 12 | @implementation PTKeyCodeTranslator 13 | 14 | + (id)currentTranslator 15 | { 16 | static PTKeyCodeTranslator *current = nil; 17 | TISInputSourceRef currentLayout = TISCopyCurrentKeyboardLayoutInputSource(); 18 | 19 | if (current == nil) { 20 | current = [[PTKeyCodeTranslator alloc] initWithKeyboardLayout:currentLayout]; 21 | } else if ([current keyboardLayout] != currentLayout) { 22 | current = [[PTKeyCodeTranslator alloc] initWithKeyboardLayout:currentLayout]; 23 | } 24 | 25 | CFRelease(currentLayout); 26 | 27 | return current; 28 | } 29 | 30 | - (id)initWithKeyboardLayout:(TISInputSourceRef)aLayout 31 | { 32 | if ((self = [super init]) != nil) { 33 | keyboardLayout = aLayout; 34 | 35 | CFRetain(keyboardLayout); 36 | 37 | CFDataRef uchr = TISGetInputSourceProperty( keyboardLayout , kTISPropertyUnicodeKeyLayoutData ); 38 | uchrData = ( const UCKeyboardLayout* )CFDataGetBytePtr(uchr); 39 | } 40 | 41 | return self; 42 | } 43 | 44 | - (void)dealloc 45 | { 46 | CFRelease(keyboardLayout); 47 | } 48 | 49 | - (NSString *)translateKeyCode:(short)keyCode { 50 | UniCharCount maxStringLength = 4, actualStringLength; 51 | UniChar unicodeString[4]; 52 | UCKeyTranslate( uchrData, keyCode, kUCKeyActionDisplay, 0, LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, &deadKeyState, maxStringLength, &actualStringLength, unicodeString ); 53 | return [NSString stringWithCharacters:unicodeString length:1]; 54 | } 55 | 56 | - (TISInputSourceRef)keyboardLayout { 57 | return keyboardLayout; 58 | } 59 | 60 | - (NSString *)description { 61 | NSString *kind; 62 | kind = @"uchr"; 63 | 64 | NSString *layoutName; 65 | layoutName = (__bridge NSString *)(TISGetInputSourceProperty( keyboardLayout, kTISPropertyLocalizedName )); 66 | return [NSString stringWithFormat:@"PTKeyCodeTranslator layout=%@ (%@)", layoutName, kind]; 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTKeyCombo.h: -------------------------------------------------------------------------------- 1 | // 2 | // PTKeyCombo.h 3 | // Protein 4 | // 5 | // Created by Quentin Carnicelli on Sat Aug 02 2003. 6 | // Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface PTKeyCombo : NSObject 12 | { 13 | NSInteger mKeyCode; 14 | NSUInteger mModifiers; 15 | } 16 | 17 | + (id)clearKeyCombo; 18 | + (id)keyComboWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers; 19 | - (id)initWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers; 20 | 21 | - (id)initWithPlistRepresentation: (id)plist; 22 | - (id)plistRepresentation; 23 | 24 | - (BOOL)isEqual: (PTKeyCombo*)combo; 25 | 26 | - (NSInteger)keyCode; 27 | - (NSUInteger)modifiers; 28 | 29 | - (BOOL)isClearCombo; 30 | - (BOOL)isValidHotKeyCombo; 31 | 32 | @end 33 | 34 | 35 | @interface PTKeyCombo (UserDisplayAdditions) 36 | - (NSString*)keyCodeString; 37 | - (NSUInteger)modifierMask; 38 | @end 39 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/PTHotKey/PTKeyCombo.m: -------------------------------------------------------------------------------- 1 | // 2 | // PTKeyCombo.m 3 | // Protein 4 | // 5 | // Created by Quentin Carnicelli on Sat Aug 02 2003. 6 | // Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved. 7 | // 8 | 9 | #import "PTKeyCombo.h" 10 | #import "PTKeyCodeTranslator.h" 11 | 12 | @implementation PTKeyCombo 13 | 14 | + (id)clearKeyCombo 15 | { 16 | return [self keyComboWithKeyCode: -1 modifiers: -1]; 17 | } 18 | 19 | + (id)keyComboWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers 20 | { 21 | return [[self alloc] initWithKeyCode: keyCode modifiers: modifiers]; 22 | } 23 | 24 | - (id)initWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers 25 | { 26 | self = [super init]; 27 | 28 | if( self ) 29 | { 30 | switch ( keyCode ) 31 | { 32 | case kVK_F1: 33 | case kVK_F2: 34 | case kVK_F3: 35 | case kVK_F4: 36 | case kVK_F5: 37 | case kVK_F6: 38 | case kVK_F7: 39 | case kVK_F8: 40 | case kVK_F9: 41 | case kVK_F10: 42 | case kVK_F11: 43 | case kVK_F12: 44 | case kVK_F13: 45 | case kVK_F14: 46 | case kVK_F15: 47 | case kVK_F16: 48 | case kVK_F17: 49 | case kVK_F18: 50 | case kVK_F19: 51 | case kVK_F20: 52 | mModifiers = modifiers | NSFunctionKeyMask; 53 | break; 54 | default: 55 | mModifiers = modifiers; 56 | break; 57 | } 58 | 59 | mKeyCode = keyCode; 60 | } 61 | 62 | return self; 63 | } 64 | 65 | - (id)initWithPlistRepresentation: (id)plist 66 | { 67 | int keyCode, modifiers; 68 | 69 | if( !plist || ![plist count] ) 70 | { 71 | keyCode = -1; 72 | modifiers = -1; 73 | } 74 | else 75 | { 76 | keyCode = [[plist objectForKey: @"keyCode"] intValue]; 77 | if( keyCode < 0 ) keyCode = -1; 78 | 79 | modifiers = [[plist objectForKey: @"modifiers"] intValue]; 80 | if( modifiers <= 0 ) modifiers = -1; 81 | } 82 | 83 | return [self initWithKeyCode: keyCode modifiers: modifiers]; 84 | } 85 | 86 | - (id)plistRepresentation 87 | { 88 | return [NSDictionary dictionaryWithObjectsAndKeys: 89 | [NSNumber numberWithInteger: [self keyCode]], @"keyCode", 90 | [NSNumber numberWithInteger: [self modifiers]], @"modifiers", 91 | nil]; 92 | } 93 | 94 | - (id)copyWithZone:(NSZone*)zone; 95 | { 96 | return self; 97 | } 98 | 99 | - (BOOL)isEqual: (PTKeyCombo*)combo 100 | { 101 | return [self keyCode] == [combo keyCode] && 102 | [self modifiers] == [combo modifiers]; 103 | } 104 | 105 | #pragma mark - 106 | 107 | - (NSInteger)keyCode 108 | { 109 | return mKeyCode; 110 | } 111 | 112 | - (NSUInteger)modifiers 113 | { 114 | return mModifiers; 115 | } 116 | 117 | - (BOOL)isValidHotKeyCombo 118 | { 119 | return mKeyCode >= 0 && mModifiers > 0; 120 | } 121 | 122 | - (BOOL)isClearCombo 123 | { 124 | return mKeyCode == -1 && mModifiers == 0; 125 | } 126 | 127 | @end 128 | -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/ca.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/ca.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/cs.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/cs.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/de.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/de.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/el.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/el.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/en.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/en.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/es-MX.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/es-MX.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/es.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/es.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/fr.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/fr.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/it.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/it.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/ja.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/ja.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/ko.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/ko.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/nb.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/nb.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/nl.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/nl.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/pl.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/pl.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/pt-BR.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/pt-BR.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/pt.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/pt.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/ro.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/ro.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/ru.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/ru.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-blue-highlighted-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-disabled-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-disabled-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-editing-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-graphite-highlighted-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-bezel-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-clear-highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-clear-highlighted.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-clear-highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-clear-highlighted@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-clear.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-clear@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-clear@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback-highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback-highlighted.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback-highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback-highlighted@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-snapback@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-blue-highlighted-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-disabled-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-disabled-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-editing-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-graphite-highlighted-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-left.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-left@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-middle.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-middle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-middle@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-right.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-bezel-right@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear-highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear-highlighted.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear-highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear-highlighted@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-clear@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback-highlighted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback-highlighted.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback-highlighted@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback-highlighted@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/shortcut-recorder-yosemite-snapback@2x.png -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/sk.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/sk.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/sv.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/sv.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/th.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/th.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/zh-Hans.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/zh-Hans.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/ShortcutRecorder/Resources/zh-Hant.lproj/ShortcutRecorder.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thecatalinstan/Funky/a6f740e86b54e5a70804b71b4913dee81fae7277/Pods/ShortcutRecorder/Resources/zh-Hant.lproj/ShortcutRecorder.strings -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Crashlytics 5 | 6 | Fabric: Copyright 2018 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2018 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt 7 | 8 | ## Fabric 9 | 10 | Fabric: Copyright 2018 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt 11 | 12 | ## ShortcutRecorder 13 | 14 | # ShortcutRecorder 15 | 16 | Copyright (c) 2006, Contributors 17 | All rights reserved. 18 | 19 | Redistribution and use in source and binary forms, with or without 20 | modification, are permitted provided that the following conditions are met: 21 | * Redistributions of source code must retain the above copyright 22 | notice, this list of conditions and the following disclaimer. 23 | * Redistributions in binary form must reproduce the above copyright 24 | notice, this list of conditions and the following disclaimer in the 25 | documentation and/or other materials provided with the distribution. 26 | * Neither the name of the organization nor the 27 | names of its contributors may be used to endorse or promote products 28 | derived from this software without specific prior written permission. 29 | 30 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 31 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 32 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 33 | DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY 34 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 35 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 36 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 37 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 39 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 40 | 41 | # PTHotKey 42 | 43 | Copyright (c) 2003 Quentin D. Carnicelli. 44 | All rights reserved. 45 | 46 | Generated by CocoaPods - https://cocoapods.org 47 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Fabric: Copyright 2018 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. Crashlytics Kit: Copyright 2018 Crashlytics, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Crashlytics Terms of Service located at http://try.crashlytics.com/terms/terms-of-service.pdf and the Crashlytics Privacy Policy located at http://try.crashlytics.com/terms/privacy-policy.pdf. OSS: http://get.fabric.io/terms/opensource.txt 18 | License 19 | Commercial 20 | Title 21 | Crashlytics 22 | Type 23 | PSGroupSpecifier 24 | 25 | 26 | FooterText 27 | Fabric: Copyright 2018 Google, Inc. All Rights Reserved. Use of this software is subject to the terms and conditions of the Fabric Software and Services Agreement located at https://fabric.io/terms. OSS: http://get.fabric.io/terms/opensource.txt 28 | License 29 | Commercial 30 | Title 31 | Fabric 32 | Type 33 | PSGroupSpecifier 34 | 35 | 36 | FooterText 37 | # ShortcutRecorder 38 | 39 | Copyright (c) 2006, Contributors 40 | All rights reserved. 41 | 42 | Redistribution and use in source and binary forms, with or without 43 | modification, are permitted provided that the following conditions are met: 44 | * Redistributions of source code must retain the above copyright 45 | notice, this list of conditions and the following disclaimer. 46 | * Redistributions in binary form must reproduce the above copyright 47 | notice, this list of conditions and the following disclaimer in the 48 | documentation and/or other materials provided with the distribution. 49 | * Neither the name of the organization nor the 50 | names of its contributors may be used to endorse or promote products 51 | derived from this software without specific prior written permission. 52 | 53 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 54 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 55 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 56 | DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY 57 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 58 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 59 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 60 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 61 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 62 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 63 | 64 | # PTHotKey 65 | 66 | Copyright (c) 2003 Quentin D. Carnicelli. 67 | All rights reserved. 68 | 69 | Title 70 | ShortcutRecorder 71 | Type 72 | PSGroupSpecifier 73 | 74 | 75 | FooterText 76 | Generated by CocoaPods - https://cocoapods.org 77 | Title 78 | 79 | Type 80 | PSGroupSpecifier 81 | 82 | 83 | StringsTable 84 | Acknowledgements 85 | Title 86 | Acknowledgements 87 | 88 | 89 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Funky : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Funky 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | 145 | if [[ "$CONFIGURATION" == "Debug" ]]; then 146 | install_framework "${BUILT_PRODUCTS_DIR}/ShortcutRecorder/ShortcutRecorder.framework" 147 | fi 148 | if [[ "$CONFIGURATION" == "Release" ]]; then 149 | install_framework "${BUILT_PRODUCTS_DIR}/ShortcutRecorder/ShortcutRecorder.framework" 150 | fi 151 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 152 | wait 153 | fi 154 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_FunkyVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_FunkyVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShortcutRecorder" "${PODS_ROOT}/Crashlytics/OSX" "${PODS_ROOT}/Fabric/OSX" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ShortcutRecorder/ShortcutRecorder.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "Fabric" -framework "Security" -framework "ShortcutRecorder" -framework "SystemConfiguration" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Funky { 2 | umbrella header "Pods-Funky-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Funky/Pods-Funky.release.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ShortcutRecorder" "${PODS_ROOT}/Crashlytics/OSX" "${PODS_ROOT}/Fabric/OSX" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/ShortcutRecorder/ShortcutRecorder.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "Crashlytics" -framework "Fabric" -framework "Security" -framework "ShortcutRecorder" -framework "SystemConfiguration" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.17.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ResourceBundle-ShortcutRecorder-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 2.17.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ShortcutRecorder-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_ShortcutRecorder : NSObject 3 | @end 4 | @implementation PodsDummy_ShortcutRecorder 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ShortcutRecorder-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | // 14 | // Prefix header for all source files of the 'ShortcutRecorder' target in the 'ShortcutRecorder' project 15 | // 16 | 17 | #ifdef __OBJC__ 18 | #import 19 | #import 20 | #endif 21 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ShortcutRecorder-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "ShortcutRecorder.h" 14 | #import "SRCommon.h" 15 | #import "SRKeyCodeTransformer.h" 16 | #import "SRKeyEquivalentModifierMaskTransformer.h" 17 | #import "SRKeyEquivalentTransformer.h" 18 | #import "SRModifierFlagsTransformer.h" 19 | #import "SRRecorderControl.h" 20 | #import "SRValidator.h" 21 | #import "PTHotKey+ShortcutRecorder.h" 22 | #import "PTHotKey.h" 23 | #import "PTHotKeyCenter.h" 24 | #import "PTKeyCodeTranslator.h" 25 | #import "PTKeyCombo.h" 26 | 27 | FOUNDATION_EXPORT double ShortcutRecorderVersionNumber; 28 | FOUNDATION_EXPORT const unsigned char ShortcutRecorderVersionString[]; 29 | 30 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ShortcutRecorder.modulemap: -------------------------------------------------------------------------------- 1 | framework module ShortcutRecorder { 2 | umbrella header "ShortcutRecorder-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ShortcutRecorder/ShortcutRecorder.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ShortcutRecorder 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_LDFLAGS = -framework "Carbon" -framework "Cocoa" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ShortcutRecorder 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Privacy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | Effective date: December 27, 2018 4 | 5 | Funky ("us", "we", or "our") operates the Funky macOS application (the "Service"). 6 | 7 | This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data. Our Privacy Policy for Funky is based on the Free Privacy Policy Template Website. 8 | 9 | We use your data to provide and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, terms used in this Privacy Policy have the same meanings as in our Terms and Conditions. 10 | 11 | ## Information Collection And Use 12 | 13 | We collect several different types of information for various purposes to provide and improve our Service to you. 14 | 15 | ### Types of Data Collected 16 | 17 | - Anonymous Cookies and Usage Data 18 | 19 | #### Usage Data 20 | 21 | When you access the Service, we may collect certain information automatically, including, but not limited to, the type of device you use, your operating system, unique device identifiers and other diagnostic data ("Usage Data"). 22 | 23 | #### Tracking & Cookies Data 24 | 25 | We use cookies and similar tracking technologies to track the activity on our Service and hold certain information. 26 | 27 | Cookies are files with small amount of data which may include an anonymous unique identifier. Cookies are sent to your browser from a website and stored on your device. Tracking technologies also used are beacons, tags, and scripts to collect and track information and to improve and analyze our Service. 28 | 29 | ### Use of Data 30 | 31 | Funky uses the collected data for various purposes: 32 | 33 | - To provide and maintain the Service 34 | - To provide analysis or valuable information so that we can improve the Service 35 | - To monitor the usage of the Service 36 | - To detect, prevent and address technical issues 37 | 38 | # Transfer Of Data 39 | 40 | Your information, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction. 41 | 42 | If you are located outside Denmark, please note that we transfer the data to Denmark and process it there. 43 | 44 | Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer. 45 | 46 | Funky will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information. 47 | 48 | ## Disclosure Of Data 49 | 50 | ### Legal Requirements 51 | 52 | Funky may disclose collected data in the good faith belief that such action is necessary to: 53 | 54 | - To comply with a legal obligation 55 | - To protect and defend the rights or property of Funky 56 | - To prevent or investigate possible wrongdoing in connection with the Service 57 | - To protect the personal safety of users of the Service or the public 58 | - To protect against legal liability 59 | 60 | ### Security Of Data 61 | 62 | The security of your data is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security. 63 | 64 | ## Service Providers 65 | 66 | We may employ third party companies and individuals to facilitate our Service ("Service Providers"), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used. 67 | 68 | These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose. 69 | 70 | ### Analytics & Crash Reporting 71 | 72 | We may use third-party Service Providers to monitor and analyze the use of our Service as well as to track crashes in the Service. 73 | 74 | #### Fabric / Crashlytics 75 | 76 | Fabric is a web analytics and crash tracking service offered by Twitter that tracks and reports website traffic. Fabric uses the data collected to track and monitor the use of our Service. This data is shared with other Twitter services. Twitter may use the collected data to contextualize and personalize the ads of its own advertising network. 77 | 78 | For more information on the privacy practices of Fabric, please visit the Fabric Terms of Service web page: https://fabric.io/terms 79 | 80 | #### Links To Other Sites 81 | 82 | Our Service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. 83 | 84 | We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services. 85 | 86 | ## Children's Privacy 87 | 88 | Our Service does not address anyone under the age of 18 ("Children"). 89 | 90 | We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers. 91 | 92 | ## Changes To This Privacy Policy 93 | 94 | We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page. 95 | 96 | We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the "effective date" at the top of this Privacy Policy. 97 | 98 | You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page. 99 | 100 | ## Contact Us 101 | 102 | If you have any questions about this Privacy Policy, please contact us: 103 | 104 | By email: catalin.stan@me.com 105 | By visiting this page on our website: https://github.com/thecatalinstan/Funky/issues 106 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Funky 2 | 3 | Funky is a status bar utility which allows you to easily toggle the function key on your Mac on a per app basis. 4 | 5 | ## Usage 6 | 7 | Funky maintains a list of apps for which it will set the function key to standard F1, F2, etc. In order to edit the list, follow the steps below: 8 | 9 | 1. From the status bar icon trigger the *Preferences* dialog and navigate to *Apps*. 10 | 2. Use the `+` sign to add a new app bundle. 11 | 12 | ## Bugs / Feature Requests 13 | 14 | Use GitHub's [issue tracker](https://github.com/thecatalinstan/Funky/issues) to submit bug reports feature requests, or just to say hi. 15 | 16 | ## Pre-Built Binaries 17 | 18 | You can download pre-built binaries of Funky from two sources: 19 | 20 | - **GitHub:** see the [Releases](https://github.com/thecatalinstan/Funky/releases) section. [https://github.com/thecatalinstan/Funky/releases](https://github.com/thecatalinstan/Funky/releases) 21 | - **Mac AppStore:** free to download from the [Mac AppStore](https://itunes.apple.com/app/funky/id1210707379) at [https://itunes.apple.com/app/funky/id1210707379](https://itunes.apple.com/app/funky/id1210707379). 22 | 23 | ## Building 24 | 25 | Building should be straightforward, except for one little caveat: Funky is also distributed through the Mac AppStore, therefore it performs a [MAS receipt validation](https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573-CH105-SW1). 26 | 27 | This means that if you try to run a *release* build, it will fail to start as there is no actual Mac AppStore receipt present. 28 | 29 | In order to disable the check, simply set the `DEVELOPMENT` variable to `1`, either in the `main.m` file or through a compile-time define. 30 | 31 | --- 32 | 33 | ## Contributors Welcome 34 | 35 | Since my time is fairly limited, contributions are more than welcome to, well, *contribute*. If you think Funky is a useful tool and your macOS kung-fu is strong, feel free to fork and submit a pull request. 36 | 37 | ## Privacy Policy 38 | 39 | Please carefully read the [Privacy Policy](https://github.com/thecatalinstan/Funky/blob/master/Privacy.md). 40 | --------------------------------------------------------------------------------