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