summaryrefslogtreecommitdiff
path: root/.config/sway/bin/wallpaper.py
diff options
context:
space:
mode:
Diffstat (limited to '.config/sway/bin/wallpaper.py')
-rwxr-xr-x.config/sway/bin/wallpaper.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/.config/sway/bin/wallpaper.py b/.config/sway/bin/wallpaper.py
new file mode 100755
index 0000000..9784625
--- /dev/null
+++ b/.config/sway/bin/wallpaper.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+
+import sys, os
+import argparse, json
+import random, subprocess, signal, time
+
+
+"""
+" CLI
+"""
+
+parser = argparse.ArgumentParser(
+ prog='wallpaper',
+ description='Cycle through wallpapers'
+)
+
+parser.add_argument(
+ '--config',
+ required=True,
+ help='{<weight>: { find: <path>, exclude: <path> }, <weight>:...}'
+)
+
+parser.add_argument(
+ '--interval',
+ default=600
+)
+
+args = parser.parse_args()
+
+config = json.loads(args.config)
+
+
+"""
+" Program
+"""
+
+pid_running = -1
+while True:
+ probability_number = random.randrange(start=1, stop=100, step=1)
+
+ # build "find" command based on args.config
+ # see https://stackoverflow.com/questions/16489449/select-element-from-array-with-probability-proportional-to-its-value/16490300#16490300
+ find_cmd = ''
+ accumulative = 0
+ for weight, wallpaper_path in config.items():
+ lower_bound = accumulative
+ accumulative += int(weight)
+ upper_bound = accumulative
+
+ if lower_bound <= probability_number and probability_number <= upper_bound:
+ find_cmd = 'find "{find}" -type f'.format(find=wallpaper_path['find'])
+
+ if 'exclude' in wallpaper_path.keys():
+ find_cmd += ' -not -path "{exclude}"'.format(exclude=wallpaper_path['exclude'])
+
+ break
+
+ # run swaybg
+ swaybg_cmd = f'swaybg -i $({find_cmd} | shuf -n1) -m fill &'
+ subprocess.run(swaybg_cmd, shell=True)
+
+ # wait until new instance of swaybg has booted up properly
+ time.sleep(5)
+
+ # kill the previous process
+ # the new swaybg process takes its place automatically
+ if pid_running != -1:
+ os.kill(pid_running, signal.SIGTERM)
+
+ # set pid for next iteration
+ pid_running = int(subprocess.check_output(['pidof', 'swaybg']))
+
+ # wait $INTERVAL seconds
+ time.sleep(int(args.interval))