Як змінити фон робочого столу з командного рядка в Unity?


63

У мене є сценарій, який щодня оновлює фон мого робочого столу за допомогою NASOD APOD. Після оновлення до 11.10 цей скрипт перестав працювати, імовірно, тому, що я використовую gconftool-2фактично оновлення фону робочого столу. Чи є новий спосіб зробити це в Unity?

Відповіді:


82

І Unity, і Gnome Shell (Gnome 3) використовують GSettings зараз замість GConf. Тож у Unity та Gnome Shell ви можете використовувати gsettingsдля цього інструмент командного рядка . Мовляв gconftool, це дозволяє вам отримати або встановити індивідуальний ключ.

Ви можете отримати поточний URI фонового зображення наступним чином:

gsettings get org.gnome.desktop.background picture-uri
'file:///home/serrano/Pictures/x.jpg'

І встановіть URI тла таким чином (який негайно оновить фон робочого столу):

gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg

Зауважте, що ви повинні додати URI з "file: //", щоб це працювало (на відміну від gconftool).

Щоб ваш сценарій працював як з Gnome 2, так і з Shell / Unity, ви можете дозволити йому перевірити версію Gnome спочатку:

gnome-session --version

Це поверне версію Gnome. Якщо номер версії починається з 3, то gsettingsйого можна використовувати. Якщо він повертає версію, починаючи з 2, нехай gconftoolзамість цього використовується ваш сценарій .


Я використав цю команду в Ubuntu 12.04 і система розбита
YumYumYum

2
@YumYumYum: Вкрай незвично, що вищезазначені команди руйнують вашу систему, якщо тільки у вашій системі не відбувається щось інше.
Серрано

Ви можете додати Корицю до списку робочого середовища за допомогою gsettings;)
MrVaykadji

Зауважте, що ви повинні додати URI з "file: //", щоб це працювало (на відміну від gconftool). <- Це важливо! Я не знайшов цього згадуваного явно більше ніде.
Том,

2
Це добре для поточного користувача, який увійшов. Я хотів би знати, як програмно змінювати шпалери іншого користувача! Я спробував sudo --user = <ім'я користувача> gsettings ... але це не вдалося.
kaiwan

12

Цей код випадковим чином змінює шпалери з заданого каталогу.

#!/bin/bash

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"

Збережіть цей скрипт і відредагуйте команду "crontab -e" (він запускає редактор, куди ви ставите цей рядок у кінці файлу):

*/1     *     *     *     *         /bin/bash /path/to/script.sh

1
Каталог шпалер повинен містити лише файли шпалер і жодний каталог.
loxaxs

gsettings не працюватиме з крона, однак. вам потрібно встановити змінну середовища DBUS_SESSION_BUS_ADDRESS для того, щоб gsettings працювали. Ви можете зробити це, додавши ці два рядки перед gsettings (рядки розділені крапкою з комою :) PID = $ (pgrep gnome-session); експортувати DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environment | cut -d = -f2-);
willbradley

6

Вступ

Ця відповідь є редакцією оригінальної відповіді. Коли я прогресував у своїх дослідженнях Ubuntu та Linux, я виявив різноманітні підходи та поглибив своє розуміння того, як працює настройка фону в Ubuntu. Ця відповідь - моя спроба якомога краще задокументувати те, про що я дізнався до цього часу, і робиться з надією, що цей матеріал може бути корисним для інших.

Важлива частина полягає в тому, що для встановлення фону для робочого столу Unity з командного рядка можна використовувати

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

Налаштування фону на робочому столі Unity vs gore X

Те, як працює Unity, такий, що внизу є голий робочий стіл X, а вгорі - вікно робочого столу Unity (що насправді є спеціальним екземпляром вікна Nautilus, файлового менеджера за замовчуванням Ubuntu). Таким чином, коли ви телефонуєте

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

що задає фон для цього спеціального вікна Nautilus. При відключенні значків робочого столу за допомогою

gsettings set org.gnome.desktop.background show-desktop-icons false

це вб'є робочий стіл Nautilus і покаже вам робочий стіл X з голими кістками. Для робочого столу X з голими кістками ви можете використовувати fehпрограму. Зокрема, ця команда:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg

