summaryrefslogtreecommitdiff
path: root/newTheme.py
diff options
context:
space:
mode:
Diffstat (limited to 'newTheme.py')
-rw-r--r--newTheme.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/newTheme.py b/newTheme.py
new file mode 100644
index 0000000..0511e47
--- /dev/null
+++ b/newTheme.py
@@ -0,0 +1,109 @@
+"""
+Basically what I want this program to dynamically update the colors based on the desktop background
+so it will grab colors from the desktop background by finding the most promident colors and then set
+the system colors to these colors. I believe there are two major components involved in making this work
+
+i. The part of the program that analyzes an image and determines the most prominent colors
+ii. The part of the program that goes into all the configuration files and updates their color schemes
+"""
+import sys
+import numpy as np
+import PIL
+import cv2 as cv
+from sklearn.cluster import KMeans
+from paths import Paths
+def grabColors(img_path: str, num_colors: int) -> list():
+ """
+ Takes in an image, and Number of colors, then returns a list of those colors.
+ The list of colors will contain the most prominent colors present in the image.
+ img_path - the path where your image lives (IE, /home/chandler/Pictures/moss.png)
+ num_colors - the number of colors you need back from the image
+ """
+ img = cv.imread(img_path)
+ img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
+
+ # scale image down by factor of 10 to decrease computation time
+ dim = (int(len(img[0])/10), int(len(img)/10))
+ img = cv.resize(img, dim, interpolation= cv.INTER_AREA)
+ clt = KMeans(n_clusters=num_colors, n_init='auto')
+ clt.fit(img.reshape(-1, 3))
+ return clt.cluster_centers_
+
+def rgbToHex(input_values):
+ """
+ Takes in a list of RBG color values and returns a list of those same colors as hex values
+ """
+ hex_list=[]
+ for color in input_values:
+ red = int(color[0])
+ green = int(color[1])
+ blue = int(color[2])
+ hex_list.append('#{:02x}{:02x}{:02x}'.format(red, green, blue))
+ return hex_list
+
+def compColors(color_list):
+ """
+ given a list of colors, generate complimentary colors to contrast the prominent colors.
+ return a list of these colors.
+ """
+ compliments = []
+ for color in color_list:
+ curr_hex = color[1:] # slice off the # from the hex code
+ rgb = (curr_hex[0:2], curr_hex[2:4], curr_hex[4:6])
+ comp = ['%02X' % (255 - int(a, 16)) for a in rgb]
+ compliments.append('#' + ''.join(comp))
+ return compliments
+def updatei3Theme(config_path: str, img_path: str, colors: list, compliments: list):
+ # read in the config file
+ data = ''
+ with open(config_path, 'r') as file:
+ data = file.readlines()
+ for i, line in enumerate(data):
+ # update colors
+ if "set $bgcolor" in line:
+ data[i] = 'set $bgcolor ' + colors[0] + '\n'
+ if "set $in-bgcolor" in line:
+ data[i] = 'set $in-bgcolor ' + colors[1] + '\n'
+ if "set $text" in line:
+ data[i] = 'set $text ' + compliments[0] + '\n'
+ if "set $indicator" in line:
+ data[i] = 'set $indicator ' + colors[2] + '\n'
+ if "set $in-text" in line:
+ data[i] = 'set $in-text ' + compliments[1] + '\n'
+ #update background image
+ if "exec_always feh" in line:
+ data[i] = 'exec_always feh --bg-fil ' + img_path + '\n'
+ with open(config_path, 'w') as file:
+ file.writelines(data)
+def updatePolybarTheme(config_path: str, colors: list, compliments: list):
+ data = ''
+ with open(config_path, 'r') as file:
+ data = file.readlines()
+ for i,line in enumerate(data):
+ #update colors
+ if "background =" in line and i == 19:
+ data[i] = 'background = ' + colors[0] + '\n'
+ if "background-alt =" in line and i == 20:
+ data[i] = 'background-alt = ' + colors[1] + '\n'
+ if "foreground =" in line and i == 21:
+ data[i] = 'foreground = ' + compliments[1] + '\n'
+ if "primary =" in line and i == 22:
+ data[i] = 'primary = ' + compliments[2] + '\n'
+ if "secondary =" in line and i == 23:
+ data[i] = 'secondary = ' + compliments[3] + '\n'
+ if "disabled =" in line and i == 25:
+ data[i] = 'disabled = ' + colors[2] + '\n'
+ with open(config_path, 'w') as file:
+ file.writelines(data)
+
+def main():
+ img_path = sys.argv[1]
+ popularColors = grabColors(img_path, 5)
+ hex_colors = rgbToHex(popularColors)
+ hex_compliments = compColors(hex_colors)
+ updatei3Theme(Paths['i3'], img_path, hex_colors, hex_compliments)
+ updatePolybarTheme(Paths['polybar'], hex_colors, hex_compliments)
+ print("Theme changed successfully, please reload i3")
+
+
+main()