mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2025-02-01 22:41:28 +01:00
Clover.app v1.05 Beta
Added Serbian translation by crusher and Indonesian bu Badruzeus. Changing boot1 boot sectors installation to use boo1-intsall only. Rework on how the nvram get dumped for CloverEFI.
This commit is contained in:
parent
3c176ec6ba
commit
66f30d4dc0
@ -13,6 +13,8 @@
|
||||
953BC20323720C0A0039755D /* FixedWidthViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953BC20223720C0A0039755D /* FixedWidthViews.swift */; };
|
||||
9542ABC02373783400DC03E6 /* boot1-install in Copy tools */ = {isa = PBXBuildFile; fileRef = 9542ABBD2373780C00DC03E6 /* boot1-install */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
9542ABC22373786700DC03E6 /* CloverV2 in Copy CloverV2 */ = {isa = PBXBuildFile; fileRef = 9542ABC12373786700DC03E6 /* CloverV2 */; };
|
||||
9546AE1B23806299007155A6 /* CloverLogOut in Copy tools */ = {isa = PBXBuildFile; fileRef = 95524B88238051F4005F6425 /* CloverLogOut */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
954BBE99238196EE0032425F /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954BBE98238196EE0032425F /* Locale.swift */; };
|
||||
9552D748236F33CA00C93377 /* CloverDaemonNew in Copy tools */ = {isa = PBXBuildFile; fileRef = 9552D745236F33A700C93377 /* CloverDaemonNew */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
958861DA235F75FB00B64173 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958861D9235F75FB00B64173 /* Driver.swift */; };
|
||||
95ACABCA236B7463008F80A4 /* Unzip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95ACABC9236B7463008F80A4 /* Unzip.swift */; };
|
||||
@ -64,6 +66,20 @@
|
||||
remoteGlobalIDString = 12F2E5461A30F7E70058A333;
|
||||
remoteInfo = "boot1-install";
|
||||
};
|
||||
9546AE1823806286007155A6 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 95524B78238051AC005F6425;
|
||||
remoteInfo = CloverLogOut;
|
||||
};
|
||||
95524B87238051F4005F6425 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 95524B79238051AC005F6425;
|
||||
remoteInfo = CloverLogOut;
|
||||
};
|
||||
9552D744236F33A700C93377 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 9552D740236F33A700C93377 /* CloverDaemonNew.xcodeproj */;
|
||||
@ -101,6 +117,7 @@
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 6;
|
||||
files = (
|
||||
9546AE1B23806299007155A6 /* CloverLogOut in Copy tools */,
|
||||
9542ABC02373783400DC03E6 /* boot1-install in Copy tools */,
|
||||
95337172237070CD003F1AF4 /* Cloverhelper in Copy tools */,
|
||||
9552D748236F33CA00C93377 /* CloverDaemonNew in Copy tools */,
|
||||
@ -147,8 +164,13 @@
|
||||
/* Begin PBXFileReference section */
|
||||
9533718223709517003F1AF4 /* bootsectors-install */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "bootsectors-install"; sourceTree = SOURCE_ROOT; };
|
||||
953BC20223720C0A0039755D /* FixedWidthViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixedWidthViews.swift; sourceTree = "<group>"; };
|
||||
9540AED42379F43D001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
9540AED52379F43E001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Installer.strings; sourceTree = "<group>"; };
|
||||
9542ABB82373780C00DC03E6 /* boot1-inst.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "boot1-inst.xcodeproj"; path = "../CloverPackage/utils/boot1-install/boot1-inst.xcodeproj"; sourceTree = "<group>"; };
|
||||
9542ABC12373786700DC03E6 /* CloverV2 */ = {isa = PBXFileReference; lastKnownFileType = folder; name = CloverV2; path = ../CloverPackage/CloverV2; sourceTree = "<group>"; };
|
||||
954BBE98238196EE0032425F /* Locale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Locale.swift; sourceTree = "<group>"; };
|
||||
954C3DF0237DF0250059C698 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
||||
95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverLogOut.xcodeproj; path = CloverLogOut/CloverLogOut.xcodeproj; sourceTree = "<group>"; };
|
||||
9552D740236F33A700C93377 /* CloverDaemonNew.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverDaemonNew.xcodeproj; path = CloverDaemonNew/CloverDaemonNew.xcodeproj; sourceTree = "<group>"; };
|
||||
958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Cloverhelper.xcodeproj; path = cloverhelper/Cloverhelper.xcodeproj; sourceTree = "<group>"; };
|
||||
958861D9235F75FB00B64173 /* Driver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Driver.swift; sourceTree = "<group>"; };
|
||||
@ -247,6 +269,16 @@
|
||||
95E68AE4235B89D9002B37A5 /* Installer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Installer.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
954C3DEE237DF0130059C698 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
9533716B237070B3003F1AF4 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
@ -264,6 +296,22 @@
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
954C3DEF237DF0250059C698 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
954C3DF0237DF0250059C698 /* ServiceManagement.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
95524B84238051F3005F6425 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95524B88238051F4005F6425 /* CloverLogOut */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
9552D741236F33A700C93377 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -284,6 +332,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95E68AC8235B862F002B37A5 /* Clover */,
|
||||
95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */,
|
||||
9542ABB82373780C00DC03E6 /* boot1-inst.xcodeproj */,
|
||||
958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */,
|
||||
95C51577236B21AE00E4A3A8 /* CloverRunAtLogin.xcodeproj */,
|
||||
@ -291,6 +340,7 @@
|
||||
95C5C0A22365D2250049940D /* Lang.bundle */,
|
||||
9542ABC12373786700DC03E6 /* CloverV2 */,
|
||||
95E68AC7235B862F002B37A5 /* Products */,
|
||||
954C3DEF237DF0250059C698 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -312,6 +362,7 @@
|
||||
95E68ADE235B86A1002B37A5 /* bdmesg.swift */,
|
||||
95E68ADD235B86A1002B37A5 /* Disks.swift */,
|
||||
95E68ADB235B86A1002B37A5 /* Extensions.swift */,
|
||||
954BBE98238196EE0032425F /* Locale.swift */,
|
||||
95E68ADA235B86A0002B37A5 /* Release.swift */,
|
||||
95E68ADC235B86A1002B37A5 /* Shared.swift */,
|
||||
95C515212369BAF500E4A3A8 /* NVRAM.swift */,
|
||||
@ -352,10 +403,12 @@
|
||||
95850588236439D500BCB4A3 /* Copy tools */,
|
||||
95C5C0A12365D1FB0049940D /* Copy Languages */,
|
||||
95C51581236B224800E4A3A8 /* Copy CloverRunAtLogin */,
|
||||
954C3DEE237DF0130059C698 /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
9546AE1923806286007155A6 /* PBXTargetDependency */,
|
||||
95337171237070BB003F1AF4 /* PBXTargetDependency */,
|
||||
9552D747236F33B900C93377 /* PBXTargetDependency */,
|
||||
9542ABBF2373781300DC03E6 /* PBXTargetDependency */,
|
||||
@ -424,6 +477,7 @@
|
||||
"bg-BG",
|
||||
lv,
|
||||
lt,
|
||||
sr,
|
||||
);
|
||||
mainGroup = 95E68ABD235B862F002B37A5;
|
||||
productRefGroup = 95E68AC7235B862F002B37A5 /* Products */;
|
||||
@ -441,6 +495,10 @@
|
||||
ProductGroup = 9533716B237070B3003F1AF4 /* Products */;
|
||||
ProjectRef = 958505B4236594C000BCB4A3 /* Cloverhelper.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 95524B84238051F3005F6425 /* Products */;
|
||||
ProjectRef = 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 95C51578236B21AE00E4A3A8 /* Products */;
|
||||
ProjectRef = 95C51577236B21AE00E4A3A8 /* CloverRunAtLogin.xcodeproj */;
|
||||
@ -468,6 +526,13 @@
|
||||
remoteRef = 9542ABBC2373780C00DC03E6 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
95524B88238051F4005F6425 /* CloverLogOut */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = "compiled.mach-o.executable";
|
||||
path = CloverLogOut;
|
||||
remoteRef = 95524B87238051F4005F6425 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
9552D745236F33A700C93377 /* CloverDaemonNew */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = "compiled.mach-o.executable";
|
||||
@ -530,6 +595,7 @@
|
||||
95E68ACC235B862F002B37A5 /* ViewController.swift in Sources */,
|
||||
95E68AE2235B86A1002B37A5 /* Disks.swift in Sources */,
|
||||
95E68ADF235B86A1002B37A5 /* Release.swift in Sources */,
|
||||
954BBE99238196EE0032425F /* Locale.swift in Sources */,
|
||||
95E68ACA235B862F002B37A5 /* AppDelegate.swift in Sources */,
|
||||
958861DA235F75FB00B64173 /* Driver.swift in Sources */,
|
||||
95E68AE3235B86A1002B37A5 /* bdmesg.swift in Sources */,
|
||||
@ -555,6 +621,11 @@
|
||||
name = "boot1-install";
|
||||
targetProxy = 9542ABBE2373781300DC03E6 /* PBXContainerItemProxy */;
|
||||
};
|
||||
9546AE1923806286007155A6 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = CloverLogOut;
|
||||
targetProxy = 9546AE1823806286007155A6 /* PBXContainerItemProxy */;
|
||||
};
|
||||
9552D747236F33B900C93377 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
name = CloverDaemonNew;
|
||||
@ -608,6 +679,7 @@
|
||||
95C5151B2368D76800E4A3A8 /* bg-BG */,
|
||||
95C5151D2368D7AD00E4A3A8 /* lv */,
|
||||
95C5151F2368D7C300E4A3A8 /* lt */,
|
||||
9540AED42379F43D001AD0C8 /* sr */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@ -652,6 +724,7 @@
|
||||
95C5151C2368D76800E4A3A8 /* bg-BG */,
|
||||
95C5151E2368D7AD00E4A3A8 /* lv */,
|
||||
95C515202368D7C300E4A3A8 /* lt */,
|
||||
9540AED52379F43E001AD0C8 /* sr */,
|
||||
);
|
||||
name = Installer.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@ -782,7 +855,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Clover/Clover.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1.04;
|
||||
CURRENT_PROJECT_VERSION = 1.05;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Clover/Frameworks",
|
||||
@ -796,7 +869,7 @@
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Clover/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.04;
|
||||
MARKETING_VERSION = 1.05;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@ -811,7 +884,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Clover/Clover.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1.04;
|
||||
CURRENT_PROJECT_VERSION = 1.05;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Clover/Frameworks",
|
||||
@ -825,7 +898,7 @@
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Clover/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.04;
|
||||
MARKETING_VERSION = 1.05;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
@ -8,6 +8,8 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
// MARK: NSApplication shared delegate
|
||||
let AppSD = NSApplication.shared.delegate as! AppDelegate
|
||||
let localeBundle = Bundle(path: Bundle.main.sharedSupportPath! + "/Lang.bundle")
|
||||
|
||||
@NSApplicationMain
|
||||
|
@ -80,7 +80,6 @@ func getPartitionSchemeMap(from diskOrMtp: String) -> String? {
|
||||
|
||||
/// Find the mountpoint for the given disk object. You can pass also a mount point to se if it is valid.
|
||||
func getMountPoint(from diskOrMtp: String) -> String? {
|
||||
// kDADiskDescriptionVolumePathKey
|
||||
var mountPoint : String? = nil
|
||||
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
|
||||
if (dict.object(forKey: kDADiskDescriptionVolumePathKey) != nil) {
|
||||
@ -98,7 +97,6 @@ func getMountPoint(from diskOrMtp: String) -> String? {
|
||||
|
||||
/// Find the Volume name: be aware that this is not the mount point name.
|
||||
func getVolumeName(from diskOrMtp: String) -> String? {
|
||||
// kDADiskDescriptionVolumeNameKey
|
||||
var name : String? = nil
|
||||
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
|
||||
if (dict.object(forKey: kDADiskDescriptionVolumeNameKey) != nil) {
|
||||
@ -110,7 +108,6 @@ func getVolumeName(from diskOrMtp: String) -> String? {
|
||||
|
||||
/// Get partition UUID for the given volume: This is not a disk UUID.
|
||||
func getVolumeUUID(from diskOrMtp: String) -> String? {
|
||||
// kDADiskDescriptionVolumeUUIDKey
|
||||
var uuid : String? = nil
|
||||
if let dict : NSDictionary = getDAdiskDescription(from: diskOrMtp) {
|
||||
if (dict.object(forKey: kDADiskDescriptionVolumeUUIDKey) != nil) {
|
||||
@ -125,9 +122,9 @@ func getVolumeUUID(from diskOrMtp: String) -> String? {
|
||||
|
||||
/// Get disk uuid for the given diskx. This is not a Volume UUID but a media UUID.
|
||||
func getDiskUUID(from diskOrMtp: String) -> String? {
|
||||
// kDADiskDescriptionVolumeUUIDKey
|
||||
var uuid : String? = nil
|
||||
if let dict : NSDictionary = getDAdiskDescription(from: getBSDParent(of: diskOrMtp)!) {
|
||||
print(dict)
|
||||
if (dict.object(forKey: kDADiskDescriptionMediaUUIDKey) != nil) {
|
||||
let temp : AnyObject = dict.object(forKey: kDADiskDescriptionMediaUUIDKey) as AnyObject
|
||||
if temp is NSUUID {
|
||||
@ -169,8 +166,6 @@ func getAlldisks() -> NSDictionary {
|
||||
var entry_iterator: io_iterator_t = 0
|
||||
let allDisks = NSMutableDictionary()
|
||||
if IOServiceGetMatchingServices(kIOMasterPortDefault, match_dictionary, &entry_iterator) == kIOReturnSuccess {
|
||||
//let serviceObject: io_registry_entry_t
|
||||
//var serviceObject : UnsafeMutablePointer<io_registry_entry_t>
|
||||
var serviceObject : io_registry_entry_t = 0
|
||||
|
||||
repeat {
|
||||
@ -282,7 +277,6 @@ func getBSDName(of mountpoint: String) -> String? {
|
||||
|
||||
/// Find the BSDName of the given parent disk.
|
||||
func getBSDParent(of mountpointORDevDisk: String) -> String? {
|
||||
// DAMediaBSDUnit
|
||||
if let dict : NSDictionary = getDAdiskDescription(from: mountpointORDevDisk) {
|
||||
if (dict.object(forKey: kDADiskDescriptionMediaBSDUnitKey) != nil) {
|
||||
return "disk" + ((dict.object(forKey: kDADiskDescriptionMediaBSDUnitKey) as? NSNumber)?.stringValue)!
|
||||
@ -325,7 +319,6 @@ func getIconFor(volume mountpointORDevDisk: String) -> NSImage? {
|
||||
let identifier = iconDict.object(forKey: kCFBundleIdentifierKey as String) as! CFString
|
||||
|
||||
let url : CFURL = Unmanaged.takeRetainedValue(KextManagerCreateURLForBundleIdentifier(kCFAllocatorDefault, identifier))()
|
||||
//print(url)
|
||||
if let kb = Bundle(url: url as URL) {
|
||||
image = NSImage(byReferencingFile:
|
||||
kb.path(forResource: iconName.deletingFileExtension, ofType: iconName.fileExtension) ?? "")
|
||||
@ -350,3 +343,266 @@ func isMountPoint(path: String) -> Bool {
|
||||
let mtp : String? = getMountPoint(from: path)
|
||||
return (mtp != nil)
|
||||
}
|
||||
|
||||
func mount(disk bsdName: String, at path: String?) {
|
||||
var disk : String = bsdName
|
||||
if disk.hasPrefix("disk") || disk.hasPrefix("/dev/disk") {
|
||||
if disk.hasPrefix("/dev/disk") {
|
||||
disk = disk.components(separatedBy: "dev/")[1]
|
||||
}
|
||||
|
||||
var isLeaf : Bool = false
|
||||
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
|
||||
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
|
||||
|
||||
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
|
||||
let mountpoint : String? = getMountPoint(from: disk)
|
||||
if ((mountpoint != nil) && FileManager.default.fileExists(atPath: mountpoint!)) {
|
||||
// already mounted
|
||||
return
|
||||
}
|
||||
|
||||
if let session = DASessionCreate(kCFAllocatorDefault) {
|
||||
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
|
||||
var url : CFURL? = nil
|
||||
if (path != nil) {
|
||||
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
|
||||
path?.toPointer(),
|
||||
(path?.count)!,
|
||||
true)
|
||||
}
|
||||
|
||||
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
|
||||
context.initialize(repeating: 0, count: 1)
|
||||
context.pointee = 0
|
||||
|
||||
DASessionScheduleWithRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
DADiskMountWithArguments(bsd,
|
||||
url,
|
||||
DADiskMountOptions(kDADiskMountOptionDefault), {
|
||||
(o, dis, ctx) in
|
||||
if (dis != nil) && (ctx != nil) {
|
||||
print("mount failure: " + printDAReturn(r: DADissenterGetStatus(dis!)))
|
||||
}
|
||||
CFRunLoopStop(CFRunLoopGetCurrent())
|
||||
}, &context, nil)
|
||||
|
||||
CFRunLoopRun()
|
||||
|
||||
DASessionUnscheduleFromRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
context.deallocate()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func mount(disk bsdName: String,
|
||||
at path: String?,
|
||||
reply: @escaping (Bool) -> ()) {
|
||||
var disk : String = bsdName
|
||||
if disk.hasPrefix("disk") || disk.hasPrefix("/dev/disk") {
|
||||
if disk.hasPrefix("/dev/disk") {
|
||||
disk = disk.components(separatedBy: "dev/")[1]
|
||||
}
|
||||
|
||||
var isLeaf : Bool = false
|
||||
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
|
||||
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
|
||||
|
||||
|
||||
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 (is a partition?)*/
|
||||
let mountpoint : String? = getMountPoint(from: disk)
|
||||
if ((mountpoint != nil) && FileManager.default.fileExists(atPath: mountpoint!)) {
|
||||
// already mounted
|
||||
reply(true)
|
||||
return
|
||||
}
|
||||
|
||||
if let session = DASessionCreate(kCFAllocatorDefault) {
|
||||
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
|
||||
var url : CFURL? = nil
|
||||
if (path != nil) {
|
||||
url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault,
|
||||
path?.toPointer(),
|
||||
(path?.count)!,
|
||||
true)
|
||||
}
|
||||
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
|
||||
context.initialize(repeating: 0, count: 1)
|
||||
context.pointee = 0
|
||||
|
||||
DASessionScheduleWithRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
DADiskMountWithArguments(bsd, url, DADiskMountOptions(kDADiskMountOptionDefault), {
|
||||
(o, dis, ctx) in
|
||||
if (dis != nil) && (ctx != nil) {
|
||||
print("mount failure: " + printDAReturn(r: DADissenterGetStatus(dis!)))
|
||||
}
|
||||
CFRunLoopStop(CFRunLoopGetCurrent())
|
||||
}, &context, nil)
|
||||
|
||||
let result : Bool = (context.pointee == 0)
|
||||
|
||||
CFRunLoopRun()
|
||||
|
||||
DASessionUnscheduleFromRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
context.deallocate()
|
||||
|
||||
reply(result)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
reply(false)
|
||||
}
|
||||
|
||||
func umount(disk diskOrMtp: String, force: Bool) {
|
||||
let disk : String = diskOrMtp
|
||||
let mtp : String? = getMountPoint(from: diskOrMtp)
|
||||
if mtp != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if disk.hasPrefix("disk") {
|
||||
var isLeaf : Bool = false
|
||||
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
|
||||
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
|
||||
|
||||
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
|
||||
let mountpoint : String? = getMountPoint(from: disk)
|
||||
if (mountpoint == nil) {
|
||||
return
|
||||
}
|
||||
|
||||
if let session = DASessionCreate(kCFAllocatorDefault) {
|
||||
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
|
||||
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
|
||||
context.initialize(repeating: 0, count: 1)
|
||||
context.pointee = 0
|
||||
|
||||
DASessionScheduleWithRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
DADiskUnmount(bsd,
|
||||
DADiskUnmountOptions(force ? kDADiskUnmountOptionForce : kDADiskUnmountOptionDefault),
|
||||
{ (dadisk, dissenter, ctx) in
|
||||
if (dissenter != nil) && (ctx != nil) {
|
||||
print("un mount failure: " + printDAReturn(r: DADissenterGetStatus(dissenter!)))
|
||||
}
|
||||
CFRunLoopStop(CFRunLoopGetCurrent())
|
||||
}, &context)
|
||||
|
||||
CFRunLoopRun()
|
||||
DASessionUnscheduleFromRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
|
||||
context.deallocate()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func umount(disk diskOrMtp: String,
|
||||
force: Bool,
|
||||
reply: @escaping (Bool) -> ()) {
|
||||
let disk : String = diskOrMtp
|
||||
let mtp : String? = getMountPoint(from: diskOrMtp)
|
||||
if (mtp == nil) || (mtp == "/private/var/vm" || mtp == "/") {
|
||||
reply(false)
|
||||
return
|
||||
}
|
||||
if disk.hasPrefix("disk") {
|
||||
var isLeaf : Bool = false
|
||||
let dict : NSDictionary? = getAlldisks().object(forKey: disk) as? NSDictionary
|
||||
isLeaf = (dict?.object(forKey: "Leaf") != nil) && (dict?.object(forKey: "Leaf") as! NSNumber).boolValue
|
||||
|
||||
if disk.components(separatedBy: "s").count == 3 && isLeaf { /* di s k0 s 1 */
|
||||
let mountpoint : String? = getMountPoint(from: disk)
|
||||
if (mountpoint == nil) {
|
||||
reply(true)
|
||||
return
|
||||
}
|
||||
|
||||
if let session = DASessionCreate(kCFAllocatorDefault) {
|
||||
if let bsd = DADiskCreateFromBSDName(kCFAllocatorDefault, session, disk) {
|
||||
var context = UnsafeMutablePointer<Int>.allocate(capacity: 1)
|
||||
context.initialize(repeating: 0, count: 1)
|
||||
context.pointee = 0
|
||||
|
||||
DASessionScheduleWithRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
DADiskUnmount(bsd,
|
||||
DADiskUnmountOptions(force ? kDADiskUnmountOptionForce : kDADiskUnmountOptionDefault),
|
||||
{ (dadisk, dissenter, ctx) in
|
||||
if (dissenter != nil) && (ctx != nil) {
|
||||
print("un mount failure: " + printDAReturn(r: DADissenterGetStatus(dissenter!)))
|
||||
}
|
||||
CFRunLoopStop(CFRunLoopGetCurrent())
|
||||
}, &context)
|
||||
|
||||
let result : Bool = (context.pointee == 0)
|
||||
CFRunLoopRun()
|
||||
|
||||
DASessionUnscheduleFromRunLoop(session,
|
||||
CFRunLoopGetCurrent(),
|
||||
CFRunLoopMode.defaultMode.rawValue)
|
||||
|
||||
|
||||
context.deallocate()
|
||||
reply(result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
reply(false)
|
||||
}
|
||||
|
||||
fileprivate func printDAReturn(r: DAReturn) -> String {
|
||||
switch Int(r) {
|
||||
case kDAReturnError:
|
||||
return "Error"
|
||||
case kDAReturnBusy:
|
||||
return "Busy"
|
||||
case kDAReturnBadArgument:
|
||||
return "Bad Argument"
|
||||
case kDAReturnExclusiveAccess:
|
||||
return "Exclusive Access"
|
||||
case kDAReturnNoResources:
|
||||
return "No Resources"
|
||||
case kDAReturnNotFound:
|
||||
return "Not Found"
|
||||
case kDAReturnNotMounted:
|
||||
return "Not Mounted"
|
||||
case kDAReturnNotPermitted:
|
||||
return "Not Permitted"
|
||||
case kDAReturnNotPrivileged:
|
||||
return "Not Privileged"
|
||||
case kDAReturnNotReady:
|
||||
return "Not Ready"
|
||||
case kDAReturnNotWritable:
|
||||
return "Not Writable"
|
||||
case kDAReturnUnsupported:
|
||||
return "Unsupported"
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -45,11 +45,16 @@
|
||||
<string>Copyright © 2019 CloverHackyColor. All rights reserved.</string>
|
||||
<key>NSMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>SMPrivilegedExecutables</key>
|
||||
<dict>
|
||||
<key>org.slice.CloverDaemonNew</key>
|
||||
<string>identifier "org.slice.CloverDaemonNew"</string>
|
||||
</dict>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>NSSupportsAutomaticTermination</key>
|
||||
<true/>
|
||||
<false/>
|
||||
<key>NSSupportsSuddenTermination</key>
|
||||
<true/>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -963,6 +963,7 @@ class InstallerViewController: NSViewController {
|
||||
let filesystem = (getFS(from: disk)?.lowercased()) ?? kNotAvailable
|
||||
Cloverapp.setValue(filesystem, forKey: "filesystem")
|
||||
|
||||
|
||||
// drivers
|
||||
for sect in self.driversUEFI {
|
||||
for driver in sect {
|
||||
|
39
CloverApp/Clover/Installer/sr.lproj/Installer.strings
Normal file
39
CloverApp/Clover/Installer/sr.lproj/Installer.strings
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "0Jk-9o-xwr"; */
|
||||
"0Jk-9o-xwr.title" = "Item 1";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "4pt-DA-Vl6"; */
|
||||
"4pt-DA-Vl6.title" = "Item 2";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "boot1"; ObjectID = "DSK-8g-GVR"; */
|
||||
"DSK-8g-GVR.title" = "boot1";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "Install"; ObjectID = "HOQ-B0-pLp"; */
|
||||
"HOQ-B0-pLp.title" = "Install";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "CloverEFI"; ObjectID = "cO6-AP-j0b"; */
|
||||
"cO6-AP-j0b.title" = "CloverEFI";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "MBR/PBR"; ObjectID = "itH-zW-i1Y"; */
|
||||
"itH-zW-i1Y.title" = "MBR/PBR";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "boot7"; ObjectID = "oOc-2T-rwc"; */
|
||||
"oOc-2T-rwc.title" = "boot7";
|
||||
|
||||
/* Class = "NSButtonCell"; title = "AltBoot"; ObjectID = "rc0-N7-2xy"; */
|
||||
"rc0-N7-2xy.title" = "AltBoot";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Item 3"; ObjectID = "sCy-bb-OOm"; */
|
||||
"sCy-bb-OOm.title" = "Item 3";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "boot0af"; ObjectID = "v1t-y6-CSK"; */
|
||||
"v1t-y6-CSK.title" = "boot0af";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "boot6"; ObjectID = "v2m-Hs-R3O"; */
|
||||
"v2m-Hs-R3O.title" = "boot6";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "boot0ss"; ObjectID = "xP1-AF-6KH"; */
|
||||
"xP1-AF-6KH.title" = "boot0ss";
|
||||
|
||||
/* Class = "NSWindow"; title = "Clover Installer"; ObjectID = "ysg-ml-Ysp"; */
|
||||
"ysg-ml-Ysp.title" = "Clover Installer";
|
58
CloverApp/Clover/Locale.swift
Normal file
58
CloverApp/Clover/Locale.swift
Normal file
@ -0,0 +1,58 @@
|
||||
//
|
||||
// Locale.swift
|
||||
// Clover
|
||||
//
|
||||
// Created by vector sigma on 17/11/2019.
|
||||
// Copyright © 2019 CloverHackyColor. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
extension String {
|
||||
var locale: String {
|
||||
get {
|
||||
let preferred : [String] = Bundle.main.preferredLocalizations
|
||||
var table : String = "en"
|
||||
if preferred.count > 0 {
|
||||
table = preferred[0]
|
||||
}
|
||||
|
||||
var result = localeBundle?.localizedString(forKey: self, value: nil, table: table)
|
||||
|
||||
if result == self {
|
||||
result = localeBundle?.localizedString(forKey: self, value: nil, table: "en")
|
||||
}
|
||||
return (result != nil) ? result! : self
|
||||
}
|
||||
}
|
||||
|
||||
public func locale(_ localized: Bool) -> String {
|
||||
return (localized ? self.locale : self)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: localize view and sub views
|
||||
func localize(view: NSView) {
|
||||
for o in view.subviews {
|
||||
if o is NSButton {
|
||||
let x = (o as! NSButton)
|
||||
if x.title.count > 0 {
|
||||
x.title = x.title.locale
|
||||
}
|
||||
} else if o is NSTextField {
|
||||
let x = (o as! NSTextField)
|
||||
if x.stringValue.count > 0 {
|
||||
x.stringValue = x.stringValue.locale
|
||||
}
|
||||
} else if o is NSBox {
|
||||
let x = (o as! NSBox)
|
||||
if x.title.count > 0 {
|
||||
x.title = x.title.locale
|
||||
}
|
||||
}
|
||||
|
||||
if o.subviews.count > 0 {
|
||||
localize(view: o)
|
||||
}
|
||||
}
|
||||
}
|
@ -8,9 +8,6 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
// MARK: NSApplication shared delegate
|
||||
let AppSD = NSApplication.shared.delegate as! AppDelegate
|
||||
|
||||
// MARK: Paths
|
||||
let Cloverv2Path : String = Bundle.main.sharedSupportPath! + "/CloverV2"
|
||||
let kDaemonPath = "/Library/Application Support/Clover/CloverDaemonNew"
|
||||
@ -40,55 +37,6 @@ let kUpdateSearchInterval = "UpdateSearchInterval"
|
||||
let kLastUpdateLink = "LastUpdateLink"
|
||||
let kLastUpdateRevision = "LastUpdateRevision"
|
||||
|
||||
extension String {
|
||||
var locale: String {
|
||||
get {
|
||||
let preferred : [String] = Bundle.main.preferredLocalizations
|
||||
var table : String = "en"
|
||||
if preferred.count > 0 {
|
||||
table = preferred[0]
|
||||
}
|
||||
|
||||
var result = localeBundle?.localizedString(forKey: self, value: nil, table: table)
|
||||
|
||||
if result == self {
|
||||
result = localeBundle?.localizedString(forKey: self, value: nil, table: "en")
|
||||
}
|
||||
return (result != nil) ? result! : self
|
||||
}
|
||||
}
|
||||
|
||||
public func locale(_ localized: Bool) -> String {
|
||||
return (localized ? self.locale : self)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: localize view and sub views
|
||||
func localize(view: NSView) {
|
||||
for o in view.subviews {
|
||||
if o is NSButton {
|
||||
let x = (o as! NSButton)
|
||||
if x.title.count > 0 {
|
||||
x.title = x.title.locale
|
||||
}
|
||||
} else if o is NSTextField {
|
||||
let x = (o as! NSTextField)
|
||||
if x.stringValue.count > 0 {
|
||||
x.stringValue = x.stringValue.locale
|
||||
}
|
||||
} else if o is NSBox {
|
||||
let x = (o as! NSBox)
|
||||
if x.title.count > 0 {
|
||||
x.title = x.title.locale
|
||||
}
|
||||
}
|
||||
|
||||
if o.subviews.count > 0 {
|
||||
localize(view: o)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: find Clover Revision
|
||||
func findCloverRevision(at EFIdir: String) -> String? {
|
||||
|
||||
|
399
CloverApp/Clover/sr.lproj/Main.strings
Normal file
399
CloverApp/Clover/sr.lproj/Main.strings
Normal file
@ -0,0 +1,399 @@
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
|
||||
"1UK-8n-QPP.title" = "Customize Toolbar…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Clover"; ObjectID = "1Xt-HY-uBw"; */
|
||||
"1Xt-HY-uBw.title" = "Clover";
|
||||
|
||||
/* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
|
||||
"1b7-l0-nxx.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
|
||||
"1tx-W0-xDw.title" = "Lower";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
|
||||
"2h7-ER-AoG.title" = "Raise";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
|
||||
"2oI-Rn-ZJC.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
|
||||
"3IN-sU-3Bg.title" = "Spelling";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
|
||||
"3Om-Ey-2VK.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
|
||||
"3rS-ZA-NoH.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
|
||||
"46P-cB-AYj.title" = "Tighten";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
|
||||
"4EN-yA-p0u.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
|
||||
"4J7-dP-txa.title" = "Enter Full Screen";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Quit Clover"; ObjectID = "4sb-4s-VLi"; */
|
||||
"4sb-4s-VLi.title" = "Quit Clover";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
|
||||
"5QF-Oa-p0T.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
|
||||
"5Vv-lz-BsD.title" = "Copy Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "About Clover"; ObjectID = "5kV-Vb-QxS"; */
|
||||
"5kV-Vb-QxS.title" = "About Clover";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
|
||||
"6dh-zS-Vam.title" = "Redo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
|
||||
"78Y-hA-62v.title" = "Correct Spelling Automatically";
|
||||
|
||||
/* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
|
||||
"8mr-sm-Yjd.title" = "Writing Direction";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
|
||||
"9ic-FL-obx.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
|
||||
"9yt-4B-nSM.title" = "Smart Copy/Paste";
|
||||
|
||||
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
|
||||
"AYu-sK-qS6.title" = "Main Menu";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
|
||||
"BOF-NM-1cW.title" = "Preferences…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
|
||||
"BgM-ve-c93.title" = "\tLeft to Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
|
||||
"Bw7-FT-i3A.title" = "Save As…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
|
||||
"DVo-aG-piG.title" = "Close";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
|
||||
"Dv1-io-Yv7.title" = "Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
|
||||
"F2S-fz-NVQ.title" = "Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Clover Help"; ObjectID = "FKE-Sm-Kum"; */
|
||||
"FKE-Sm-Kum.title" = "Clover Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
|
||||
"Fal-I4-PZk.title" = "Text";
|
||||
|
||||
/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
|
||||
"FeM-D8-WVr.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
|
||||
"GB9-OM-e27.title" = "Bold";
|
||||
|
||||
/* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
|
||||
"GEO-Iw-cKr.title" = "Format";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
|
||||
"GUa-eO-cwY.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
|
||||
"Gi5-1S-RQB.title" = "Font";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
|
||||
"H1b-Si-o9J.title" = "Writing Direction";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
|
||||
"H8h-7b-M4v.title" = "View";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
|
||||
"HFQ-gK-NFA.title" = "Text Replacement";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
|
||||
"HFo-cy-zxI.title" = "Show Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
|
||||
"HyV-fh-RgO.title" = "View";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
|
||||
"I0S-gh-46l.title" = "Subscript";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
|
||||
"IAo-SY-fd9.title" = "Open…";
|
||||
|
||||
/* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
|
||||
"IQv-IB-iLA.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
|
||||
"J5U-5w-g23.title" = "Justify";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
|
||||
"J7y-lM-qPV.title" = "Use None";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
|
||||
"KaW-ft-85H.title" = "Revert to Saved";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
|
||||
"Kd2-mp-pUS.title" = "Show All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
|
||||
"LE2-aR-0XJ.title" = "Bring All to Front";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
|
||||
"LVM-kO-fVI.title" = "Paste Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
|
||||
"Lbh-J2-qVU.title" = "\tLeft to Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
|
||||
"MkV-Pr-PK5.title" = "Copy Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
|
||||
"NMo-om-nkz.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
|
||||
"Nop-cj-93Q.title" = "\tDefault";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
|
||||
"OY7-WF-poV.title" = "Minimize";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
|
||||
"OaQ-X3-Vso.title" = "Baseline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide Clover"; ObjectID = "Olw-nP-bQN"; */
|
||||
"Olw-nP-bQN.title" = "Hide Clover";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
|
||||
"OwM-mh-QMV.title" = "Find Previous";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
|
||||
"Oyz-dy-DGm.title" = "Stop Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
|
||||
"Ptp-SP-VEL.title" = "Bigger";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
|
||||
"Q5e-8K-NDq.title" = "Show Fonts";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
|
||||
"R4o-n2-Eq4.title" = "Zoom";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
|
||||
"RB4-Sm-HuC.title" = "\tRight to Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
|
||||
"Rqc-34-cIF.title" = "Superscript";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
|
||||
"Ruw-6m-B2m.title" = "Select All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
|
||||
"S0p-oC-mLd.title" = "Jump to Selection";
|
||||
|
||||
/* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
|
||||
"Td7-aD-5lo.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
|
||||
"UEZ-Bs-lqG.title" = "Capitalize";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
|
||||
"VIY-Ag-zcb.title" = "Center";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
|
||||
"Vdr-fp-XzO.title" = "Hide Others";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
|
||||
"Vjx-xi-njq.title" = "Italic";
|
||||
|
||||
/* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
|
||||
"W48-6f-4Dl.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
|
||||
"WRG-CD-K1S.title" = "Underline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
|
||||
"Was-JA-tGl.title" = "New";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
|
||||
"WeT-3V-zwk.title" = "Paste and Match Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
|
||||
"Xz5-n4-O0W.title" = "Find…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
|
||||
"YEy-JH-Tfz.title" = "Find and Replace…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
|
||||
"YGs-j5-SAR.title" = "\tDefault";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
|
||||
"Ynk-f8-cLZ.title" = "Start Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
|
||||
"ZM1-6Q-yy1.title" = "Align Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
|
||||
"ZvO-Gk-QUH.title" = "Paragraph";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
|
||||
"aTl-1u-JFS.title" = "Print…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
|
||||
"aUF-d1-5bR.title" = "Window";
|
||||
|
||||
/* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
|
||||
"aXa-aM-Jaq.title" = "Font";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
|
||||
"agt-UL-0e3.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
|
||||
"bgn-CT-cEk.title" = "Show Colors";
|
||||
|
||||
/* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
|
||||
"bib-Uj-vzu.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
|
||||
"buJ-ug-pKt.title" = "Use Selection for Find";
|
||||
|
||||
/* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
|
||||
"c8a-y6-VQd.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
|
||||
"cDB-IK-hbR.title" = "Use None";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
|
||||
"cqv-fj-IhA.title" = "Selection";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
|
||||
"cwL-P1-jid.title" = "Smart Links";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
|
||||
"d9M-CD-aMd.title" = "Make Lower Case";
|
||||
|
||||
/* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
|
||||
"d9c-me-L2H.title" = "Text";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
|
||||
"dMs-cI-mzQ.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
|
||||
"dRJ-4n-Yzg.title" = "Undo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
|
||||
"gVA-U4-sdL.title" = "Paste";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
|
||||
"hQb-2v-fYv.title" = "Smart Quotes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
|
||||
"hz2-CU-CR7.title" = "Check Document Now";
|
||||
|
||||
/* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
|
||||
"hz9-B4-Xy5.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
|
||||
"i1d-Er-qST.title" = "Smaller";
|
||||
|
||||
/* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
|
||||
"ijk-EB-dga.title" = "Baseline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
|
||||
"jBQ-r6-VK2.title" = "Kern";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
|
||||
"jFq-tB-4Kx.title" = "\tRight to Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
|
||||
"jxT-CU-nIS.title" = "Format";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
|
||||
"kIP-vf-haE.title" = "Show Sidebar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
|
||||
"mK6-2p-4JG.title" = "Check Grammar With Spelling";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
|
||||
"o6e-r0-MWq.title" = "Ligatures";
|
||||
|
||||
/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
|
||||
"oas-Oc-fiZ.title" = "Open Recent";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
|
||||
"ogc-rX-tC1.title" = "Loosen";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
|
||||
"pa3-QI-u2k.title" = "Delete";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
|
||||
"pxx-59-PXV.title" = "Save…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
|
||||
"q09-fT-Sye.title" = "Find Next";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
|
||||
"qIS-W8-SiK.title" = "Page Setup…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
|
||||
"rbD-Rh-wIN.title" = "Check Spelling While Typing";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
|
||||
"rgM-f4-ycn.title" = "Smart Dashes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
|
||||
"snW-S8-Cw5.title" = "Show Toolbar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
|
||||
"tRr-pd-1PS.title" = "Data Detectors";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
|
||||
"tXI-mr-wws.title" = "Open Recent";
|
||||
|
||||
/* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
|
||||
"tlD-Oa-oAM.title" = "Kern";
|
||||
|
||||
/* Class = "NSMenu"; title = "Clover"; ObjectID = "uQy-DD-JDr"; */
|
||||
"uQy-DD-JDr.title" = "Clover";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
|
||||
"uRl-iY-unG.title" = "Cut";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
|
||||
"vKC-jM-MkH.title" = "Paste Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
|
||||
"vLm-3I-IUL.title" = "Show Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
|
||||
"vNY-rz-j42.title" = "Clear Menu";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
|
||||
"vmV-6d-7jI.title" = "Make Upper Case";
|
||||
|
||||
/* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
|
||||
"w0m-vy-SC9.title" = "Ligatures";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Main Clover.app"; ObjectID = "wA3-rG-VSC"; */
|
||||
"wA3-rG-VSC.title" = "Main Clover.app";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
|
||||
"wb2-vD-lq4.title" = "Align Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
|
||||
"wpr-3q-Mcd.title" = "Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
|
||||
"x3v-GG-iWU.title" = "Copy";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
|
||||
"xQD-1f-W4t.title" = "Use All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
|
||||
"xrE-MZ-jX0.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
|
||||
"z6F-FW-3nz.title" = "Show Substitutions";
|
@ -17,18 +17,6 @@
|
||||
954FF2102371B16300C3D94C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 954FF20F2371B16300C3D94C /* IOKit.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
953DBFD9236F037400B0C4FB /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
953B8DED2370BB1A007E36E3 /* bdmesg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = bdmesg.swift; path = ../../Clover/bdmesg.swift; sourceTree = "<group>"; };
|
||||
953B8DEF2370BB5C007E36E3 /* NVRAM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NVRAM.swift; path = ../../Clover/NVRAM.swift; sourceTree = "<group>"; };
|
||||
@ -106,7 +94,6 @@
|
||||
buildPhases = (
|
||||
953DBFD7236F037400B0C4FB /* Sources */,
|
||||
953DBFD8236F037400B0C4FB /* Frameworks */,
|
||||
953DBFD9236F037400B0C4FB /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -292,6 +279,7 @@
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "CloverDaemonNew/CloverDaemonNew-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
@ -311,6 +299,7 @@
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
OTHER_LDFLAGS = "";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "CloverDaemonNew/CloverDaemonNew-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
- (void)registerPowerNotifications;
|
||||
- (void)powerDidReceiveMessage:(natural_t)type argument:(void *)argument;
|
||||
|
||||
- (void)removeNVRAMPlist;
|
||||
- (void)readAndCleanConflictingsKeys;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@ -52,24 +52,49 @@ void powerCallback(void *refCon, io_service_t service, natural_t type, void *arg
|
||||
}
|
||||
case kIOMessageSystemHasPoweredOn:{
|
||||
printf("System awaken at %s\n", [date UTF8String]);
|
||||
// who will come first? ..I don't know so do that after 3 seconds
|
||||
[self performSelector:@selector(removeNVRAMPlist) withObject:nil afterDelay:3];
|
||||
[self performSelector:@selector(readAndCleanConflictingsKeys) withObject:nil afterDelay:3];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)removeNVRAMPlist {
|
||||
- (void)readAndCleanConflictingsKeys {
|
||||
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/nvram.plist"]) {
|
||||
printf("Found /nvram.plist after waking from sleep, checking fro Apple GUIDs..\n");
|
||||
NSDictionary *nvram = [NSDictionary dictionaryWithContentsOfFile:@"/nvram.plist"];
|
||||
NSMutableDictionary *nvram = [NSMutableDictionary dictionaryWithContentsOfFile:@"/nvram.plist"];
|
||||
if (nvram != nil) {
|
||||
NSArray *keys = [nvram allKeys];
|
||||
int removed = 0;
|
||||
for (int i = 0; i < [keys count]; i++) {
|
||||
NSString *key = [keys objectAtIndex:i];
|
||||
if ([key hasPrefix:@"8BE4DF61-93CA-11D2-AA0D-00E098032B8C:"]) {
|
||||
printf("/nvram.plist contains %s\n", [key UTF8String]);
|
||||
}
|
||||
|
||||
if ([key isEqualToString: @"efi-backup-boot-device"]) {
|
||||
printf("removing %s.\n", [key UTF8String]);
|
||||
[nvram removeObjectForKey:@"efi-backup-boot-device"];
|
||||
}
|
||||
if ([key isEqualToString: @"efi-backup-boot-device-data"]) {
|
||||
printf("removing %s.\n", [key UTF8String]);
|
||||
[nvram removeObjectForKey:@"efi-backup-boot-device-data"];
|
||||
}
|
||||
if ([key isEqualToString: @"install-product-url"]) {
|
||||
printf("removing %s.\n", [key UTF8String]);
|
||||
[nvram removeObjectForKey:@"install-product-url"];
|
||||
}
|
||||
if ([key isEqualToString: @"previous-system-uuid"]) {
|
||||
printf("removing %s.\n", [key UTF8String]);
|
||||
[nvram removeObjectForKey:@"previous-system-uuid"];
|
||||
}
|
||||
}
|
||||
|
||||
if (removed > 0) {
|
||||
if (![nvram writeToFile:@"/nvram.plist" atomically:YES]) {
|
||||
printf("Error: cannot write back to /nvram.plist.\n");
|
||||
} else {
|
||||
system("/usr/bin/chflags hidden /nvram.plist");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,21 +7,13 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import CoreFoundation
|
||||
|
||||
let daemonVersion = "1.01"
|
||||
let fm = FileManager.default
|
||||
let daemonVersion = "1.0.3"
|
||||
|
||||
/*
|
||||
Store a session reference to contact Disk Arbitration,
|
||||
..it will be usefull during the shut down.
|
||||
this is weird, but make some chances for the last stand (SIGTERM)
|
||||
*/
|
||||
|
||||
var BootDeviceUUID : String? = nil
|
||||
var BootDeviceFS : String? = nil
|
||||
var BootDevice : String? = nil
|
||||
|
||||
let wrapperPath = "/Library/Application Support/Clover/CloverWrapper.sh"
|
||||
let loginwindow = "/var/root/Library/Preferences/com.apple.loginwindow.plist"
|
||||
let lh = "/Library/Application Support/Clover/CloverLogOut"
|
||||
|
||||
func execAttr() -> [FileAttributeKey : Any] {
|
||||
var attributes = [FileAttributeKey : Any]()
|
||||
@ -58,24 +50,7 @@ func run(cmd: String) {
|
||||
}
|
||||
|
||||
func doJob() {
|
||||
/*
|
||||
Don't lose time.. We're shutting down, so try to make root writable anyway
|
||||
*/
|
||||
if !fm.isWritableFile(atPath: "/") {
|
||||
run(cmd: "mount -uw /")
|
||||
}
|
||||
|
||||
|
||||
if let nvram = getNVRAM() {
|
||||
// first time is to dump nvram (time is running out..)
|
||||
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
|
||||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
|
||||
// mount -t "$filesystem" "$bootdev" "$mnt_pt"
|
||||
if let bootDevice = BootDevice, let fs = BootDeviceFS {
|
||||
saveNVRAM(bootDevice: bootDevice, filesystem: fs, nvram: nvram)
|
||||
}
|
||||
}
|
||||
|
||||
checkSleepProxyClient(nvram: nvram)
|
||||
} else {
|
||||
print("nvram not present in this machine.")
|
||||
@ -83,114 +58,72 @@ func doJob() {
|
||||
exit(EXIT_SUCCESS)
|
||||
}
|
||||
|
||||
func saveNVRAM(bootDevice: String, filesystem: String, nvram: NSMutableDictionary) {
|
||||
nvram.removeObject(forKey: "efi-backup-boot-device")
|
||||
nvram.removeObject(forKey: "efi-backup-boot-device-data")
|
||||
nvram.removeObject(forKey: "install-product-url")
|
||||
nvram.removeObject(forKey: "previous-system-uuid")
|
||||
nvram.write(toFile: "/tmp/nvramsaved.plist", atomically: false)
|
||||
|
||||
let uuid = (BootDeviceUUID != nil) ? "\(BootDeviceUUID!)" : "NO UUID"
|
||||
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
let mp = "/Volumes/\(String((0..<10).map{ _ in letters.randomElement()! }))"
|
||||
let type : String = (filesystem.hasPrefix("fat") || filesystem.hasPrefix("exf")) ? "msdos" : filesystem
|
||||
|
||||
let cmd = """
|
||||
if [[ ! -f /tmp/nvramsaved.plist ]]; then
|
||||
echo "Error: nvram not found to a temporary location."
|
||||
exit 0
|
||||
fi
|
||||
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist > /dev/null 2>&1
|
||||
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskmanagementd.plist > /dev/null 2>&1
|
||||
diskutil mount \(bootDevice) > /dev/null 2>&1
|
||||
mp=$(LC_ALL=C mount | egrep "^/dev/\(bootDevice) on" | sed 's/^.* on *//;s/ ([^(]*//')
|
||||
if [[ "${mp}" == "/"* ]]; then
|
||||
cat /tmp/nvramsaved.plist > "${mp}"/nvram.plist
|
||||
echo 'nvram saved to disk with UUID \(uuid)'
|
||||
else
|
||||
mkdir -p '\(mp)'
|
||||
attempts=1
|
||||
until [ $attempts -ge 11 ]
|
||||
do
|
||||
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskarbitrationd.plist > /dev/null 2>&1
|
||||
launchctl load -F /System/Library/LaunchDaemons/com.apple.diskmanagementd.plist > /dev/null 2>&1
|
||||
sleep 0.2
|
||||
mount -t \(type) /dev/\(bootDevice) '\(mp)' > /dev/null 2>&1
|
||||
sleep 0.3
|
||||
if [ $? -eq 0 ]; then
|
||||
cat /tmp/nvramsaved.plist > '\(mp)/nvram.plist'
|
||||
echo 'nvram saved to disk with UUID \(uuid)'
|
||||
echo "$attempts attempts required."
|
||||
break
|
||||
else
|
||||
attempts=$[$attempts+1]
|
||||
if [ $attempts -eq 11 ]; then
|
||||
echo "Error: \(bootDevice) doesn't want to mount after $attempts attempts, try to save in /."
|
||||
cat /tmp/nvramsaved.plist > /nvram.plist
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
"""
|
||||
let task = Process()
|
||||
task.launchPath = "/bin/bash"
|
||||
task.arguments = ["-c", cmd]
|
||||
|
||||
task.launch()
|
||||
}
|
||||
|
||||
|
||||
func checkSleepProxyClient(nvram: NSDictionary) {
|
||||
let mDNSResponderPath = "/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist"
|
||||
let disableOption = "-DisableSleepProxyClient"
|
||||
|
||||
if let nvdata = nvram.object(forKey: "Clover.DisableSleepProxyClient") as? Data {
|
||||
let value = String(decoding: nvdata, as: UTF8.self)
|
||||
|
||||
if value == "true" {
|
||||
print("Clover.DisableSleepProxyClient=\(value)")
|
||||
if !fm.fileExists(atPath: mDNSResponderPath) {
|
||||
print("Error: cannot found \(mDNSResponderPath)")
|
||||
return
|
||||
}
|
||||
if !fm.isWritableFile(atPath: "/") {
|
||||
print("try to making '/' writable as Clover.DisableSleepProxyClient=true.")
|
||||
run(cmd: "mount -uw /")
|
||||
print("Cannot go ahead as / is still read-only at this moment, will try again at power off.")
|
||||
return
|
||||
}
|
||||
|
||||
// check if already disabled
|
||||
// check if enabled or disabled
|
||||
if let mDNSResponder = NSDictionary(contentsOfFile: mDNSResponderPath) {
|
||||
if let ProgramArguments = mDNSResponder.object(forKey: "ProgramArguments") as? NSArray {
|
||||
var toDisable : Bool = true
|
||||
for a in ProgramArguments {
|
||||
if let arg = a as? String {
|
||||
var index : Int = -1
|
||||
var serviceDisabled = false
|
||||
for i in 0..<ProgramArguments.count {
|
||||
if let arg = ProgramArguments.object(at: i) as? String {
|
||||
if arg == disableOption {
|
||||
print("DisableSleepProxyClient: service already disabled\n")
|
||||
toDisable = false
|
||||
index = i
|
||||
serviceDisabled = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if toDisable {
|
||||
print("DisableSleepProxyClient: trying to disable the service.. SIP permitting.\n")
|
||||
if value == "true" && !serviceDisabled {
|
||||
print("Trying to disable Sleep Proxy Client service as requested.")
|
||||
let cmd = "/usr/libexec/PlistBuddy -c \"Add ProgramArguments: string \(disableOption)\" \(mDNSResponderPath)"
|
||||
run(cmd: cmd)
|
||||
} else if value != "true" && serviceDisabled {
|
||||
print("Trying to enable Sleep Proxy Client service as requested.")
|
||||
if index >= 0 {
|
||||
let cmd = "/usr/libexec/PlistBuddy -c \"delete :ProgramArguments:\(index)\" \(mDNSResponderPath)"
|
||||
run(cmd: cmd)
|
||||
} else {
|
||||
print("Bug: cant find the index of '\(disableOption)'.\n")
|
||||
}
|
||||
} else {
|
||||
print("Sleep Proxy Client \(serviceDisabled ? "disabled" : "enabled") as requested.")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getLogOutHook() -> String? {
|
||||
return NSDictionary(contentsOfFile: loginwindow)?.object(forKey: "LogoutHook") as? String
|
||||
}
|
||||
|
||||
func main() {
|
||||
let df = DateFormatter()
|
||||
df.dateFormat = "yyyy-MM-dd hh:mm:ss"
|
||||
var now = df.string(from: Date())
|
||||
print("--------------------------------------------")
|
||||
|
||||
print("\n\n--------------------------------------------")
|
||||
print("- CloverDaemonNew v\(daemonVersion)")
|
||||
print("- macOS \(ProcessInfo().operatingSystemVersionString)")
|
||||
print("- System start at \(now)")
|
||||
print("--------------------------------------------")
|
||||
var powerObserver : PowerObserver? = PowerObserver() // I want it to be var
|
||||
print("------")
|
||||
run(cmd: "kextunload /System/Library/Extensions/msdosfs.kext 2>/dev/null")
|
||||
let _ : PowerObserver? = PowerObserver()
|
||||
if let volname = getMediaName(from: "/") {
|
||||
print("root mount point is '/Volumes/\(volname)'")
|
||||
}
|
||||
@ -213,6 +146,7 @@ func main() {
|
||||
This is not going to go into the System log and is not
|
||||
controllable by the nvram.
|
||||
*/
|
||||
|
||||
let logLinesMax : Int = 500
|
||||
let logDir = "/Library/Logs/CloverEFI"
|
||||
let logPath = "/Library/Logs/CloverEFI/clover.daemon.log"
|
||||
@ -235,35 +169,117 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// get the boot device UUID, will be of help later
|
||||
if let bootDevice = findBootPartitionDevice() {
|
||||
BootDevice = bootDevice
|
||||
BootDeviceUUID = getVolumeUUID(from: bootDevice)
|
||||
BootDeviceFS = getFS(from: bootDevice)?.lowercased()
|
||||
}
|
||||
|
||||
// check options in nvram
|
||||
var mountRWCalled = fm.isWritableFile(atPath: "/")
|
||||
|
||||
if let nvram = getNVRAM() {
|
||||
if let nvdata = nvram.object(forKey: "Clover.RootRW") as? Data {
|
||||
let value = String(decoding: nvdata, as: UTF8.self)
|
||||
if value == "true" && !fm.isWritableFile(atPath: "/") {
|
||||
print("making '/' writable as Clover.RootRW=true")
|
||||
if value == "true" {
|
||||
if !mountRWCalled {
|
||||
mountRWCalled = true
|
||||
print("making '/' writable as Clover.RootRW=true.")
|
||||
run(cmd: "mount -uw /")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// using the logout Hook only if EmuVariableUefiPresent
|
||||
let loh = getLogOutHook()
|
||||
|
||||
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
|
||||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
|
||||
|
||||
// if a hook exist and is not our one, then add a wrapper
|
||||
if (loh != nil) {
|
||||
if loh! != lh && fm.fileExists(atPath: loh!) {
|
||||
let wrapper =
|
||||
"""
|
||||
#!/bin/sh
|
||||
|
||||
'\(lh)'
|
||||
|
||||
# This file is automatically generated by CloverDaemonNew because
|
||||
# it has detected you added a logout script somewhere else.
|
||||
# if you edit this file, be aware that if you start to boot in UEFI
|
||||
# CloverDaemonNew will take care to restore your custom logout script,
|
||||
# but your script must be the last line to be detected again.
|
||||
# The script path must be escaped within '' if contains spaces in the middle.
|
||||
# NOTE: if your will is to add multiple scripts, please add them to
|
||||
# the following script (and so not in this script):
|
||||
|
||||
'\(loh!)'
|
||||
"""
|
||||
print("Detected user logout hook at \(loh!), merging with it with CloverLogOut in CloverWrapper.sh.")
|
||||
do {
|
||||
try wrapper.write(toFile: wrapperPath, atomically: false, encoding: .utf8)
|
||||
try fm.setAttributes(execAttr(), ofItemAtPath: wrapperPath)
|
||||
|
||||
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(wrapperPath)'")
|
||||
} catch {
|
||||
print(error)
|
||||
}
|
||||
} else {
|
||||
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(lh)'")
|
||||
}
|
||||
} else {
|
||||
run(cmd: "defaults write com.apple.loginwindow LogoutHook '\(lh)'")
|
||||
}
|
||||
|
||||
if !fm.isWritableFile(atPath: "/") {
|
||||
if !mountRWCalled {
|
||||
print("making '/' writable as EmuVariableUefiPresent is present to save nvram.")
|
||||
}
|
||||
run(cmd: "mount -uw /")
|
||||
}
|
||||
} else {
|
||||
// what to do? remove the logout hook if it's our
|
||||
if (loh != nil) {
|
||||
if loh! == lh {
|
||||
// it is CloverLogOut
|
||||
print("Removing CloverLogOut hook as EmuVariable is no longer present.")
|
||||
run(cmd: "defaults delete com.apple.loginwindow LogoutHook")
|
||||
} else if loh! == wrapperPath {
|
||||
print("Removing CloverWrapper.sh logout hook as EmuVariable is no longer present.")
|
||||
// it is CloverWrapper.sh. We have to mantain user script!
|
||||
// get the user script path:
|
||||
var script : String? = nil
|
||||
if let lines = try? String(contentsOf: URL(fileURLWithPath: wrapperPath),
|
||||
encoding: .utf8).components(separatedBy: .newlines) {
|
||||
if lines.count > 0 {
|
||||
script = lines.last
|
||||
}
|
||||
}
|
||||
if script != nil {
|
||||
print("..but taking user logout hook script at \(script!).")
|
||||
run(cmd: "defaults write com.apple.loginwindow LogoutHook \(script!)")
|
||||
} else {
|
||||
run(cmd: "defaults delete com.apple.loginwindow LogoutHook")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let nvdata = nvram.object(forKey: "Clover.DisableSleepProxyClient") as? Data {
|
||||
let value = String(decoding: nvdata, as: UTF8.self)
|
||||
if value == "true" {
|
||||
if !fm.isWritableFile(atPath: "/") {
|
||||
if !mountRWCalled {
|
||||
print("making '/' writable as Clover.DisableSleepProxyClient=true.")
|
||||
}
|
||||
run(cmd: "mount -uw /")
|
||||
sleep(2)
|
||||
}
|
||||
}
|
||||
checkSleepProxyClient(nvram: nvram)
|
||||
}
|
||||
|
||||
/*
|
||||
Clean old nvram.plist user may have in other volumes,
|
||||
but not if it is our boot device
|
||||
Clean old nvram.plist user may have in all volumes
|
||||
*/
|
||||
for v in getVolumes() {
|
||||
let nvramtPath = v.addPath("nvram.plist")
|
||||
let bootDevice = findBootPartitionDevice()
|
||||
let vbsd = getBSDName(of: v)
|
||||
if vbsd != bootDevice {
|
||||
if fm.fileExists(atPath: nvramtPath) {
|
||||
if fm.isDeletableFile(atPath: nvramtPath) {
|
||||
do {
|
||||
@ -277,20 +293,22 @@ func main() {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print("Error: nvram not present in this System.")
|
||||
}
|
||||
|
||||
// SIGTERM? This is a daemon so we are shutting down
|
||||
signal(SIGTERM, SIG_IGN)
|
||||
let termSource = DispatchSource.makeSignalSource(signal: SIGTERM)
|
||||
termSource.setEventHandler {
|
||||
print("Logout hook is: \(getLogOutHook() ?? "none")")
|
||||
signal(SIGTERM, SIG_IGN) //preferred
|
||||
let sigtermSource = DispatchSource.makeSignalSource(signal: SIGTERM)
|
||||
sigtermSource.setEventHandler {
|
||||
now = df.string(from: Date())
|
||||
print("")
|
||||
print("- System power off at \(now)")
|
||||
print("- CloverDaemonNew v\(daemonVersion)")
|
||||
powerObserver = nil // no longer needed
|
||||
print("SIGTERM received at \(now)")
|
||||
//print("- CloverDaemonNew v\(daemonVersion)")
|
||||
doJob()
|
||||
}
|
||||
termSource.resume()
|
||||
sigtermSource.resume()
|
||||
|
||||
RunLoop.current.run()
|
||||
//dispatchMain()
|
||||
}
|
||||
@ -337,6 +355,17 @@ if CommandLine.arguments.contains("--install") {
|
||||
ofItemAtPath: "/Library/Application Support/Clover/\(myName)")
|
||||
|
||||
|
||||
let logouthookSrc = myPath.deletingLastPath.addPath("CloverLogOut")
|
||||
if fm.fileExists(atPath: lh) {
|
||||
try fm.removeItem(atPath: lh)
|
||||
}
|
||||
if fm.fileExists(atPath: logouthookSrc) {
|
||||
try fm.copyItem(atPath: logouthookSrc,
|
||||
toPath: lh)
|
||||
try fm.setAttributes(execAttr(),
|
||||
ofItemAtPath: lh)
|
||||
}
|
||||
|
||||
try fm.setAttributes(launchAttr(),
|
||||
ofItemAtPath: "/Library/LaunchDaemons/com.slice.CloverDaemonNew.plist")
|
||||
if fm.fileExists(atPath: "/Library/LaunchDaemons/com.slice.CloverDaemonNew.plist") {
|
||||
@ -365,7 +394,6 @@ if CommandLine.arguments.contains("--install") {
|
||||
}
|
||||
} else {
|
||||
main()
|
||||
CFRunLoopRun()
|
||||
}
|
||||
|
||||
exit(EXIT_FAILURE)
|
||||
|
307
CloverApp/CloverLogOut/CloverLogOut.xcodeproj/project.pbxproj
Normal file
307
CloverApp/CloverLogOut/CloverLogOut.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,307 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
954BBE972381964F0032425F /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954BBE962381964F0032425F /* Shared.swift */; };
|
||||
95524B7D238051AC005F6425 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B7C238051AC005F6425 /* main.swift */; };
|
||||
95524B8A23805210005F6425 /* NVRAM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8923805210005F6425 /* NVRAM.swift */; };
|
||||
95524B8C2380521D005F6425 /* Disks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8B2380521D005F6425 /* Disks.swift */; };
|
||||
95524B8E2380522A005F6425 /* bdmesg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8D2380522A005F6425 /* bdmesg.swift */; };
|
||||
95524B9023805233005F6425 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95524B8F23805232005F6425 /* Extensions.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
95524B77238051AC005F6425 /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = /usr/share/man/man1/;
|
||||
dstSubfolderSpec = 0;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 1;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
954BBE962381964F0032425F /* Shared.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Shared.swift; path = ../../Clover/Shared.swift; sourceTree = "<group>"; };
|
||||
95524B79238051AC005F6425 /* CloverLogOut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CloverLogOut; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
95524B7C238051AC005F6425 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
|
||||
95524B8923805210005F6425 /* NVRAM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NVRAM.swift; path = ../../Clover/NVRAM.swift; sourceTree = "<group>"; };
|
||||
95524B8B2380521D005F6425 /* Disks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Disks.swift; path = ../../Clover/Disks.swift; sourceTree = "<group>"; };
|
||||
95524B8D2380522A005F6425 /* bdmesg.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = bdmesg.swift; path = ../../Clover/bdmesg.swift; sourceTree = "<group>"; };
|
||||
95524B8F23805232005F6425 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = ../../Clover/Extensions.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
95524B76238051AC005F6425 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
95524B70238051AC005F6425 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95524B7B238051AC005F6425 /* CloverLogOut */,
|
||||
95524B7A238051AC005F6425 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
95524B7A238051AC005F6425 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95524B79238051AC005F6425 /* CloverLogOut */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
95524B7B238051AC005F6425 /* CloverLogOut */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95524B7C238051AC005F6425 /* main.swift */,
|
||||
954BBE962381964F0032425F /* Shared.swift */,
|
||||
95524B8923805210005F6425 /* NVRAM.swift */,
|
||||
95524B8B2380521D005F6425 /* Disks.swift */,
|
||||
95524B8D2380522A005F6425 /* bdmesg.swift */,
|
||||
95524B8F23805232005F6425 /* Extensions.swift */,
|
||||
);
|
||||
path = CloverLogOut;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
95524B78238051AC005F6425 /* CloverLogOut */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 95524B80238051AC005F6425 /* Build configuration list for PBXNativeTarget "CloverLogOut" */;
|
||||
buildPhases = (
|
||||
95524B75238051AC005F6425 /* Sources */,
|
||||
95524B76238051AC005F6425 /* Frameworks */,
|
||||
95524B77238051AC005F6425 /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = CloverLogOut;
|
||||
productName = CloverLogOut;
|
||||
productReference = 95524B79238051AC005F6425 /* CloverLogOut */;
|
||||
productType = "com.apple.product-type.tool";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
95524B71238051AC005F6425 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1120;
|
||||
LastUpgradeCheck = 1120;
|
||||
ORGANIZATIONNAME = CloverHackyColor;
|
||||
TargetAttributes = {
|
||||
95524B78238051AC005F6425 = {
|
||||
CreatedOnToolsVersion = 11.2;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 95524B74238051AC005F6425 /* Build configuration list for PBXProject "CloverLogOut" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 95524B70238051AC005F6425;
|
||||
productRefGroup = 95524B7A238051AC005F6425 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
95524B78238051AC005F6425 /* CloverLogOut */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
95524B75238051AC005F6425 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
954BBE972381964F0032425F /* Shared.swift in Sources */,
|
||||
95524B9023805233005F6425 /* Extensions.swift in Sources */,
|
||||
95524B8A23805210005F6425 /* NVRAM.swift in Sources */,
|
||||
95524B8E2380522A005F6425 /* bdmesg.swift in Sources */,
|
||||
95524B7D238051AC005F6425 /* main.swift in Sources */,
|
||||
95524B8C2380521D005F6425 /* Disks.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
95524B7E238051AC005F6425 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = 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_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
95524B7F238051AC005F6425 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = 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_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
95524B81238051AC005F6425 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
95524B82238051AC005F6425 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
95524B74238051AC005F6425 /* Build configuration list for PBXProject "CloverLogOut" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
95524B7E238051AC005F6425 /* Debug */,
|
||||
95524B7F238051AC005F6425 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
95524B80238051AC005F6425 /* Build configuration list for PBXNativeTarget "CloverLogOut" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
95524B81238051AC005F6425 /* Debug */,
|
||||
95524B82238051AC005F6425 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 95524B71238051AC005F6425 /* Project object */;
|
||||
}
|
7
CloverApp/CloverLogOut/CloverLogOut.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
7
CloverApp/CloverLogOut/CloverLogOut.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:CloverLogOut.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
177
CloverApp/CloverLogOut/CloverLogOut/main.swift
Normal file
177
CloverApp/CloverLogOut/CloverLogOut/main.swift
Normal file
@ -0,0 +1,177 @@
|
||||
//
|
||||
// main.swift
|
||||
// CloverLogOut
|
||||
//
|
||||
// Created by vector sigma on 16/11/2019.
|
||||
// Copyright © 2019 CloverHackyColor. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
func log(_ str: String) {
|
||||
let logUrl = URL(fileURLWithPath: "/Library/Logs/CloverEFI/clover.daemon.log")
|
||||
|
||||
if !fm.fileExists(atPath: "/Library/Logs/CloverEFI") {
|
||||
try? fm.createDirectory(at: URL(fileURLWithPath: "/Library/Logs/CloverEFI"),
|
||||
withIntermediateDirectories: false,
|
||||
attributes: nil)
|
||||
}
|
||||
|
||||
if !fm.fileExists(atPath: "/Library/Logs/CloverEFI/clover.daemon.log") {
|
||||
try? "".write(to: logUrl, atomically: false, encoding: .utf8)
|
||||
}
|
||||
|
||||
if let fh = try? FileHandle(forUpdating: logUrl) {
|
||||
fh.seekToEndOfFile()
|
||||
fh.write("\n\(str)".data(using: .utf8)!)
|
||||
fh.closeFile()
|
||||
}
|
||||
}
|
||||
|
||||
func run(cmd: String) {
|
||||
let task = Process()
|
||||
if #available(OSX 10.13, *) {
|
||||
task.executableURL = URL(fileURLWithPath: "/bin/bash")
|
||||
} else {
|
||||
task.launchPath = "/bin/bash"
|
||||
}
|
||||
task.environment = ProcessInfo.init().environment
|
||||
task.arguments = ["-c", cmd]
|
||||
task.launch()
|
||||
}
|
||||
|
||||
func saveNVRAM(nvram: NSMutableDictionary, volume: String) {
|
||||
if (nvram.object(forKey: "efi-backup-boot-device") != nil) {
|
||||
nvram.removeObject(forKey: "efi-backup-boot-device")
|
||||
}
|
||||
|
||||
if (nvram.object(forKey: "efi-backup-boot-device-data") != nil) {
|
||||
nvram.removeObject(forKey: "efi-backup-boot-device-data")
|
||||
}
|
||||
|
||||
if (nvram.object(forKey: "install-product-url") != nil) {
|
||||
nvram.removeObject(forKey: "install-product-url")
|
||||
}
|
||||
|
||||
if (nvram.object(forKey: "previous-system-uuid") != nil) {
|
||||
nvram.removeObject(forKey: "previous-system-uuid")
|
||||
}
|
||||
|
||||
if fm.fileExists(atPath: "/nvram.plist") {
|
||||
do {
|
||||
try fm.removeItem(atPath: "/nvram.plist")
|
||||
} catch {
|
||||
log("\(error)")
|
||||
}
|
||||
}
|
||||
|
||||
let bsdname = getBSDName(of: volume) ?? ""
|
||||
let uuid = getVolumeUUID(from: bsdname) ?? kNotAvailable
|
||||
if nvram.write(toFile: volume.addPath("nvram.plist"), atomically: false) {
|
||||
if volume == "/" {
|
||||
run(cmd: "chflags hidden /nvram.plist")
|
||||
}
|
||||
log("nvram correctly saved to \(volume) with UUID: \(uuid).")
|
||||
} else {
|
||||
log("Error: nvram cannot be saved to \(volume) with UUID: \(uuid).")
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
let df = DateFormatter()
|
||||
df.dateFormat = "yyyy-MM-dd hh:mm:ss"
|
||||
var now = df.string(from: Date())
|
||||
log("- CloverLogOut: begin at \(now)")
|
||||
if let nvram = getNVRAM() {
|
||||
// Check if we're running from CloverEFI
|
||||
if (nvram.object(forKey: "EmuVariableUefiPresent") != nil ||
|
||||
nvram.object(forKey: "TestEmuVariableUefiPresent") != nil) {
|
||||
|
||||
var disk : String? = nil
|
||||
var espList = [String]()
|
||||
|
||||
/* find all internal ESP in the System as we don't want
|
||||
to save the nvram in a USB pen drive (user will lost the nvram if not plugged in)
|
||||
*/
|
||||
for esp in getAllESPs() {
|
||||
if isInternalDevice(diskOrMtp: esp) {
|
||||
espList.append(esp)
|
||||
}
|
||||
}
|
||||
|
||||
// find the boot partition device and check if it is a ESP
|
||||
if let bd = findBootPartitionDevice() {
|
||||
if espList.contains(bd) {
|
||||
// boot device is a ESP :-)
|
||||
disk = bd
|
||||
log("Detected ESP \(bd) as boot device.")
|
||||
}
|
||||
}
|
||||
|
||||
if (disk == nil) {
|
||||
// boot device not found
|
||||
if espList.count > 0 {
|
||||
// we have an internal ESP, using that
|
||||
disk = espList[0]
|
||||
log("Will use ESP \(disk!) as boot device is not found.")
|
||||
} else {
|
||||
// use root
|
||||
disk = getBSDName(of: "/")
|
||||
log("Will use / as no boot device nor an internal ESP are found.")
|
||||
}
|
||||
}
|
||||
|
||||
if (disk != nil) {
|
||||
// get the mount point or mount it
|
||||
var mounted : Bool = false
|
||||
if let mp = getMountPoint(from: disk!) {
|
||||
mounted = true
|
||||
saveNVRAM(nvram: nvram, volume: mp)
|
||||
return
|
||||
}
|
||||
if !mounted {
|
||||
log("mount begin for \(disk!)..")
|
||||
var mountattempts : Int = 0
|
||||
repeat {
|
||||
mount(disk: disk!, at: nil) { (result) in
|
||||
mountattempts+=1
|
||||
sleep(1)
|
||||
if result == true {
|
||||
var attempts = 0
|
||||
repeat {
|
||||
sleep(1)
|
||||
attempts+=1
|
||||
if let mp = getMountPoint(from: disk!) {
|
||||
mounted = true
|
||||
mountattempts = 5
|
||||
saveNVRAM(nvram: nvram, volume: mp)
|
||||
sleep(1)
|
||||
umount(disk: disk!, force: true)
|
||||
break
|
||||
}
|
||||
} while (getMountPoint(from: disk!) == nil || attempts > 10)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} while mountattempts < 5
|
||||
|
||||
if !mounted {
|
||||
log("mount failed for \(disk!).")
|
||||
saveNVRAM(nvram: nvram, volume: "/")
|
||||
}
|
||||
} else {
|
||||
// CloverDaemonNew should have made the fs read-write for us.
|
||||
saveNVRAM(nvram: nvram, volume: "/")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
now = df.string(from: Date())
|
||||
log("- CloverLogOut: end at \(now)")
|
||||
}
|
||||
|
||||
main()
|
||||
|
||||
exit(EXIT_SUCCESS)
|
@ -15,6 +15,7 @@
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
9540AED62379F43E001AD0C8 /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
95C51560236B211200E4A3A8 /* CloverRunAtLogin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CloverRunAtLogin.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
95C51563236B211200E4A3A8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
95C51564236B211200E4A3A8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
||||
@ -111,6 +112,7 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
sr,
|
||||
);
|
||||
mainGroup = 95C51557236B211100E4A3A8;
|
||||
productRefGroup = 95C51561236B211200E4A3A8 /* Products */;
|
||||
@ -152,6 +154,7 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
95C5156C236B211400E4A3A8 /* Base */,
|
||||
9540AED62379F43E001AD0C8 /* sr */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
|
@ -0,0 +1,399 @@
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
|
||||
"1UK-8n-QPP.title" = "Customize Toolbar…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "CloverRunAtLogin"; ObjectID = "1Xt-HY-uBw"; */
|
||||
"1Xt-HY-uBw.title" = "CloverRunAtLogin";
|
||||
|
||||
/* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
|
||||
"1b7-l0-nxx.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
|
||||
"1tx-W0-xDw.title" = "Lower";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
|
||||
"2h7-ER-AoG.title" = "Raise";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
|
||||
"2oI-Rn-ZJC.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
|
||||
"3IN-sU-3Bg.title" = "Spelling";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
|
||||
"3Om-Ey-2VK.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
|
||||
"3rS-ZA-NoH.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
|
||||
"46P-cB-AYj.title" = "Tighten";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
|
||||
"4EN-yA-p0u.title" = "Find";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
|
||||
"4J7-dP-txa.title" = "Enter Full Screen";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Quit CloverRunAtLogin"; ObjectID = "4sb-4s-VLi"; */
|
||||
"4sb-4s-VLi.title" = "Quit CloverRunAtLogin";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
|
||||
"5QF-Oa-p0T.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
|
||||
"5Vv-lz-BsD.title" = "Copy Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "About CloverRunAtLogin"; ObjectID = "5kV-Vb-QxS"; */
|
||||
"5kV-Vb-QxS.title" = "About CloverRunAtLogin";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
|
||||
"6dh-zS-Vam.title" = "Redo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
|
||||
"78Y-hA-62v.title" = "Correct Spelling Automatically";
|
||||
|
||||
/* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
|
||||
"8mr-sm-Yjd.title" = "Writing Direction";
|
||||
|
||||
/* Class = "NSTextFieldCell"; title = "Main RunAtLogin"; ObjectID = "97q-mb-A90"; */
|
||||
"97q-mb-A90.title" = "Main RunAtLogin";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
|
||||
"9ic-FL-obx.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
|
||||
"9yt-4B-nSM.title" = "Smart Copy/Paste";
|
||||
|
||||
/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
|
||||
"AYu-sK-qS6.title" = "Main Menu";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
|
||||
"BOF-NM-1cW.title" = "Preferences…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
|
||||
"BgM-ve-c93.title" = "\tLeft to Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
|
||||
"Bw7-FT-i3A.title" = "Save As…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
|
||||
"DVo-aG-piG.title" = "Close";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
|
||||
"Dv1-io-Yv7.title" = "Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
|
||||
"F2S-fz-NVQ.title" = "Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "CloverRunAtLogin Help"; ObjectID = "FKE-Sm-Kum"; */
|
||||
"FKE-Sm-Kum.title" = "CloverRunAtLogin Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
|
||||
"Fal-I4-PZk.title" = "Text";
|
||||
|
||||
/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
|
||||
"FeM-D8-WVr.title" = "Substitutions";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
|
||||
"GB9-OM-e27.title" = "Bold";
|
||||
|
||||
/* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
|
||||
"GEO-Iw-cKr.title" = "Format";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
|
||||
"GUa-eO-cwY.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
|
||||
"Gi5-1S-RQB.title" = "Font";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
|
||||
"H1b-Si-o9J.title" = "Writing Direction";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
|
||||
"H8h-7b-M4v.title" = "View";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
|
||||
"HFQ-gK-NFA.title" = "Text Replacement";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
|
||||
"HFo-cy-zxI.title" = "Show Spelling and Grammar";
|
||||
|
||||
/* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
|
||||
"HyV-fh-RgO.title" = "View";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
|
||||
"I0S-gh-46l.title" = "Subscript";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
|
||||
"IAo-SY-fd9.title" = "Open…";
|
||||
|
||||
/* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
|
||||
"IQv-IB-iLA.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
|
||||
"J5U-5w-g23.title" = "Justify";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
|
||||
"J7y-lM-qPV.title" = "Use None";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
|
||||
"KaW-ft-85H.title" = "Revert to Saved";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
|
||||
"Kd2-mp-pUS.title" = "Show All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
|
||||
"LE2-aR-0XJ.title" = "Bring All to Front";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
|
||||
"LVM-kO-fVI.title" = "Paste Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
|
||||
"Lbh-J2-qVU.title" = "\tLeft to Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
|
||||
"MkV-Pr-PK5.title" = "Copy Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
|
||||
"NMo-om-nkz.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
|
||||
"Nop-cj-93Q.title" = "\tDefault";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
|
||||
"OY7-WF-poV.title" = "Minimize";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
|
||||
"OaQ-X3-Vso.title" = "Baseline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide CloverRunAtLogin"; ObjectID = "Olw-nP-bQN"; */
|
||||
"Olw-nP-bQN.title" = "Hide CloverRunAtLogin";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
|
||||
"OwM-mh-QMV.title" = "Find Previous";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
|
||||
"Oyz-dy-DGm.title" = "Stop Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
|
||||
"Ptp-SP-VEL.title" = "Bigger";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
|
||||
"Q5e-8K-NDq.title" = "Show Fonts";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
|
||||
"R4o-n2-Eq4.title" = "Zoom";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
|
||||
"RB4-Sm-HuC.title" = "\tRight to Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
|
||||
"Rqc-34-cIF.title" = "Superscript";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
|
||||
"Ruw-6m-B2m.title" = "Select All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
|
||||
"S0p-oC-mLd.title" = "Jump to Selection";
|
||||
|
||||
/* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
|
||||
"Td7-aD-5lo.title" = "Window";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
|
||||
"UEZ-Bs-lqG.title" = "Capitalize";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
|
||||
"VIY-Ag-zcb.title" = "Center";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
|
||||
"Vdr-fp-XzO.title" = "Hide Others";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
|
||||
"Vjx-xi-njq.title" = "Italic";
|
||||
|
||||
/* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
|
||||
"W48-6f-4Dl.title" = "Edit";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
|
||||
"WRG-CD-K1S.title" = "Underline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
|
||||
"Was-JA-tGl.title" = "New";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
|
||||
"WeT-3V-zwk.title" = "Paste and Match Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
|
||||
"Xz5-n4-O0W.title" = "Find…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
|
||||
"YEy-JH-Tfz.title" = "Find and Replace…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
|
||||
"YGs-j5-SAR.title" = "\tDefault";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
|
||||
"Ynk-f8-cLZ.title" = "Start Speaking";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
|
||||
"ZM1-6Q-yy1.title" = "Align Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
|
||||
"ZvO-Gk-QUH.title" = "Paragraph";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
|
||||
"aTl-1u-JFS.title" = "Print…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
|
||||
"aUF-d1-5bR.title" = "Window";
|
||||
|
||||
/* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
|
||||
"aXa-aM-Jaq.title" = "Font";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
|
||||
"agt-UL-0e3.title" = "Use Default";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
|
||||
"bgn-CT-cEk.title" = "Show Colors";
|
||||
|
||||
/* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
|
||||
"bib-Uj-vzu.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
|
||||
"buJ-ug-pKt.title" = "Use Selection for Find";
|
||||
|
||||
/* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
|
||||
"c8a-y6-VQd.title" = "Transformations";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
|
||||
"cDB-IK-hbR.title" = "Use None";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
|
||||
"cqv-fj-IhA.title" = "Selection";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
|
||||
"cwL-P1-jid.title" = "Smart Links";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
|
||||
"d9M-CD-aMd.title" = "Make Lower Case";
|
||||
|
||||
/* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
|
||||
"d9c-me-L2H.title" = "Text";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
|
||||
"dMs-cI-mzQ.title" = "File";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
|
||||
"dRJ-4n-Yzg.title" = "Undo";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
|
||||
"gVA-U4-sdL.title" = "Paste";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
|
||||
"hQb-2v-fYv.title" = "Smart Quotes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
|
||||
"hz2-CU-CR7.title" = "Check Document Now";
|
||||
|
||||
/* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
|
||||
"hz9-B4-Xy5.title" = "Services";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
|
||||
"i1d-Er-qST.title" = "Smaller";
|
||||
|
||||
/* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
|
||||
"ijk-EB-dga.title" = "Baseline";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
|
||||
"jBQ-r6-VK2.title" = "Kern";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
|
||||
"jFq-tB-4Kx.title" = "\tRight to Left";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
|
||||
"jxT-CU-nIS.title" = "Format";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
|
||||
"kIP-vf-haE.title" = "Show Sidebar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
|
||||
"mK6-2p-4JG.title" = "Check Grammar With Spelling";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
|
||||
"o6e-r0-MWq.title" = "Ligatures";
|
||||
|
||||
/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
|
||||
"oas-Oc-fiZ.title" = "Open Recent";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
|
||||
"ogc-rX-tC1.title" = "Loosen";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
|
||||
"pa3-QI-u2k.title" = "Delete";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
|
||||
"pxx-59-PXV.title" = "Save…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
|
||||
"q09-fT-Sye.title" = "Find Next";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
|
||||
"qIS-W8-SiK.title" = "Page Setup…";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
|
||||
"rbD-Rh-wIN.title" = "Check Spelling While Typing";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
|
||||
"rgM-f4-ycn.title" = "Smart Dashes";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
|
||||
"snW-S8-Cw5.title" = "Show Toolbar";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
|
||||
"tRr-pd-1PS.title" = "Data Detectors";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
|
||||
"tXI-mr-wws.title" = "Open Recent";
|
||||
|
||||
/* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
|
||||
"tlD-Oa-oAM.title" = "Kern";
|
||||
|
||||
/* Class = "NSMenu"; title = "CloverRunAtLogin"; ObjectID = "uQy-DD-JDr"; */
|
||||
"uQy-DD-JDr.title" = "CloverRunAtLogin";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
|
||||
"uRl-iY-unG.title" = "Cut";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
|
||||
"vKC-jM-MkH.title" = "Paste Style";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
|
||||
"vLm-3I-IUL.title" = "Show Ruler";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
|
||||
"vNY-rz-j42.title" = "Clear Menu";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
|
||||
"vmV-6d-7jI.title" = "Make Upper Case";
|
||||
|
||||
/* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
|
||||
"w0m-vy-SC9.title" = "Ligatures";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
|
||||
"wb2-vD-lq4.title" = "Align Right";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
|
||||
"wpr-3q-Mcd.title" = "Help";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
|
||||
"x3v-GG-iWU.title" = "Copy";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
|
||||
"xQD-1f-W4t.title" = "Use All";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
|
||||
"xrE-MZ-jX0.title" = "Speech";
|
||||
|
||||
/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
|
||||
"z6F-FW-3nz.title" = "Show Substitutions";
|
@ -12,13 +12,13 @@
|
||||
|
||||
/* top bar menu */
|
||||
"N/A" = "N/D"; // not available (please be short)
|
||||
"Install Clover" = "Install Clover";
|
||||
"Current Clover revision" = "Current Clover revision";
|
||||
"Boot device" = "Boot Device";
|
||||
"config path:" = "config path:";
|
||||
"Install Clover" = "Pasang Clover";
|
||||
"Current Clover revision" = "Revisi Clover Terkini";
|
||||
"Boot device" = "Device Boot";
|
||||
"config path:" = "Lokasi config:";
|
||||
|
||||
"Clover wants to mount %@" = "Clover wants to mount %@";
|
||||
"Clover wants to umount %@" = "Clover wants to umount %@";
|
||||
"Clover wants to mount %@" = "Clover ingin mount %@";
|
||||
"Clover wants to umount %@" = "Clover ingin umount %@";
|
||||
"Mount" = "Mount";
|
||||
"umount" = "umount";
|
||||
"mount point" = "mount point";
|
||||
@ -28,136 +28,131 @@
|
||||
|
||||
"Theme:" = "Theme:";
|
||||
"Sound:" = "Sound:";
|
||||
"*Make filesystem read-write" = "*Make filesystem read-write";
|
||||
"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client";
|
||||
"*Require CloverDaemon" = "*Require CloverDaemon";
|
||||
"Read daemon log" = "Read daemon log";
|
||||
"Read bdmesg" = "Read boot log";
|
||||
"*Make filesystem read-write" = "*Jadikan FileSystem Read-Write";
|
||||
"*Disable Sleep Proxy Client" = "*Tiadakan Sleep Proxy Client";
|
||||
"*Require CloverDaemon" = "*Butuh CloverDaemon";
|
||||
"Read daemon log" = "Baca daemon log";
|
||||
"Read bdmesg" = "Baca boot log";
|
||||
|
||||
"Install CloverDaemonNew" = "Install CloverDaemonNew";
|
||||
"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew";
|
||||
"Install CloverDaemonNew" = "Pasang CloverDaemonNew";
|
||||
"Uninstall CloverDaemonNew" = "Copot CloverDaemonNew";
|
||||
|
||||
"Update" = "Update";
|
||||
"Update to r%d" = "Update to r%d"; // "Update to r5101"
|
||||
"Check update:" = "Check update:";
|
||||
"Check now" = "Check now";
|
||||
"Update" = "Perbarui";
|
||||
"Update to r%d" = "Perbarui ke r%d"; // "Update to r5101"
|
||||
"Check update:" = "Periksa Pembaruan:";
|
||||
"Check now" = "Periksa Sekarang";
|
||||
|
||||
"never" = "never";
|
||||
"daily" = "daily";
|
||||
"weekly" = "weekly";
|
||||
"monthly" = "monthly";
|
||||
"last checked:" = "last checked:"; // last date update was checked. Please be short.
|
||||
"never" = "Tak Pernah";
|
||||
"daily" = "Harian";
|
||||
"weekly" = "Mingguan";
|
||||
"monthly" = "Bulanan";
|
||||
"last checked:" = "Terakhir Periksa:"; // last date update was checked. Please be short.
|
||||
|
||||
"Run at login" = "Run at login";
|
||||
"Close" = "Close"; // Close the Clover.app
|
||||
"Run at login" = "Jalankan saat Login";
|
||||
"Close" = "Tutup"; // Close the Clover.app
|
||||
|
||||
/* Installer */
|
||||
"Clover Installer" = "Clover Installer";
|
||||
"Select a disk.." = "Select a disk..";
|
||||
"Install" = "Install";
|
||||
"Uninstall" = "Uninstall";
|
||||
"AltBoot" = "Alternative boot";
|
||||
"Clover Installer" = "Installer Clover";
|
||||
"Select a disk.." = "Pilih Disk..";
|
||||
"Install" = "Pasang";
|
||||
"Uninstall" = "Copot";
|
||||
"AltBoot" = "Boot Alternatif";
|
||||
|
||||
/* Drivers */
|
||||
"UEFI mandatory" = "UEFI mandatory";
|
||||
"BIOS mandatory" = "BIOS mandatory";
|
||||
"UEFI/Other" = "UEFI/Other";
|
||||
"BIOS/Other" = "BIOS/Other";
|
||||
"UEFI, but not from this installer" = "UEFI, but not from this installer";
|
||||
"BIOS, but not from this installer" = "BIOS, but not from this installer";
|
||||
"UEFI mandatory" = "Penting bagi UEFI";
|
||||
"BIOS mandatory" = "Penting bagi BIOS";
|
||||
"UEFI/Other" = "UEFI (Tambahan)";
|
||||
"BIOS/Other" = "BIOS (Tambahan)";
|
||||
"UEFI, but not from this installer" = "UEFI, dari sumber lain";
|
||||
"BIOS, but not from this installer" = "BIOS, dari sumber lain";
|
||||
|
||||
"UEFI/FileSystem" = "UEFI, filesystem drivers";
|
||||
"BIOS/FileSystem" = "BIOS, filesystem drivers";
|
||||
"UEFI/FileSystem" = "UEFI, drivers File System";
|
||||
"BIOS/FileSystem" = "BIOS, drivers File System";
|
||||
|
||||
"UEFI/HID" = "UEFI, Human Interface Devices";
|
||||
"BIOS/HID" = "BIOS, Human Interface Devices";
|
||||
"UEFI/HID" = "UEFI, drivers Perangkat HID";
|
||||
"BIOS/HID" = "BIOS, drivers Perangkat HID";
|
||||
|
||||
"UEFI/FileVault2" = "UEFI, FileVault 2 drivers";
|
||||
"BIOS/FileVault2" = "BIOS, FileVault 2 drivers";
|
||||
"UEFI/FileVault2" = "UEFI, drivers FileVault2";
|
||||
"BIOS/FileVault2" = "BIOS, drivers FileVault2";
|
||||
|
||||
"UEFI/MemoryFix" = "UEFI, memory fix drivers";
|
||||
"UEFI/MemoryFix" = "UEFI, drivers Memory Fix";
|
||||
|
||||
"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers";
|
||||
"ApfsDriverLoader.efi" = "Driver untuk memuat File System APFS dari Container bagi macOS 10.13 atau yang lebih baru.";
|
||||
|
||||
"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2.";
|
||||
"AppleImageCodec.efi" = "Untuk decode gambar PNG dan BMP pada UI Boot.";
|
||||
|
||||
"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification.";
|
||||
"AppleImageLoader.efi" = "Mengamankan binary driver AppleEfiFat menggunakan implementasi protokol AppleLoadImage dengan verifikasi signature EfiBinary.";
|
||||
|
||||
"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2.";
|
||||
"AppleKeyAggregator.efi" = "Dukungan bagi Dialog UI Boot untuk FileVault2.";
|
||||
|
||||
"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2.";
|
||||
"AppleKeyFeeder.efi" = "Dukungan Keyboard PS/2 untuk digunakan dengan FileVault2.";
|
||||
|
||||
"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault.";
|
||||
"AppleUISupport.efi" = "Rangkaian protokol untuk mendukung EfiLoginUi bagi FileVault2.";
|
||||
|
||||
"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2.";
|
||||
"AppleUITheme.efi" = "Mendukung Themes UI saat boot.";
|
||||
|
||||
"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio.";
|
||||
"AptioInputFix.efi" = "Driver untuk membenahi masalah Input pada firmware UEFI, misalnya AMI Aptio.";
|
||||
|
||||
"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together.";
|
||||
"AptioMemoryFix.efi" = "Driver pilihan untuk membenahi masalah Memori pada firmware UEFI, misalnya AMI Aptio. Firmware lainnya mungkin juga kompatibel.";
|
||||
|
||||
"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot.
|
||||
Configure it via Startup sound output from Option menu, including:
|
||||
Volume and Audio device (for supported IOAudio devices only).";
|
||||
"AudioDxe.efi" = "Driver HDA untuk memainkan Startup Sound ketika Boot. Atur terlebih dahulu perangkat dan Volume Audio melalui Startup sound output yang ada di menu Options. Tidak semua perangkat IOAudio didukung, butuh NVRAM aktif.";
|
||||
|
||||
"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2.";
|
||||
"FirmwareVolume.efi" = "Membuat FirmwareVolume dengan gambar cursor untuk FileVault2.";
|
||||
|
||||
"FSInject.efi" = "Provide injection of kernel extensions from Clover folder.";
|
||||
"FSInject.efi" = "Menyediakan injeksi kexts dari folder CLOVER.";
|
||||
|
||||
"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB.";
|
||||
"GrubEXFAT.efi" = "Driver File System ExFAT dari GRUB.";
|
||||
|
||||
"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB.";
|
||||
"GrubISO9660.efi" = "Driver File System ISO9600 dari GRUB.";
|
||||
|
||||
"GrubNTFS.efi" = "NTFS filesystem driver from GRUB.";
|
||||
"GrubNTFS.efi" = "Driver File System NTFS dari GRUB.";
|
||||
|
||||
"GrubUDF.efi" = "UDF filesystem driver from GRUB.";
|
||||
"GrubUDF.efi" = "Driver File System UDF dari GRUB.";
|
||||
|
||||
"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC.";
|
||||
"SMCHelper.efi" = "Memulihkan keys FakeSMC dari NVRAM";
|
||||
|
||||
"XhciDxe.efi" = "USB 3.0 driver";
|
||||
"XhciDxe.efi" = "Driver USB 3.0";
|
||||
|
||||
"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2.";
|
||||
"AppleEvent.uefi" = "Membuat protokol AppleEvent untuk FileVault2.";
|
||||
|
||||
"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol.";
|
||||
"AppleGraphicsConfig.uefi" = "Membuat protokol AppleGraphicsConfig opsional.";
|
||||
|
||||
"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled.
|
||||
Clover may not started with it and you may have wake problem in system. Use with precautions.";
|
||||
"CsmVideoDxe.efi" = "Driver video untuk GUI Clover yang mendukung lebih banyak resolusi. Bergantung modul CSM di UEFI BIOS, sehingga ia menjadi enabled. Ini bisa berakibat Clover gagal Boot dan Wake di sistem bermasalah. Gunakan dengan hati-hati.";
|
||||
|
||||
"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS.
|
||||
Usually it is already present but sometime it may be missed. In this case you should see warning on screen.";
|
||||
"DataHubDxe.efi" = "Dukungan protokol DataHub yang dibutuhkan oleh MacOS. Biasanya sudah tersedia namun kadang-kadang hilang. Jika terlewatkan, maka akan muncul peringatan di layar.";
|
||||
|
||||
"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware.
|
||||
Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it";
|
||||
"EmuVariableUefi.efi" = "Solusi masalah penyimpanan variabel NVRAM di Sistem tanpa perangkat UEFI. Biasanya UEFI boot memakai NVRAM dari perangkat, namun dalam kasus tertentu driver ini tetap dibutuhkan. Gunakan (hanya) jika tanpa memakainya, Anda menemui kendala.";
|
||||
|
||||
"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI.";
|
||||
"EnglishDxe.efi" = "Dukungan protokol UnicodeCollation bagi EFI Shell jika firmware UEFI tidak menyediakan.";
|
||||
|
||||
"Fat.efi" = "FAT filesystem driver.";
|
||||
"Fat.efi" = "Driver File System FAT.";
|
||||
|
||||
"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS.";
|
||||
"HashServiceFix.efi" = "Mendukung Hash jika firmware UEFI native tidak menyediakan.";
|
||||
|
||||
"HFSPlus.efi" = "Alternate HFS+ filesystem driver.";
|
||||
"HFSPlus.efi" = "Driver File System HFS+ (versi alternatif).";
|
||||
|
||||
"NvmExpressDxe.efi" = "Driver for support NVM Express devices.";
|
||||
"NvmExpressDxe.efi" = "Driver untuk mendukung perangkat NVMExpress.";
|
||||
|
||||
"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together.";
|
||||
"OsxAptioFix3Drv.efi" = "Driver alternatif (v3) untuk membenahi masalah Memory di firmware UEFI.";
|
||||
|
||||
"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together.";
|
||||
"OsxAptioFixDrv.efi" = "Driver lawas untuk membenahi masalah Memory pada firmware UEFI misalnya AMI Aptio.";
|
||||
|
||||
"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older.";
|
||||
"OsxFatBinaryDrv.efi" = "Driver untuk mendukung FAT Binary executables bagi OS X 10.9 atau versi sebelumnya.";
|
||||
|
||||
"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together.";
|
||||
"OsxLowMemFixDrv.efi" = "Varian sederhana driver OsxAptioFixDrv (jangan pakai bersamaan).";
|
||||
|
||||
"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map.";
|
||||
"PartitionDxe.efi" = "Driver untuk dukungan Skema Partisi yang tidak biasa, semisal: Hybrid GPT/MBR atau Apple Partition Map.";
|
||||
|
||||
"Ps2MouseDxe.efi" = "PS/2 mouse driver";
|
||||
"Ps2MouseDxe.efi" = "Driver Mouse PS/2";
|
||||
|
||||
"UsbKbDxe.efi" = "Keyboard driver for boot UI support.";
|
||||
"UsbKbDxe.efi" = "Driver Keyboard USB, untuk dukungan UI boot";
|
||||
|
||||
"UsbMouseDxe.efi" = "USB mouse driver";
|
||||
"UsbMouseDxe.efi" = "Driver Mouse USB";
|
||||
|
||||
"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox.";
|
||||
"VBoxExt2.efi" = "Driver File System EXT2/3 dari VirtualBox.";
|
||||
|
||||
"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox.";
|
||||
"VBoxExt4.efi" = "Driver File System EXT4 dari VirtualBox.";
|
||||
|
||||
"VBoxHfs.efi" = "HFS+ filesystem driver.";
|
||||
"VBoxHfs.efi" = "Driver File System HFS+ dari VirtualBox.";
|
||||
|
||||
"VBoxIso9600.efi" = "ISO 9600 filesystem driver.";
|
||||
"VBoxIso9600.efi" = "Driver File System ISO 9600.";
|
||||
|
163
CloverApp/Lang.bundle/Contents/Resources/sr.strings
Normal file
163
CloverApp/Lang.bundle/Contents/Resources/sr.strings
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
Clover.app
|
||||
|
||||
Created by vector sigma on 27/10/2019.
|
||||
Copyright © 2019 CloverHackyColor. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
Hi, some of the views are set to have a fixed width, but other may automatically
|
||||
enlarge the affecting view, so please consider to translate this file keeping in mind this.
|
||||
*/
|
||||
|
||||
/* top bar menu */
|
||||
"N/A" = "N/V"; // not available (please be short)
|
||||
"Install Clover" = "Instalirajte Clover";
|
||||
"Current Clover revision" = "Trenutna verzija Clover-a";
|
||||
"Boot device" = "Uređaj za podizanje sastava";
|
||||
"config path:" = "Putanja za konfiguraciju:";
|
||||
|
||||
"Clover wants to mount %@" = "Clover želi %@ mount";
|
||||
"Clover wants to umount %@" = "Clover želi %@ unmount";
|
||||
"Mount" = "Mount";
|
||||
"umount" = "Unmount";
|
||||
"mount point" = "mount point";
|
||||
|
||||
"true" = "tačno";
|
||||
"false" = "Lažno";
|
||||
|
||||
"Theme:" = "Tema:";
|
||||
"Sound:" = "Zvuk:";
|
||||
"*Make filesystem read-write" = "*Filesystem čine čitanje-Pisanje";
|
||||
"*Disable Sleep Proxy Client" = "*Sleep Proxy Client deaktiviran";
|
||||
"*Require CloverDaemon" = "*Tražiti CloverDaemon";
|
||||
"Read daemon log" = " Čitanje Daemon log";
|
||||
"Read bdmesg" = " Čitanje Boot log";
|
||||
|
||||
"Install CloverDaemonNew" = "Instalirati CloverDaemonNew";
|
||||
"Uninstall CloverDaemonNew" = "Deinstalirati CloverDaemonNew";
|
||||
|
||||
"Update" = "Ažuriranje";
|
||||
"Update to r%d" = "Ažurirati Verziju r%d Aktuelnu"; // "Update to r5101"
|
||||
"Check update:" = "Proveriti trenutnu verziju:";
|
||||
"Check now" = "Proveriti sada";
|
||||
|
||||
"never" = "Nikada";
|
||||
"daily" = "Dnevno";
|
||||
"weekly" = "Nedeljno";
|
||||
"monthly" = "Mesečno";
|
||||
"last checked:" = "Poslednja proverat:"; // last date update was checked. Please be short.
|
||||
|
||||
"Run at login" = "Pokrenuti pri prijavi";
|
||||
"Close" = "Zatvoriti"; // Close the Clover.app
|
||||
|
||||
/* Installer */
|
||||
"Clover Installer" = "Clover Instalacija";
|
||||
"Select a disk.." = "Selektuj disk..";
|
||||
"Install" = "Instaliraj";
|
||||
"Uninstall" = "Deinstaliraj";
|
||||
"AltBoot" = "AltBoot";
|
||||
|
||||
/* Drivers */
|
||||
"UEFI mandatory" = "UEFI mandatory";
|
||||
"BIOS mandatory" = "BIOS mandatory";
|
||||
"UEFI/Other" = "UEFI/Other";
|
||||
"BIOS/Other" = "BIOS/Other";
|
||||
"UEFI, but not from this installer" = "UEFI, ali ne sa ovog instalera";
|
||||
"BIOS, but not from this installer" = "BIOS, ali ne sa ovog instalera";
|
||||
|
||||
"UEFI/FileSystem" = "UEFI, Filesystem";
|
||||
"BIOS/FileSystem" = "BIOS, Filesystem";
|
||||
|
||||
"UEFI/HID" = "UEFI, Human Interface Uređaj";
|
||||
"BIOS/HID" = "BIOS, Human Interface Uređaj";
|
||||
|
||||
"UEFI/FileVault2" = "UEFI, FileVault 2 Uređaj";
|
||||
"BIOS/FileVault2" = "BIOS, FileVault 2 Uređaj";
|
||||
|
||||
"UEFI/MemoryFix" = "UEFI, Popravka Memorijskog Uređaj";
|
||||
|
||||
"ApfsDriverLoader.efi" = "Podržava APFS Filesystem za =>macOS 10.13 Containern";
|
||||
|
||||
"AppleImageCodec.efi" = "Dekodira PNG und BMP za FileVault2.";
|
||||
|
||||
"AppleImageLoader.efi" = "Osigurajte AppleEfiFat binarni upravljački program s implementacijom AppleLoadImage protokola i provjerom potpisa EfiBinary.";
|
||||
|
||||
"AppleKeyAggregator.efi" = "Podrška za boot UI dijalog za FileVault2.";
|
||||
|
||||
"AppleKeyFeeder.efi" = "PS/2 Tastatura Podrška za korišćenje FileVault 2.";
|
||||
|
||||
"AppleUISupport.efi" = "Podrška za protokol EfiLoginUi za FileVault.";
|
||||
|
||||
"AppleUITheme.efi" = "Stvaranje UI Themes Boot podrške za FileVault2.";
|
||||
|
||||
"AptioInputFix.efi" = "Drajver za pomoć kod problema sa UEFI firmware kod AMI Aptio.";
|
||||
|
||||
"AptioMemoryFix.efi" = "Trenutno se preporučuje 64-bitni upravljački program za rešavanje problema s memorijom u UEFI firmware-u AMI Aptio. Ovaj upravljački program NE sme da se koristiti s drugim upravljačkim programima AptioFix.";
|
||||
|
||||
"AudioDxe.efi" = "HDA Dajver koji podržava zvuki pri pokretanju.
|
||||
Konfigurisanje zvuka pokretanja putem izbornika Option, uključujući:
|
||||
Glasnoća i audio uređaj (samo za podržane audio uređaje).";
|
||||
|
||||
"FirmwareVolume.efi" = "Stvara volumen firmvera sa slikama kursora za FileVault2.";
|
||||
|
||||
"FSInject.efi" = "Omogućuje integraciju proširenja kernela spremljenih u mapi Clover.";
|
||||
|
||||
"GrubEXFAT.efi" = "Upravljački program za datotečni sistem ExFAT.";
|
||||
|
||||
"GrubISO9660.efi" = "Upravljački program za datoteku sistema ISO9600.";
|
||||
|
||||
"GrubNTFS.efi" = "Upravljački program za NTFS datoteku sistema.";
|
||||
|
||||
"GrubUDF.efi" = "Upravljački program za UDF datoteku sistema.";
|
||||
|
||||
"SMCHelper.efi" = "Vraćanje NVRAM SMC ključa pomoću FakeSMC.";
|
||||
|
||||
"XhciDxe.efi" = "USB 3.0 Podrška";
|
||||
|
||||
"AppleEvent.uefi" = "Stvara AppleEvent Protokol za FileVault2.";
|
||||
|
||||
"AppleGraphicsConfig.uefi" = "Stvaranje opcionalnog AppleGraphicsConfig Protokola.";
|
||||
|
||||
"CsmVideoDxe.efi" = "64-bitni upravljački program za Clovers GUI omogućava vam više rezolucija. Na osnovu CSM modula UEFI biosa, CSM se tamo mora aktivirati. Clover se možda neće pokrenuti, mogu nastati i problemi s buđenjem sistema..
|
||||
Molimo vas poduzmite mere predostrožnosti.";
|
||||
|
||||
"DataHubDxe.efi" = "Podrška za protokol Essential DataHub za macOS.
|
||||
Obično su već dostupni, ali ponekad nedostaju. U tom slučaju trebali biste vidjeti poruku o pogrešci.";
|
||||
|
||||
"EmuVariableUefi.efi" = "Zaustavljanje za pripremu UEFI varijabli bez postojećeg UEFI. 64-bitni upravljački program za podršku NVRAM varijabli koje zahtijeva macOS. Većinu vremena UEFI dizanje koristi hardverski NVRAM, ali u nekoliko slučajeva je ovaj driajver potreban.
|
||||
Ovaj upravljački program koristite samo ako postoje problemi bez njega.";
|
||||
|
||||
"EnglishDxe.efi" = "Podrška za Unicode Collation protokol za EFI Shell ne bi trebala postojati u UEFI.";
|
||||
|
||||
"Fat.efi" = "Upravljački program za FAT datoteku sistema.";
|
||||
|
||||
"HashServiceFix.efi" = "Pruža hash podršku ako nijedna nije prisutna u rodnom UEFI BIOS-u.";
|
||||
|
||||
"HFSPlus.efi" = "Alternativni drajver za HFS + datoteka sistema.";
|
||||
|
||||
"NvmExpressDxe.efi" = "Drajver za podršku NVM Express uređaje.";
|
||||
|
||||
"OsxAptioFix3Drv.efi" = "Alternativni drajver (v3) za rešavanje problema s memorijom u UEFI firmveru. Ovaj upravljački program NE sme se koristiti s drugim upravljačkim programima AptioFix.";
|
||||
|
||||
"OsxAptioFixDrv.efi" = "Stari upravljački program za ispravljanje problema s memorijom softvera UEFI, kao što je u AMI Aptio. Ovaj upravljački program NE sme se koristiti s drugim upravljačkim programima AptioFix.";
|
||||
|
||||
"OsxFatBinaryDrv.efi" = "Upravljački program za podršku FAT Binary izvršnih datoteka za macOS 10.9 i starije verzije.";
|
||||
|
||||
"OsxLowMemFixDrv.efi" = "Jednostavna verzija OsxAptioFixDrv, 64bit. ! Nikada ne koristite ovaj upravljački program s drugim AptioFix upravljačkim programima !";
|
||||
|
||||
"PartitionDxe.efi" = "64-bitni upravljački program koji podržava neobične tablice particija, kao što su GPT / MBR ili Apple particijska mapa.";
|
||||
|
||||
"Ps2MouseDxe.efi" = "Podrška PS/2 Maus, 64bit";
|
||||
|
||||
"UsbKbDxe.efi" = "Upravljački program za podršku tastature u korisničko sučelje tokom pokretanja.";
|
||||
|
||||
"UsbMouseDxe.efi" = "Drajver za USB miš, 64bit";
|
||||
|
||||
"VBoxExt2.efi" = "Upravljački program za datoteku sistema ext2 / 3 iz VirtualBox-a, 64bit";
|
||||
|
||||
"VBoxExt4.efi" = "Upravljački program za datoteku sistema ext4 iz VirtualBoxa, 64bit";
|
||||
|
||||
"VBoxHfs.efi" = "Upravljački program za HFS + datoteku sistema.";
|
||||
|
||||
"VBoxIso9600.efi" = "Upravljački program za ISO 9600 datoteku sistema.";
|
@ -5,25 +5,26 @@
|
||||
|
||||
cd /tmp
|
||||
|
||||
journaled=0
|
||||
boot1install="/tmp/boot1-install" # must be there
|
||||
|
||||
disk="${1}"
|
||||
filesystem="${2}"
|
||||
partition_scheme="${3}"
|
||||
boot0="/tmp/${4}"
|
||||
boot1="/tmp/${5}"
|
||||
# arguments
|
||||
disk="${1}" # disk0s1
|
||||
filesystem="${2}" # fat32, hfs, exfat
|
||||
partition_scheme="${3}" # FDisk_partition_scheme, GUID_partition_scheme
|
||||
boot0="/tmp/${4}" # /tmp/boot0af, /tmp/boot0ss
|
||||
boot1="/tmp/${5}" # /tmp/boot1h, /tmp/boot1f32, /tmp/boot1x etc.
|
||||
|
||||
bootdev="/dev/${disk}"
|
||||
bootrdev=${bootdev/disk/rdisk}
|
||||
|
||||
bootdisk="${bootdev%s*}"
|
||||
bootrdisk="${bootdisk/disk/rdisk}"
|
||||
bootslice="${bootdev#*disk*s}"
|
||||
|
||||
boot1install="/tmp/boot1-install"
|
||||
keepmounted=0
|
||||
journaled=0
|
||||
|
||||
echo
|
||||
echo "Installing boot sectors (version of Wed 6 2019, 12:03)"
|
||||
echo "Installing boot sectors (version of Sun 17 2019, 12:14)"
|
||||
echo
|
||||
echo "disk: ${disk}"
|
||||
echo "bootdev: ${bootdev}"
|
||||
@ -35,8 +36,8 @@ echo "filesystem: ${filesystem}"
|
||||
echo "partition_scheme: ${partition_scheme}"
|
||||
echo
|
||||
|
||||
if [[ "$disk" != disk* ]]; then
|
||||
echo "Error: target disk not specified."
|
||||
if [[ "$disk" != disk*s* ]]; then
|
||||
echo "Error: target disk not specified or not in the correct format as diskXsY."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@ -54,20 +55,31 @@ if [ "${filesystem}" != fat32 ] && \
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${boot0}" ]] || [[ ! -f "${boot1}" ]]; then
|
||||
echo "Error: cannot found boot sectors."
|
||||
if [[ ! -f "${boot0}" ]]; then
|
||||
echo "Error: cannot found /tmp/boot0[af-ss] sector."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${boot1}" ]]; then
|
||||
echo "Error: cannot found /tmp/boot1[1f32-h-x] sector."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${boot1install}" ]]; then
|
||||
echo "Error: cannot found boot1-install."
|
||||
echo "Error: cannot found /tmp/boot1-install."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
chmod +x "${boot1install}"
|
||||
|
||||
rootdisk=$(LC_ALL=C diskutil info / | grep -i 'device identifier:' | awk '{print $NF}')
|
||||
|
||||
if [[ "${rootdisk}" == "${disk}" ]]; then
|
||||
keepmounted=1
|
||||
fi
|
||||
|
||||
echo
|
||||
diskutil list
|
||||
LC_ALL=C diskutil list
|
||||
echo
|
||||
|
||||
# hfs can cause a panic writing boot sectors if journaled
|
||||
@ -77,13 +89,14 @@ echo
|
||||
# panic("jnl: end_tr: !!!DANGER!!! bp %p flags (0x%x) not LOCKED & DELWRI\n", bp, buf_flags(bp));
|
||||
|
||||
# fix? disable the journal (will be reactivated later)
|
||||
if [[ $(LC_ALL=C diskutil info "${disk}" | grep 'File System Personality:') == *ournaled* ]]; then
|
||||
if [[ $(LC_ALL=C diskutil info "${disk}" | grep -i 'file system personality:') == *ournaled* ]]; then
|
||||
diskutil disableJournal "${disk}"
|
||||
journaled=1
|
||||
fi
|
||||
|
||||
# Try to unmount the partition first
|
||||
mnt_pt=$(LC_ALL=C mount | egrep "^$bootdev on" | sed 's/^.* on *//;s/ ([^(]*//')
|
||||
if [[ $keepmounted -eq 0 ]]; then
|
||||
if [[ -n "$mnt_pt" ]]; then
|
||||
# Try to umount the partition with umount
|
||||
umount $bootdev 2>/dev/null
|
||||
@ -93,6 +106,7 @@ if [[ -n "$mnt_pt" ]]; then
|
||||
[[ $? -ne 0 ]] && mnt_pt=''
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
### Stage 0 ###
|
||||
echo "Stage 0 - Writing ${boot0} to ${bootrdisk}"
|
||||
@ -105,48 +119,16 @@ dd if="${boot0}" of=/tmp/CloverNewMBR bs=440 count=1 conv=notrunc
|
||||
echo "Executing: fdisk -f /tmp/CloverNewMBR -u -y ${bootrdisk}"
|
||||
fdisk -f /tmp/CloverNewMBR -u -y "${bootrdisk}"
|
||||
|
||||
|
||||
if [[ ${filesystem} = "hfs" ]]; then
|
||||
### Stage 1 ###
|
||||
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
|
||||
echo "File system is HFS."
|
||||
echo "Executing: dd if=${boot1} of=${bootrdev}"
|
||||
dd if="${boot1}" of="${bootrdev}"
|
||||
|
||||
elif [[ ${filesystem} = "fat32" ]]; then
|
||||
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
|
||||
|
||||
# copy partition boot sector to CloverOrigPBR
|
||||
echo "Executing: dd if=${bootrdev} count=1 bs=512 of=/tmp/CloverOrigPBR"
|
||||
dd if="${bootrdev}" count=1 bs=512 of=/tmp/CloverOrigPBR
|
||||
|
||||
if [[ -n $(cat /tmp/CloverOrigPBR | grep FAT16) ]]; then
|
||||
echo "boot volume format is FAT16"
|
||||
echo "No Stage1 was written"
|
||||
if [[ $keepmounted -eq 0 ]]; then
|
||||
echo "Executing: boot1-install -y -f -M "${boot1}" "${bootrdev}"
|
||||
"$boot1install" -y -f -M "${boot1}" "${bootrdev}"
|
||||
else
|
||||
echo "boot volume format is FAT32"
|
||||
# copy boot1f32 to CloverNewPBR
|
||||
echo "Executing: cp ${boot1} /tmp/CloverNewPBR"
|
||||
cp -f "${boot1}" /tmp/CloverNewPBR
|
||||
|
||||
# "merge" CloverOrigPBR into CloverNewPBR
|
||||
echo "Executing: dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc"
|
||||
dd if=/tmp/CloverOrigPBR of=/tmp/CloverNewPBR skip=3 seek=3 bs=1 count=87 conv=notrunc
|
||||
|
||||
# write CloverNewPBR to the partition boot sector
|
||||
echo "Executing: dd if=/tmp/CloverNewPBR of=${bootrdev}"
|
||||
dd if=/tmp/CloverNewPBR count=1 bs=512 of="${bootrdev}"
|
||||
fi
|
||||
elif [[ ${filesystem} = "exfat" ]]; then
|
||||
echo "Stage 1 - Writing ${boot1} to ${bootrdev}"
|
||||
echo "File system is ExFat."
|
||||
echo "Executing: $boot1install -y -f ${boot1} ${bootrdev}"
|
||||
echo "Executing: boot1-install -y -f "${boot1}" "${bootrdev}"
|
||||
"$boot1install" -y -f "${boot1}" "${bootrdev}"
|
||||
else
|
||||
echo "Unknown boot volume format: $filesystem"
|
||||
echo "No Stage1 was written"
|
||||
fi
|
||||
|
||||
|
||||
# Now try to remount the partition
|
||||
if [[ -n "$mnt_pt" ]]; then
|
||||
[[ ! -d "$mnt_pt" ]] && mkdir -p "$mnt_pt"
|
||||
|
Loading…
Reference in New Issue
Block a user