¿Cómo cambiar el fondo del escritorio desde la línea de comandos en Unity?

63

Tengo un script que actualiza mi fondo de escritorio todos los días con el APOD de la NASA. Desde la actualización a 11.10, ese script dejó de funcionar, presumiblemente porque lo estoy usando gconftool-2para actualizar el fondo del escritorio. ¿Hay una nueva forma de hacer esto bajo Unity?

Shaddi
fuente

Respuestas:

82

Tanto Unity como Gnome Shell (Gnome 3) usan GSettings ahora en lugar de GConf. Entonces, en Unity y Gnome Shell puedes usar la herramienta de línea de comandos gsettingspara eso. Al igual gconftool, le permite obtener o establecer una clave individual.

Puede obtener el URI actual de la imagen de fondo de la siguiente manera:

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

Y configure el URI de fondo de la siguiente manera (que actualizará inmediatamente el fondo de su escritorio):

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

Tenga en cuenta que debe anteponer el URI con "file: //" para que esto funcione (a diferencia de gconftool).

Para que su script funcione tanto con Gnome 2 como con Shell / Unity, puede dejar que primero haga una verificación de versión de Gnome:

gnome-session --version

Eso devolverá la versión de Gnome. Si el número de versión comienza con 3, gsettingspuede usarse. Si devuelve una versión que comienza con 2, deje que su script use gconftoolen su lugar.

Serrano
fuente
2
@YumYumYum: es muy inusual que los comandos anteriores bloqueen su sistema, a menos que haya algo más en su sistema.
Serrano
Puede agregar Cinnamon a la lista de Desktop Environment usando gsettings;)
MrVaykadji
Tenga en cuenta que debe anteponer el URI con "file: //" para que esto funcione (a diferencia de gconftool). <- ¡Esto es importante! No encontré esto mencionado explícitamente en ningún otro lugar.
Tom
2
Esto está bien para el usuario actual conectado. ¡Me gustaría saber cómo cambiar programáticamente el fondo de pantalla de otro usuario! Intenté sudo --user = <username> gsettings ... pero eso falló.
Kaiwan
12

Este código cambia aleatoriamente el fondo de pantalla de un directorio dado.

#!/bin/bash

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

Guarde este script y edite su con el comando "crontab -e" (inicia un editor donde coloca esta línea al final del archivo):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Indra
fuente
1
El directorio de fondo de pantalla debe contener solo archivos de fondo de pantalla y ningún directorio.
loxaxs
Sin embargo, gsettings no funcionará desde cron. debe configurar la variable de entorno DBUS_SESSION_BUS_ADDRESS para que funcionen los gsettings. Puede hacerlo agregando estas dos líneas antes de gsettings (líneas separadas por punto y coma :) PID = $ (pgrep gnome-session); exportar DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environmental | cut -d = -f2-);
willbradley
6

Introducción

Esta respuesta es una edición de la respuesta original. A medida que progresé en mis estudios de Ubuntu y Linux, descubrí una variedad de enfoques y profundicé mi comprensión de cómo funciona la configuración de un fondo en Ubuntu. Esta respuesta es mi intento de documentar lo mejor posible lo que he aprendido hasta ahora, y lo hago con la esperanza de que este material pueda ser útil para otros.

La parte importante es que para establecer el fondo para el escritorio de Unity desde la línea de comandos, puede usar

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

Establecer fondo en Unity vs escritorio X desnudo

La forma en que funciona Unity es tal que hay un escritorio X desnudo debajo, y arriba está la ventana del escritorio de Unity (que de hecho es una instancia especial de la ventana de Nautilus, el administrador de archivos predeterminado de Ubuntu). Por lo tanto, cuando llamas

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

que establece el fondo para esa ventana especial de Nautilus. Cuando deshabilita los iconos del escritorio con

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

eso matará el escritorio de Nautilus y le mostrará el escritorio X básico. Para el escritorio X básico puedes usar el fehprograma. En particular, este comando:

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

También hay alternativa a la interfaz gráfica de usuario, nitrogen. Los enfoques fehy nitrogense pueden usar con equipos de escritorio que no sean Unity, como openboxo blackbox. El gsettingsenfoque se puede usar con Unity u otro escritorio basado en GNOME.

Diseccionando el comando gsettings

¿Qué hace exactamente el gsettingscomando? Bueno, en primer lugar, existe una base de datos de configuración de dconf para cada usuario, que está destinada a reemplazar GConf en desuso , y se puede acceder a través de dconfcomando o gsettings. En particular, estamos tratando aquí con org.gnome.desktop.backgroundesquema y una de sus teclas, picture-uri.

URI, que en file:///home/JohnDoe/Pictures/cool_wallpaper.pngrealidad significa Identificador Uniforme de Recursos , que fue creado originalmente para uso de Internet, pero existe un esquema de URI de archivo , que es lo que vemos aquí. Lo bueno de URI es que proporciona una ruta codificada en bytes si usa una configuración regional que no está en inglés, por ejemplo, con mi escritorio chino, tengo el siguiente URI para mi fondo:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Scripting con gsettings

Por supuesto, escribir el comando cada vez es tedioso y uno puede usar un poco de magia de secuencias de comandos. Por ejemplo, esto es lo que he configurado en mi ~/.bashrcpara que pueda cambiar el fondo a voluntad:

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 
} 

Esta función se puede llamar con una ruta absoluta como

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

o con ruta relativa desde el directorio de trabajo actual

change_background Pictures/cool_wallpaper.jpg

También realiza una comprobación si el archivo existe y resuelve enlaces simbólicos. Esto se puede usar en un script de shell o como una función independiente para uso diario.

Por supuesto, esta no es la única forma. Python tiene una API para Gio (que es la biblioteca principal detrás gsettings). He escrito una gsettings_gety gsettings_setfunciones, que fueron bastante útiles para otros proyectos, como el Indicador de lista de inicio . En caso de establecer un fondo, también se puede usar y lo he usado recientemente para esta pregunta . Aquí hay una versión simplificada de ese mismo enfoque:

#!/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()

Por supuesto, las mismas reglas para los scripts también se aplican aquí: asegúrese de que sea ejecutable chmod +x set_wallpaper.pyy guárdelo en la ~/bincarpeta (preferiblemente) . El uso es simple: el ./set_wallpaper.py Picture/cool_image.py código fuente de este script también está disponible en mi repositorio de GitHub con muchos otros scripts, también.

Sergiy Kolodyazhnyy
fuente
1

Gracias a la increíble respuesta de Serrano, pude escribir este script que utilizo como parte de mis nuevos scripts de configuración de máquina para establecer un fondo negro:

#! /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
fuente
1

También puedes usar esto:

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