How to loop through all Mac desktop spaces

Viewed 2198

I'm trying to set a desktop background for all screens AND spaces (preexisting and new). However, I can't seem to find a way to set the background for all the existing spaces (and any new spaces created use the old background).

Here is what I have so far:

let sqlData = NSMutableArray()
let paths = NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory, .UserDomainMask, true)
let appSupportDirectory = paths.first! as NSString
let dbPath = appSupportDirectory.stringByAppendingPathComponent("Dock/desktoppicture.db") as NSString

var db: COpaquePointer = nil
if sqlite3_open(dbPath.UTF8String, &db) == SQLITE_OK {
    var statement: COpaquePointer = nil

    if sqlite3_exec(db, "DELETE FROM data", nil, nil, nil) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error deleting table row: \(errmsg)")
    }

    if sqlite3_exec(db, "INSERT INTO DATA (VALUE) VALUES ('\(getBackgroundImagePath())');", nil, nil, nil) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error inserting table row: \(errmsg)")
    }

    let workspace = NSWorkspace.sharedWorkspace()

    for screen in NSScreen.screens()! {
        do {
            let options = workspace.desktopImageOptionsForScreen(screen)
            try workspace.setDesktopImageURL(NSURL(fileURLWithPath: getBackgroundImagePath()), forScreen: screen, options: options!)
        } catch let error as NSError {
            NSLog("\(error.localizedDescription)")
        }
    }

    system("/usr/bin/killall Dock")
}

sqlite3_close(db)

Note: I update the .db file found in ~/Library/Application Support/Dock/desktoppicture.db. Since this doesn't actually update the background, I then proceed to loop through each screen and set them manually.

Although this changes all of the screen's backgrounds, any non-active spaces are not changed, and any new spaces created use the old background.

I'm using this code within a small app I made on GitHub, and this is an issue a user reported. You can find the issue here (with a terminal solution).

Apple has a seemingly relevant project here, but even they don't update multiple spaces.

Also, if you update the background through the default mac settings app, it also doesn't change pre-existing spaces. Is it impossible?

1 Answers
Related