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