Bagaimana cara mengubah latar belakang desktop dari baris perintah di Unity?

63

Saya memiliki skrip yang memperbarui latar belakang desktop saya setiap hari dengan NASA APOD. Sejak memutakhirkan ke 11.10, skrip itu berhenti berfungsi, mungkin karena saya gunakan gconftool-2untuk benar-benar memperbarui latar belakang desktop. Apakah ada cara baru untuk melakukan ini di bawah Persatuan?

Shaddi
sumber

Jawaban:

82

Baik Unity dan Gnome Shell (Gnome 3) menggunakan GSettings sekarang, bukan GConf. Jadi di Unity dan Gnome Shell Anda dapat menggunakan alat baris perintah gsettingsuntuk itu. Seperti gconftool, ini memungkinkan Anda mendapatkan atau mengatur kunci individual.

Anda bisa mendapatkan URI saat ini dari gambar latar belakang sebagai berikut:

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

Dan atur URI latar belakang sebagai berikut (yang akan segera memperbarui latar belakang desktop Anda):

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

Perhatikan bahwa Anda harus menambahkan URI dengan "file: //" agar ini berfungsi (tidak seperti dengan gconftool).

Agar skrip Anda berfungsi baik dengan Gnome 2 dan Shell / Unity, Anda dapat membiarkannya melakukan pemeriksaan versi Gnome terlebih dahulu:

gnome-session --version

Itu akan mengembalikan versi Gnome. Jika nomor versi dimulai dengan 3, maka gsettingsdapat digunakan. Jika mengembalikan versi yang dimulai dengan 2, biarkan skrip Anda digunakan gconftool.

Serrano
sumber
Saya menggunakan perintah ini di Ubuntu 12.04 dan sistem
2
@YumYumYum: Sangat tidak biasa bahwa perintah di atas akan merusak sistem Anda, kecuali ada sesuatu yang terjadi di sistem Anda.
Serrano
Anda dapat menambahkan Cinnamon ke daftar Desktop Environment menggunakan gsettings;)
MrVaykadji
Perhatikan bahwa Anda harus menambahkan URI dengan "file: //" agar ini berfungsi (tidak seperti dengan gconftool). <- Ini penting! Saya tidak menemukan ini disebutkan secara eksplisit di tempat lain.
Tom
2
Ini bagus untuk pengguna yang masuk saat ini. Saya ingin tahu cara mengubah wallpaper dari pengguna lain secara terprogram! Saya memang mencoba sudo --user = <username> gsettings ... tapi itu gagal.
kaiwan
12

Kode ini secara acak mengubah wallpaper dari direktori yang diberikan.

#!/bin/bash

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

Simpan skrip ini dan edit Anda dengan perintah "crontab -e" (meluncurkan editor tempat Anda meletakkan baris ini di akhir file):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Indera
sumber
1
Direktori wallpaper harus hanya berisi file wallpaper dan tidak ada direktori.
loxaxs
gsettings tidak akan bekerja dari cron. Anda perlu mengatur variabel lingkungan DBUS_SESSION_BUS_ADDRESS agar gsettings berfungsi. Anda dapat melakukannya dengan menambahkan dua baris ini sebelum gsettings (baris dipisahkan oleh titik koma :) PID = $ (pgrep gnome-session); ekspor DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID /viron | cut -d = -f2-);
willbradley
6

pengantar

Jawaban ini adalah hasil edit dari jawaban asli. Ketika saya telah maju dalam studi Ubuntu dan Linux saya, saya telah menemukan berbagai pendekatan dan memperdalam pemahaman saya tentang bagaimana pengaturan latar belakang bekerja di Ubuntu. Jawaban ini adalah upaya saya untuk mendokumentasikan sebaik mungkin apa yang telah saya pelajari sejauh ini, dan dilakukan dengan harapan materi ini dapat bermanfaat bagi orang lain.

Bagian penting adalah bahwa untuk mengatur latar belakang untuk desktop Unity dari baris perintah, Anda dapat menggunakan

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

