В качестве оконного менеджера у меня стоит Awesome, в котором меня почти все устраивает, кроме использования в нем Lua (который я не знаю, да и не собираюсь специально изучать). Так вот, потребовалась мне автосмена обоев (чтобы рабочий стол смотрелся современно), но как такую вещь реализовать в конфигурации Awesome — я без понятия.
Но так как я не знаю Lua, но знаю и использую Icon — возникла идея, как реализовать автосмену обоев, задействовав минимальные познания в линуксовой командной строке и некоторые из операций Icon.
Для начала нужно создать скрытую папку внутри домашней папки и поместить в нее изображения в формате JPG:
mkdir /home/pingvinoid/.imgsr
Как вы поняли, моя домашняя папка — /home/pingvinoid/. Если хотите повторить описанное в статье, вам нужно будет исправить путь к домашней папке в скрипте и в команде shell, т.е. mkdir /home/имя_пользователя/.imgsrc/.
Далее нам потребуется программа для смены фона рабочего стола. В данном случае, этой программой будет Nitrogen. Из вывода команды:
nitrogen --help
следует, что нам необходимо выполнить команду:
nitrogen --set-scaled путь_к_изображению
каждый раз изменяя путь к рисунку,чтобы получить смену обоев рабочего стола.
Но, чтобы заметить смену изображений (да и чтоб не доставало глаза) требуется выполнять изменение пути для рисунка с небольшой задержкой, допустим, задержка будет около 1 минуты.
Теперь,когда у нас есть все данные на руках,можно приступать к написанию скрипта на Icon.
Все наши обои для рабочего стола лежат в папке /home/имя_пользователя/.imgsrc/ и имеют расширение *.jpg, следовательно, достаточно получить список всех файлов с этим расширением, поместить их в какой-нибудь текстовый файл и каждый раз запускать nitrogen —set-scaled путь_к_изображению с параметром путь_к_изображению, взятым из этого текстового файла, и небольшой задержкой (которая составляет в нашем случае — 1 минуту). Текстовый файл, в который будут помещены пути к обоям, мы назовем img.txt и разместим в той же самой папке, где лежат обои.
Для манипуляций по получению списка путей к изображению и вывода их в файл, применим команду Icon’a system(), аргументом которой станет небольшая команда из арсенала shell линукса:
ls путь_к папке_с_обоями/*.jpg & путь_к_файлу_img.txt
Для того, чтобы смена выполнялась бесконечно, применим бесконечный цикл из Icon — цикл repeat, в котором разместим команду открытия файла с путями к обоям, небольшую процедурку, выполняющую смену обоя с интервалом и команду закрытия файлового потока (т.е. реализуем бесконечное чтение из файла).
В итоге получаем вот такой скрипт:
procedure main(argv) local dir,imgf,f dir:=argv[1] imgf:=dir||"img.txt" system("ls "||dir||"*.jpg &"||imgf) repeat { f:=open(imgf,"r") every mini(!f,f) close(f) } end procedure mini(s,f) system("nitrogen --set-scaled "||s) delay(10000) end
Запуск скрипта (который я назвал live_image.icn) после компиляции, будем осуществлять вот такой командой:
./live_image путь_к домашней_папке
Конечно, это самое простейшее решение подобной автоматизации, и можно было бы обойтись только shell-скриптами, однако, это решение служит примером использования Icon в качестве скриптового языка — и расширяет сферу использования этого необычного языка программирования.
P.S: Скрипт работает не только в Awesome 😉