Add AppKit bundle, fix light appearance

This commit is contained in:
Shadowfacts 2022-01-16 12:32:45 -05:00
parent 75be4141dd
commit b8a415b6fd
7 changed files with 258 additions and 21 deletions

View File

@ -18,6 +18,8 @@
D68408E827947D0800E327D2 /* PrefsSceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68408E727947D0800E327D2 /* PrefsSceneDelegate.swift */; };
D68408ED2794803D00E327D2 /* PrefsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68408EC2794803D00E327D2 /* PrefsView.swift */; };
D68408EF2794808E00E327D2 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68408EE2794808E00E327D2 /* Preferences.swift */; };
D68409132794870000E327D2 /* ReaderMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68409122794870000E327D2 /* ReaderMac.swift */; };
D6840914279487DC00E327D2 /* ReaderMac.bundle in Embed PlugIns */ = {isa = PBXBuildFile; fileRef = D684090D279486BF00E327D2 /* ReaderMac.bundle */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D68B303627907D9200E8B3FA /* ExcerptGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68B303527907D9200E8B3FA /* ExcerptGenerator.swift */; };
D68B303D2792204B00E8B3FA /* read.js in Resources */ = {isa = PBXBuildFile; fileRef = D68B303C2792204B00E8B3FA /* read.js */; };
D68B30402792729A00E8B3FA /* AppSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D68B303F2792729A00E8B3FA /* AppSplitViewController.swift */; };
@ -58,6 +60,13 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
D6840915279487DC00E327D2 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D6C687E0272CD27600874C10 /* Project object */;
proxyType = 1;
remoteGlobalIDString = D684090C279486BF00E327D2;
remoteInfo = ReaderMac;
};
D6C68802272CD27700874C10 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D6C687E0272CD27600874C10 /* Project object */;
@ -82,6 +91,17 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
D6840917279487DD00E327D2 /* Embed PlugIns */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
D6840914279487DC00E327D2 /* ReaderMac.bundle in Embed PlugIns */,
);
name = "Embed PlugIns";
runOnlyForDeploymentPostprocessing = 0;
};
D6C6882E272CD2BA00874C10 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@ -107,6 +127,8 @@
D68408E727947D0800E327D2 /* PrefsSceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsSceneDelegate.swift; sourceTree = "<group>"; };
D68408EC2794803D00E327D2 /* PrefsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsView.swift; sourceTree = "<group>"; };
D68408EE2794808E00E327D2 /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = "<group>"; };
D684090D279486BF00E327D2 /* ReaderMac.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReaderMac.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
D68409122794870000E327D2 /* ReaderMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderMac.swift; sourceTree = "<group>"; };
D68B3032278FDD1A00E8B3FA /* Reader-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Reader-Bridging-Header.h"; sourceTree = "<group>"; };
D68B303527907D9200E8B3FA /* ExcerptGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExcerptGenerator.swift; sourceTree = "<group>"; };
D68B3037279099FD00E8B3FA /* liblolhtml.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = liblolhtml.a; path = "lol-html/c-api/target/aarch64-apple-ios-sim/release/liblolhtml.a"; sourceTree = "<group>"; };
@ -152,6 +174,13 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
D684090A279486BF00E327D2 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
D6C687E5272CD27600874C10 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@ -224,6 +253,14 @@
path = Preferences;
sourceTree = "<group>";
};
D6840911279486C400E327D2 /* ReaderMac */ = {
isa = PBXGroup;
children = (
D68409122794870000E327D2 /* ReaderMac.swift */,
);
path = ReaderMac;
sourceTree = "<group>";
};
D68B302E278FDCE200E8B3FA /* Frameworks */ = {
isa = PBXGroup;
children = (
@ -253,6 +290,7 @@
D6C687EA272CD27600874C10 /* Reader */,
D6C68804272CD27700874C10 /* ReaderTests */,
D6C6880E272CD27700874C10 /* ReaderUITests */,
D6840911279486C400E327D2 /* ReaderMac */,
D6C68824272CD2BA00874C10 /* Fervor */,
D6C687E9272CD27600874C10 /* Products */,
D68B302E278FDCE200E8B3FA /* Frameworks */,
@ -266,6 +304,7 @@
D6C68801272CD27700874C10 /* ReaderTests.xctest */,
D6C6880B272CD27700874C10 /* ReaderUITests.xctest */,
D6C68823272CD2BA00874C10 /* Fervor.framework */,
D684090D279486BF00E327D2 /* ReaderMac.bundle */,
);
name = Products;
sourceTree = "<group>";
@ -362,6 +401,23 @@
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
D684090C279486BF00E327D2 /* ReaderMac */ = {
isa = PBXNativeTarget;
buildConfigurationList = D6840910279486BF00E327D2 /* Build configuration list for PBXNativeTarget "ReaderMac" */;
buildPhases = (
D6840909279486BF00E327D2 /* Sources */,
D684090A279486BF00E327D2 /* Frameworks */,
D684090B279486BF00E327D2 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = ReaderMac;
productName = ReaderMac;
productReference = D684090D279486BF00E327D2 /* ReaderMac.bundle */;
productType = "com.apple.product-type.bundle";
};
D6C687E7272CD27600874C10 /* Reader */ = {
isa = PBXNativeTarget;
buildConfigurationList = D6C68815272CD27700874C10 /* Build configuration list for PBXNativeTarget "Reader" */;
@ -371,11 +427,13 @@
D6C687E5272CD27600874C10 /* Frameworks */,
D6C687E6272CD27600874C10 /* Resources */,
D6C6882E272CD2BA00874C10 /* Embed Frameworks */,
D6840917279487DD00E327D2 /* Embed PlugIns */,
);
buildRules = (
);
dependencies = (
D6C68828272CD2BA00874C10 /* PBXTargetDependency */,
D6840916279487DC00E327D2 /* PBXTargetDependency */,
);
name = Reader;
packageProductDependencies = (
@ -449,6 +507,10 @@
LastSwiftUpdateCheck = 1320;
LastUpgradeCheck = 1320;
TargetAttributes = {
D684090C279486BF00E327D2 = {
CreatedOnToolsVersion = 13.2;
LastSwiftMigration = 1320;
};
D6C687E7272CD27600874C10 = {
CreatedOnToolsVersion = 13.2;
};
@ -486,11 +548,19 @@
D6C68800272CD27700874C10 /* ReaderTests */,
D6C6880A272CD27700874C10 /* ReaderUITests */,
D6C68822272CD2BA00874C10 /* Fervor */,
D684090C279486BF00E327D2 /* ReaderMac */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
D684090B279486BF00E327D2 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
D6C687E6272CD27600874C10 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -548,6 +618,14 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
D6840909279486BF00E327D2 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D68409132794870000E327D2 /* ReaderMac.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D6C687E4272CD27600874C10 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -619,6 +697,11 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
D6840916279487DC00E327D2 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D684090C279486BF00E327D2 /* ReaderMac */;
targetProxy = D6840915279487DC00E327D2 /* PBXContainerItemProxy */;
};
D6C68803272CD27700874C10 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D6C687E7272CD27600874C10 /* Reader */;
@ -648,6 +731,65 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
D684090E279486BF00E327D2 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = ZPBBSK8L8B;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSPrincipalClass = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = net.shadowfacts.Reader.ReaderMac;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
D684090F279486BF00E327D2 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = ZPBBSK8L8B;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSPrincipalClass = "";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = net.shadowfacts.Reader.ReaderMac;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
D6C68813272CD27700874C10 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -996,6 +1138,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
D6840910279486BF00E327D2 /* Build configuration list for PBXNativeTarget "ReaderMac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D684090E279486BF00E327D2 /* Debug */,
D684090F279486BF00E327D2 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
D6C687E3272CD27600874C10 /* Build configuration list for PBXProject "Reader" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -14,6 +14,10 @@ import Combine
class AppDelegate: UIResponder, UIApplicationDelegate {
private var cancellables = Set<AnyCancellable>()
#if targetEnvironment(macCatalyst)
private var readerMac: NSObject!
#endif
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
swizzleWKWebView()
@ -25,6 +29,23 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
.store(in: &cancellables)
#if targetEnvironment(macCatalyst)
let macBundleURL = Bundle.main.builtInPlugInsURL!.appendingPathComponent("ReaderMac.bundle")
let bundle = Bundle(url: macBundleURL)!
do {
try bundle.loadAndReturnError()
let clazz = NSClassFromString("ReaderMac.ReaderMac")! as! NSObject.Type
readerMac = clazz.init()
readerMac.perform(Selector(("setup")))
} catch {
print("Unable to load ReaderMac bundle: \(error)")
}
#endif
NotificationCenter.default.addObserver(self, selector: #selector(updateAppearance), name: .appearanceChanged, object: nil)
updateAppearance()
return true
}
@ -112,7 +133,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}
@objc private func showPreferences() {
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: .preferences(), options: nil, errorHandler: nil)
let existing = UIApplication.shared.connectedScenes.first {
$0.session.configuration.name == "prefs"
}
UIApplication.shared.requestSceneSessionActivation(existing?.session, userActivity: .preferences(), options: nil, errorHandler: nil)
}
@objc private func updateAppearance() {
#if targetEnvironment(macCatalyst)
readerMac.perform(Selector(("updateAppearance:")), with: Preferences.shared.appearance.rawValue)
#endif
}
}

View File

@ -5,7 +5,7 @@
// Created by Shadowfacts on 1/16/22.
//
import UIKit
import Foundation
class Preferences: Codable, ObservableObject {
@ -36,7 +36,7 @@ class Preferences: Codable, ObservableObject {
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.appearance = try container.decode(UIUserInterfaceStyle.self, forKey: .appearance)
self.appearance = try container.decode(Appearance.self, forKey: .appearance)
}
func encode(to encoder: Encoder) throws {
@ -44,12 +44,11 @@ class Preferences: Codable, ObservableObject {
try container.encode(appearance, forKey: .appearance)
}
var appearance = UIUserInterfaceStyle.unspecified {
willSet {
objectWillChange.send()
}
@Published var appearance = Appearance.unspecified {
didSet {
NotificationCenter.default.post(name: .userInterfaceStyleChanged, object: nil)
NotificationCenter.default.post(name: .appearanceChanged, object: nil, userInfo: [
"appearance": appearance.rawValue
])
}
}
@ -59,9 +58,12 @@ class Preferences: Codable, ObservableObject {
}
extension UIUserInterfaceStyle: Codable {
enum Appearance: Int, Codable {
case unspecified = 0
case light = 1
case dark = 2
}
extension Notification.Name {
static let userInterfaceStyleChanged = Notification.Name("userInterfaceStyleChanged")
static let appearanceChanged = Notification.Name("appearanceChanged")
}

View File

@ -34,12 +34,19 @@ class PrefsSceneDelegate: UIResponder, UIWindowSceneDelegate {
window!.makeKeyAndVisible()
NotificationCenter.default.addObserver(self, selector: #selector(updateUserInterfaceStyle), name: .userInterfaceStyleChanged, object: nil)
updateUserInterfaceStyle()
NotificationCenter.default.addObserver(self, selector: #selector(updateAppearance), name: .appearanceChanged, object: nil)
updateAppearance()
}
@objc private func updateUserInterfaceStyle() {
window?.overrideUserInterfaceStyle = Preferences.shared.appearance
@objc private func updateAppearance() {
switch Preferences.shared.appearance {
case .unspecified:
window!.overrideUserInterfaceStyle = .unspecified
case .light:
window!.overrideUserInterfaceStyle = .light
case .dark:
window!.overrideUserInterfaceStyle = .dark
}
}
}

View File

@ -55,8 +55,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
window!.makeKeyAndVisible()
NotificationCenter.default.addObserver(self, selector: #selector(updateUserInterfaceStyle), name: .userInterfaceStyleChanged, object: nil)
updateUserInterfaceStyle()
NotificationCenter.default.addObserver(self, selector: #selector(updateAppearance), name: .appearanceChanged, object: nil)
updateAppearance()
}
func sceneDidDisconnect(_ scene: UIScene) {
@ -120,8 +120,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
}
}
@objc private func updateUserInterfaceStyle() {
window?.overrideUserInterfaceStyle = Preferences.shared.appearance
@objc private func updateAppearance() {
switch Preferences.shared.appearance {
case .unspecified:
window!.overrideUserInterfaceStyle = .unspecified
case .light:
window!.overrideUserInterfaceStyle = .light
case .dark:
window!.overrideUserInterfaceStyle = .dark
}
}
}

View File

@ -24,9 +24,9 @@ struct PrefsView: View {
private var appearance: some View {
Picker("Appearance", selection: $preferences.appearance) {
Text("System").tag(UIUserInterfaceStyle.unspecified)
Text("Dark").tag(UIUserInterfaceStyle.dark)
Text("Light").tag(UIUserInterfaceStyle.light)
Text("System").tag(Appearance.unspecified)
Text("Dark").tag(Appearance.dark)
Text("Light").tag(Appearance.light)
}
}
}

40
ReaderMac/ReaderMac.swift Normal file
View File

@ -0,0 +1,40 @@
//
// ReaderMac.swift
// ReaderMac
//
// Created by Shadowfacts on 1/16/22.
//
import AppKit
class ReaderMac: NSObject {
private(set) static var shared: ReaderMac!
override init() {
if ReaderMac.shared != nil {
fatalError()
}
super.init()
ReaderMac.shared = self
}
@objc func setup() {
}
@objc func updateAppearance(_ appearance: NSNumber) {
switch appearance {
case 0:
NSApp.appearance = nil
case 1:
NSApp.appearance = NSAppearance(named: .aqua)
case 2:
NSApp.appearance = NSAppearance(named: .darkAqua)
default:
fatalError("unexpected appeaerance value: \(appearance)")
}
}
}