Dup Ver Goto 📝

WallpaperChanger

PT2/os/kde/wallpaper does not exist
To
97 lines, 318 words, 2829 chars Page 'WallpaperChanger' does not exist.

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()