"""Set the wallpaper.""" import ctypes import logging import os import re import shutil import subprocess import urllib.parse from .settings import HOME, OS, CACHE_DIR from . import util def get_desktop_env(): """Identify the current running desktop environment.""" desktop = os.environ.get("XDG_CURRENT_DESKTOP") if desktop: return desktop desktop = os.environ.get("DESKTOP_SESSION") if desktop: return desktop desktop = os.environ.get("GNOME_DESKTOP_SESSION_ID") if desktop: return "GNOME" desktop = os.environ.get("MATE_DESKTOP_SESSION_ID") if desktop: return "MATE" desktop = os.environ.get("SWAYSOCK") if desktop: return "SWAY" desktop = os.environ.get("DESKTOP_STARTUP_ID") if desktop and "awesome" in desktop: return "AWESOME" return None def xfconf(img): """Call xfconf to set the wallpaper on XFCE.""" xfconf_re = re.compile( r"^/backdrop/screen\d/monitor(?:0|\w*)/" r"(?:(?:image-path|last-image)|workspace\d/last-image)$", flags=re.M, ) xfconf_data = subprocess.check_output( ["xfconf-query", "--channel", "xfce4-desktop", "--list"], stderr=subprocess.DEVNULL, ).decode("utf8") paths = xfconf_re.findall(xfconf_data) for path in paths: util.disown( [ "xfconf-query", "--channel", "xfce4-desktop", "--property", path, "--set", img, ] ) def set_wm_wallpaper(img): """Set the wallpaper for non desktop environments.""" if shutil.which("feh"): util.disown(["feh", "--bg-fill", img]) elif shutil.which("xwallpaper"): util.disown(["xwallpaper", "--zoom", img]) elif shutil.which("hsetroot"): util.disown(["hsetroot", "-fill", img]) elif shutil.which("nitrogen"): util.disown(["nitrogen", "--set-zoom-fill", img]) elif shutil.which("bgs"): util.disown(["bgs", "-z", img]) elif shutil.which("hsetroot"): util.disown(["hsetroot", "-fill", img]) elif shutil.which("habak"): util.disown(["habak", "-mS", img]) elif shutil.which("display"): util.disown(["display", "-backdrop", "-window", "root", img]) else: logging.error("No wallpaper setter found.") return def set_desktop_wallpaper(desktop, img): """Set the wallpaper for the desktop environment.""" desktop = str(desktop).lower() if "xfce" in desktop or "xubuntu" in desktop: xfconf(img) elif "muffin" in desktop or "cinnamon" in desktop: util.disown( [ "gsettings", "set", "org.cinnamon.desktop.background", "picture-uri", "file://" + urllib.parse.quote(img), ] ) elif "gnome" in desktop or "unity" in desktop: util.disown( [ "gsettings", "set", "org.gnome.desktop.background", "picture-uri", "file://" + urllib.parse.quote(img), ] ) elif "mate" in desktop: util.disown( ["gsettings", "set", "org.mate.background", "picture-filename", img] ) elif "sway" in desktop: util.disown(["swaymsg", "output", "*", "bg", img, "fill"]) elif "awesome" in desktop: util.disown( [ "awesome-client", "require('gears').wallpaper.maximized('{img}')".format(**locals()), ] ) elif "kde" in desktop: string = """ var allDesktops = desktops();for (i=0;i