¿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?
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.
@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.
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:
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
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 importGioimport os,sys,randomdef gsettings_set(schema, path, key, value):"""Set value of gsettings schema"""if path isNone:
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')ifnot 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.
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:
Este código cambia aleatoriamente el fondo de pantalla de un directorio dado.
Guarde este script y edite su con el comando "crontab -e" (inicia un editor donde coloca esta línea al final del archivo):
fuente
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
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
que establece el fondo para esa ventana especial de Nautilus. Cuando deshabilita los iconos del escritorio con
eso matará el escritorio de Nautilus y le mostrará el escritorio X básico. Para el escritorio X básico puedes usar el
feh
programa. En particular, este comando:También hay alternativa a la interfaz gráfica de usuario,
nitrogen
. Los enfoquesfeh
ynitrogen
se pueden usar con equipos de escritorio que no sean Unity, comoopenbox
oblackbox
. Elgsettings
enfoque se puede usar con Unity u otro escritorio basado en GNOME.Diseccionando el comando gsettings
¿Qué hace exactamente el
gsettings
comando? 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 dedconf
comando ogsettings
. En particular, estamos tratando aquí conorg.gnome.desktop.background
esquema y una de sus teclas,picture-uri
.URI, que en
file:///home/JohnDoe/Pictures/cool_wallpaper.png
realidad 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
~/.bashrc
para que pueda cambiar el fondo a voluntad:Esta función se puede llamar con una ruta absoluta como
o con ruta relativa desde el directorio de trabajo actual
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 unagsettings_get
ygsettings_set
funciones, 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:Por supuesto, las mismas reglas para los scripts también se aplican aquí: asegúrese de que sea ejecutable
chmod +x set_wallpaper.py
y guárdelo en la~/bin
carpeta (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.fuente
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:
fuente
También puedes usar esto:
fuente