Алгоритм смены обоев Ubuntu для рабочего стола
Итак, я знаю, что в Интернете уже есть некоторые программы, которые делают этот трюк. Но я представляю, что это должна быть очень простая программа.
Могу ли я сделать это с помощью C и / или скрипта оболочки? Я хочу сделать функцию, которая делает что-то вроде bool setDesktopBG(ImagePath path)
Какие основные звонки я должен сделать, чтобы сделать это? К каким пакетам я должен получить доступ, чтобы сделать это? Я никогда не кодировал ничего, связанного с этой ОС, поэтому не знаю, с чего именно начать?
Кроме того, этот вопрос больше подходит для переполнения стека? Если это так, я удалю его и отправлю туда. Заранее спасибо.
1 ответ
Что меняет обои
В случае поведения Ubuntu по умолчанию, когда дело доходит до фона, это устанавливается через gsettings
, В скорлупе ореха это форма базы данных для настройки различных приложений. Простая команда такова:
gsettings set org.gnome.desktop.background picture-uri "$FILE"
, где "$FILE"
переменная сценария оболочки, которая содержит полный путь к изображению в форме file:///path/to/image.png
Это несколько отличается от других настольных сред. Представьте, что Ubuntu Unity и Gnome имеют уровень выше типичного сервера X11 (то есть уровень выше среды графического интерфейса). В таких средах, как blackbox
или же openbox
вам нужно вызвать внешнюю программу. Например, feh --bg-scale /path/to/image
Я предполагаю, что вы хотите иметь дело со средой по умолчанию - Ubuntu Unity.
Создание функции оболочки
Вот пример того, что я использую в своем .bashrc
файл.
function chbackground {
FILE="'file://$(readlink -f "$1" )'"
echo changing to "$FILE"
gsettings set org.gnome.desktop.background picture-uri "$FILE"
}
Функция может быть вызвана так
chbackground WALLPAPERS-FOLDER/cool-background.png
Эта функция состоит из двух важных частей. Во-первых, мы можем указать полный или частичный путь к файлу - вот что readlink -f "$1"
заботится о - возвращает полный путь к изображению. Затем мы превращаем это в строку, комбинируя вывод readlink -f "$1"
а также file://
, Помните, путь Unix всегда начинается с корневой папки, /
так что нам нужно только провести две косые черты там. Результат будет file:///home/user/WALLPAPERS-FOLDER/cool-background.png
строка и хранится в FILE
переменная.
Наконец звоним gsettings
с FILE
в качестве аргумента.
Эта функция может быть частью любого скрипта и вызываться с любым частичным или полным путем в качестве параметра
Составляем скрипт
Вот сценарий, который я набросал примерно за 15 минут, который будет составлять список изображений, а затем выбирать случайное изображение из этого списка и устанавливать фон для этого изображения. Скрипт также находится в моем github, репозитории sergrep репозитория и будет немного больше разработан для включения дополнительных функций, но по большей части версия кода здесь делает большую работу.
Чтобы автоматизировать этот сценарий, обратитесь к разделу Как сделать автозапуск программы при каждом входе в систему?
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com
# Date: March 10th 2016
# Purpose: Set random wallpaper
# To make it start automatically, add it as one of
# the Startup Applications in Ubuntu's Unity
# or Gnome
#
# Written for: https://Ask-ubuntu.ru/q/744464/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
ARGV0="$0"
ARGC=$#
change_background()
{
FILE="'file://$(readlink -f "$1" )'"
echo changing to "$FILE"
gsettings set org.gnome.desktop.background picture-uri "$FILE"
}
make_list()
{
# -max-depth may be optional , if you want to
# traverse subdirectories,too
find "$1" -maxdepth 1 -type f > "$2"
}
main()
{
# Variables
local DISPLAY=:0 # ensure this is set
local DIR="$1"
local LIST="/tmp/wallpaper.list"
local TIME="$2"
# cat $LIST # for debugging only
make_list "$DIR" "$LIST"
while true
do
change_background $( shuf $LIST | head -n 1 )
sleep "$TIME"
done
}
main "$@"