Там також GUI альтернатива , що nitrogen. fehІ nitrogenпідходи можуть бути використані з іншими , ніж Unity настільних комп'ютерів, таких як openboxабо blackbox. Цей gsettingsпідхід може використовуватися для Unity чи іншого робочого столу на базі GNOME.

Розрізання команди gsettings

Що саме робить gsettingsкоманда? Ну, по-перше, існує база даних налаштувань dconf для кожного користувача, яка призначена як заміна застарілого GConf , і вона доступна через будь-яку dconfкоманду або gsettings. Зокрема, тут ми маємо справу з org.gnome.desktop.backgroundсхемою і одним з його ключів picture-uri.

URI це file:///home/JohnDoe/Pictures/cool_wallpaper.pngнасправді розшифровується як Уніфікований ідентифікатор ресурсу , який був створений для використання в Інтернеті, але є файлова схема URI , що ми бачимо тут. Що цікаво в URI - це те, що він дає кодований байтом шлях, якщо ви використовуєте не англійську мову, наприклад, на моєму китайському робочому столі.'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Сценарій з gsettings

Звичайно, виписування команди кожного разу стомлює, і можна використовувати трохи сценаріїв магії. Наприклад, ось що я встановив у своєму, ~/.bashrcщоб я міг змінити тло за бажанням:

change_background() {
    FILE="'file://$(readlink -e "$1" )'" 
    if [ "$FILE" != "'file://'" ] 
    then
        gsettings set org.gnome.desktop.background picture-uri "$FILE" 
    else
        echo "File doesn't exist" 
    fi 
} 

Цю функцію можна викликати абсолютним шляхом, таким як

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

або з відносним шляхом до поточного робочого каталогу

change_background Pictures/cool_wallpaper.jpg

Він також перевіряє, чи існує файл, і вирішує символьні посилання. Це може використовуватися в сценарії оболонки або як окрема функція для щоденного використання.

Звичайно, це не єдиний спосіб. У Python є API для Gio (який є основною бібліотекою позаду gsettings). Я написав «а» gsettings_getта gsettings_setфункції, які були дуже корисними для інших проектів, таких як Launcher List Indicator . Якщо встановити фон, його також можна використовувати, і я нещодавно використовував його для цього питання . Ось спрощена версія того ж підходу:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <1047481448@qq.com>
Date: December, 21,2016
Purpose: script for setting wallpaper, the pythonic way
Written for: https://askubuntu.com/q/66914/295286
"""
from gi.repository import Gio
import os,sys,random

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema, path)
    if isinstance(value, list):
        return gsettings.set_strv(key, value)
    if isinstance(value, int):
        return gsettings.set_int(key, value)
    if isinstance(value,str): 
        return gsettings.set_string(key,value)

def error_and_exit(message):
    sys.stderr.write(message + "\n")
    sys.exit(1)

def main():
    gschema='org.gnome.desktop.background'
    key='picture-uri'
    if len(sys.argv) != 2:
        error_and_exit('>>> Path to a file is required')
    if not os.path.isfile(sys.argv[1]):
        error_and_exit('>>> Path "' + sys.argv[1] + \
                       '" isn\'t a file or file doesn\'t exit')
    full_path = os.path.abspath(sys.argv[1])
    uri = Gio.File.new_for_path(full_path).get_uri()
    gsettings_set(gschema,None,key,uri)


if __name__ == '__main__': main()

Звичайно, тут застосовуються ті самі правила для сценаріїв: переконайтеся, що він зроблений з виконуваним, chmod +x set_wallpaper.pyі зберігайте його в (бажано) ~/binпапці. Використання просте: ./set_wallpaper.py Picture/cool_image.py вихідний код цього сценарію також доступний у моєму сховищі GitHub з багатьма іншими сценаріями.


1

Завдяки дивовижній відповіді Серрано, мені вдалося написати цей сценарій, який я використовую як частину моїх нових сценаріїв налаштування машини, щоб встановити чорний фон:

#! /bin/bash
SRC_URI="https://i.imgur.com/uomkVIL.png"
FNAME="/home/$USER/Pictures/black.png"
wget "$SRC_URI" -O "$FNAME"
gsettings set org.gnome.desktop.background picture-uri "$FNAME"

1

Також ви можете використовувати це:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.