Обновление фона рабочего стола Mac OS X из скрипта

3

У меня есть сценарий оболочки, который запускается заданием cron, которое обновляет JPEG. Фон рабочего стола на моем внешнем мониторе настроен на этот же файл. Однако Mac OS X не обновляет автоматически фон рабочего стола при обновлении файла.

Как заставить фон рабочего стола обновляться из скрипта?

p00ya
источник

Ответы:

5

Правильным способом (без использования чего-либо еще для вызова вашего скрипта) было бы добавить следующую строку в ваш скрипт:

osascript -e 'tell Application "Finder"' -e 'set the desktop picture to {"NAME OF STARTUP DRIVE:PATH:TO:PICTURE.jpg"} as alias' -e 'end tell'

Примечание: путь использует двоеточия вместо /, и вы должны назвать жесткий диск.

Действительно странная альтернатива для хихиканья - это огромный обходной путь, заключающийся в добавлении следующей строки в ваш скрипт оболочки, выполняемый cron:

killall Dock

Это убьет Dock, который при перезагрузке (автоматически) обновит фон вашего рабочего стола. Недостатки? Значки открытых док-приложений вашего приложения будут переупорядочены (если значки приложений еще не сохранили позицию в вашей док-станции), а все свернутые окна будут свернуты. Так что, если вы не используете эти функции, это нормально.

Chealion
источник
24: 113: ошибка выполнения: программа Finder получила ошибку: не удается преобразовать "/ Library / Desktop Pictures / Beach.jpg" в файл типа. (-1700)
иконоборчество
@ Брэндон: Не уверен, когда это сломалось; но если вы удалите «POSIX путь», он работает правильно. Обновил ответ соответственно.
Chealion
3

Мой предыдущий ответ на этот отстой, так что вот лучший.

Для этого я использую сценарий оболочки и рабочий процесс Automator. Сценарий оболочки загружает изображение, которое я хочу, сохраняет его где-то и отображает полный путь к изображению (это важная часть). Рабочий процесс Automator выглядит примерно так:

[run shell script ~/bin/getAPOD.sh] -> [Set the Desktop Picture]

Это действие «Установить изображение на рабочем столе», насколько я могу судить, пришло с Automator.

Затем у меня есть запись в crontab, которая выглядит так:

* 4 * * * /usr/bin/open /Users/myuser/bin/APODset.app

Если вы хотите, я могу опубликовать сценарий, рабочий процесс Automator, что угодно.

Билл Вайс
источник
1

Вот последний яблочный скрипт, который я использую:

tell application "System Events"
    set myfolder to folder "foo" of the pictures folder
    tell desktop 2 to set picture to file "empty.jpeg" of myfolder as alias
    tell desktop 2 to set picture to file "bar.jpeg" of myfolder as alias
end tell

Это передается osascriptиз сценария оболочки (фактически ruby), который обновляет jpeg.

Обсуждаемая ранее проблема с фоном, который не обновляется, если новый путь совпадает с текущим путем (который все еще был проблемой с ответом Chealion), может быть взломан путем временного переключения на «empty.jpeg». Это раздражает, так как переход прерывистый, но это лучше, чем перезапуск Finder / Dock.

Я использую приложение System Events, потому что примеры Apple тоже .

p00ya
источник
0

Я знаю, что это не отвечает на ваш вопрос полностью, но это может быть интересно для вас, чтобы прочитать. То, как кто-то сделал это, использовало AppleScript, который перезапустил Finder; когда Finder перезагружается, он автоматически обновляет фоновое изображение; кажется, нет другого пути.

Алекс
источник
это нежелательно, если все мои окна Finder убиты, это навязчиво. Информативная ссылка, хотя.
p00ya
FWIW, Dock.app теперь контролирует фоновое изображение, а не Finder и имеет с 10.3 IIRC.
Chealion
0

Это довольно просто сделать без использования внешнего скрипта ....

Во-первых, продолжай работать.

Во-вторых, создайте папку, в которую ваша задача cron поместит одну фотографию / jpg. Эта папка должна содержать только одну фотографию / jpg. (Несколько файлов дадут вам случайный эффект, см. Ниже).

В-третьих, откройте «Системные настройки» -> «Рабочий стол и заставка» -> вкладка «Рабочий стол».

В-четвертых, либо перетащите, либо используйте +, чтобы добавить новую папку в список.

В-пятых, выделите папку в списке папок.

В-шестых, включите «Изменить картинку» и выберите временные рамки.

Вы также можете запустить Applescript для сброса изображения, но это самый очевидный и простой способ, которым я могу это сделать ...

Бенджамин Шолльник
источник
Это неоптимально (я должен установить период «изменения картины» значительно ниже, чем период cronjob, чтобы получать своевременные обновления, когда эти два не в фазе). Тем не менее, похоже, что это лучшее решение.
p00ya