├── Emoji-256x256.png ├── Pods ├── Headers │ └── Public │ │ └── Smile │ │ ├── Smile.modulemap │ │ └── Smile-umbrella.h ├── Target Support Files │ ├── Smile │ │ ├── Smile.modulemap │ │ ├── Smile-dummy.m │ │ ├── Smile-prefix.pch │ │ ├── Smile-umbrella.h │ │ ├── Smile.xcconfig │ │ └── Smile-Info.plist │ └── Pods-EmojiClipboard │ │ ├── Pods-EmojiClipboard.modulemap │ │ ├── Pods-EmojiClipboard-dummy.m │ │ ├── Pods-EmojiClipboard-umbrella.h │ │ ├── Pods-EmojiClipboard.debug.xcconfig │ │ ├── Pods-EmojiClipboard.release.xcconfig │ │ ├── Pods-EmojiClipboard-Info.plist │ │ ├── Pods-EmojiClipboard-acknowledgements.markdown │ │ ├── Pods-EmojiClipboard-acknowledgements.plist │ │ └── Pods-EmojiClipboard-frameworks.sh ├── Manifest.lock ├── Pods.xcodeproj │ ├── xcuserdata │ │ └── ilialesik.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ ├── Smile.xcscheme │ │ │ └── Pods-EmojiClipboard.xcscheme │ └── project.pbxproj └── Smile │ ├── LICENSE.md │ ├── Sources │ ├── Sequence.swift │ ├── Utils.swift │ ├── Smile.swift │ └── Categories.swift │ └── README.md ├── accessiblity.png ├── control-strip-icon.png ├── TouchEmoji ├── Assets.xcassets │ ├── Contents.json │ ├── Strip.imageset │ │ ├── Hi_emoji (2).png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ ├── Emoji-128x128.png │ │ ├── Emoji-16x16 (1).png │ │ ├── Emoji-32x32 (1).png │ │ ├── Emoji-64x64 (1).png │ │ ├── Emoji-256x256 (1).png │ │ ├── Emoji-32x32 (1)-1.png │ │ ├── Emoji-512x512 (1).png │ │ ├── Emoji-1024x1024 (1).png │ │ ├── Emoji-256x256 (1)-1.png │ │ ├── Emoji-512x512 (1)-1.png │ │ └── Contents.json ├── WindowController.swift ├── Info.plist ├── SupportNSTouchBar.swift ├── TouchBarPrivateApi.h ├── KeyEvent.swift ├── AppDelegate.swift ├── Scrubber.swift ├── SwiftFSWatcher.swift ├── TouchBarController.swift ├── Emojis.swift ├── ViewController.swift └── Base.lproj │ └── Main.storyboard ├── touch-emoji-foods-screenshot.png ├── touch-emoji-icon-screenshot.png ├── touch-emoji-recent-screenshot.png ├── Podfile ├── Touch Emoji.xcodeproj ├── project.xcworkspace │ ├── xcuserdata │ │ └── ilialesik.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ ├── gabriellorin.xcuserdatad │ │ ├── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── TouchBarEmojis.xcscheme │ │ └── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ └── ilialesik.xcuserdatad │ │ ├── xcschemes │ │ └── xcschememanagement.plist │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── project.pbxproj ├── Touch Emoji.xcworkspace ├── xcshareddata │ └── IDEWorkspaceChecks.plist └── contents.xcworkspacedata ├── Podfile.lock ├── .gitignore ├── LICENSE └── README.md /Emoji-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/Emoji-256x256.png -------------------------------------------------------------------------------- /Pods/Headers/Public/Smile/Smile.modulemap: -------------------------------------------------------------------------------- 1 | ../../../Target Support Files/Smile/Smile.modulemap -------------------------------------------------------------------------------- /accessiblity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/accessiblity.png -------------------------------------------------------------------------------- /Pods/Headers/Public/Smile/Smile-umbrella.h: -------------------------------------------------------------------------------- 1 | ../../../Target Support Files/Smile/Smile-umbrella.h -------------------------------------------------------------------------------- /control-strip-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/control-strip-icon.png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /touch-emoji-foods-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/touch-emoji-foods-screenshot.png -------------------------------------------------------------------------------- /touch-emoji-icon-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/touch-emoji-icon-screenshot.png -------------------------------------------------------------------------------- /touch-emoji-recent-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/touch-emoji-recent-screenshot.png -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile.modulemap: -------------------------------------------------------------------------------- 1 | module Smile { 2 | umbrella header "Smile-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/Strip.imageset/Hi_emoji (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/Strip.imageset/Hi_emoji (2).png -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'EmojiClipboard' do 5 | pod 'Smile' 6 | 7 | end 8 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Smile : NSObject 3 | @end 4 | @implementation PodsDummy_Smile 5 | @end 6 | -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-128x128.png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-16x16 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-16x16 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-32x32 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-32x32 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-64x64 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-64x64 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-256x256 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-256x256 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-32x32 (1)-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-32x32 (1)-1.png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-512x512 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-512x512 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-1024x1024 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-1024x1024 (1).png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-256x256 (1)-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-256x256 (1)-1.png -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-512x512 (1)-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/TouchEmoji/Assets.xcassets/AppIcon.appiconset/Emoji-512x512 (1)-1.png -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.modulemap: -------------------------------------------------------------------------------- 1 | module Pods_EmojiClipboard { 2 | umbrella header "Pods-EmojiClipboard-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_EmojiClipboard : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_EmojiClipboard 5 | @end 6 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/project.xcworkspace/xcuserdata/ilialesik.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ilyalesik/touch-emoji/HEAD/Touch Emoji.xcodeproj/project.xcworkspace/xcuserdata/ilialesik.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile-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 | -------------------------------------------------------------------------------- /Touch Emoji.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Smile (2.0.0) 3 | 4 | DEPENDENCIES: 5 | - Smile 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - Smile 10 | 11 | SPEC CHECKSUMS: 12 | Smile: 21ff6c48e06ecfcee605cca32aedd74d5810e34a 13 | 14 | PODFILE CHECKSUM: b6a1b77b7766717de4ebc643045b4e893616b04d 15 | 16 | COCOAPODS: 1.6.1 17 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Smile (2.0.0) 3 | 4 | DEPENDENCIES: 5 | - Smile 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - Smile 10 | 11 | SPEC CHECKSUMS: 12 | Smile: 21ff6c48e06ecfcee605cca32aedd74d5810e34a 13 | 14 | PODFILE CHECKSUM: b6a1b77b7766717de4ebc643045b4e893616b04d 15 | 16 | COCOAPODS: 1.6.1 17 | -------------------------------------------------------------------------------- /Touch Emoji.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile-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 SmileVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char SmileVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/Strip.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Hi_emoji (2).png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-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_EmojiClipboardVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_EmojiClipboardVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Smile 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Smile 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | SWIFT_VERSION = 4.2 11 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/xcuserdata/gabriellorin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | TouchBarEmojis.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 12FBD11B1F064CFA00E2F644 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/ilialesik.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-EmojiClipboard.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | Smile.xcscheme 15 | 16 | isShown 17 | 18 | orderHint 19 | 1 20 | 21 | 22 | SuppressBuildableAutocreation 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /TouchEmoji/WindowController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WindowController.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Foundation 9 | 10 | class WindowController: NSWindowController { 11 | 12 | 13 | override func windowDidLoad() { 14 | 15 | // hide title: 16 | window?.titleVisibility = .hidden 17 | 18 | // hide resize button + make window unresizable: 19 | window?.styleMask.remove(.resizable) 20 | 21 | // make window top transparent: 22 | window?.titlebarAppearsTransparent = true 23 | 24 | // set background color to white: 25 | window?.backgroundColor = NSColor(red: 1, green: 1, blue: 1, alpha: 1) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/xcuserdata/ilialesik.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | EmojiClipboard.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 2 11 | 12 | Touch Emoji.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 2 16 | 17 | TouchBarEmojis.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 0 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Smile" 4 | OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Smile/Smile.modulemap" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"Smile" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Smile/Smile.modulemap" 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 | SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Smile" 12 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Smile" 4 | OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Smile/Smile.modulemap" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -l"Smile" 6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Smile/Smile.modulemap" 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 | SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Smile" 12 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Smile/Smile-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.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Lessmess 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/Smile/LICENSE.md: -------------------------------------------------------------------------------- 1 | Licensed under the **MIT** license 2 | 3 | > Copyright (c) 2015 Khoa Pham 4 | > 5 | > Permission is hereby granted, free of charge, to any person obtaining 6 | > a copy of this software and associated documentation files (the 7 | > "Software"), to deal in the Software without restriction, including 8 | > without limitation the rights to use, copy, modify, merge, publish, 9 | > distribute, sublicense, and/or sell copies of the Software, and to 10 | > permit persons to whom the Software is furnished to do so, subject to 11 | > the following conditions: 12 | > 13 | > The above copyright notice and this permission notice shall be 14 | > included in all copies or substantial portions of the Software. 15 | > 16 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 21 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /TouchEmoji/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 | 0.2 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.utilities 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | LSUIElement 28 | 29 | NSHumanReadableCopyright 30 | https://github.com/ilyalesik 31 | NSMainStoryboardFile 32 | Main 33 | NSPrincipalClass 34 | NSApplication 35 | 36 | 37 | -------------------------------------------------------------------------------- /TouchEmoji/SupportNSTouchBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExtendNSTouchBar.swift 3 | // MTMR 4 | // 5 | // Created by Anton Palgunov on 07/06/2018. 6 | // Copyright © 2018 Anton Palgunov. All rights reserved. 7 | // 8 | 9 | func presentSystemModal(_ touchBar: NSTouchBar!, systemTrayItemIdentifier identifier: NSTouchBarItem.Identifier!) { 10 | if #available(OSX 10.14, *) { 11 | NSTouchBar.presentSystemModalTouchBar(touchBar, systemTrayItemIdentifier: identifier) 12 | } else { 13 | NSTouchBar.presentSystemModalFunctionBar(touchBar, systemTrayItemIdentifier: identifier) 14 | } 15 | } 16 | 17 | func presentSystemModal(_ touchBar: NSTouchBar!, placement: Int64, systemTrayItemIdentifier identifier: NSTouchBarItem.Identifier!) { 18 | if #available(OSX 10.14, *) { 19 | NSTouchBar.presentSystemModalTouchBar(touchBar, placement: placement, systemTrayItemIdentifier: identifier) 20 | } else { 21 | NSTouchBar.presentSystemModalFunctionBar(touchBar, placement: placement, systemTrayItemIdentifier: identifier) 22 | } 23 | } 24 | 25 | func minimizeSystemModal(_ touchBar: NSTouchBar!) { 26 | if #available(OSX 10.14, *) { 27 | NSTouchBar.minimizeSystemModalTouchBar(touchBar) 28 | } else { 29 | NSTouchBar.minimizeSystemModalFunctionBar(touchBar) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Smile 5 | 6 | Licensed under the **MIT** license 7 | 8 | > Copyright (c) 2015 Khoa Pham 9 | > 10 | > Permission is hereby granted, free of charge, to any person obtaining 11 | > a copy of this software and associated documentation files (the 12 | > "Software"), to deal in the Software without restriction, including 13 | > without limitation the rights to use, copy, modify, merge, publish, 14 | > distribute, sublicense, and/or sell copies of the Software, and to 15 | > permit persons to whom the Software is furnished to do so, subject to 16 | > the following conditions: 17 | > 18 | > The above copyright notice and this permission notice shall be 19 | > included in all copies or substantial portions of the Software. 20 | > 21 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 25 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 26 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 27 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28 | 29 | Generated by CocoaPods - https://cocoapods.org 30 | -------------------------------------------------------------------------------- /TouchEmoji/TouchBarPrivateApi.h: -------------------------------------------------------------------------------- 1 | // 2 | // Private API for Touch Bar, discovered by Alexsander Akers: https://github.com/a2/touch-baer 3 | // 4 | 5 | 6 | #import 7 | 8 | extern void DFRElementSetControlStripPresenceForIdentifier(NSTouchBarItemIdentifier, BOOL); 9 | 10 | extern void DFRSystemModalShowsCloseBoxWhenFrontMost(BOOL); 11 | 12 | 13 | @interface NSTouchBarItem (PrivateMethods) 14 | 15 | + (void)addSystemTrayItem:(NSTouchBarItem *)item; 16 | 17 | + (void)removeSystemTrayItem:(NSTouchBarItem *)item; 18 | 19 | @end 20 | 21 | 22 | @interface NSTouchBar (PrivateMethods) 23 | 24 | // macOS 10.14 25 | + (void)presentSystemModalTouchBar:(NSTouchBar *)touchBar placement:(long long)placement systemTrayItemIdentifier:(NSTouchBarItemIdentifier)identifier; 26 | + (void)presentSystemModalTouchBar:(NSTouchBar *)touchBar systemTrayItemIdentifier:(NSTouchBarItemIdentifier)identifier; 27 | + (void)dismissSystemModalTouchBar:(NSTouchBar *)touchBar; 28 | + (void)minimizeSystemModalTouchBar:(NSTouchBar *)touchBar; 29 | 30 | // macOS 10.13 31 | + (void)presentSystemModalFunctionBar:(NSTouchBar *)touchBar placement:(long long)placement systemTrayItemIdentifier:(NSTouchBarItemIdentifier)identifier; 32 | + (void)presentSystemModalFunctionBar:(NSTouchBar *)touchBar systemTrayItemIdentifier:(NSTouchBarItemIdentifier)identifier; 33 | + (void)dismissSystemModalFunctionBar:(NSTouchBar *)touchBar; 34 | + (void)minimizeSystemModalFunctionBar:(NSTouchBar *)touchBar; 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /Pods/Smile/Sources/Sequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Sequence.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 24/02/2017. 6 | // Copyright © 2017 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Sequence { 12 | 13 | public struct Mark { 14 | public static let zeroWidthJoiner: String = emoji(unicodeValues: [0x200D]) 15 | public static let presentationSelector: String = emoji(unicodeValues: [0xFE0F]) 16 | public static let enclosingKeyCap: String = emoji(unicodeValues: [0x20E3]) 17 | } 18 | 19 | public struct SkinTone { 20 | public static let light: String = "🏻" 21 | public static let mediumLight: String = "🏼" 22 | public static let medium: String = "🏽" 23 | public static let mediumDark: String = "🏾" 24 | public static let dark: String = "🏿" 25 | } 26 | 27 | public struct Gender { 28 | public static let male: String = emoji(unicodeValues: [0x2642]) 29 | public static let female: String = emoji(unicodeValues: [0x2640]) 30 | } 31 | 32 | public struct VariationSelector { 33 | public static let start: String = emoji(unicodeValues: [0xFE00]) 34 | public static let end: String = emoji(unicodeValues: [0xFE0F]) 35 | 36 | public static var all: [String] = 37 | Array(start.unicodeScalars.first!.value...end.unicodeScalars.first!.value) 38 | .map({ emoji(unicodeValues: [Int($0)]) }) 39 | } 40 | 41 | public static let all: [String] = [ 42 | Mark.zeroWidthJoiner, 43 | Mark.presentationSelector, 44 | Mark.enclosingKeyCap, 45 | SkinTone.light, SkinTone.mediumLight, SkinTone.mediumLight, SkinTone.mediumDark, SkinTone.dark 46 | ] + VariationSelector.all 47 | } 48 | -------------------------------------------------------------------------------- /TouchEmoji/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "Emoji-16x16 (1).png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "Emoji-32x32 (1)-1.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "Emoji-32x32 (1).png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "Emoji-64x64 (1).png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "Emoji-128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "Emoji-256x256 (1)-1.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "Emoji-256x256 (1).png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "Emoji-512x512 (1)-1.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "Emoji-512x512 (1).png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "Emoji-1024x1024 (1).png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Pods/Smile/Sources/Utils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utils.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 05/06/16. 6 | // Copyright © 2016 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Utils { 12 | 13 | static func dropPrefix(string: String, subString: String) -> String { 14 | guard string.hasPrefix(subString), 15 | let range = string.range(of: subString) else { 16 | return string 17 | } 18 | 19 | return string.replacingCharacters(in: range, with: "") 20 | } 21 | 22 | static func remove(string: String, set: Set) -> String { 23 | var result = string 24 | set.forEach { 25 | result = result.replacingOccurrences(of: $0, with: "") 26 | } 27 | 28 | return result 29 | } 30 | 31 | static func flatten(string: String, base: UInt32 = 0) -> [String] { 32 | return string.unicodeScalars.compactMap { scalarView in 33 | if let scalar = UnicodeScalar(base + scalarView.value) { 34 | return String(scalar) 35 | } else { 36 | return nil 37 | } 38 | } 39 | } 40 | 41 | static func flattenCharacters(string: String) -> [String] { 42 | return string.map { character in 43 | return String(character) 44 | } 45 | } 46 | 47 | static func insert(element: String, betweenArray array: [String]) -> [String] { 48 | var result = [String]() 49 | array.forEach { 50 | result.append($0) 51 | result.append(element) 52 | } 53 | 54 | return Array(result.dropLast()) 55 | } 56 | 57 | static func add(element: T, array: [T]) -> [T] { 58 | var array = array 59 | array.append(element) 60 | 61 | return array 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | # Touch Emoji 4 | 5 | > Emoji picker for MacBook Pro Touch Bar. 6 | 7 | [![GitHub release](https://img.shields.io/github/release/lm-a/touch-emoji.svg)](https://github.com/lm-a/touch-emoji/releases) 8 | [![license](https://img.shields.io/github/license/lm-a/touch-emoji.svg)](https://github.com/lm-a/touch-emoji/blob/master/LICENSE) ![minimal system requirements](https://img.shields.io/badge/required-macOS%2010.12.2-blue.svg) 9 | 10 | Launching an application adds the icon to Control Strip: 11 | ![Icon at control strip](touch-emoji-icon-screenshot.png) 12 | 13 | Clicking on the icon opens a swipeable panel with emojis: 14 | ![Recent emoji](touch-emoji-recent-screenshot.png) 15 | 16 | Touching a particular emoji inserts it into the currently open window. 17 | 18 | [Demo](https://www.youtube.com/watch?v=YSZSjz9Lp3Q) 19 | 20 | ## Installation 21 | * Download [latest release](https://github.com/lm-a/touch-emoji/releases/download/v0.2.1/Touch-Emoji-v0.2.1.zip) from GitHub 22 | * Unpack archive 23 | * Move `Touch Emoji` to *Applications* folder 24 | 25 | ## Troubleshooting 26 | #### Emoji touch doesn't work: 27 | 28 | Re-tick or check a tick for access  → System Preferences → Security and Privacy → tab Privacy → Accessibility → TouchEmoji 29 | 30 |

Accessibility window

31 | 32 | ## Author 33 | Ilya Lesik (https://github.com/ilyalesik) 34 | 35 | This app is based on [touch-bar-emojis](https://github.com/gabriellorin/touch-bar-emojis) by Gabriel Lorin (https://github.com/gabriellorin). 36 | 37 | ## Sponsored 38 | 39 | Sponsored by Lessmess 41 | 42 | -------------------------------------------------------------------------------- /TouchEmoji/KeyEvent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyEvent.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Foundation 9 | 10 | struct KeyEvent { 11 | static func typeEmoji (emoji: String) { 12 | 13 | let source = CGEventSource(stateID: .hidSystemState) 14 | // event for key down event: 15 | let eventKey = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: true) 16 | // event for key up event: 17 | let eventKeyUp = CGEvent(keyboardEventSource: source, virtualKey: 0, keyDown: false) 18 | 19 | // split the emoji into an array: 20 | var utf16array = Array(emoji.utf16) 21 | 22 | // set the emoji for the key down event: 23 | eventKey?.keyboardSetUnicodeString(stringLength: utf16array.count, unicodeString: &utf16array) 24 | // set the emoji for the key up event: 25 | eventKeyUp?.keyboardSetUnicodeString(stringLength: utf16array.count, unicodeString: &utf16array) 26 | // post key down event: 27 | eventKey?.post(tap: CGEventTapLocation.cghidEventTap) 28 | // post key up event: 29 | eventKeyUp?.post(tap: CGEventTapLocation.cghidEventTap) 30 | 31 | } 32 | 33 | static func openEmojiViewer () { 34 | // to open the Emoji Viewer, we need to simulate control + command + space: 35 | 36 | let source = CGEventSource(stateID: .hidSystemState) 37 | // set the key to space: 38 | let eventKeySpace = CGEvent(keyboardEventSource: source, virtualKey: 0x31, keyDown: true) 39 | // set the key up to space: 40 | let eventKeySpaceUp = CGEvent(keyboardEventSource: source, virtualKey: 0x31, keyDown: false) 41 | 42 | // add the flags control and command 43 | eventKeySpace?.flags = [.maskCommand,.maskControl] 44 | eventKeySpaceUp?.flags = [.maskCommand,.maskControl] 45 | 46 | // post key down and up events: 47 | eventKeySpace?.post(tap: CGEventTapLocation.cghidEventTap) 48 | eventKeySpaceUp?.post(tap: CGEventTapLocation.cghidEventTap) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /TouchEmoji/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Cocoa 9 | 10 | @available(OSX 10.12.2, *) 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | // dic array containing the list of apps which should have the permanent emoji bar: 15 | static var emojisForApp: [[String: String]] = [] 16 | 17 | // the Touch Bar 18 | let touchBar = TouchBarController() 19 | 20 | // we check for file changed in the preferences files containing the latest used emojis 21 | // starting in 10.13, most frequent emojis are stored in the EmojiPreferences.plist file: it also contains the number of times each emoji was used 22 | let fileWatcher = SwiftFSWatcher([NSHomeDirectory()+"/Library/Preferences/com.apple.EmojiPreferences.plist", NSHomeDirectory()+"/Library/Preferences/com.apple.CharacterPicker.plist"]) 23 | 24 | 25 | func applicationDidFinishLaunching(_ aNotification: Notification) { 26 | TouchBarController.shared.setupControlStripPresence() 27 | 28 | // set the frequently used emojis: 29 | Emojis.arrayEmojis = Emojis.getAllEmojis() 30 | 31 | // we show the permanent emoji Touch Bar: 32 | NSTouchBar.presentSystemModalFunctionBar(touchBar.systemModalTouchBar, systemTrayItemIdentifier: touchBar.emojiSystemModal) 33 | 34 | // in case of a preferences files change: 35 | fileWatcher.watch { changeEvents in 36 | for _ in changeEvents { 37 | // update array containing recently used emojis: 38 | Emojis.arrayEmojis = Emojis.getAllEmojis() 39 | 40 | // reload the data of the Touch Bar: 41 | self.touchBar.scrubber.reloadData() 42 | } 43 | } 44 | } 45 | 46 | func applicationWillTerminate(_ aNotification: Notification) { 47 | 48 | } 49 | 50 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 51 | // we close the app if the window gets closed: 52 | return true 53 | } 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/ilialesik.xcuserdatad/xcschemes/Smile.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/ilialesik.xcuserdatad/xcschemes/Pods-EmojiClipboard.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-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 | Licensed under the **MIT** license 18 | 19 | > Copyright (c) 2015 Khoa Pham 20 | > 21 | > Permission is hereby granted, free of charge, to any person obtaining 22 | > a copy of this software and associated documentation files (the 23 | > "Software"), to deal in the Software without restriction, including 24 | > without limitation the rights to use, copy, modify, merge, publish, 25 | > distribute, sublicense, and/or sell copies of the Software, and to 26 | > permit persons to whom the Software is furnished to do so, subject to 27 | > the following conditions: 28 | > 29 | > The above copyright notice and this permission notice shall be 30 | > included in all copies or substantial portions of the Software. 31 | > 32 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 33 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 34 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 35 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 36 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 37 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 38 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 39 | 40 | License 41 | MIT 42 | Title 43 | Smile 44 | Type 45 | PSGroupSpecifier 46 | 47 | 48 | FooterText 49 | Generated by CocoaPods - https://cocoapods.org 50 | Title 51 | 52 | Type 53 | PSGroupSpecifier 54 | 55 | 56 | StringsTable 57 | Acknowledgements 58 | Title 59 | Acknowledgements 60 | 61 | 62 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/xcuserdata/gabriellorin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 40 | 52 | 53 | 54 | 56 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /TouchEmoji/Scrubber.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Scrubber.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Cocoa 9 | import Smile 10 | 11 | @available(OSX 10.12.2, *) 12 | class Scrubber: NSCustomTouchBarItem, NSScrubberDelegate, NSScrubberDataSource, NSScrubberFlowLayoutDelegate { 13 | 14 | private let itemViewIdentifier = "EmojiScrubber" 15 | // width for each emoji: 16 | private let scrubberItemWidth = 40 17 | 18 | 19 | required init?(coder: NSCoder) { 20 | super.init(coder: coder) 21 | } 22 | 23 | override init(identifier: NSTouchBarItemIdentifier) { 24 | super.init(identifier: identifier) 25 | 26 | let scrubber = NSScrubber() 27 | scrubber.scrubberLayout = NSScrubberFlowLayout() 28 | scrubber.register(NSScrubberTextItemView.self, forItemIdentifier: self.itemViewIdentifier) 29 | // .free makes the Scrubber scrollable: 30 | scrubber.mode = .free 31 | scrubber.selectionBackgroundStyle = .roundedBackground 32 | scrubber.delegate = self 33 | scrubber.dataSource = self 34 | view = scrubber 35 | } 36 | 37 | func numberOfItems(for scrubber: NSScrubber) -> Int { 38 | return Emojis.arrayEmojis.count 39 | } 40 | 41 | func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView { 42 | let itemView = scrubber.makeItem(withIdentifier: self.itemViewIdentifier, 43 | owner: nil) as! NSScrubberTextItemView 44 | 45 | let emojiToFiew = Emojis.arrayEmojis[index] 46 | 47 | // (scrubber iterates depending on value returned by numberOfItems) 48 | itemView.textField.stringValue = emojiToFiew.value 49 | 50 | // change emoji font size: 51 | if (emojiToFiew.type == "item") { 52 | itemView.textField.font = NSFont.systemFont(ofSize: 28) 53 | } else { 54 | itemView.textField.font = NSFont.systemFont(ofSize: 14) 55 | } 56 | 57 | return itemView 58 | } 59 | 60 | func scrubber(_ scrubber: NSScrubber, layout: NSScrubberFlowLayout, sizeForItemAt itemIndex: Int) -> NSSize { 61 | 62 | // set the distance between emojis (the height Touch Bar is 30 points): 63 | let emojiToType = Emojis.arrayEmojis[itemIndex] 64 | if emojiToType.type == "item" { 65 | return NSSize(width: scrubberItemWidth, height: 30) 66 | } else { 67 | return NSSize(width: emojiToType.value.count * 10, height: 30) 68 | } 69 | } 70 | 71 | func scrubber(_ scrubber: NSScrubber, didSelectItemAt index: Int) { 72 | // get the emoji that has been selected: 73 | let emojiToType = Emojis.arrayEmojis[index] 74 | if emojiToType.type == "item" { 75 | // check permissions: 76 | AXIsProcessTrustedWithOptions([kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString: true] as NSDictionary) 77 | 78 | KeyEvent.typeEmoji(emoji: emojiToType.value) 79 | 80 | // deselect the selected emoji: 81 | scrubber.selectedIndex = -1 82 | } 83 | 84 | 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /TouchEmoji/SwiftFSWatcher.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftFSWatcher.swift 3 | // SwiftFSWatcher 4 | // 5 | // Created by Gurinder Hans on 4/9/16. 6 | // Copyright © 2016 Gurinder Hans. All rights reserved. 7 | // 8 | 9 | @objc open class SwiftFSWatcher : NSObject { 10 | 11 | var stream: FSEventStreamRef? 12 | 13 | var onChangeCallback: (([FileEvent]) -> Void)? 14 | 15 | open var watchingPaths: [String]? { 16 | didSet { 17 | guard stream != nil else { 18 | return 19 | } 20 | 21 | pause() 22 | stream = nil 23 | watch(onChangeCallback) 24 | } 25 | } 26 | 27 | 28 | // MARK: - Init methods 29 | 30 | public override init() { 31 | // Default init 32 | super.init() 33 | } 34 | 35 | public convenience init(_ paths: [String]) { 36 | self.init() 37 | self.watchingPaths = paths 38 | } 39 | 40 | // MARK: - API public methods 41 | 42 | open func watch(_ changeCb: (([FileEvent]) -> Void)?) { 43 | guard let paths = watchingPaths else { 44 | return 45 | } 46 | 47 | guard stream == nil else { 48 | return 49 | } 50 | 51 | onChangeCallback = changeCb 52 | 53 | var context = FSEventStreamContext(version: 0, info: UnsafeMutableRawPointer(mutating: Unmanaged.passUnretained(self).toOpaque()), retain: nil, release: nil, copyDescription: nil) 54 | stream = FSEventStreamCreate(kCFAllocatorDefault, innerEventCallback, &context, paths as CFArray, FSEventStreamEventId(kFSEventStreamEventIdSinceNow), 0, UInt32(kFSEventStreamCreateFlagUseCFTypes | kFSEventStreamCreateFlagFileEvents)) 55 | FSEventStreamScheduleWithRunLoop(stream!, RunLoop.current.getCFRunLoop(), CFRunLoopMode.defaultMode.rawValue) 56 | FSEventStreamStart(stream!) 57 | } 58 | 59 | open func resume() { 60 | guard stream != nil else { 61 | return 62 | } 63 | 64 | FSEventStreamStart(stream!) 65 | } 66 | 67 | open func pause() { 68 | guard stream != nil else { 69 | return 70 | } 71 | 72 | FSEventStreamStop(stream!) 73 | } 74 | 75 | // MARK: - [Private] Closure passed into `FSEventStream` and is called on new file event 76 | 77 | fileprivate let innerEventCallback: FSEventStreamCallback = { (stream, contextInfo, numEvents, eventPaths, eventFlags, eventIds) in 78 | let eventIds = eventIds 79 | let eventFlags = eventFlags 80 | let fsWatcher: SwiftFSWatcher = unsafeBitCast(contextInfo, to: SwiftFSWatcher.self) 81 | let paths = unsafeBitCast(eventPaths, to: NSArray.self) as! [String] 82 | 83 | var fileEvents = [FileEvent]() 84 | for i in 0.. 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /TouchEmoji/TouchBarController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TouchBarController.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Foundation 9 | 10 | extension NSTouchBarItem.Identifier { 11 | static let controlStripItem = NSTouchBarItem.Identifier("com.toxblh.mtmr.controlStrip") 12 | } 13 | 14 | @available(OSX 10.12.2, *) 15 | class TouchBarController: NSObject, NSTouchBarDelegate { 16 | 17 | var showControlStripState: Bool { 18 | get { 19 | return true 20 | } 21 | set { 22 | UserDefaults.standard.set(newValue, forKey: "com.toxblh.mtmr.settings.showControlStrip") 23 | } 24 | } 25 | 26 | // the identifiers for the Touch Bar modal and items: 27 | let emojiSystemModal = NSTouchBarItemIdentifier("in.lor.EmojiSystemModal") 28 | let emojiScrubberIdentifier = NSTouchBarItemIdentifier("in.lor.EmojiScrubber") 29 | let emojiButtonIdentifier = NSTouchBarItemIdentifier("in.lor.EmojiButton") 30 | 31 | // the scrubber we use to display the emojis: 32 | var scrubber = NSScrubber() 33 | 34 | // we keep track of a single Touch Bar object: 35 | private var singleSystemModalTouchBar: NSTouchBar? 36 | 37 | var systemModalTouchBar: NSTouchBar? { 38 | // if the Touch Bar object is not set: 39 | if (singleSystemModalTouchBar == nil) { 40 | let touchBar = NSTouchBar() 41 | // the Touch Bar will contain the scrubber and the button: 42 | touchBar.defaultItemIdentifiers = [emojiScrubberIdentifier,emojiButtonIdentifier] 43 | touchBar.delegate = self 44 | singleSystemModalTouchBar = touchBar 45 | } 46 | return singleSystemModalTouchBar 47 | } 48 | 49 | func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? { 50 | // the Touch Bar is initializing: 51 | if (identifier == emojiScrubberIdentifier) { 52 | 53 | // setting up the emoji Scrubber: 54 | let scrubberItem: NSCustomTouchBarItem 55 | scrubberItem = Scrubber(identifier: identifier) 56 | scrubber = scrubberItem.view as! NSScrubber 57 | 58 | return scrubberItem 59 | 60 | } else if(identifier == emojiButtonIdentifier) { 61 | // setting up the emoji Button: 62 | let exitButton = NSCustomTouchBarItem(identifier: emojiButtonIdentifier) 63 | exitButton.view = NSButton(title: "exit", target: self, action: #selector(self.exitButtonTapped)) 64 | 65 | return exitButton 66 | } else { 67 | 68 | return nil 69 | } 70 | } 71 | 72 | func exitButtonTapped(_ sender: Any) { 73 | NSApplication.shared().terminate(self) 74 | } 75 | 76 | static let shared = TouchBarController() 77 | 78 | var touchBar = NSTouchBar() 79 | 80 | func setupControlStripPresence() { 81 | DFRSystemModalShowsCloseBoxWhenFrontMost(false) 82 | let item = NSCustomTouchBarItem(identifier: .controlStripItem) 83 | item.view = NSButton(image: #imageLiteral(resourceName: "Strip"), target: self, action: #selector(presentTouchBar)) 84 | NSTouchBarItem.addSystemTrayItem(item) 85 | DFRElementSetControlStripPresenceForIdentifier(.controlStripItem, true) 86 | } 87 | 88 | func updateControlStripPresence() { 89 | DFRElementSetControlStripPresenceForIdentifier(.controlStripItem, true) 90 | } 91 | 92 | @objc private func presentTouchBar() { 93 | updateControlStripPresence() 94 | presentSystemModal(self.systemModalTouchBar, systemTrayItemIdentifier: .controlStripItem) 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /Pods/Smile/README.md: -------------------------------------------------------------------------------- 1 | # Smile 2 | Emoji in Swift. For reference, go to https://github.com/onmyway133/emoji 3 | 4 | [![CI Status](http://img.shields.io/travis/onmyway133/Smile.svg?style=flat)](https://travis-ci.org/onmyway133/Smile) 5 | [![Version](https://img.shields.io/cocoapods/v/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 6 | [![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 7 | [![License](https://img.shields.io/cocoapods/l/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 8 | [![Platform](https://img.shields.io/cocoapods/p/Smile.svg?style=flat)](http://cocoadocs.org/docsets/Smile) 9 | ![Swift](https://img.shields.io/badge/%20in-swift%204.0-orange.svg) 10 | 11 | ![](Screenshots/Banner.png) 12 | 13 | ## Features 14 | 15 | - [x] Support emoji sequences 16 | - [x] Handle skin tones, marks, genders, variation selectors 17 | - [x] Support new iOS emojis 18 | 19 | ### List 20 | 21 | #### List all emojis 22 | 23 | ```swift 24 | Smile.list() 25 | emojiList 26 | emojiCategories 27 | ``` 28 | 29 | ### Emoji 30 | 31 | #### Check if a character is emoji 32 | 33 | ```swift 34 | Smile.isEmoji(character: "🎉") // true 35 | ``` 36 | 37 | #### Check if a string contains any emoji 38 | 39 | ```swift 40 | Smile.containsEmoji(string: "🎈 and 🎁") // true 41 | ``` 42 | 43 | #### Get emoji from unicode values 44 | 45 | ```swift 46 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x1F47B]), "👻") 47 | XCTAssertEqual(Smile.emoji(unicodeValues: [0x0001F468, 0x200D, 0x2708]), "👨‍✈") 48 | ``` 49 | 50 | #### Unmodify an emoji 51 | 52 | ```swift 53 | Smile.unmodify(emoji: "👨🏿") // 👨 54 | ``` 55 | 56 | ### Name 57 | 58 | #### Show standard name of an emoji 59 | 60 | ```swift 61 | Smile.name(emoji: "🇳🇴") // ["REGIONAL INDICATOR SYMBOL LETTER N", "REGIONAL INDICATOR SYMBOL LETTER O"]) 62 | ``` 63 | 64 | #### Search emoji by keywords 65 | 66 | ```swift 67 | Smile.emojis(keywords: ["GRINNING"]) // 😁, 😸 68 | ``` 69 | 70 | ### Flag 71 | 72 | #### Search emoji flag by country code 73 | 74 | ```swift 75 | Smile.emoji(countryCode: "no") // 🇳🇴 76 | ``` 77 | 78 | ### Alias 79 | 80 | #### Search emoji by alias 81 | 82 | Emoji data is from https://github.com/github/gemoji/blob/master/db/emoji.json 83 | 84 | ```swift 85 | Smile.emoji(alias: "japanese_castle") // 🏯 86 | ``` 87 | 88 | #### Find alias by emoji 89 | 90 | ```swift 91 | Smile.alias(emoji: "🏯") // japanese_castle 92 | ``` 93 | 94 | #### Replace alias within a string 95 | 96 | ```swift 97 | Smile.replaceAlias(string: ":santa: is coming to :european_castle:") // 🎅 is coming to 🏰 98 | ``` 99 | 100 | ### Category 101 | 102 | #### Find category of emoji 103 | 104 | Emoji data is from https://github.com/github/gemoji/blob/master/db/Category-Emoji.json 105 | 106 | ```swift 107 | Smile.category(emoji: "😁") // people 108 | ``` 109 | 110 | ### Manipulation 111 | 112 | #### Extract all emojis within a string 113 | 114 | ```swift 115 | Smile.extractEmojis(string: "Find 🔑and🔎") // 🔑🔎 116 | ``` 117 | 118 | #### Remove all emojis within a string 119 | 120 | ```swift 121 | Smile.removeEmojis(string: "Find 🔑and🔎") // Find and 122 | ``` 123 | 124 | #### Assemble 125 | 126 | ```swift 127 | Smile.assemble(emojis: ["👨", "🏫") // 👨‍🏫 128 | Smile.assemble(emojis: ["👨", "👩", "👧", "👦"] // 👨‍👩‍👧‍👦 129 | ``` 130 | 131 | #### Disassemble 132 | 133 | ```swift 134 | Smile.disassemble(emoji: "👨‍🏫") // [👨, 🏫] 135 | ``` 136 | 137 | ## Script 138 | 139 | Update emoji list by running 140 | 141 | ```js 142 | node parser.js 143 | ``` 144 | 145 | ## Installation 146 | 147 | **Smile** is available through [CocoaPods](http://cocoapods.org). To install 148 | it, simply add the following line to your Podfile: 149 | 150 | ```ruby 151 | pod 'Smile' 152 | ``` 153 | 154 | **Smile** is also available through [Carthage](https://github.com/Carthage/Carthage). 155 | To install just write into your Cartfile: 156 | 157 | ```ruby 158 | github "onmyway133/Smile" 159 | ``` 160 | 161 | ## Author 162 | 163 | Khoa Pham, onmyway133@gmail.com 164 | 165 | ## Contributing 166 | 167 | We would love you to contribute to **Smile**, check the [CONTRIBUTING](https://github.com/onmyway133/Smile/blob/master/CONTRIBUTING.md) file for more info. 168 | 169 | ## License 170 | 171 | **Smile** is available under the MIT license. See the [LICENSE](https://github.com/onmyway133/Smile/blob/master/LICENSE.md) file for more info. 172 | -------------------------------------------------------------------------------- /TouchEmoji/Emojis.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Emojis.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Foundation 9 | import Smile 10 | 11 | struct EmojiItem { 12 | var type: String; 13 | var value: String; 14 | 15 | init(type: String, value: String) { 16 | self.type = type; 17 | self.value = value; 18 | } 19 | 20 | } 21 | 22 | extension String { 23 | func capitalizingFirstLetter() -> String { 24 | return prefix(1).uppercased() + self.lowercased().dropFirst() 25 | } 26 | 27 | mutating func capitalizeFirstLetter() { 28 | self = self.capitalizingFirstLetter() 29 | } 30 | } 31 | 32 | struct Emojis { 33 | // array containing the emojis: 34 | static var arrayEmojis = [EmojiItem]() 35 | static var allEmojis = Smile.emojiCategories 36 | static var emojiCategories = ["people", "nature", "foods", "activity", "places", "objects", "symbols", "flags"] 37 | 38 | 39 | 40 | static func getFrequentlyUsedEmojis() -> [String] { 41 | 42 | // initiate the array containing the most recently used/frequently used emojis: 43 | var frequentlyUsedEmojis = [String]() 44 | 45 | // path to most commonly used emojis, new location (10.13): 46 | let pathFrequentlyUsedEmojis = NSHomeDirectory()+"/Library/Preferences/com.apple.EmojiPreferences.plist" 47 | 48 | // it's a dic: 49 | if let dic = NSDictionary(contentsOfFile: pathFrequentlyUsedEmojis) as? [String: Any] { 50 | 51 | // check key EMFDefaultsKey: 52 | if let EMFDefaultsKey = dic["EMFDefaultsKey"] as! NSDictionary? { 53 | 54 | // then check key EMFRecentsKey, which contains emojis ordered by most frequently used: 55 | if let EMFRecentsKey = EMFDefaultsKey["EMFRecentsKey"] as! [String]? { 56 | for oneEmoji in EMFRecentsKey { 57 | // add items to our array: 58 | frequentlyUsedEmojis.append(oneEmoji) 59 | } 60 | } 61 | 62 | } 63 | 64 | } 65 | 66 | // if array is empty, it means we probably don't have the new 10.13 emoji preferences file: 67 | if(frequentlyUsedEmojis.count == 0) { 68 | 69 | // retrieve frequently used emojis from 10.12 (and older) location: 70 | let pathFrequentlyUsedEmojis = NSHomeDirectory()+"/Library/Preferences/com.apple.CharacterPicker.plist" 71 | 72 | // a dic, with different structure from 10.13: 73 | if let dic = NSDictionary(contentsOfFile: pathFrequentlyUsedEmojis) as? [String: Any] { 74 | 75 | if let arrayDic: [String] = dic["Recents:com.apple.CharacterPicker.DefaultDataStorage"] as? [String] { 76 | 77 | for item in arrayDic { 78 | if(item.components(separatedBy: "com.apple.cpk:").count > 1) { 79 | let jsonText = item.components(separatedBy: "com.apple.cpk:")[1] 80 | 81 | // convert the String to utf8 encoded Data for json serializing: 82 | if let data = jsonText.data(using: String.Encoding.utf8) { 83 | 84 | do { 85 | 86 | // serialize the JSON data object into a dic: 87 | let jsonDic = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String:AnyObject] as NSDictionary? 88 | 89 | // from the serialized object, we try to get the value for char: 90 | if let oneEmojiItem = jsonDic?["char"] as? String { 91 | // add it to the array of recently used emojis: 92 | frequentlyUsedEmojis.append(oneEmojiItem) 93 | } 94 | 95 | } catch { 96 | // error with serialization 97 | } 98 | } 99 | } 100 | } 101 | } 102 | 103 | 104 | } 105 | 106 | } 107 | 108 | return frequentlyUsedEmojis 109 | } 110 | 111 | static func getAllEmojis() -> [EmojiItem] { 112 | var result = [EmojiItem](); 113 | let frequentEmojis = getFrequentlyUsedEmojis(); 114 | if (frequentEmojis.count > 0) { 115 | result.append(EmojiItem(type: "group", value: "Recent: ")); 116 | for c in frequentEmojis { 117 | result.append(EmojiItem(type: "item", value: c)); 118 | } 119 | } 120 | 121 | for groupEmojiName in emojiCategories { 122 | result.append(EmojiItem(type: "group", value: groupEmojiName.capitalizingFirstLetter() + ":")) 123 | let groupEmojiArray = allEmojis[groupEmojiName] ?? [] 124 | for c in groupEmojiArray { 125 | result.append(EmojiItem(type: "item", value: c)); 126 | } 127 | } 128 | 129 | return result; 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /Pods/Smile/Sources/Smile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Smile.swift 3 | // Smile 4 | // 5 | // Created by Khoa Pham on 05/06/16. 6 | // Copyright © 2016 Fantageek. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: - List 12 | 13 | /// List all emojis 14 | public func list() -> [String] { 15 | let ranges = [ 16 | 0x1F601...0x1F64F, 17 | 0x2600...0x27B0, 18 | 0x23F0...0x23FA, 19 | 0x1F680...0x1F6C0, 20 | 0x1F170...0x1F251 21 | ] 22 | 23 | var all = ranges.joined().map { 24 | return String(Character(UnicodeScalar($0)!)) 25 | } 26 | 27 | //⌚️⌨️⭐️ 28 | let solos = [0x231A, 0x231B, 0x2328, 0x2B50] 29 | all.append(contentsOf: solos.map({ String(Character(UnicodeScalar($0)!))})) 30 | 31 | return all 32 | } 33 | 34 | // MARK: - Emoji 35 | 36 | /// Check if a character is emoji 37 | public func isEmoji(character: String) -> Bool { 38 | return emojiList.values.contains(character) 39 | } 40 | 41 | /// Check if a string contains any emojis 42 | public func containsEmoji(string: String) -> Bool { 43 | let set = CharacterSet(charactersIn: emojiList.values.joined()) 44 | let range = string 45 | .smile_removingDigits 46 | .rangeOfCharacter(from: set) 47 | 48 | return range != nil 49 | } 50 | 51 | /// Get emoji from unicode value 52 | public func emoji(unicodeValues: [Int]) -> String { 53 | return unicodeValues.compactMap({ 54 | guard let scalar = UnicodeScalar($0) else { 55 | return nil 56 | } 57 | 58 | return String(scalar) 59 | }).joined() 60 | } 61 | 62 | /// Unmodify an emoji 63 | public func unmodify(emoji: String) -> String { 64 | guard let first = emoji.unicodeScalars.first?.value else { 65 | return emoji 66 | } 67 | 68 | return Smile.emoji(unicodeValues: [Int(first)]) 69 | } 70 | 71 | // MARK: - Name 72 | 73 | /// Return standard name for a emoji 74 | public func name(emoji: String) -> [String] { 75 | let string = NSMutableString(string: String(emoji)) 76 | var range = CFRangeMake(0, CFStringGetLength(string)) 77 | CFStringTransform(string, &range, kCFStringTransformToUnicodeName, false) 78 | 79 | return Utils.dropPrefix(string: String(string), subString: "\\N") 80 | .components(separatedBy: "\\N") 81 | .map { 82 | return Utils.remove(string: $0, set: (Set(["{", "}"]))) 83 | } 84 | } 85 | 86 | // MARK: - Flag 87 | 88 | /// Return emoji for a flag 89 | public func emoji(countryCode: String) -> String { 90 | let base = UnicodeScalar("🇦").value - UnicodeScalar("A").value 91 | return Utils.flatten(string: countryCode.uppercased(), base: base).joined() 92 | } 93 | 94 | // MARK: - Keywords 95 | 96 | /// Search emoji by keywords 97 | public func emojis(keywords: [String]) -> [String] { 98 | var result: [String] = [] 99 | 100 | list().forEach { emoji in 101 | keywords.forEach { keyword in 102 | name(emoji: emoji).forEach { name in 103 | if name.range(of: keyword) != nil { 104 | result.append(emoji) 105 | } 106 | } 107 | } 108 | } 109 | 110 | return result 111 | } 112 | 113 | // MARK: - Alias 114 | 115 | /// Return emoji for an alias 116 | public func emoji(alias: String) -> String? { 117 | return emojiList[alias] 118 | } 119 | 120 | /// Find alias of emoji 121 | public func alias(emoji: String) -> String? { 122 | for (key, value) in emojiList { 123 | if value == emoji { 124 | return key 125 | } 126 | } 127 | 128 | return nil 129 | } 130 | 131 | /// Replace alias within a string by emoji 132 | public func replaceAlias(string: String) -> String { 133 | guard let regex = try? NSRegularExpression(pattern: ":.*?:", options: .caseInsensitive) else { 134 | return string 135 | } 136 | 137 | let range = NSMakeRange(0, string.count) 138 | var mutableString = string 139 | regex.enumerateMatches(in: string, options: [], range: range) { (result, flags, context) in 140 | guard let range = result?.range else { 141 | return 142 | } 143 | 144 | let start = string.index(string.startIndex, offsetBy: range.location) 145 | let end = string.index(start, offsetBy: range.length) 146 | 147 | let alias = string[start.. String? { 163 | for (category, list) in emojiCategories { 164 | if list.contains(emoji) { 165 | return category 166 | } 167 | } 168 | 169 | return nil 170 | } 171 | 172 | // MARK: - Manipulation 173 | 174 | /// Extract all emojis within a string 175 | public func extractEmojis(string: String) -> String { 176 | return Utils.flatten(string: string).filter({ character in 177 | return isRelatedToEmoji(character: character) 178 | }).joined() 179 | } 180 | 181 | /// Remove all emojis within a string 182 | public func removeEmojis(string: String) -> String { 183 | let first = Utils.flattenCharacters(string: string).filter({ character in 184 | return !isRelatedToEmoji(character: character) 185 | }).joined() 186 | 187 | let second = Utils.flatten(string: first).filter({ character in 188 | return !isRelatedToEmoji(character: character) 189 | }).joined() 190 | 191 | return second 192 | } 193 | 194 | /// Assemble many emojis into one 195 | public func assemble(emojis: [String]) -> String { 196 | let simple = Utils.flatten(string: emojis.joined()) 197 | let joiner = Utils.insert(element: Smile.Sequence.Mark.zeroWidthJoiner, betweenArray: simple) 198 | let selector = Utils.add(element: Smile.Sequence.Mark.presentationSelector, array: joiner) 199 | 200 | if isEmoji(character: simple.joined()) { 201 | return simple.joined() 202 | } 203 | 204 | if isEmoji(character: joiner.joined()) { 205 | return joiner.joined() 206 | } 207 | 208 | if isEmoji(character: selector.joined()) { 209 | return selector.joined() 210 | } 211 | 212 | return emojis.joined() 213 | } 214 | 215 | /// Disassemble an emoji into many 216 | public func disassemble(emoji: String) -> [String] { 217 | return Utils.flatten(string: emoji).filter({ character in 218 | return isEmoji(character: character) 219 | }) 220 | } 221 | 222 | // MARK: - Helper 223 | 224 | /// Check if a character is emoji, or emoji sequence marks 225 | fileprivate func isRelatedToEmoji(character: String) -> Bool { 226 | return isEmoji(character: character) 227 | || list().contains(character) 228 | || Smile.Sequence.all.contains(character) 229 | } 230 | 231 | fileprivate extension String { 232 | var smile_removingDigits: String { 233 | return components(separatedBy: .decimalDigits).joined() 234 | } 235 | } 236 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | 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}\"" 90 | 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}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | 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}\"" 104 | 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}" 105 | else 106 | # 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. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Signs a framework with the provided identity 113 | code_sign_if_enabled() { 114 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 115 | # Use the current code_sign_identity 116 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 117 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 118 | 119 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 120 | code_sign_cmd="$code_sign_cmd &" 121 | fi 122 | echo "$code_sign_cmd" 123 | eval "$code_sign_cmd" 124 | fi 125 | } 126 | 127 | # Strip invalid architectures 128 | strip_invalid_archs() { 129 | binary="$1" 130 | # Get architectures for current target binary 131 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 132 | # Intersect them with the architectures we are building for 133 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 134 | # If there are no archs supported by this binary then warn the user 135 | if [[ -z "$intersected_archs" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | STRIP_BINARY_RETVAL=0 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=1 152 | } 153 | 154 | 155 | if [[ "$CONFIGURATION" == "Debug" ]]; then 156 | install_framework "${BUILT_PRODUCTS_DIR}/Smile/Smile.framework" 157 | fi 158 | if [[ "$CONFIGURATION" == "Release" ]]; then 159 | install_framework "${BUILT_PRODUCTS_DIR}/Smile/Smile.framework" 160 | fi 161 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 162 | wait 163 | fi 164 | -------------------------------------------------------------------------------- /Pods/Smile/Sources/Categories.swift: -------------------------------------------------------------------------------- 1 | public let emojiCategories: [String: [String]] = [ 2 | "people": ["😀","😃","😄","😁","😆","😅","😂","🤣","☺️","😊","😇","🙂","🙃","😉","😌","😍","😘","😗","😙","😚","😋","😜","😝","😛","🤑","🤗","🤓","😎","🤡","🤠","😏","😒","😞","😔","😟","😕","🙁","☹️","😣","😖","😫","😩","😤","😠","😡","😶","😐","😑","😯","😦","😧","😮","😲","😵","😳","😱","😨","😰","😢","😥","🤤","😭","😓","😪","😴","🙄","🤔","🤥","😬","🤐","🤢","🤧","😷","🤒","🤕","😈","👿","👹","👺","💩","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👐","🙌","👏","🙏","🤝","👍","👎","👊","✊","🤛","🤜","🤞","✌️","🤘","👌","👈","👉","👆","👇","☝️","✋","🤚","🖐","🖖","👋","🤙","💪","🖕","✍️","🤳","💅","💍","💄","💋","👄","👅","👂","👃","👣","👁","👀","🗣","👤","👥","👶","👦","👧","👨","👩","👱‍♀️","👱","👴","👵","👲","👳‍♀️","👳","👮‍♀️","👮","👷‍♀️","👷","💂‍♀️","💂","🕵️‍♀️","🕵️","👩‍⚕️","👨‍⚕️","👩‍🌾","👨‍🌾","👩‍🍳","👨‍🍳","👩‍🎓","👨‍🎓","👩‍🎤","👨‍🎤","👩‍🏫","👨‍🏫","👩‍🏭","👨‍🏭","👩‍💻","👨‍💻","👩‍💼","👨‍💼","👩‍🔧","👨‍🔧","👩‍🔬","👨‍🔬","👩‍🎨","👨‍🎨","👩‍🚒","👨‍🚒","👩‍✈️","👨‍✈️","👩‍🚀","👨‍🚀","👩‍⚖️","👨‍⚖️","🤶","🎅","👸","🤴","👰","🤵","👼","🤰","🙇‍♀️","🙇","💁","💁‍♂️","🙅","🙅‍♂️","🙆","🙆‍♂️","🙋","🙋‍♂️","🤦‍♀️","🤦‍♂️","🤷‍♀️","🤷‍♂️","🙎","🙎‍♂️","🙍","🙍‍♂️","💇","💇‍♂️","💆","💆‍♂️","🕴","💃","🕺","👯","👯‍♂️","🚶‍♀️","🚶","🏃‍♀️","🏃","👫","👭","👬","💑","👩‍❤️‍👩","👨‍❤️‍👨","💏","👩‍❤️‍💋‍👩","👨‍❤️‍💋‍👨","👪","👨‍👩‍👧","👨‍👩‍👧‍👦","👨‍👩‍👦‍👦","👨‍👩‍👧‍👧","👩‍👩‍👦","👩‍👩‍👧","👩‍👩‍👧‍👦","👩‍👩‍👦‍👦","👩‍👩‍👧‍👧","👨‍👨‍👦","👨‍👨‍👧","👨‍👨‍👧‍👦","👨‍👨‍👦‍👦","👨‍👨‍👧‍👧","👩‍👦","👩‍👧","👩‍👧‍👦","👩‍👦‍👦","👩‍👧‍👧","👨‍👦","👨‍👧","👨‍👧‍👦","👨‍👦‍👦","👨‍👧‍👧","👚","👕","👖","👔","👗","👙","👘","👠","👡","👢","👞","👟","👒","🎩","🎓","👑","⛑","🎒","👝","👛","👜","💼","👓","🕶","🌂","☂️"], 3 | "nature": ["🐶","🐱","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐽","🐸","🐵","🙈","🙉","🙊","🐒","🐔","🐧","🐦","🐤","🐣","🐥","🦆","🦅","🦉","🦇","🐺","🐗","🐴","🦄","🐝","🐛","🦋","🐌","🐚","🐞","🐜","🕷","🕸","🐢","🐍","🦎","🦂","🦀","🦑","🐙","🦐","🐠","🐟","🐡","🐬","🦈","🐳","🐋","🐊","🐆","🐅","🐃","🐂","🐄","🦌","🐪","🐫","🐘","🦏","🦍","🐎","🐖","🐐","🐏","🐑","🐕","🐩","🐈","🐓","🦃","🕊","🐇","🐁","🐀","🐿","🐾","🐉","🐲","🌵","🎄","🌲","🌳","🌴","🌱","🌿","☘️","🍀","🎍","🎋","🍃","🍂","🍁","🍄","🌾","💐","🌷","🌹","🥀","🌻","🌼","🌸","🌺","🌎","🌍","🌏","🌕","🌖","🌗","🌘","🌑","🌒","🌓","🌔","🌚","🌝","🌞","🌛","🌜","🌙","💫","⭐️","🌟","✨","⚡️","🔥","💥","☄️","☀️","🌤","⛅️","🌥","🌦","🌈","☁️","🌧","⛈","🌩","🌨","☃️","⛄️","❄️","🌬","💨","🌪","🌫","🌊","💧","💦","☔️"], 4 | "foods": ["🍏","🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🍈","🍒","🍑","🍍","🥝","🥑","🍅","🍆","🥒","🥕","🌽","🌶","🥔","🍠","🌰","🥜","🍯","🥐","🍞","🥖","🧀","🥚","🍳","🥓","🥞","🍤","🍗","🍖","🍕","🌭","🍔","🍟","🥙","🌮","🌯","🥗","🥘","🍝","🍜","🍲","🍥","🍣","🍱","🍛","🍚","🍙","🍘","🍢","🍡","🍧","🍨","🍦","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🥛","🍼","☕️","🍵","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🍾","🥄","🍴","🍽"], 5 | "activity": ["⚽️","🏀","🏈","⚾️","🎾","🏐","🏉","🎱","🏓","🏸","🥅","🏒","🏑","🏏","⛳️","🏹","🎣","🥊","🥋","⛸","🎿","⛷","🏂","🏋️‍♀️","🏋️","🤺","🤼‍♀️","🤼‍♂️","🤸‍♀️","🤸‍♂️","⛹️‍♀️","⛹️","🤾‍♀️","🤾‍♂️","🏌️‍♀️","🏌️","🏄‍♀️","🏄","🏊‍♀️","🏊","🤽‍♀️","🤽‍♂️","🚣‍♀️","🚣","🏇","🚴‍♀️","🚴","🚵‍♀️","🚵","🎽","🏅","🎖","🥇","🥈","🥉","🏆","🏵","🎗","🎫","🎟","🎪","🤹‍♀️","🤹‍♂️","🎭","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🎷","🎺","🎸","🎻","🎲","🎯","🎳","🎮","🎰"], 6 | "places": ["🚗","🚕","🚙","🚌","🚎","🏎","🚓","🚑","🚒","🚐","🚚","🚛","🚜","🛴","🚲","🛵","🏍","🚨","🚔","🚍","🚘","🚖","🚡","🚠","🚟","🚃","🚋","🚞","🚝","🚄","🚅","🚈","🚂","🚆","🚇","🚊","🚉","🚁","🛩","✈️","🛫","🛬","🚀","🛰","💺","🛶","⛵️","🛥","🚤","🛳","⛴","🚢","⚓️","🚧","⛽️","🚏","🚦","🚥","🗺","🗿","🗽","⛲️","🗼","🏰","🏯","🏟","🎡","🎢","🎠","⛱","🏖","🏝","⛰","🏔","🗻","🌋","🏜","🏕","⛺️","🛤","🛣","🏗","🏭","🏠","🏡","🏘","🏚","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","🏛","⛪️","🕌","🕍","🕋","⛩","🗾","🎑","🏞","🌅","🌄","🌠","🎇","🎆","🌇","🌆","🏙","🌃","🌌","🌉","🌁"], 7 | "objects": ["⌚️","📱","📲","💻","⌨️","🖥","🖨","🖱","🖲","🕹","🗜","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📽","🎞","📞","☎️","📟","📠","📺","📻","🎙","🎚","🎛","⏱","⏲","⏰","🕰","⌛️","⏳","📡","🔋","🔌","💡","🔦","🕯","🗑","🛢","💸","💵","💴","💶","💷","💰","💳","💎","⚖️","🔧","🔨","⚒","🛠","⛏","🔩","⚙️","⛓","🔫","💣","🔪","🗡","⚔️","🛡","🚬","⚰️","⚱️","🏺","🔮","📿","💈","⚗️","🔭","🔬","🕳","💊","💉","🌡","🚽","🚰","🚿","🛁","🛀","🛎","🔑","🗝","🚪","🛋","🛏","🛌","🖼","🛍","🛒","🎁","🎈","🎏","🎀","🎊","🎉","🎎","🏮","🎐","✉️","📩","📨","📧","💌","📥","📤","📦","🏷","📪","📫","📬","📭","📮","📯","📜","📃","📄","📑","📊","📈","📉","🗒","🗓","📆","📅","📇","🗃","🗳","🗄","📋","📁","📂","🗂","🗞","📰","📓","📔","📒","📕","📗","📘","📙","📚","📖","🔖","🔗","📎","🖇","📐","📏","📌","📍","✂️","🖊","🖋","✒️","🖌","🖍","📝","✏️","🔍","🔎","🔏","🔐","🔒","🔓"], 8 | "symbols": ["❤️","💛","💚","💙","💜","🖤","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✝️","☪️","🕉","☸️","✡️","🔯","🕎","☯️","☦️","🛐","⛎","♈️","♉️","♊️","♋️","♌️","♍️","♎️","♏️","♐️","♑️","♒️","♓️","🆔","⚛️","🉑","☢️","☣️","📴","📳","🈶","🈚️","🈸","🈺","🈷️","✴️","🆚","💮","🉐","㊙️","㊗️","🈴","🈵","🈹","🈲","🅰️","🅱️","🆎","🆑","🅾️","🆘","❌","⭕️","🛑","⛔️","📛","🚫","💯","💢","♨️","🚷","🚯","🚳","🚱","🔞","📵","🚭","❗️","❕","❓","❔","‼️","⁉️","🔅","🔆","〽️","⚠️","🚸","🔱","⚜️","🔰","♻️","✅","🈯️","💹","❇️","✳️","❎","🌐","💠","Ⓜ️","🌀","💤","🏧","🚾","♿️","🅿️","🈳","🈂️","🛂","🛃","🛄","🛅","🚹","🚺","🚼","🚻","🚮","🎦","📶","🈁","🔣","ℹ️","🔤","🔡","🔠","🆖","🆗","🆙","🆒","🆕","🆓","0️⃣","1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣","8️⃣","9️⃣","🔟","🔢","#️⃣","*️⃣","▶️","⏸","⏯","⏹","⏺","⏭","⏮","⏩","⏪","⏫","⏬","◀️","🔼","🔽","➡️","⬅️","⬆️","⬇️","↗️","↘️","↙️","↖️","↕️","↔️","↪️","↩️","⤴️","⤵️","🔀","🔁","🔂","🔄","🔃","🎵","🎶","➕","➖","➗","✖️","💲","💱","™️","©️","®️","〰️","➰","➿","🔚","🔙","🔛","🔝","🔜","✔️","☑️","🔘","⚪️","⚫️","🔴","🔵","🔺","🔻","🔸","🔹","🔶","🔷","🔳","🔲","▪️","▫️","◾️","◽️","◼️","◻️","⬛️","⬜️","🔈","🔇","🔉","🔊","🔔","🔕","📣","📢","👁‍🗨","💬","💭","🗯","♠️","♣️","♥️","♦️","🃏","🎴","🀄️","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕜","🕝","🕞","🕟","🕠","🕡","🕢","🕣","🕤","🕥","🕦","🕧"], 9 | "flags": ["🏳️","🏴","🏁","🚩","🏳️‍🌈","🇦🇫","🇦🇽","🇦🇱","🇩🇿","🇦🇸","🇦🇩","🇦🇴","🇦🇮","🇦🇶","🇦🇬","🇦🇷","🇦🇲","🇦🇼","🇦🇺","🇦🇹","🇦🇿","🇧🇸","🇧🇭","🇧🇩","🇧🇧","🇧🇾","🇧🇪","🇧🇿","🇧🇯","🇧🇲","🇧🇹","🇧🇴","🇧🇶","🇧🇦","🇧🇼","🇧🇷","🇮🇴","🇻🇬","🇧🇳","🇧🇬","🇧🇫","🇧🇮","🇨🇻","🇰🇭","🇨🇲","🇨🇦","🇮🇨","🇰🇾","🇨🇫","🇹🇩","🇨🇱","🇨🇳","🇨🇽","🇨🇨","🇨🇴","🇰🇲","🇨🇬","🇨🇩","🇨🇰","🇨🇷","🇨🇮","🇭🇷","🇨🇺","🇨🇼","🇨🇾","🇨🇿","🇩🇰","🇩🇯","🇩🇲","🇩🇴","🇪🇨","🇪🇬","🇸🇻","🇬🇶","🇪🇷","🇪🇪","🇪🇹","🇪🇺","🇫🇰","🇫🇴","🇫🇯","🇫🇮","🇫🇷","🇬🇫","🇵🇫","🇹🇫","🇬🇦","🇬🇲","🇬🇪","🇩🇪","🇬🇭","🇬🇮","🇬🇷","🇬🇱","🇬🇩","🇬🇵","🇬🇺","🇬🇹","🇬🇬","🇬🇳","🇬🇼","🇬🇾","🇭🇹","🇭🇳","🇭🇰","🇭🇺","🇮🇸","🇮🇳","🇮🇩","🇮🇷","🇮🇶","🇮🇪","🇮🇲","🇮🇱","🇮🇹","🇯🇲","🇯🇵","🎌","🇯🇪","🇯🇴","🇰🇿","🇰🇪","🇰🇮","🇽🇰","🇰🇼","🇰🇬","🇱🇦","🇱🇻","🇱🇧","🇱🇸","🇱🇷","🇱🇾","🇱🇮","🇱🇹","🇱🇺","🇲🇴","🇲🇰","🇲🇬","🇲🇼","🇲🇾","🇲🇻","🇲🇱","🇲🇹","🇲🇭","🇲🇶","🇲🇷","🇲🇺","🇾🇹","🇲🇽","🇫🇲","🇲🇩","🇲🇨","🇲🇳","🇲🇪","🇲🇸","🇲🇦","🇲🇿","🇲🇲","🇳🇦","🇳🇷","🇳🇵","🇳🇱","🇳🇨","🇳🇿","🇳🇮","🇳🇪","🇳🇬","🇳🇺","🇳🇫","🇲🇵","🇰🇵","🇳🇴","🇴🇲","🇵🇰","🇵🇼","🇵🇸","🇵🇦","🇵🇬","🇵🇾","🇵🇪","🇵🇭","🇵🇳","🇵🇱","🇵🇹","🇵🇷","🇶🇦","🇷🇪","🇷🇴","🇷🇺","🇷🇼","🇧🇱","🇸🇭","🇰🇳","🇱🇨","🇵🇲","🇻🇨","🇼🇸","🇸🇲","🇸🇹","🇸🇦","🇸🇳","🇷🇸","🇸🇨","🇸🇱","🇸🇬","🇸🇽","🇸🇰","🇸🇮","🇸🇧","🇸🇴","🇿🇦","🇬🇸","🇰🇷","🇸🇸","🇪🇸","🇱🇰","🇸🇩","🇸🇷","🇸🇿","🇸🇪","🇨🇭","🇸🇾","🇹🇼","🇹🇯","🇹🇿","🇹🇭","🇹🇱","🇹🇬","🇹🇰","🇹🇴","🇹🇹","🇹🇳","🇹🇷","🇹🇲","🇹🇨","🇹🇻","🇺🇬","🇺🇦","🇦🇪","🇬🇧","🇺🇸","🇻🇮","🇺🇾","🇺🇿","🇻🇺","🇻🇦","🇻🇪","🇻🇳","🇼🇫","🇪🇭","🇾🇪","🇿🇲","🇿🇼"], 10 | ] -------------------------------------------------------------------------------- /TouchEmoji/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // TouchBarEmojis 4 | // 5 | // Created by Gabriel Lorin 6 | // 7 | 8 | import Cocoa 9 | 10 | @available(OSX 10.12.2, *) 11 | class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate { 12 | 13 | // help button: 14 | @IBAction func helpButtonClicked(_ sender: Any) { 15 | openGitHubLink() 16 | } 17 | 18 | // button with blue URL to GitHub: 19 | @IBOutlet weak var linkButton: NSButton! 20 | @IBAction func linkButtonClicked(_ sender: Any) { 21 | openGitHubLink() 22 | } 23 | 24 | // when update available: 25 | @IBAction func buttonLinkNewVersion(_ sender: Any) { 26 | openGitHubLink() 27 | } 28 | 29 | // menu action help: 30 | @IBAction func showHelp(_ sender: Any) { 31 | openGitHubLink() 32 | } 33 | 34 | // when update available, view: 35 | @IBOutlet weak var viewUpdateMessage: NSView! 36 | 37 | // table: 38 | @IBOutlet weak var appsTable: NSTableView! 39 | 40 | // table button remove: 41 | @IBOutlet weak var buttonRemove: NSButton! 42 | 43 | // table button remove clicked: 44 | @IBAction func buttonRemove(_ sender: Any) { 45 | buttonRemoveClicked() 46 | } 47 | 48 | // table button add clicked: 49 | @IBAction func buttonAdd(_ sender: Any) { 50 | buttonAddClicked() 51 | } 52 | 53 | // URL for GitHub: 54 | private let gitHubUrl = "https://github.com/gabriellorin/touch-bar-emojis" 55 | 56 | override func viewDidLoad() { 57 | super.viewDidLoad() 58 | 59 | // in case we want to reset the preferences settings: 60 | //UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) 61 | 62 | 63 | // get saved apps list from app's preferences: 64 | if let loadedEmojisForApp = UserDefaults.standard.array(forKey: "SavedAppsForEmojis") as? [[String: String]] { 65 | // set the dic array: 66 | AppDelegate.emojisForApp = loadedEmojisForApp 67 | } 68 | 69 | // if no apps in list: 70 | if(AppDelegate.emojisForApp.count == 0) { 71 | 72 | // add default list: 73 | for oneApp in AppDelegate.defaultApps { 74 | // (addBundleAtPath will only add apps which exist) 75 | self.addBundleAtPath(path: oneApp) 76 | } 77 | 78 | 79 | } 80 | 81 | // setting up table: 82 | self.appsTable.delegate = self 83 | self.appsTable.dataSource = self 84 | self.appsTable.reloadData() 85 | 86 | 87 | // check if the app has an update: 88 | checkForUpdate() 89 | 90 | } 91 | 92 | override var representedObject: Any? { 93 | didSet { 94 | // Update the view, if already loaded. 95 | } 96 | } 97 | 98 | func tableViewSelectionDidChange(_ notification: Notification) { 99 | // if at least one item is selected: 100 | if(self.appsTable.selectedRow < 0) { 101 | // activate remove button: 102 | buttonRemove.isEnabled = false 103 | } else { 104 | buttonRemove.isEnabled = true 105 | } 106 | } 107 | 108 | func addBundleAtPath(path: String) { 109 | // from a path, we get the app's name and bundle id: 110 | if let bundle = Bundle(path: path) { 111 | if let ident = bundle.bundleIdentifier { 112 | 113 | if let bundleAppName = NSURL(fileURLWithPath: path).lastPathComponent { 114 | 115 | // if the app has bundle id and name, we add it to our list of apps: 116 | AppDelegate.emojisForApp.append(["name":bundleAppName, "bundle":ident]) 117 | 118 | // store the new list to preferences file: 119 | let defaults = UserDefaults.standard 120 | defaults.set(AppDelegate.emojisForApp, forKey: "SavedAppsForEmojis") 121 | } 122 | 123 | } else { 124 | //bundle has no id 125 | } 126 | } else { 127 | // bundle not found 128 | } 129 | } 130 | 131 | func buttonRemoveClicked() { 132 | // clicked button to remove from table 133 | 134 | // multiple elements can be selected, stating from the end: 135 | for oneRow in self.appsTable.selectedRowIndexes.reversed() { 136 | 137 | // if element actually selected: 138 | if(oneRow > -1) { 139 | // removed starting from the end: 140 | AppDelegate.emojisForApp.remove(at: oneRow) 141 | 142 | // reload table: 143 | self.appsTable.reloadData() 144 | 145 | // store new table: 146 | let defaults = UserDefaults.standard 147 | defaults.set(AppDelegate.emojisForApp, forKey: "SavedAppsForEmojis") 148 | 149 | // disable remove button: 150 | buttonRemove.isEnabled = false 151 | } 152 | } 153 | } 154 | 155 | func buttonAddClicked() { 156 | // clicked button to add to table 157 | 158 | let dialog = NSOpenPanel(); 159 | dialog.title = "Choose an app"; 160 | dialog.showsResizeIndicator = true; 161 | dialog.directoryURL = NSURL.fileURL(withPath: "/Applications/", isDirectory: true) 162 | dialog.showsHiddenFiles = false; 163 | dialog.canChooseDirectories = true; 164 | dialog.canCreateDirectories = true; 165 | dialog.allowsMultipleSelection = false; 166 | dialog.allowedFileTypes = ["app"]; 167 | dialog.beginSheetModal(for: self.view.window!, completionHandler: { num in 168 | if num == NSModalResponseOK { 169 | // get path: 170 | if let path = dialog.url?.path { 171 | // add bundle at path: 172 | self.addBundleAtPath(path: path) 173 | // reload table: 174 | self.appsTable.reloadData() 175 | 176 | } 177 | } else { 178 | // user cancelled 179 | } 180 | }) 181 | } 182 | 183 | func checkForUpdate() { 184 | let url = URL(string: "https://momoji.io/touchmoji/version.html") 185 | if let usableUrl = url { 186 | let request = URLRequest(url: usableUrl) 187 | let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in 188 | if let data = data { 189 | if let stringData = String(data: data, encoding: String.Encoding.utf8) { 190 | 191 | if let strVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String { 192 | if let currentVersion = Float(strVersion) { 193 | 194 | if let webVersion = Float(stringData) { 195 | 196 | if(currentVersion < webVersion) { 197 | // new version, show update message in main qeue: 198 | DispatchQueue.main.async { 199 | () -> Void in 200 | self.viewUpdateMessage.isHidden = false 201 | } 202 | 203 | } else { 204 | // no new version 205 | } 206 | } 207 | } 208 | 209 | } 210 | 211 | } 212 | } 213 | }) 214 | task.resume() 215 | } 216 | } 217 | 218 | func numberOfRows(in tableView: NSTableView) -> Int { 219 | return AppDelegate.emojisForApp.count 220 | } 221 | 222 | func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?{ 223 | var result:NSTableCellView 224 | result = tableView.make(withIdentifier: (tableColumn?.identifier)!, owner: self) as! NSTableCellView 225 | // for each row, get the data: 226 | let rowAppIdentifier = AppDelegate.emojisForApp[row] 227 | 228 | // make sure we have a matching name for the app: 229 | if let appsName = rowAppIdentifier["name"] { 230 | // if we have, we display name: 231 | result.textField?.stringValue = appsName 232 | } else if let bundleName = rowAppIdentifier["bundle"] { 233 | // otherwise we display the bundle name 234 | result.textField?.stringValue = bundleName 235 | } else { 236 | // and default: 237 | result.textField?.stringValue = "unknown app name" 238 | } 239 | 240 | return result 241 | } 242 | 243 | func openGitHubLink() { 244 | let url = URL(string: gitHubUrl)! 245 | NSWorkspace.shared().open(url) 246 | } 247 | 248 | 249 | } 250 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/xcuserdata/ilialesik.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 40 | 52 | 53 | 54 | 56 | 68 | 69 | 70 | 72 | 84 | 85 | 99 | 100 | 114 | 115 | 129 | 130 | 131 | 132 | 133 | 135 | 147 | 148 | 149 | 151 | 163 | 164 | 165 | 167 | 179 | 180 | 181 | 183 | 195 | 196 | 197 | 199 | 211 | 212 | 213 | 215 | 227 | 228 | 229 | 231 | 243 | 244 | 245 | 247 | 259 | 260 | 261 | 263 | 275 | 276 | 277 | 279 | 291 | 292 | 293 | 295 | 307 | 308 | 309 | 310 | 311 | -------------------------------------------------------------------------------- /Touch Emoji.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 101E07F4192B50040EFCBC8D /* libPods-EmojiClipboard.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B68746295DDD6094E6D460A /* libPods-EmojiClipboard.a */; }; 11 | 120B28131F0E7446007A3535 /* DFRFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12FBD12F1F064DEE00E2F644 /* DFRFoundation.framework */; }; 12 | 12BC8E701F0E877E007ED8C5 /* KeyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12BC8E6F1F0E877E007ED8C5 /* KeyEvent.swift */; }; 13 | 12E5A4CA1F0EB0C600ACD0D0 /* TouchBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E5A4C91F0EB0C600ACD0D0 /* TouchBarController.swift */; }; 14 | 12E5A4D01F0ED58300ACD0D0 /* SwiftFSWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E5A4CF1F0ED58300ACD0D0 /* SwiftFSWatcher.swift */; }; 15 | 12E5A4D21F0FCDCA00ACD0D0 /* Emojis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12E5A4D11F0FCDCA00ACD0D0 /* Emojis.swift */; }; 16 | 12FBD1201F064CFA00E2F644 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FBD11F1F064CFA00E2F644 /* AppDelegate.swift */; }; 17 | 12FBD1241F064CFA00E2F644 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 12FBD1231F064CFA00E2F644 /* Assets.xcassets */; }; 18 | 12FBD1271F064CFA00E2F644 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 12FBD1251F064CFA00E2F644 /* Main.storyboard */; }; 19 | 12FBD1371F06769700E2F644 /* Scrubber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FBD1361F06769700E2F644 /* Scrubber.swift */; }; 20 | 3F497D062242D2EE007827D1 /* Podfile in Resources */ = {isa = PBXBuildFile; fileRef = 3F497D052242D2EE007827D1 /* Podfile */; }; 21 | 3F69684D223EB6DB00A7021E /* SupportNSTouchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F69684C223EB6DB00A7021E /* SupportNSTouchBar.swift */; }; 22 | 3FEA526C2254022C0021AA46 /* touch-emoji-foods-screenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = 3FEA52692254022C0021AA46 /* touch-emoji-foods-screenshot.png */; }; 23 | 3FEA526D2254022C0021AA46 /* touch-emoji-icon-screenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = 3FEA526A2254022C0021AA46 /* touch-emoji-icon-screenshot.png */; }; 24 | 3FEA526E2254022C0021AA46 /* touch-emoji-recent-screenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = 3FEA526B2254022C0021AA46 /* touch-emoji-recent-screenshot.png */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXCopyFilesBuildPhase section */ 28 | 127C0FC01F0E73960029D74B /* Embed Frameworks */ = { 29 | isa = PBXCopyFilesBuildPhase; 30 | buildActionMask = 2147483647; 31 | dstPath = ""; 32 | dstSubfolderSpec = 10; 33 | files = ( 34 | ); 35 | name = "Embed Frameworks"; 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXCopyFilesBuildPhase section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 12BC8E6F1F0E877E007ED8C5 /* KeyEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyEvent.swift; sourceTree = ""; }; 42 | 12E5A4C91F0EB0C600ACD0D0 /* TouchBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TouchBarController.swift; sourceTree = ""; }; 43 | 12E5A4CF1F0ED58300ACD0D0 /* SwiftFSWatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftFSWatcher.swift; sourceTree = ""; }; 44 | 12E5A4D11F0FCDCA00ACD0D0 /* Emojis.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Emojis.swift; sourceTree = ""; }; 45 | 12FBD11C1F064CFA00E2F644 /* Touch Emoji.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Touch Emoji.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 12FBD11F1F064CFA00E2F644 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 47 | 12FBD1231F064CFA00E2F644 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 48 | 12FBD1261F064CFA00E2F644 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 49 | 12FBD1281F064CFA00E2F644 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50 | 12FBD12F1F064DEE00E2F644 /* DFRFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DFRFoundation.framework; path = ../../../../../../System/Library/PrivateFrameworks/DFRFoundation.framework; sourceTree = ""; }; 51 | 12FBD1311F064E2E00E2F644 /* TouchBarPrivateApi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TouchBarPrivateApi.h; sourceTree = ""; }; 52 | 12FBD1361F06769700E2F644 /* Scrubber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scrubber.swift; sourceTree = ""; }; 53 | 1FD4C37790430BFF924B3866 /* Pods-EmojiClipboard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiClipboard.debug.xcconfig"; path = "Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.debug.xcconfig"; sourceTree = ""; }; 54 | 3F497D052242D2EE007827D1 /* Podfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 55 | 3F69684C223EB6DB00A7021E /* SupportNSTouchBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportNSTouchBar.swift; sourceTree = ""; }; 56 | 3FEA52682248E66F0021AA46 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = "/Users/ilialesik/Workspace/emoji-clipboard/README.md"; sourceTree = ""; }; 57 | 3FEA52692254022C0021AA46 /* touch-emoji-foods-screenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "touch-emoji-foods-screenshot.png"; sourceTree = ""; }; 58 | 3FEA526A2254022C0021AA46 /* touch-emoji-icon-screenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "touch-emoji-icon-screenshot.png"; sourceTree = ""; }; 59 | 3FEA526B2254022C0021AA46 /* touch-emoji-recent-screenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "touch-emoji-recent-screenshot.png"; sourceTree = ""; }; 60 | 8B68746295DDD6094E6D460A /* libPods-EmojiClipboard.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EmojiClipboard.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | D5FD0791605AF010B36FAF05 /* Pods-EmojiClipboard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EmojiClipboard.release.xcconfig"; path = "Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.release.xcconfig"; sourceTree = ""; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | 12FBD1191F064CFA00E2F644 /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | 120B28131F0E7446007A3535 /* DFRFoundation.framework in Frameworks */, 70 | 101E07F4192B50040EFCBC8D /* libPods-EmojiClipboard.a in Frameworks */, 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | /* End PBXFrameworksBuildPhase section */ 75 | 76 | /* Begin PBXGroup section */ 77 | 12FBD1131F064CFA00E2F644 = { 78 | isa = PBXGroup; 79 | children = ( 80 | 3FEA52692254022C0021AA46 /* touch-emoji-foods-screenshot.png */, 81 | 3FEA526A2254022C0021AA46 /* touch-emoji-icon-screenshot.png */, 82 | 3FEA526B2254022C0021AA46 /* touch-emoji-recent-screenshot.png */, 83 | 3FEA52682248E66F0021AA46 /* README.md */, 84 | 3F497D052242D2EE007827D1 /* Podfile */, 85 | 12FBD11E1F064CFA00E2F644 /* TouchEmoji */, 86 | 12FBD11D1F064CFA00E2F644 /* Products */, 87 | 12FBD12E1F064DEE00E2F644 /* Frameworks */, 88 | DABA71924E9062DAAD97829F /* Pods */, 89 | ); 90 | sourceTree = ""; 91 | }; 92 | 12FBD11D1F064CFA00E2F644 /* Products */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 12FBD11C1F064CFA00E2F644 /* Touch Emoji.app */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | 12FBD11E1F064CFA00E2F644 /* TouchEmoji */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 3F69684C223EB6DB00A7021E /* SupportNSTouchBar.swift */, 104 | 12FBD11F1F064CFA00E2F644 /* AppDelegate.swift */, 105 | 12E5A4D11F0FCDCA00ACD0D0 /* Emojis.swift */, 106 | 12E5A4C91F0EB0C600ACD0D0 /* TouchBarController.swift */, 107 | 12FBD1361F06769700E2F644 /* Scrubber.swift */, 108 | 12BC8E6F1F0E877E007ED8C5 /* KeyEvent.swift */, 109 | 12FBD1231F064CFA00E2F644 /* Assets.xcassets */, 110 | 12FBD1251F064CFA00E2F644 /* Main.storyboard */, 111 | 12FBD1281F064CFA00E2F644 /* Info.plist */, 112 | 12FBD1311F064E2E00E2F644 /* TouchBarPrivateApi.h */, 113 | 12E5A4CF1F0ED58300ACD0D0 /* SwiftFSWatcher.swift */, 114 | ); 115 | path = TouchEmoji; 116 | sourceTree = ""; 117 | }; 118 | 12FBD12E1F064DEE00E2F644 /* Frameworks */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 12FBD12F1F064DEE00E2F644 /* DFRFoundation.framework */, 122 | 8B68746295DDD6094E6D460A /* libPods-EmojiClipboard.a */, 123 | ); 124 | name = Frameworks; 125 | sourceTree = ""; 126 | }; 127 | DABA71924E9062DAAD97829F /* Pods */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | 1FD4C37790430BFF924B3866 /* Pods-EmojiClipboard.debug.xcconfig */, 131 | D5FD0791605AF010B36FAF05 /* Pods-EmojiClipboard.release.xcconfig */, 132 | ); 133 | path = Pods; 134 | sourceTree = ""; 135 | }; 136 | /* End PBXGroup section */ 137 | 138 | /* Begin PBXNativeTarget section */ 139 | 12FBD11B1F064CFA00E2F644 /* Touch Emoji */ = { 140 | isa = PBXNativeTarget; 141 | buildConfigurationList = 12FBD12B1F064CFA00E2F644 /* Build configuration list for PBXNativeTarget "Touch Emoji" */; 142 | buildPhases = ( 143 | 59E3373F9D9E2CD83B09AAB5 /* [CP] Check Pods Manifest.lock */, 144 | 12FBD1181F064CFA00E2F644 /* Sources */, 145 | 12FBD1191F064CFA00E2F644 /* Frameworks */, 146 | 12FBD11A1F064CFA00E2F644 /* Resources */, 147 | 127C0FC01F0E73960029D74B /* Embed Frameworks */, 148 | ); 149 | buildRules = ( 150 | ); 151 | dependencies = ( 152 | ); 153 | name = "Touch Emoji"; 154 | productName = TouchMojiPrototype; 155 | productReference = 12FBD11C1F064CFA00E2F644 /* Touch Emoji.app */; 156 | productType = "com.apple.product-type.application"; 157 | }; 158 | /* End PBXNativeTarget section */ 159 | 160 | /* Begin PBXProject section */ 161 | 12FBD1141F064CFA00E2F644 /* Project object */ = { 162 | isa = PBXProject; 163 | attributes = { 164 | LastSwiftUpdateCheck = 0830; 165 | LastUpgradeCheck = 0830; 166 | ORGANIZATIONNAME = "Gabriel Lorin"; 167 | TargetAttributes = { 168 | 12FBD11B1F064CFA00E2F644 = { 169 | CreatedOnToolsVersion = 8.3.2; 170 | DevelopmentTeam = 5R6C4GRTSX; 171 | LastSwiftMigration = 0830; 172 | ProvisioningStyle = Automatic; 173 | }; 174 | }; 175 | }; 176 | buildConfigurationList = 12FBD1171F064CFA00E2F644 /* Build configuration list for PBXProject "Touch Emoji" */; 177 | compatibilityVersion = "Xcode 3.2"; 178 | developmentRegion = English; 179 | hasScannedForEncodings = 0; 180 | knownRegions = ( 181 | en, 182 | Base, 183 | ); 184 | mainGroup = 12FBD1131F064CFA00E2F644; 185 | productRefGroup = 12FBD11D1F064CFA00E2F644 /* Products */; 186 | projectDirPath = ""; 187 | projectRoot = ""; 188 | targets = ( 189 | 12FBD11B1F064CFA00E2F644 /* Touch Emoji */, 190 | ); 191 | }; 192 | /* End PBXProject section */ 193 | 194 | /* Begin PBXResourcesBuildPhase section */ 195 | 12FBD11A1F064CFA00E2F644 /* Resources */ = { 196 | isa = PBXResourcesBuildPhase; 197 | buildActionMask = 2147483647; 198 | files = ( 199 | 3FEA526C2254022C0021AA46 /* touch-emoji-foods-screenshot.png in Resources */, 200 | 3FEA526E2254022C0021AA46 /* touch-emoji-recent-screenshot.png in Resources */, 201 | 3F497D062242D2EE007827D1 /* Podfile in Resources */, 202 | 12FBD1241F064CFA00E2F644 /* Assets.xcassets in Resources */, 203 | 3FEA526D2254022C0021AA46 /* touch-emoji-icon-screenshot.png in Resources */, 204 | 12FBD1271F064CFA00E2F644 /* Main.storyboard in Resources */, 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | /* End PBXResourcesBuildPhase section */ 209 | 210 | /* Begin PBXShellScriptBuildPhase section */ 211 | 59E3373F9D9E2CD83B09AAB5 /* [CP] Check Pods Manifest.lock */ = { 212 | isa = PBXShellScriptBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | ); 216 | inputFileListPaths = ( 217 | ); 218 | inputPaths = ( 219 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 220 | "${PODS_ROOT}/Manifest.lock", 221 | ); 222 | name = "[CP] Check Pods Manifest.lock"; 223 | outputFileListPaths = ( 224 | ); 225 | outputPaths = ( 226 | "$(DERIVED_FILE_DIR)/Pods-EmojiClipboard-checkManifestLockResult.txt", 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | shellPath = /bin/sh; 230 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 231 | showEnvVarsInLog = 0; 232 | }; 233 | /* End PBXShellScriptBuildPhase section */ 234 | 235 | /* Begin PBXSourcesBuildPhase section */ 236 | 12FBD1181F064CFA00E2F644 /* Sources */ = { 237 | isa = PBXSourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | 3F69684D223EB6DB00A7021E /* SupportNSTouchBar.swift in Sources */, 241 | 12E5A4CA1F0EB0C600ACD0D0 /* TouchBarController.swift in Sources */, 242 | 12BC8E701F0E877E007ED8C5 /* KeyEvent.swift in Sources */, 243 | 12FBD1371F06769700E2F644 /* Scrubber.swift in Sources */, 244 | 12FBD1201F064CFA00E2F644 /* AppDelegate.swift in Sources */, 245 | 12E5A4D21F0FCDCA00ACD0D0 /* Emojis.swift in Sources */, 246 | 12E5A4D01F0ED58300ACD0D0 /* SwiftFSWatcher.swift in Sources */, 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | }; 250 | /* End PBXSourcesBuildPhase section */ 251 | 252 | /* Begin PBXVariantGroup section */ 253 | 12FBD1251F064CFA00E2F644 /* Main.storyboard */ = { 254 | isa = PBXVariantGroup; 255 | children = ( 256 | 12FBD1261F064CFA00E2F644 /* Base */, 257 | ); 258 | name = Main.storyboard; 259 | sourceTree = ""; 260 | }; 261 | /* End PBXVariantGroup section */ 262 | 263 | /* Begin XCBuildConfiguration section */ 264 | 12FBD1291F064CFA00E2F644 /* Debug */ = { 265 | isa = XCBuildConfiguration; 266 | buildSettings = { 267 | ALWAYS_SEARCH_USER_PATHS = NO; 268 | CLANG_ANALYZER_NONNULL = YES; 269 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 270 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 271 | CLANG_CXX_LIBRARY = "libc++"; 272 | CLANG_ENABLE_MODULES = YES; 273 | CLANG_ENABLE_OBJC_ARC = YES; 274 | CLANG_WARN_BOOL_CONVERSION = YES; 275 | CLANG_WARN_CONSTANT_CONVERSION = YES; 276 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 277 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 278 | CLANG_WARN_EMPTY_BODY = YES; 279 | CLANG_WARN_ENUM_CONVERSION = YES; 280 | CLANG_WARN_INFINITE_RECURSION = YES; 281 | CLANG_WARN_INT_CONVERSION = YES; 282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 283 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 284 | CLANG_WARN_UNREACHABLE_CODE = YES; 285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 286 | CODE_SIGN_IDENTITY = "-"; 287 | COPY_PHASE_STRIP = NO; 288 | DEBUG_INFORMATION_FORMAT = dwarf; 289 | ENABLE_STRICT_OBJC_MSGSEND = YES; 290 | ENABLE_TESTABILITY = YES; 291 | GCC_C_LANGUAGE_STANDARD = gnu99; 292 | GCC_DYNAMIC_NO_PIC = NO; 293 | GCC_NO_COMMON_BLOCKS = YES; 294 | GCC_OPTIMIZATION_LEVEL = 0; 295 | GCC_PREPROCESSOR_DEFINITIONS = ( 296 | "DEBUG=1", 297 | "$(inherited)", 298 | ); 299 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 300 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 301 | GCC_WARN_UNDECLARED_SELECTOR = YES; 302 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 303 | GCC_WARN_UNUSED_FUNCTION = YES; 304 | GCC_WARN_UNUSED_VARIABLE = YES; 305 | MACOSX_DEPLOYMENT_TARGET = 10.12; 306 | MTL_ENABLE_DEBUG_INFO = YES; 307 | ONLY_ACTIVE_ARCH = YES; 308 | SDKROOT = macosx; 309 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 310 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 311 | }; 312 | name = Debug; 313 | }; 314 | 12FBD12A1F064CFA00E2F644 /* Release */ = { 315 | isa = XCBuildConfiguration; 316 | buildSettings = { 317 | ALWAYS_SEARCH_USER_PATHS = NO; 318 | CLANG_ANALYZER_NONNULL = YES; 319 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 320 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 321 | CLANG_CXX_LIBRARY = "libc++"; 322 | CLANG_ENABLE_MODULES = YES; 323 | CLANG_ENABLE_OBJC_ARC = YES; 324 | CLANG_WARN_BOOL_CONVERSION = YES; 325 | CLANG_WARN_CONSTANT_CONVERSION = YES; 326 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 327 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 328 | CLANG_WARN_EMPTY_BODY = YES; 329 | CLANG_WARN_ENUM_CONVERSION = YES; 330 | CLANG_WARN_INFINITE_RECURSION = YES; 331 | CLANG_WARN_INT_CONVERSION = YES; 332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 333 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 334 | CLANG_WARN_UNREACHABLE_CODE = YES; 335 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 336 | CODE_SIGN_IDENTITY = "-"; 337 | COPY_PHASE_STRIP = NO; 338 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 339 | ENABLE_NS_ASSERTIONS = NO; 340 | ENABLE_STRICT_OBJC_MSGSEND = YES; 341 | GCC_C_LANGUAGE_STANDARD = gnu99; 342 | GCC_NO_COMMON_BLOCKS = YES; 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | MACOSX_DEPLOYMENT_TARGET = 10.12; 350 | MTL_ENABLE_DEBUG_INFO = NO; 351 | SDKROOT = macosx; 352 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 353 | }; 354 | name = Release; 355 | }; 356 | 12FBD12C1F064CFA00E2F644 /* Debug */ = { 357 | isa = XCBuildConfiguration; 358 | baseConfigurationReference = 1FD4C37790430BFF924B3866 /* Pods-EmojiClipboard.debug.xcconfig */; 359 | buildSettings = { 360 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 361 | CLANG_ENABLE_MODULES = YES; 362 | CODE_SIGN_IDENTITY = "Mac Developer"; 363 | COMBINE_HIDPI_IMAGES = YES; 364 | DEVELOPMENT_TEAM = 5R6C4GRTSX; 365 | FRAMEWORK_SEARCH_PATHS = ( 366 | "$(inherited)", 367 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 368 | "$(PROJECT_DIR)/Touch", 369 | Emoji, 370 | ); 371 | INFOPLIST_FILE = "$(SRCROOT)/TouchEmoji/Info.plist"; 372 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 373 | MACOSX_DEPLOYMENT_TARGET = 10.13; 374 | PRODUCT_BUNDLE_IDENTIFIER = lm.a.TouchEmoji; 375 | PRODUCT_NAME = "$(TARGET_NAME)"; 376 | PROVISIONING_PROFILE_SPECIFIER = ""; 377 | SWIFT_OBJC_BRIDGING_HEADER = TouchEmoji/TouchBarPrivateApi.h; 378 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 379 | SWIFT_VERSION = 3.0; 380 | }; 381 | name = Debug; 382 | }; 383 | 12FBD12D1F064CFA00E2F644 /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | baseConfigurationReference = D5FD0791605AF010B36FAF05 /* Pods-EmojiClipboard.release.xcconfig */; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | CLANG_ENABLE_MODULES = YES; 389 | CODE_SIGN_IDENTITY = "Mac Developer"; 390 | COMBINE_HIDPI_IMAGES = YES; 391 | DEVELOPMENT_TEAM = 5R6C4GRTSX; 392 | FRAMEWORK_SEARCH_PATHS = ( 393 | "$(inherited)", 394 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks", 395 | "$(PROJECT_DIR)/Touch", 396 | Emoji, 397 | ); 398 | INFOPLIST_FILE = "$(SRCROOT)/TouchEmoji/Info.plist"; 399 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 400 | MACOSX_DEPLOYMENT_TARGET = 10.13; 401 | PRODUCT_BUNDLE_IDENTIFIER = lm.a.TouchEmoji; 402 | PRODUCT_NAME = "$(TARGET_NAME)"; 403 | PROVISIONING_PROFILE_SPECIFIER = ""; 404 | SWIFT_OBJC_BRIDGING_HEADER = TouchEmoji/TouchBarPrivateApi.h; 405 | SWIFT_VERSION = 3.0; 406 | }; 407 | name = Release; 408 | }; 409 | /* End XCBuildConfiguration section */ 410 | 411 | /* Begin XCConfigurationList section */ 412 | 12FBD1171F064CFA00E2F644 /* Build configuration list for PBXProject "Touch Emoji" */ = { 413 | isa = XCConfigurationList; 414 | buildConfigurations = ( 415 | 12FBD1291F064CFA00E2F644 /* Debug */, 416 | 12FBD12A1F064CFA00E2F644 /* Release */, 417 | ); 418 | defaultConfigurationIsVisible = 0; 419 | defaultConfigurationName = Release; 420 | }; 421 | 12FBD12B1F064CFA00E2F644 /* Build configuration list for PBXNativeTarget "Touch Emoji" */ = { 422 | isa = XCConfigurationList; 423 | buildConfigurations = ( 424 | 12FBD12C1F064CFA00E2F644 /* Debug */, 425 | 12FBD12D1F064CFA00E2F644 /* Release */, 426 | ); 427 | defaultConfigurationIsVisible = 0; 428 | defaultConfigurationName = Release; 429 | }; 430 | /* End XCConfigurationList section */ 431 | }; 432 | rootObject = 12FBD1141F064CFA00E2F644 /* Project object */; 433 | } 434 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0C0B76B28AFE6CACF1BD82B0A554B185 /* Pods-EmojiClipboard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6A49389408CE17439F9C5856DDBE02 /* Pods-EmojiClipboard-dummy.m */; }; 11 | 19EFFE9F60DAF15CA701BE02F52836AA /* Smile-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 253127A139CDB2D04788C77BFAA27DCB /* Smile-dummy.m */; }; 12 | 20837A7D0F6C23509FE559A8EC6D55A5 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49C2EE4133FAB9C46B28AD2D5A41E924 /* Utils.swift */; }; 13 | 3118735E0A2E0F18CBAF0AA7869AFD93 /* Smile.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD3209E7E4E9CA0EF1827E9B0FF1FA80 /* Smile.swift */; }; 14 | 3771A0B10D3D1D86F4FB0D6D4369E848 /* Categories.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E6AE0D20BA3B58BE6E902265C2FDE9 /* Categories.swift */; }; 15 | 48C4AF48F713D1E86D55A7F67C5D971D /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23C8D0D706FBEA049726265AF74FF17A /* Sequence.swift */; }; 16 | 6B8BE5CE37359F0362BED1788BD06FE6 /* Smile-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D1A4070FB5289210652DFE0BB41D44ED /* Smile-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; 17 | A06FBA7BA9E0043D9175EDF9686D3183 /* Pods-EmojiClipboard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 59EAF77044B1FE9EACF37B60ED25185D /* Pods-EmojiClipboard-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; 18 | C612319DC72C8360455D1AEFF9B0A6D3 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AAB3FCD30CB708F3544A1EF00E95A19 /* Emoji.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 581D5CE1A1514D256662B315286F4BBF /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 0A72E7E7F56EA48622FE4B2865345F3E; 27 | remoteInfo = Smile; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 02B917CBEF381B06F458F952815DC595 /* libPods-EmojiClipboard.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-EmojiClipboard.a"; path = "libPods-EmojiClipboard.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 0C6A49389408CE17439F9C5856DDBE02 /* Pods-EmojiClipboard-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-EmojiClipboard-dummy.m"; sourceTree = ""; }; 34 | 23C8D0D706FBEA049726265AF74FF17A /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = Sources/Sequence.swift; sourceTree = ""; }; 35 | 253127A139CDB2D04788C77BFAA27DCB /* Smile-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Smile-dummy.m"; sourceTree = ""; }; 36 | 3DA450E2965DC42C1B1EED8CE79A8CEC /* libSmile.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSmile.a; path = libSmile.a; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 3DB07DA7FE21D5A3976BEA8DE3681BB8 /* Pods-EmojiClipboard-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-EmojiClipboard-acknowledgements.markdown"; sourceTree = ""; }; 38 | 4618251F8CD16ED6CF94478B4CA849B8 /* Pods-EmojiClipboard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiClipboard.debug.xcconfig"; sourceTree = ""; }; 39 | 49C2EE4133FAB9C46B28AD2D5A41E924 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = Sources/Utils.swift; sourceTree = ""; }; 40 | 4AAB3FCD30CB708F3544A1EF00E95A19 /* Emoji.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Emoji.swift; path = Sources/Emoji.swift; sourceTree = ""; }; 41 | 59EAF77044B1FE9EACF37B60ED25185D /* Pods-EmojiClipboard-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-EmojiClipboard-umbrella.h"; sourceTree = ""; }; 42 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 43 | 9E69BB823947178F022228BE862F5C79 /* Smile.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Smile.modulemap; sourceTree = ""; }; 44 | B8E481CA3D0299541B402E2B40AA95EA /* Pods-EmojiClipboard.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-EmojiClipboard.modulemap"; sourceTree = ""; }; 45 | BA0A8158B264F52497361C122B625C41 /* Pods-EmojiClipboard-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-EmojiClipboard-acknowledgements.plist"; sourceTree = ""; }; 46 | C0E6AE0D20BA3B58BE6E902265C2FDE9 /* Categories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Categories.swift; path = Sources/Categories.swift; sourceTree = ""; }; 47 | C5C415AC8D6C8573F8C8F2A6332F7862 /* Smile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Smile.xcconfig; sourceTree = ""; }; 48 | CB6AA0D0929C5D72E379DD80DF3DD336 /* Pods-EmojiClipboard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-EmojiClipboard.release.xcconfig"; sourceTree = ""; }; 49 | D1A4070FB5289210652DFE0BB41D44ED /* Smile-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Smile-umbrella.h"; sourceTree = ""; }; 50 | D81A12B0ADFE6B7C1171B0EAD4FA1294 /* Smile-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Smile-prefix.pch"; sourceTree = ""; }; 51 | FD3209E7E4E9CA0EF1827E9B0FF1FA80 /* Smile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Smile.swift; path = Sources/Smile.swift; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | A85739204AA2C8C3C72F72D9B7C541AD /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | CC228661C8B3723C6D837579E1BF2D8B /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 27AA4384C13B69E2D783994C860AD4CB /* Support Files */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 9E69BB823947178F022228BE862F5C79 /* Smile.modulemap */, 76 | C5C415AC8D6C8573F8C8F2A6332F7862 /* Smile.xcconfig */, 77 | 253127A139CDB2D04788C77BFAA27DCB /* Smile-dummy.m */, 78 | D81A12B0ADFE6B7C1171B0EAD4FA1294 /* Smile-prefix.pch */, 79 | D1A4070FB5289210652DFE0BB41D44ED /* Smile-umbrella.h */, 80 | ); 81 | name = "Support Files"; 82 | path = "../Target Support Files/Smile"; 83 | sourceTree = ""; 84 | }; 85 | 51833D1E284CF5928EDFF6EE63F24811 /* Smile */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | C0E6AE0D20BA3B58BE6E902265C2FDE9 /* Categories.swift */, 89 | 4AAB3FCD30CB708F3544A1EF00E95A19 /* Emoji.swift */, 90 | 23C8D0D706FBEA049726265AF74FF17A /* Sequence.swift */, 91 | FD3209E7E4E9CA0EF1827E9B0FF1FA80 /* Smile.swift */, 92 | 49C2EE4133FAB9C46B28AD2D5A41E924 /* Utils.swift */, 93 | 27AA4384C13B69E2D783994C860AD4CB /* Support Files */, 94 | ); 95 | name = Smile; 96 | path = Smile; 97 | sourceTree = ""; 98 | }; 99 | 671C06A127E9BC357CEED17232CE18A5 /* Pods-EmojiClipboard */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | B8E481CA3D0299541B402E2B40AA95EA /* Pods-EmojiClipboard.modulemap */, 103 | 3DB07DA7FE21D5A3976BEA8DE3681BB8 /* Pods-EmojiClipboard-acknowledgements.markdown */, 104 | BA0A8158B264F52497361C122B625C41 /* Pods-EmojiClipboard-acknowledgements.plist */, 105 | 0C6A49389408CE17439F9C5856DDBE02 /* Pods-EmojiClipboard-dummy.m */, 106 | 59EAF77044B1FE9EACF37B60ED25185D /* Pods-EmojiClipboard-umbrella.h */, 107 | 4618251F8CD16ED6CF94478B4CA849B8 /* Pods-EmojiClipboard.debug.xcconfig */, 108 | CB6AA0D0929C5D72E379DD80DF3DD336 /* Pods-EmojiClipboard.release.xcconfig */, 109 | ); 110 | name = "Pods-EmojiClipboard"; 111 | path = "Target Support Files/Pods-EmojiClipboard"; 112 | sourceTree = ""; 113 | }; 114 | 74923983359A5D29AD350C56F07A9E73 /* Pods */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 51833D1E284CF5928EDFF6EE63F24811 /* Smile */, 118 | ); 119 | name = Pods; 120 | sourceTree = ""; 121 | }; 122 | BA53665D72A29E6544C9267D1475998A /* Targets Support Files */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 671C06A127E9BC357CEED17232CE18A5 /* Pods-EmojiClipboard */, 126 | ); 127 | name = "Targets Support Files"; 128 | sourceTree = ""; 129 | }; 130 | CF1408CF629C7361332E53B88F7BD30C = { 131 | isa = PBXGroup; 132 | children = ( 133 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 134 | D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, 135 | 74923983359A5D29AD350C56F07A9E73 /* Pods */, 136 | F487E93E7C8306DAC7512EBB3D0C26FD /* Products */, 137 | BA53665D72A29E6544C9267D1475998A /* Targets Support Files */, 138 | ); 139 | sourceTree = ""; 140 | }; 141 | D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | ); 145 | name = Frameworks; 146 | sourceTree = ""; 147 | }; 148 | F487E93E7C8306DAC7512EBB3D0C26FD /* Products */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 02B917CBEF381B06F458F952815DC595 /* libPods-EmojiClipboard.a */, 152 | 3DA450E2965DC42C1B1EED8CE79A8CEC /* libSmile.a */, 153 | ); 154 | name = Products; 155 | sourceTree = ""; 156 | }; 157 | /* End PBXGroup section */ 158 | 159 | /* Begin PBXHeadersBuildPhase section */ 160 | 51D50CCF865E0FBC4FBAE83B6C8876AC /* Headers */ = { 161 | isa = PBXHeadersBuildPhase; 162 | buildActionMask = 2147483647; 163 | files = ( 164 | 6B8BE5CE37359F0362BED1788BD06FE6 /* Smile-umbrella.h in Headers */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | EA3D6F9D04E7F147EFBBAB22B7C273AD /* Headers */ = { 169 | isa = PBXHeadersBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | A06FBA7BA9E0043D9175EDF9686D3183 /* Pods-EmojiClipboard-umbrella.h in Headers */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXHeadersBuildPhase section */ 177 | 178 | /* Begin PBXNativeTarget section */ 179 | 0A72E7E7F56EA48622FE4B2865345F3E /* Smile */ = { 180 | isa = PBXNativeTarget; 181 | buildConfigurationList = D3C4B4D5D42E910C9C55C06346DE1B32 /* Build configuration list for PBXNativeTarget "Smile" */; 182 | buildPhases = ( 183 | 51D50CCF865E0FBC4FBAE83B6C8876AC /* Headers */, 184 | 66A86341A0CBBE2B11C78CD56F91B98F /* Sources */, 185 | CC228661C8B3723C6D837579E1BF2D8B /* Frameworks */, 186 | FF50717B9AEF4ACFB3D7210AE2E7CBD9 /* Copy generated compatibility header */, 187 | ); 188 | buildRules = ( 189 | ); 190 | dependencies = ( 191 | ); 192 | name = Smile; 193 | productName = Smile; 194 | productReference = 3DA450E2965DC42C1B1EED8CE79A8CEC /* libSmile.a */; 195 | productType = "com.apple.product-type.library.static"; 196 | }; 197 | AF27AB4AC71D6A5C7ADC09E689392FD4 /* Pods-EmojiClipboard */ = { 198 | isa = PBXNativeTarget; 199 | buildConfigurationList = E093A5A2C2FCF466CBE23C191D314572 /* Build configuration list for PBXNativeTarget "Pods-EmojiClipboard" */; 200 | buildPhases = ( 201 | EA3D6F9D04E7F147EFBBAB22B7C273AD /* Headers */, 202 | 3A95E0E8E7F12C5DC51F93402FDD40B6 /* Sources */, 203 | A85739204AA2C8C3C72F72D9B7C541AD /* Frameworks */, 204 | ); 205 | buildRules = ( 206 | ); 207 | dependencies = ( 208 | 37761E9912809A257AA79151EAD2ED5A /* PBXTargetDependency */, 209 | ); 210 | name = "Pods-EmojiClipboard"; 211 | productName = "Pods-EmojiClipboard"; 212 | productReference = 02B917CBEF381B06F458F952815DC595 /* libPods-EmojiClipboard.a */; 213 | productType = "com.apple.product-type.library.static"; 214 | }; 215 | /* End PBXNativeTarget section */ 216 | 217 | /* Begin PBXProject section */ 218 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 219 | isa = PBXProject; 220 | attributes = { 221 | LastSwiftUpdateCheck = 0930; 222 | LastUpgradeCheck = 0930; 223 | }; 224 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = English; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | en, 230 | ); 231 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 232 | productRefGroup = F487E93E7C8306DAC7512EBB3D0C26FD /* Products */; 233 | projectDirPath = ""; 234 | projectRoot = ""; 235 | targets = ( 236 | AF27AB4AC71D6A5C7ADC09E689392FD4 /* Pods-EmojiClipboard */, 237 | 0A72E7E7F56EA48622FE4B2865345F3E /* Smile */, 238 | ); 239 | }; 240 | /* End PBXProject section */ 241 | 242 | /* Begin PBXShellScriptBuildPhase section */ 243 | FF50717B9AEF4ACFB3D7210AE2E7CBD9 /* Copy generated compatibility header */ = { 244 | isa = PBXShellScriptBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | ); 248 | inputFileListPaths = ( 249 | ); 250 | inputPaths = ( 251 | "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h", 252 | "${PODS_ROOT}/Headers/Public/Smile/Smile.modulemap", 253 | "${PODS_ROOT}/Headers/Public/Smile/Smile-umbrella.h", 254 | ); 255 | name = "Copy generated compatibility header"; 256 | outputFileListPaths = ( 257 | ); 258 | outputPaths = ( 259 | "${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap", 260 | "${BUILT_PRODUCTS_DIR}/Smile-umbrella.h", 261 | "${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h", 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | shellPath = /bin/sh; 265 | shellScript = "COMPATIBILITY_HEADER_PATH=\"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h\"\nMODULE_MAP_PATH=\"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap\"\n\nditto \"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h\" \"${COMPATIBILITY_HEADER_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/Smile/Smile.modulemap\" \"${MODULE_MAP_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/Smile/Smile-umbrella.h\" \"${BUILT_PRODUCTS_DIR}\"\nprintf \"\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\\"${COMPATIBILITY_HEADER_PATH}\\\"\\n requires objc\\n}\\n\" >> \"${MODULE_MAP_PATH}\"\n"; 266 | }; 267 | /* End PBXShellScriptBuildPhase section */ 268 | 269 | /* Begin PBXSourcesBuildPhase section */ 270 | 3A95E0E8E7F12C5DC51F93402FDD40B6 /* Sources */ = { 271 | isa = PBXSourcesBuildPhase; 272 | buildActionMask = 2147483647; 273 | files = ( 274 | 0C0B76B28AFE6CACF1BD82B0A554B185 /* Pods-EmojiClipboard-dummy.m in Sources */, 275 | ); 276 | runOnlyForDeploymentPostprocessing = 0; 277 | }; 278 | 66A86341A0CBBE2B11C78CD56F91B98F /* Sources */ = { 279 | isa = PBXSourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | 3771A0B10D3D1D86F4FB0D6D4369E848 /* Categories.swift in Sources */, 283 | C612319DC72C8360455D1AEFF9B0A6D3 /* Emoji.swift in Sources */, 284 | 48C4AF48F713D1E86D55A7F67C5D971D /* Sequence.swift in Sources */, 285 | 19EFFE9F60DAF15CA701BE02F52836AA /* Smile-dummy.m in Sources */, 286 | 3118735E0A2E0F18CBAF0AA7869AFD93 /* Smile.swift in Sources */, 287 | 20837A7D0F6C23509FE559A8EC6D55A5 /* Utils.swift in Sources */, 288 | ); 289 | runOnlyForDeploymentPostprocessing = 0; 290 | }; 291 | /* End PBXSourcesBuildPhase section */ 292 | 293 | /* Begin PBXTargetDependency section */ 294 | 37761E9912809A257AA79151EAD2ED5A /* PBXTargetDependency */ = { 295 | isa = PBXTargetDependency; 296 | name = Smile; 297 | target = 0A72E7E7F56EA48622FE4B2865345F3E /* Smile */; 298 | targetProxy = 581D5CE1A1514D256662B315286F4BBF /* PBXContainerItemProxy */; 299 | }; 300 | /* End PBXTargetDependency section */ 301 | 302 | /* Begin XCBuildConfiguration section */ 303 | 028F2984CE49ED775A3115DB1C0B4B27 /* Debug */ = { 304 | isa = XCBuildConfiguration; 305 | baseConfigurationReference = C5C415AC8D6C8573F8C8F2A6332F7862 /* Smile.xcconfig */; 306 | buildSettings = { 307 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 308 | CODE_SIGN_IDENTITY = "-"; 309 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 311 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 312 | EXECUTABLE_PREFIX = lib; 313 | GCC_PREFIX_HEADER = "Target Support Files/Smile/Smile-prefix.pch"; 314 | MACOSX_DEPLOYMENT_TARGET = 10.9; 315 | MODULEMAP_FILE = Headers/Public/Smile/Smile.modulemap; 316 | OTHER_LDFLAGS = ""; 317 | OTHER_LIBTOOLFLAGS = ""; 318 | PRIVATE_HEADERS_FOLDER_PATH = ""; 319 | PRODUCT_MODULE_NAME = Smile; 320 | PRODUCT_NAME = Smile; 321 | PUBLIC_HEADERS_FOLDER_PATH = ""; 322 | SDKROOT = macosx; 323 | SKIP_INSTALL = YES; 324 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 325 | SWIFT_VERSION = 3.0; 326 | }; 327 | name = Debug; 328 | }; 329 | 411E2369C239DEE8E4B6EDB7551D9064 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | baseConfigurationReference = 4618251F8CD16ED6CF94478B4CA849B8 /* Pods-EmojiClipboard.debug.xcconfig */; 332 | buildSettings = { 333 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 334 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 335 | CLANG_ENABLE_OBJC_WEAK = NO; 336 | CODE_SIGN_IDENTITY = "-"; 337 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 339 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 340 | EXECUTABLE_PREFIX = lib; 341 | MACH_O_TYPE = staticlib; 342 | MACOSX_DEPLOYMENT_TARGET = 10.13; 343 | MODULEMAP_FILE = "Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.modulemap"; 344 | OTHER_LDFLAGS = ""; 345 | OTHER_LIBTOOLFLAGS = ""; 346 | PODS_ROOT = "$(SRCROOT)"; 347 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 348 | SDKROOT = macosx; 349 | SKIP_INSTALL = YES; 350 | }; 351 | name = Debug; 352 | }; 353 | 84AD58C0BDDA52C171FD48086BBB2D25 /* Release */ = { 354 | isa = XCBuildConfiguration; 355 | baseConfigurationReference = CB6AA0D0929C5D72E379DD80DF3DD336 /* Pods-EmojiClipboard.release.xcconfig */; 356 | buildSettings = { 357 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 358 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 359 | CLANG_ENABLE_OBJC_WEAK = NO; 360 | CODE_SIGN_IDENTITY = "-"; 361 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 362 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 363 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 364 | EXECUTABLE_PREFIX = lib; 365 | MACH_O_TYPE = staticlib; 366 | MACOSX_DEPLOYMENT_TARGET = 10.13; 367 | MODULEMAP_FILE = "Target Support Files/Pods-EmojiClipboard/Pods-EmojiClipboard.modulemap"; 368 | OTHER_LDFLAGS = ""; 369 | OTHER_LIBTOOLFLAGS = ""; 370 | PODS_ROOT = "$(SRCROOT)"; 371 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 372 | SDKROOT = macosx; 373 | SKIP_INSTALL = YES; 374 | }; 375 | name = Release; 376 | }; 377 | B02064D7E8BCDAC9B6D67691989B865B /* Release */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | CLANG_ANALYZER_NONNULL = YES; 382 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 383 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 384 | CLANG_CXX_LIBRARY = "libc++"; 385 | CLANG_ENABLE_MODULES = YES; 386 | CLANG_ENABLE_OBJC_ARC = YES; 387 | CLANG_ENABLE_OBJC_WEAK = YES; 388 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 389 | CLANG_WARN_BOOL_CONVERSION = YES; 390 | CLANG_WARN_COMMA = YES; 391 | CLANG_WARN_CONSTANT_CONVERSION = YES; 392 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 393 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 394 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 395 | CLANG_WARN_EMPTY_BODY = YES; 396 | CLANG_WARN_ENUM_CONVERSION = YES; 397 | CLANG_WARN_INFINITE_RECURSION = YES; 398 | CLANG_WARN_INT_CONVERSION = YES; 399 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 400 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 401 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 403 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 404 | CLANG_WARN_STRICT_PROTOTYPES = YES; 405 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 406 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 407 | CLANG_WARN_UNREACHABLE_CODE = YES; 408 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 409 | COPY_PHASE_STRIP = NO; 410 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 411 | ENABLE_NS_ASSERTIONS = NO; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | GCC_C_LANGUAGE_STANDARD = gnu11; 414 | GCC_NO_COMMON_BLOCKS = YES; 415 | GCC_PREPROCESSOR_DEFINITIONS = ( 416 | "POD_CONFIGURATION_RELEASE=1", 417 | "$(inherited)", 418 | ); 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | MACOSX_DEPLOYMENT_TARGET = 10.13; 426 | MTL_ENABLE_DEBUG_INFO = NO; 427 | MTL_FAST_MATH = YES; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | STRIP_INSTALLED_PRODUCT = NO; 430 | SWIFT_COMPILATION_MODE = wholemodule; 431 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 432 | SWIFT_VERSION = 4.2; 433 | SYMROOT = "${SRCROOT}/../build"; 434 | }; 435 | name = Release; 436 | }; 437 | E8A3F4551FABCE3AA6C332D0A25E460E /* Release */ = { 438 | isa = XCBuildConfiguration; 439 | baseConfigurationReference = C5C415AC8D6C8573F8C8F2A6332F7862 /* Smile.xcconfig */; 440 | buildSettings = { 441 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 442 | CODE_SIGN_IDENTITY = "-"; 443 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 444 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 445 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 446 | EXECUTABLE_PREFIX = lib; 447 | GCC_PREFIX_HEADER = "Target Support Files/Smile/Smile-prefix.pch"; 448 | MACOSX_DEPLOYMENT_TARGET = 10.9; 449 | MODULEMAP_FILE = Headers/Public/Smile/Smile.modulemap; 450 | OTHER_LDFLAGS = ""; 451 | OTHER_LIBTOOLFLAGS = ""; 452 | PRIVATE_HEADERS_FOLDER_PATH = ""; 453 | PRODUCT_MODULE_NAME = Smile; 454 | PRODUCT_NAME = Smile; 455 | PUBLIC_HEADERS_FOLDER_PATH = ""; 456 | SDKROOT = macosx; 457 | SKIP_INSTALL = YES; 458 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 459 | SWIFT_VERSION = 3.0; 460 | }; 461 | name = Release; 462 | }; 463 | FC05650207F51715AE5AE6EDB1FAE9C3 /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | buildSettings = { 466 | ALWAYS_SEARCH_USER_PATHS = NO; 467 | CLANG_ANALYZER_NONNULL = YES; 468 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 469 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 470 | CLANG_CXX_LIBRARY = "libc++"; 471 | CLANG_ENABLE_MODULES = YES; 472 | CLANG_ENABLE_OBJC_ARC = YES; 473 | CLANG_ENABLE_OBJC_WEAK = YES; 474 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 475 | CLANG_WARN_BOOL_CONVERSION = YES; 476 | CLANG_WARN_COMMA = YES; 477 | CLANG_WARN_CONSTANT_CONVERSION = YES; 478 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 479 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 480 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 481 | CLANG_WARN_EMPTY_BODY = YES; 482 | CLANG_WARN_ENUM_CONVERSION = YES; 483 | CLANG_WARN_INFINITE_RECURSION = YES; 484 | CLANG_WARN_INT_CONVERSION = YES; 485 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 486 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 487 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 488 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 489 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 490 | CLANG_WARN_STRICT_PROTOTYPES = YES; 491 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 492 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 493 | CLANG_WARN_UNREACHABLE_CODE = YES; 494 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 495 | COPY_PHASE_STRIP = NO; 496 | DEBUG_INFORMATION_FORMAT = dwarf; 497 | ENABLE_STRICT_OBJC_MSGSEND = YES; 498 | ENABLE_TESTABILITY = YES; 499 | GCC_C_LANGUAGE_STANDARD = gnu11; 500 | GCC_DYNAMIC_NO_PIC = NO; 501 | GCC_NO_COMMON_BLOCKS = YES; 502 | GCC_OPTIMIZATION_LEVEL = 0; 503 | GCC_PREPROCESSOR_DEFINITIONS = ( 504 | "POD_CONFIGURATION_DEBUG=1", 505 | "DEBUG=1", 506 | "$(inherited)", 507 | ); 508 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 509 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 510 | GCC_WARN_UNDECLARED_SELECTOR = YES; 511 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 512 | GCC_WARN_UNUSED_FUNCTION = YES; 513 | GCC_WARN_UNUSED_VARIABLE = YES; 514 | MACOSX_DEPLOYMENT_TARGET = 10.13; 515 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 516 | MTL_FAST_MATH = YES; 517 | ONLY_ACTIVE_ARCH = YES; 518 | PRODUCT_NAME = "$(TARGET_NAME)"; 519 | STRIP_INSTALLED_PRODUCT = NO; 520 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 521 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 522 | SWIFT_VERSION = 4.2; 523 | SYMROOT = "${SRCROOT}/../build"; 524 | }; 525 | name = Debug; 526 | }; 527 | /* End XCBuildConfiguration section */ 528 | 529 | /* Begin XCConfigurationList section */ 530 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 531 | isa = XCConfigurationList; 532 | buildConfigurations = ( 533 | FC05650207F51715AE5AE6EDB1FAE9C3 /* Debug */, 534 | B02064D7E8BCDAC9B6D67691989B865B /* Release */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | D3C4B4D5D42E910C9C55C06346DE1B32 /* Build configuration list for PBXNativeTarget "Smile" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 028F2984CE49ED775A3115DB1C0B4B27 /* Debug */, 543 | E8A3F4551FABCE3AA6C332D0A25E460E /* Release */, 544 | ); 545 | defaultConfigurationIsVisible = 0; 546 | defaultConfigurationName = Release; 547 | }; 548 | E093A5A2C2FCF466CBE23C191D314572 /* Build configuration list for PBXNativeTarget "Pods-EmojiClipboard" */ = { 549 | isa = XCConfigurationList; 550 | buildConfigurations = ( 551 | 411E2369C239DEE8E4B6EDB7551D9064 /* Debug */, 552 | 84AD58C0BDDA52C171FD48086BBB2D25 /* Release */, 553 | ); 554 | defaultConfigurationIsVisible = 0; 555 | defaultConfigurationName = Release; 556 | }; 557 | /* End XCConfigurationList section */ 558 | }; 559 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 560 | } 561 | -------------------------------------------------------------------------------- /TouchEmoji/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 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 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | --------------------------------------------------------------------------------