#!/usr/bin/env python #Copyright (C) 2024 Michael Kantor #This program is free software: you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation, either version 3 of the License, or #(at your option) any later version. #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. #You should have received a copy of the GNU General Public License #along with this program. If not, see . import os import sys import json import toml import signal import openrazer.client from PIL import Image from pathlib import Path from random import randint from subprocess import run import colors def dmenu(input_, prompt): result = os.popen(f'echo "{input_}" | dmenu -p "{prompt}"').read().strip("\n") return result def gen_pylogo(top_color, bottom_color): home = str(Path.home()) run(['convert', f'{home}/.config/qtile/topsnake.png', '+level-colors', f"gray,'{top_color}'", '-transparent', 'gray', '/tmp/topsnake.png']) run(['convert', f'{home}/.config/qtile/bottomsnake.png', '+level-colors', f"gray,'{bottom_color}'", '-transparent', 'gray', '/tmp/bottomsnake.png']) run(['convert', '-size', '600x600', '-composite', '/tmp/bottomsnake.png', '/tmp/topsnake.png', '/tmp/python.png']) #run(['convert', '-size', '610x610', '-composite', f'{home}/.config/qtile/border.png', '/tmp/python.png', '/tmp/python.png']) run(['rm', '-r', '/tmp/topsnake.png', '/tmp/bottomsnake.png']) def preset(wall, mode): global home presets = os.popen(f"ls {home}/Pictures/Wallpapers/presets").read().strip('\n').split('\n') wall = wall[:-3] wall += 'json' if mode == 'find': return wall in presets elif mode == 'set': wall = presets.index(wall) return presets[wall] def new(name, folder): os.system(f"ln -s {home}/Pictures/Wallpapers/wallpapers/{name} {home}/Pictures/Wallpapers/wallpaperdirs/{folder}/{name}") def pywal(wall, loc): global home if wall == 'archstylized.png': nitro(wall, loc) os.system(f'wal --theme {home}/.config/qtile/colors/defaultcolors.json') return 0 else: pass os.system(f'wal -i {loc}/{wall}') def nitro(wall, loc): global home os.system(f'nitrogen --set-scaled {loc}/{wall}') def random(walls): wallcount = len(walls) - 1 ranint = randint(0, wallcount) ranwall = walls[ranint] return ranwall if __name__ == '__main__': #Set dir variables home = str(Path.home()) stdwalls = f'{home}/Pictures/Wallpapers/wallpapers' hallo = f'{home}/Pictures/Wallpapers/halloweenwallpapers' xmas = f'{home}/Pictures/Wallpapers/xmaswallpapers' if len(sys.argv) >= 2: if sys.argv[1] == 'none': wallpapers = os.popen(f'ls {stdwalls}').read().strip('\n').split('\n') wall = random(wallpapers) if preset(wall, 'find'): os.system(f'wal --theme {home}/Pictures/Wallpapers/presets/{preset(wall, "set")}') run([f'{home}/.local/bin/pywalfox', 'update']) else: pywal(wall, stdwalls) with open(f"{home}/.cache/wal/colors.json", 'r') as f: data = json.load(f) top_color = data["colors"].get('color8') bottom_color = data["colors"].get('color6') gen_pylogo(top_color, bottom_color) elif sys.argv[1] == 'halloween': curr_dir = hallo wallpapers = os.popen(f'ls {curr_dir}').read().strip('\n').split('\n') walls = random(wallpapers) nitro(walls, curr_dir) colors.setColor(home, f'{home}/.config/qtile/colors', 'halloweencolors.json', norestart = True) run([f'{home}/.local/bin/pywalfox', 'update']) sys.exit(0) elif sys.argv[1] == 'xmas': curr_dir = xmas wallpapers = os.popen(f'ls {curr_dir}').read().strip('\n').split('\n') walls = random(wallpapers) nitro(walls, curr_dir) colors.setColor(home, f'{home}/.config/qtile/colors', 'xmascolors.json', norestart = True) run([f'{home}/.local/bin/pywalfox', 'update']) sys.exit(0) elif sys.argv[1] == 'new': new(sys.argv[2], sys.argv[3]) elif '-i' == sys.argv[1]: if sys.argv[2][0] == '/': indx = sys.argv[2].rindex('/') curr_dir = sys.argv[2][:indx] wall = sys.argv[2][indx + 1:] else: curr_dir = os.getcwd() wall = sys.argv[2] pywal(wall, curr_dir) run([f'{home}/.local/bin/pywalfox', 'update']) with open(f"{home}/.cache/wal/colors.json", 'r') as f: data = json.load(f) top_color = data["colors"].get('color8') bottom_color = data["colors"].get('color6') gen_pylogo(top_color, bottom_color) try: #subprocess.check_call(['qtile', 'shell', '-c', 'restart()']) #run(['kill', '-SIGUSR1', os.popen('pidof qtile').read().strip('\n')]) #run(['qtile', 'shell', '-c', 'restart()']) run([f'{home}/git/qtile/.venv/bin/qtile', 'shell', '-c', 'reload_config()']) except: os.system('killall dwm') elif 'a' in sys.argv[1]: curr_dir = sys.argv[1] + 'wallpapers' wallpapers = os.popen(f'ls {home}/Pictures/Wallpapers/{curr_dir}').read().strip('\n').split('\n') nitro(random(wallpapers), curr_dir) sys.exit(0) else: pass #Inital prompt walldirs = "All\n" walldirs += os.popen(f"ls {home}/Pictures/Wallpapers/wallpaperdirs/").read().strip("\n") #wallpaperchoice = os.popen(f'echo "{walldirs}" | dmenu -p "Wallpaper:"').read().strip("\n") wallpaperchoice = dmenu(walldirs, "Wallpaper:") #Closes on ESC if wallpaperchoice == '': sys.exit(0) #Sets to other dirs elif wallpaperchoice == "halloween": #wallpaperchoice = os.popen(f'ls {hallo}/ | dmenu -p "Wallpaper:"').read().strip('\n') wallpaperchoice = dmenu(os.popen(f"ls {hallo}").read().strip('\n'), "Wallpaper:") if wallpaperchoice == '': sys.exit(0) curr_dir = hallo elif wallpaperchoice == "xmas": #wallpaperchoice = os.popen(f'ls {xmas}/ | dmenu -p "Wallpaper:"').read().strip('\n') wallpaperchoice = dmenu(os.popen(f"ls {xmas}").read().strip('\n'), "Wallpaper:") if wallpaperchoice == '': sys.exit(0) curr_dir = xmas elif wallpaperchoice == "All": #wallpaperchoice = os.popen(f'ls {stdwalls}/ | dmenu -p "Wallpaper:"').read().strip('\n') wallpaperchoice = dmenu(os.popen(f"ls {stdwalls}").read().strip('\n'), "Wallpaper:") if wallpaperchoice == '': sys.exit(0) curr_dir = stdwalls else: #wallpaperchoice = os.popen(f'ls {home}/Pictures/Wallpapers/wallpaperdirs/{wallpaperchoice} | dmenu -p "Wallpaper:"').read().strip('\n') wallpaperchoice = dmenu(os.popen(f"ls {home}/Pictures/Wallpapers/wallpaperdirs/{wallpaperchoice}").read().strip('\n'), "Wallpaper:") if wallpaperchoice == '': sys.exit(0) curr_dir = stdwalls #Split to list wallargs = wallpaperchoice.split(' ') #Handle random selection if 'random' in wallargs: wallpapers = os.popen(f'ls {home}/Pictures/Wallpapers/{curr_dir}').read().strip('\n').split('\n') wallargs[0] = random(wallpapers) #Set wallpaper with nitrogen if ':nitro' in wallargs: nitro(wallargs[0], curr_dir) sys.exit(0) elif preset(wallargs[0], 'find') and ':auto' not in wallargs: os.system(f'wal --theme {home}/Pictures/Wallpapers/presets/{preset(wallargs[0], "set")}') run([f'{home}/.local/bin/pywalfox', 'update']) #Set wallpaper with pywal else: pywal(wallargs[0], curr_dir) run([f'{home}/.local/bin/pywalfox', 'update']) with open(f"{home}/.cache/wal/colors.json", 'r') as f: data = json.load(f) top_color = data["colors"].get('color8') bottom_color = data["colors"].get('color6') gen_pylogo(top_color, bottom_color) try: print('restarting qtile') #subprocess.check_call(['qtile', 'shell', '-c', 'restart()']) #run(['qtile', 'shell', '-c', 'restart()']) #run(['kill', '-SIGUSR1', os.popen('pidof qtile').read().strip('\n')]) run([f'{home}/git/qtile/.venv/bin/qtile', 'shell', '-c', 'reload_config()']) rgb = tuple(int(bottom_color.lstrip('#')[i:i+2], 16) for i in (0, 2, 4)) devman = openrazer.client.DeviceManager() for device in devman.devices: device.fx.static(rgb[0], rgb[1], rgb[2]) #os.system('qtile shell -c "restart()"') except: print('killing dwm') os.system('killall dwm') #pass