通过脚本

时间:2015-11-04 22:28:51

标签: macos sqlite applescript osx-mavericks osx-yosemite

我正在尝试设置一个自动更改Mac上所有桌面(空格)背景的脚本。我已经到了this answer,可以通过

的快速脚本将所有桌面背景更改为图像
#!/bin/sh
sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "update data set value = '/Users/user/Documents/My Pictures/dlanham_Phobos.sitechange.jpg'";
killall Dock;

但是,默认为"填充屏幕"选项,我想使用"适合屏幕"显示整个图像(最好也设置背景颜色)。

我一直在使用desktoppicture.db数据库,当我更改Fit to Screen时,我可以看到某些事情发生了变化,但我无法找到需要添加到脚本,以使所有桌面显示相同的图像,但适当缩放。

1 个答案:

答案 0 :(得分:5)

我今天自己偶然发现了这个问题并进行了一些逆向工程。因此,实际上有 4 必要步骤可以完成您想要的任务:

  1. 清除整个数据库。 (这不是强制性的,但使一切变得更容易)

    DELETE FROM data
    DELETE FROM displays;
    DELETE FROM pictures;
    DELETE FROM preferences;
    DELETE FROM prefs;
    DELETE FROM spaces;
    
  2. pictures表中添加一个空行。据我了解,这在某种程度上可以作为后备,macOS会根据我们现在定义的所有内容自动创建具有相应显示ID和空间ID的其他行。

    INSERT INTO pictures (space_id, display_id) VALUES (null, null);
    
  3. 将您的实际偏好添加到data表格。

    INSERT INTO data (value) VALUES ('~/Pictures'); -- #10
    INSERT INTO data (value) VALUES (60); -- #11
    INSERT INTO data (value) VALUES (5); -- #2
    INSERT INTO data (value) VALUES (0.07); -- #3, #4, #5
    INSERT INTO data (value) VALUES ('current-wallpaper.jpg'); -- #16
    INSERT INTO data (value) VALUES (1); -- #11 / #12
    
  4. 现在这是最重要的部分 - 数据与相应的macOS内部首选项键的实际映射。这是我到目前为止所发现的:

    #1: Image path
    #2: Scaling method (Fill Screen (1), Center (3), Stretch to Fill Screen (4), Fit to Screen (5))
    #3: Fill color
    #4: Fill color
    #5: Fill color
    #9: Enable automatic changing
    #10: Directory path to images
    #11: Image changing interval
    #12: Random order
    #16: Current image (used when automatic changing is enabled)
    

    所以你要做的就是将数据行的ID与上面列出的键相匹配。例如

    INSERT INTO preferences (key, data_id, picture_id) VALUES (11, 2, 1);
    

    上面一行表示:使用data表格中的第二行(→60)作为第一张图片的Image changing interval(#11)(在我们的例子中,表示所有空格/显示默认值)。

  5. 在我的情况下,我想将随机图片从特定文件夹更改为随机图像适合屏幕启用, 7%亮黑色背景色。我用那条线实现了它:

    sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db " \
        DELETE FROM data; \
        DELETE FROM displays; \
        DELETE FROM pictures; \
        DELETE FROM preferences; \
        DELETE FROM prefs; \
        DELETE FROM spaces; \
        INSERT INTO pictures (space_id, display_id) VALUES (null, null); \
        INSERT INTO data (value) VALUES ('~/Pictures'); \
        INSERT INTO data (value) VALUES (60); \
        INSERT INTO data (value) VALUES (5); \
        INSERT INTO data (value) VALUES (0.07); \
        INSERT INTO data (value) VALUES ('198.png'); \
        INSERT INTO data (value) VALUES (1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (2, 3, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (3, 4, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (4, 4, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (5, 4, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (9, 6, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (10, 1, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (11, 2, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (12, 6, 1); \
        INSERT INTO preferences (key, data_id, picture_id) VALUES (16, 5, 1); \
    " && killall Dock
    

    希望这可以帮助那些在这里挣扎的人。