Skip to content

Instantly share code, notes, and snippets.

@AbodiDawoud
Created March 2, 2026 21:25
Show Gist options
  • Select an option

  • Save AbodiDawoud/6d90898b619ccef4b9b95d88865d8252 to your computer and use it in GitHub Desktop.

Select an option

Save AbodiDawoud/6d90898b619ccef4b9b95d88865d8252 to your computer and use it in GitHub Desktop.
import Foundation
import CoreFoundation
@main
struct CleanDesktop {
enum Action: String { case status, on, off, toggle }
private static let wmDomainString = "com.apple.WindowManager"
private static let finderDomainString = "com.apple.finder"
// Keys as String too (avoid static CFString)
private static let widgetsDesktopKeyString = "StandardHideWidgets" // true = hide, false = show
private static let finderCreateDesktopKeyString = "CreateDesktop" // true = show icons, false = hide icons
// MARK: - Process restart helpers
private static func run(_ launchPath: String, _ args: [String]) {
let p = Process()
p.executableURL = URL(fileURLWithPath: launchPath)
p.arguments = args
do { try p.run(); p.waitUntilExit() } catch { /* ignore */ }
}
private static func restartFinder() { run("/usr/bin/killall", ["Finder"]) }
private static func restartDock() { run("/usr/bin/killall", ["Dock"]) }
// MARK: - CLI
private static func usageAndExit() -> Never {
let exe = (CommandLine.arguments.first as NSString?)?.lastPathComponent ?? "cleandesktop"
fputs("""
Usage:
\(exe) status
\(exe) on
\(exe) off
\(exe) toggle
Behavior:
- Desktop widgets: toggles WindowManager '\(widgetsDesktopKeyString)' (true=hide)
- Desktop icons: toggles Finder '\(finderCreateDesktopKeyString)' (true=show)
on => show widgets + show icons
off => hide widgets + hide icons
toggle => flips both independently
""", stderr)
exit(2)
}
static func main() {
guard CommandLine.arguments.count >= 2,
let action = Action(rawValue: CommandLine.arguments[1].lowercased()) else {
usageAndExit()
}
func state() -> (widgetsHidden: Bool?, iconsShown: Bool?) {
let widgetsHidden = readBool(domainString: wmDomainString, keyString: widgetsDesktopKeyString)
let iconsShown = readBool(domainString: finderDomainString, keyString: finderCreateDesktopKeyString)
return (widgetsHidden, iconsShown)
}
func set(showWidgets: Bool, showIcons: Bool) {
// widgetsHidden = !showWidgets
_ = writeBool(!showWidgets, domainString: wmDomainString, keyString: widgetsDesktopKeyString)
_ = writeBool(showIcons, domainString: finderDomainString, keyString: finderCreateDesktopKeyString)
restartDock()
restartFinder()
}
switch action {
case .status:
let s = state()
let widgets = s.widgetsHidden.map { "hidden=\($0) (show=\(!$0))" } ?? "hidden=<unset>"
let icons = s.iconsShown.map { "shown=\($0)" } ?? "shown=<unset>"
print("widgets(desktop): \(widgets)")
print("finder icons: \(icons)")
case .on:
set(showWidgets: true, showIcons: true)
case .off:
set(showWidgets: false, showIcons: false)
case .toggle:
let s = state()
// Defaults if unset: widgets are shown (hidden=false), icons are shown (CreateDesktop=true)
let widgetsCurrentlyShown = !(s.widgetsHidden ?? false)
let iconsCurrentlyShown = (s.iconsShown ?? true)
set(showWidgets: !widgetsCurrentlyShown, showIcons: !iconsCurrentlyShown)
}
}
private static func readBool(domainString: String, keyString: String) -> Bool? {
let domain = domainString as CFString
let key = keyString as CFString
let value = CFPreferencesCopyValue(key, domain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
guard let value else { return nil }
if CFGetTypeID(value) == CFBooleanGetTypeID() {
return (value as! Bool)
}
if CFGetTypeID(value) == CFNumberGetTypeID() {
var n: Int32 = 0
if CFNumberGetValue((value as! CFNumber), .sInt32Type, &n) { return n != 0 }
}
return nil
}
@discardableResult
private static func writeBool(_ b: Bool, domainString: String, keyString: String) -> Bool {
let domain = domainString as CFString
let key = keyString as CFString
CFPreferencesSetValue(key, b as CFBoolean, domain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
return CFPreferencesSynchronize(domain, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment