From d9c8addbc11897de45f78f70f5ebf73d4b79b17c Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 6 Dec 2021 12:33:42 +1000 Subject: [PATCH] switch AnkiHelper to Swift More pleasant to work with than ObjectiveC, which will help with the following commit. Swift libraries weren't added to macOS until 10.14.4, so theme autodetection will fail on 10.14.0-10.14.3. The Qt6 build will have its minimum version bumped to 10.14.4; the Qt5 build will remain on 10.13.4. Bazel's rules_swift doesn't currently support building Swift dylibs, so we need to invoke swiftc directly via a genrule(). --- qt/mac/AnkiHelper.m | 34 ------------------ qt/mac/BUILD.bazel | 21 +++++------ qt/mac/README.md | 2 +- qt/mac/ankihelper.xcodeproj/project.pbxproj | 24 ++++++++++--- .../UserInterfaceState.xcuserstate | Bin 16238 -> 19893 bytes .../xcschemes/xcschememanagement.plist | 5 +++ .../xcschemes/xcschememanagement.plist | 2 +- qt/mac/helper_build.py | 29 +++++++++++++++ qt/mac/theme.swift | 18 ++++++++++ 9 files changed, 82 insertions(+), 53 deletions(-) delete mode 100644 qt/mac/AnkiHelper.m create mode 100644 qt/mac/ankihelper.xcodeproj/project.xcworkspace/xcuserdata/dae.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 qt/mac/helper_build.py create mode 100644 qt/mac/theme.swift diff --git a/qt/mac/AnkiHelper.m b/qt/mac/AnkiHelper.m deleted file mode 100644 index 2b461ee82..000000000 --- a/qt/mac/AnkiHelper.m +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright: Ankitects Pty Ltd and contributors -// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html - -@import Foundation; -@import AppKit; - -/// Force our app to be either light or dark mode. -void set_darkmode_enabled(BOOL enabled) { - NSAppearance *appearance; - if (enabled) { - appearance = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; - } else { - appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua]; - } - - [NSApplication sharedApplication].appearance = appearance; -} - -/// True if the system is set to dark mode. -BOOL system_is_dark(void) { - BOOL styleSet = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleInterfaceStyle"] != nil; - return styleSet; - // FIXME: confirm whether this is required on 10.15/16 (it - // does not appear to be on 11) - - // BOOL autoSwitch = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleInterfaceStyleSwitchesAutomatically"]; - // - // if (@available(macOS 10.15, *)) { - // return autoSwitch ? !styleSet : styleSet; - // } else { - // return styleSet; - // } - -} diff --git a/qt/mac/BUILD.bazel b/qt/mac/BUILD.bazel index ef9684fab..45948e07d 100644 --- a/qt/mac/BUILD.bazel +++ b/qt/mac/BUILD.bazel @@ -1,20 +1,15 @@ -load("@rules_cc//cc:defs.bzl", "objc_library") - -objc_library( - name = "helper_static", - srcs = ["AnkiHelper.m"], - enable_modules = True, - sdk_frameworks = ["AppKit"], +py_binary( + name = "helper_build", + srcs = ["helper_build.py"], tags = ["manual"], - alwayslink = True, ) -apple_binary( +genrule( name = "helper_dylib", - binary_type = "dylib", - minimum_os_version = "10.14", - platform_type = "macos", + srcs = glob(["*.swift"]), + outs = ["libankihelper.dylib"], + cmd = "$(location :helper_build) $@ $(COMPILATION_MODE) $(SRCS)", tags = ["manual"], + tools = [":helper_build"], visibility = ["//qt:__subpackages__"], - deps = ["helper_static"], ) diff --git a/qt/mac/README.md b/qt/mac/README.md index eda236ff6..b1c8d6240 100644 --- a/qt/mac/README.md +++ b/qt/mac/README.md @@ -1 +1 @@ -Tiny helper library to set dark mode on and off on Macs. +Helper library for macOS-specific functionality. diff --git a/qt/mac/ankihelper.xcodeproj/project.pbxproj b/qt/mac/ankihelper.xcodeproj/project.pbxproj index d03fb4567..637f03e40 100644 --- a/qt/mac/ankihelper.xcodeproj/project.pbxproj +++ b/qt/mac/ankihelper.xcodeproj/project.pbxproj @@ -7,11 +7,11 @@ objects = { /* Begin PBXBuildFile section */ - 1327600A274613D9001D63D7 /* AnkiHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 13276009274613D8001D63D7 /* AnkiHelper.m */; }; + 137892AC275D90FC009D0B6E /* theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137892AB275D90FC009D0B6E /* theme.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 13276009274613D8001D63D7 /* AnkiHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnkiHelper.m; sourceTree = ""; }; + 137892AB275D90FC009D0B6E /* theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = theme.swift; sourceTree = ""; }; 138B770F2746137F003A3E4F /* libankihelper.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libankihelper.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -29,7 +29,7 @@ 138B77062746137F003A3E4F = { isa = PBXGroup; children = ( - 13276009274613D8001D63D7 /* AnkiHelper.m */, + 137892AB275D90FC009D0B6E /* theme.swift */, 138B77102746137F003A3E4F /* Products */, ); sourceTree = ""; @@ -83,6 +83,7 @@ TargetAttributes = { 138B770E2746137F003A3E4F = { CreatedOnToolsVersion = 13.1; + LastSwiftMigration = 1310; }; }; }; @@ -109,7 +110,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1327600A274613D9001D63D7 /* AnkiHelper.m in Sources */, + 137892AC275D90FC009D0B6E /* theme.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -230,26 +231,41 @@ 138B77192746137F003A3E4F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 7ZM8SLJM4P; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; EXECUTABLE_PREFIX = lib; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; 138B771A2746137F003A3E4F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 7ZM8SLJM4P; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; EXECUTABLE_PREFIX = lib; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/qt/mac/ankihelper.xcodeproj/project.xcworkspace/xcuserdata/dae.xcuserdatad/UserInterfaceState.xcuserstate b/qt/mac/ankihelper.xcodeproj/project.xcworkspace/xcuserdata/dae.xcuserdatad/UserInterfaceState.xcuserstate index 255052f657c793b78e3639d5588108e23711424a..ca596a1eb3edee7b74b87a9d4d8ec1948630333c 100644 GIT binary patch delta 11253 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 + + + + diff --git a/qt/mac/ankihelper.xcodeproj/xcuserdata/dae.xcuserdatad/xcschemes/xcschememanagement.plist b/qt/mac/ankihelper.xcodeproj/xcuserdata/dae.xcuserdatad/xcschemes/xcschememanagement.plist index 7b914bfe3..888e2b255 100644 --- a/qt/mac/ankihelper.xcodeproj/xcuserdata/dae.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/qt/mac/ankihelper.xcodeproj/xcuserdata/dae.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,7 +4,7 @@ SchemeUserState - ankihelper.xcscheme_^#shared#^_ + ankihelper.xcscheme orderHint 0 diff --git a/qt/mac/helper_build.py b/qt/mac/helper_build.py new file mode 100644 index 000000000..86a369d78 --- /dev/null +++ b/qt/mac/helper_build.py @@ -0,0 +1,29 @@ +# Copyright: Ankitects Pty Ltd and contributors +# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +import subprocess +import sys +import platform +from pathlib import Path + +out_dylib, compile_mode, *src_files = sys.argv[1:] +out_dir = Path(out_dylib).parent.resolve() +src_dir = Path(src_files[0]).parent.resolve() + +if platform.machine() == "arm64": + target = "arm64-apple-macos11" +else: + target = "x86_64-apple-macos10.14" + +args = [ + "swiftc", + "-target", + target, + "-emit-library", + "-module-name", + "ankihelper", +] +if compile_mode == "opt": + args.append("-O") +args.extend(src_dir / Path(file).name for file in src_files) +subprocess.run(args, check=True, cwd=out_dir) diff --git a/qt/mac/theme.swift b/qt/mac/theme.swift new file mode 100644 index 000000000..dda9d6e35 --- /dev/null +++ b/qt/mac/theme.swift @@ -0,0 +1,18 @@ +// Copyright: Ankitects Pty Ltd and contributors +// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +import AppKit +import Foundation + +/// Force our app to be either light or dark mode. +@_cdecl("set_darkmode_enabled") +public func setDarkmodeEnabled(_ enabled: Bool) { + NSApplication.shared.appearance = NSAppearance(named: enabled ? .darkAqua : .aqua) +} + +/// True if the system is set to dark mode. +@_cdecl("system_is_dark") +public func systemIsDark() -> Bool { + let styleSet = UserDefaults.standard.object(forKey: "AppleInterfaceStyle") != nil + return styleSet +}