Mengatur latar belakang di Unity vs bare X desktop

Cara Unity bekerja sedemikian rupa sehingga ada desktop X telanjang di bawah ini, dan di atas ada jendela desktop Unity (yang sebenarnya adalah contoh khusus dari jendela Nautilus, manajer file default Ubuntu). Jadi, saat Anda menelepon

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

yang menetapkan latar belakang untuk jendela Nautilus khusus itu. Ketika Anda menonaktifkan ikon desktop dengan

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

yang akan membunuh desktop Nautilus dan menampilkan desktop X tanpa tulang. Untuk desktop X tanpa tulang, Anda dapat menggunakan fehprogram. Khususnya, perintah ini:

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

Ada juga alternatif GUI untuk itu nitrogen,. The fehdan nitrogenpendekatan dapat digunakan dengan desktop selain Unity, seperti openboxatau blackbox. The gsettingspendekatan dapat digunakan dengan Unity atau desktop berbasis GNOME lainnya.

Diseksi perintah gsettings

Apa sebenarnya yang dilakukan gsettingsperintah? Yah, pertama-tama, ada basis data pengaturan dconf untuk setiap pengguna, yang dimaksudkan sebagai pengganti GConf yang sudah usang , dan dapat diakses melalui dconfperintah atau gsettings. Khususnya, kita berurusan dengan org.gnome.desktop.backgroundskema dan salah satu kuncinya di sini picture-uri.

URI, file:///home/JohnDoe/Pictures/cool_wallpaper.pngsebenarnya, singkatan dari Uniform Resource Identifier , yang awalnya dibuat untuk penggunaan internet, tetapi ada skema file URI , yang kami lihat di sini. Apa yang keren tentang URI adalah memberikan jalur byte-encoded jika Anda menggunakan lokal non-Inggris, misalnya dengan desktop Cina saya, saya telah mengikuti URI untuk backgroun saya:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Scripting dengan gsettings

Tentu saja, menuliskan perintah setiap kali itu membosankan dan kita bisa menggunakan sedikit keajaiban penulisan naskah. Misalnya, inilah yang saya atur di saya ~/.bashrcsehingga saya dapat mengubah latar belakang sesuka hati:

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 
} 

Fungsi ini dapat dipanggil dengan path absolut seperti

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

atau dengan jalur relatif dari direktori kerja saat ini

change_background Pictures/cool_wallpaper.jpg

Itu juga melakukan pemeriksaan apakah file ada dan menyelesaikan symlink. Ini dapat digunakan dalam skrip shell atau sebagai fungsi mandiri untuk penggunaan sehari-hari.

Tentu saja, ini bukan satu-satunya cara. Python memiliki API untuk Gio (yang merupakan pustaka utama di belakang gsettings). Saya telah menulis a gsettings_getdan gsettings_setfungsi, yang cukup berguna untuk proyek lain seperti Indikator Daftar Peluncur . Dalam hal mengatur latar belakang, itu juga dapat digunakan dan saya baru saja menggunakannya untuk pertanyaan ini . Berikut adalah versi sederhana dari pendekatan yang sama:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <[email protected]>
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()

Tentu saja, aturan yang sama untuk skrip juga berlaku di sini: memastikan skrip dibuat dapat dieksekusi chmod +x set_wallpaper.pydan menyimpannya dalam ~/binfolder (lebih disukai) . Penggunaannya sederhana: ./set_wallpaper.py Picture/cool_image.py Kode sumber skrip ini juga tersedia di repositori GitHub saya dengan banyak skrip lain juga.

Sergiy Kolodyazhnyy
sumber
1

Berkat jawaban Serrano yang luar biasa, saya dapat menulis skrip ini yang saya gunakan sebagai bagian dari skrip pengaturan mesin baru saya untuk menetapkan latar belakang hitam:

#! /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"
jerblack
sumber
1

Anda juga dapat menggunakan ini:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Alexander
sumber