To give myself more cli-based control over the wallpaper, I've written the following two python scripts. I have a symlink in `~/Pictures/Wallpaper/w` pointing to wherever I want my wallpapers chosen from. Then there is a process which, for each activity, picks one image at random and sets that as the wallpaper. The `kde-wallpaper-changer` can be 'prodded' via `SIGHUP` (i.e `killall -HUP kde-wallpaper-changer`) to change immediately, otherwise it changes with the given period in seconds. ## kde-next-wallpaper This illustrates how to do things with `qdbus`, and in particular, you can give it [Javascript](/lang/js) to execute. ```py #!/usr/bin/env python from setproctitle import setproctitle from glob import glob import os import random import time from subprocess import run, PIPE def select_wallpaper_all(wallpaper): wallpaper_path = os.path.abspath(wallpaper) wallpaper_uri = f"file://{wallpaper_path}" s = f"""var allDesktops = desktops(); for( i = 0; i < allDesktops.length; i++ ) {{ d = allDesktops[i]; d.wallpaperPlugin = 'org.kde.image'; d.currentConfigGroup = Array('Wallpaper', 'org.kde.image', 'General'); d.writeConfig('Image', '{wallpaper_uri}'); }}""" return qcmd(s) def get_num_desktops(): s = f"""print(desktops().length)""" m = qcmd(s) a = m.stdout.decode().strip() a = int(a) return a def select_wallpaper(i,wallpaper): wallpaper_path = os.path.abspath(wallpaper) wallpaper_uri = f"file://{wallpaper_path}" s = f"""var d = desktops()[{i}]; if( d ) {{ d.wallpaperPlugin = 'org.kde.image'; d.currentConfigGroup = Array('Wallpaper', 'org.kde.image', 'General'); d.writeConfig('Image', '{wallpaper_uri}'); }}""" return qcmd(s) def qcmd(s,*xs,**kw): cmd = "qdbus org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript".split(" ") cmd.append(s) return run(cmd,*xs,stdout=PIPE,stderr=PIPE,**kw) n = get_num_desktops() setproctitle("kde-next-wallpaper") wallpapers = glob(os.path.expanduser("~/pic/Wallpaper/w/*.jpg")) for i in range(n): chosen = random.choice(wallpapers) print(i,chosen) select_wallpaper(i,chosen) ``` ## kde-wallpaper-changer This runs the above script every minute (by default) or whatever interval in seconds you give it as a command line argument (minimum is 10s). ```py #!/usr/bin/env python3 from setproctitle import setproctitle setproctitle("kde-wallpaper-changer") from subprocess import run, PIPE from time import sleep import sys import signal def donext(*xs,**kw): return run(["kde-next-wallpaper"]) def dohup(*xs,**kw): print("HUP") return donext() signal.signal(signal.SIGHUP,dohup) args = sys.argv[1:] try: t = int(args[0]) if t < 10: t = 10 except: t = 60 try: while True: donext() sleep(t) except KeyboardInterrupt: print("Ctrl-C") exit() ```