Подтвердить что ты не робот

Как пропустить все пространства рабочего стола Mac

Я пытаюсь установить фон рабочего стола для всех экранов И пробелов (существующих и новых). Однако я не могу найти способ установить фон для всех существующих пространств (и любые созданные новые пространства используют старый фон).

Вот что я до сих пор:

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)

Примечание. Я обновляю файл .db, найденный в ~/Library/Application Support/Dock/desktoppicture.db. Поскольку это фактически не обновляет фон, я затем перехожу к каждому экрану и устанавливаю его вручную.

Несмотря на то, что это изменяет все фон на экране, любые неактивные пробелы не изменяются, а любые созданные новые пространства используют старый фон.

Я использую этот код в небольшом приложении, которое я сделал на GitHub, и это проблема, о которой сообщил пользователь. Вы можете найти эту проблему здесь (с помощью терминального решения).

У Apple есть, по-видимому, релевантный проект здесь, но даже они не обновляют несколько пробелов.

Кроме того, если вы обновляете фон через приложение настроек Mac по умолчанию, оно также не изменяет ранее существовавшие пробелы. Это невозможно?

4b9b3361

Ответ 1

OS X Desktop Picture Глобальное обновление через пробелы

В desktoppicture.db запрос update может быть запущен в таблице data с указанием пути к новому изображению (value). Не требуется delete, а затем insert значения или использовать циклы. Используя обновление запросов без запроса, и, таким образом, он обновит каждую строку в таблице data.

(В приведенном ниже примере используется языковой уровень SQLite.swift, который использует безопасный по типу интерфейс Swift)к югу >

func globalDesktopPicture(image: String) {

    let paths: [String] = NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory,
                                                              .UserDomainMask, true)
    let appSup: String = paths.first!
    let dbPath: String = (appSup as NSString).stringByAppendingPathComponent("Dock/desktoppicture.db")

    let dbase = try? Connection("\(dbPath)")
    let value = Expression<String?>("value")    
    let table = Table("data")
    try! dbase!.run(table.update(value <- image))

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

Такая же концепция/принцип обновления db применяется одинаково, если вы вместо этого решили использовать традиционный/устаревший (мосты) метод выполнения запросов SQLite3:

func legacyGlobalDesktopPicture(image: String) {

    let paths: [String] = NSSearchPathForDirectoriesInDomains(.ApplicationSupportDirectory,
                                                              .UserDomainMask, true)
    let appSup: String = paths.first!
    let dbPath: String = (appSup as NSString).stringByAppendingPathComponent("Dock/desktoppicture.db")

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

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

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

ПРИМЕЧАНИЕ. Приведенные выше примеры весьма минимальны и должны включать некоторые проверки ошибок и т.д.

Дополнительная информация: