diff --git a/.gitignore b/.gitignore index afa2d06..b400ba3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ xcuserdata/ *.moved-aside *.xccheckout *.xcscmblueprint +.DS_Store diff --git a/SandS.xcodeproj/project.pbxproj b/SandS.xcodeproj/project.pbxproj index 635446f..67a883c 100644 --- a/SandS.xcodeproj/project.pbxproj +++ b/SandS.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -87,19 +87,19 @@ E48008F91E432A9500E85169 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1630; ORGANIZATIONNAME = "Takatoshi Matsumoto"; TargetAttributes = { E48009001E432A9500E85169 = { CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = E48008FC1E432A9500E85169 /* Build configuration list for PBXProject "SandS" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -155,28 +155,41 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 24H9SY32QF; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -204,28 +217,41 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 24H9SY32QF; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -237,7 +263,8 @@ MACOSX_DEPLOYMENT_TARGET = 10.12; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; @@ -245,13 +272,22 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 24H9SY32QF; INFOPLIST_FILE = SandS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = net.toqoz.SandS; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + PRODUCT_BUNDLE_IDENTIFIER = net.yasumelt.SandS; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -259,13 +295,22 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 24H9SY32QF; INFOPLIST_FILE = SandS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = net.toqoz.SandS; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + PRODUCT_BUNDLE_IDENTIFIER = net.yasumelt.SandS; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/SandS.xcodeproj/xcshareddata/xcschemes/SandS.xcscheme b/SandS.xcodeproj/xcshareddata/xcschemes/SandS.xcscheme new file mode 100644 index 0000000..60dcabc --- /dev/null +++ b/SandS.xcodeproj/xcshareddata/xcschemes/SandS.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SandS/AppDelegate.swift b/SandS/AppDelegate.swift index fa51285..7212e25 100644 --- a/SandS/AppDelegate.swift +++ b/SandS/AppDelegate.swift @@ -1,6 +1,6 @@ import Cocoa -var statusItem = NSStatusBar.system().statusItem(withLength: CGFloat(NSVariableStatusItemLength)) +var statusItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength)) func interceptCGEvent(proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, refcon: UnsafeMutableRawPointer?) -> Unmanaged? { if let r = refcon { @@ -20,8 +20,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { // MENU let menu = NSMenu() - statusItem.title = "S" - statusItem.highlightMode = true + if let button = statusItem.button { + button.image = createStatusBarIcon() + button.image?.isTemplate = true + } statusItem.menu = menu menu.addItem(withTitle: "Quit", action: #selector(AppDelegate.quit(_:)), keyEquivalent: "") @@ -43,7 +45,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { return false } - func checkAXIsProcessTrusted(_ timer: Timer) { + @objc func checkAXIsProcessTrusted(_ timer: Timer) { if AXIsProcessTrusted() { timer.invalidate() activate() @@ -67,12 +69,33 @@ class AppDelegate: NSObject, NSApplicationDelegate { let runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0) - CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, .commonModes) + CFRunLoopAddSource(CFRunLoopGetMain(), runLoopSource, .commonModes) CGEvent.tapEnable(tap: eventTap, enable: true) - CFRunLoopRun() } - func quit(_ sender: Any) { - NSApplication.shared().terminate(self) + @objc func quit(_ sender: Any) { + NSApplication.shared.terminate(self) + } + + private func createStatusBarIcon() -> NSImage { + let size = NSSize(width: 18, height: 18) + let image = NSImage(size: size) + image.lockFocus() + + let font = NSFont.boldSystemFont(ofSize: 14) + let attributes: [NSAttributedString.Key: Any] = [ + .font: font, + .foregroundColor: NSColor.black + ] + let str = "S" + let strSize = str.size(withAttributes: attributes) + let point = NSPoint( + x: (size.width - strSize.width) / 2, + y: (size.height - strSize.height) / 2 + ) + str.draw(at: point, withAttributes: attributes) + + image.unlockFocus() + return image } } diff --git a/SandS/Assets.xcassets/AppIcon.appiconset/1024_sands.png b/SandS/Assets.xcassets/AppIcon.appiconset/1024_sands.png new file mode 100644 index 0000000..a646dc2 Binary files /dev/null and b/SandS/Assets.xcassets/AppIcon.appiconset/1024_sands.png differ diff --git a/SandS/Assets.xcassets/AppIcon.appiconset/Contents.json b/SandS/Assets.xcassets/AppIcon.appiconset/Contents.json index 2db2b1c..3d9d6e2 100644 --- a/SandS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/SandS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,57 +2,58 @@ "images" : [ { "idiom" : "mac", - "size" : "16x16", - "scale" : "1x" + "scale" : "1x", + "size" : "16x16" }, { "idiom" : "mac", - "size" : "16x16", - "scale" : "2x" + "scale" : "2x", + "size" : "16x16" }, { "idiom" : "mac", - "size" : "32x32", - "scale" : "1x" + "scale" : "1x", + "size" : "32x32" }, { "idiom" : "mac", - "size" : "32x32", - "scale" : "2x" + "scale" : "2x", + "size" : "32x32" }, { "idiom" : "mac", - "size" : "128x128", - "scale" : "1x" + "scale" : "1x", + "size" : "128x128" }, { "idiom" : "mac", - "size" : "128x128", - "scale" : "2x" + "scale" : "2x", + "size" : "128x128" }, { "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" + "scale" : "1x", + "size" : "256x256" }, { "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" + "scale" : "2x", + "size" : "256x256" }, { "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" + "scale" : "1x", + "size" : "512x512" }, { + "filename" : "1024_sands.png", "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" + "scale" : "2x", + "size" : "512x512" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/SandS/Info.plist b/SandS/Info.plist index 01af646..9d7bee8 100644 --- a/SandS/Info.plist +++ b/SandS/Info.plist @@ -2,8 +2,6 @@ - LSUIElement - CFBundleDevelopmentRegion en CFBundleExecutable @@ -24,6 +22,8 @@ 2 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) + LSUIElement + NSHumanReadableCopyright Copyright © 2017 Takatoshi Matsumoto. All rights reserved. NSMainStoryboardFile