Added support for xml
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
resources/demo.mp4
|
||||
test_pack/theme/
|
||||
*.egg-info/
|
||||
__pycache__/
|
||||
|
||||
@@ -9,23 +9,43 @@ from colormath.color_diff import delta_e_cie2000
|
||||
from PIL import Image, ImageDraw
|
||||
import os, re, shutil, json, subprocess
|
||||
|
||||
# Utility ----------------------------------------------------------------------
|
||||
def expand_path(path:str) -> str:
|
||||
""" Returns the absolute version of the given path, and expands unix notation like tilde for home folder. """
|
||||
return os.path.abspath(os.path.expanduser(path))
|
||||
|
||||
def is_empty(list:List) -> bool:
|
||||
""" Returns true if given list is empty, else false. """
|
||||
return len(list) == 0
|
||||
|
||||
def load_json_file(path:str) -> Dict:
|
||||
""" Return object defined in given json file. """
|
||||
with open(path, 'r') as file:
|
||||
obj = json.load(file)
|
||||
return obj
|
||||
|
||||
# Color conversion -------------------------------------------------------------
|
||||
|
||||
def hex_to_rgb(hex:str) -> Tuple[int,int,int]:
|
||||
""" Converts 6-digit hexadecimal color to rgb color. """
|
||||
return int(hex[1:3], 16), int(hex[3:5], 16), int(hex[5:7], 16)
|
||||
|
||||
def hex_to_hsl(hex:str) -> Tuple[float,float,float]:
|
||||
""" Converts 6-digit hexadecimal color to hsl color. """
|
||||
return rgb_to_hsl(hex_to_rgb(hex))
|
||||
|
||||
def hex_to_gray(hex:str) -> str:
|
||||
""" Grayscales a given 6-digit hexadecimal color. """
|
||||
r, g, b = hex_to_rgb(hex)
|
||||
return '#' + format(int(0.21*r + 0.72*g + 0.07*b), '02x')*3
|
||||
|
||||
def rgb_to_hex(rgb:Tuple[int,int,int]) -> str:
|
||||
""" Converts rgb color to 6-digit hexadecimal color. """
|
||||
r, g, b = rgb
|
||||
return "#{:02x}{:02x}{:02x}".format(r, g, b)
|
||||
|
||||
def rgba_to_hex(rgba:Tuple[int,int,int,Optional[float]]) -> str:
|
||||
""" Converts rgba color to 8-digit hexadecimal color. """
|
||||
r, g, b = rgba[:3]
|
||||
hex = "#{:02X}{:02X}{:02X}".format(r, g, b)
|
||||
|
||||
@@ -36,6 +56,7 @@ def rgba_to_hex(rgba:Tuple[int,int,int,Optional[float]]) -> str:
|
||||
return hex
|
||||
|
||||
def rgb_to_hsl(rgb:Tuple[int,int,int]) -> Tuple[float,float,float]:
|
||||
""" Converts rgb color to hsl color. """
|
||||
r, g, b = rgb
|
||||
r /= 255.0; g /= 255.0; b /= 255.0
|
||||
max_val = max(r, g, b); min_val = min(r, g, b)
|
||||
@@ -55,11 +76,13 @@ def rgb_to_hsl(rgb:Tuple[int,int,int]) -> Tuple[float,float,float]:
|
||||
return h, s, l
|
||||
|
||||
def rgb_to_gray(rgb:Tuple[int,int,int]) -> Tuple[int,int,int]:
|
||||
""" Grayscales a given rgb color. """
|
||||
r, g, b = rgb
|
||||
weighed_avg = int(0.21*r + 0.72*g + 0.07*b)
|
||||
return weighed_avg, weighed_avg, weighed_avg
|
||||
|
||||
def hsl_to_rgb(hsl:Tuple[float,float,float]) -> Tuple[int,int,int]:
|
||||
""" Converts hsl color to rgb color. """
|
||||
h, s, l = hsl
|
||||
|
||||
if s == 0:
|
||||
@@ -75,6 +98,7 @@ def hsl_to_rgb(hsl:Tuple[float,float,float]) -> Tuple[int,int,int]:
|
||||
return int(round(r * 255)), int(round(g * 255)), int(round(b * 255))
|
||||
|
||||
def hue_to_rgb(p:float, q:float, t:float) -> float:
|
||||
""" Converts hue to rgb values. Only used by the hsl_to_rgb function. """
|
||||
if t < 0: t += 1
|
||||
if t > 1: t -= 1
|
||||
if t < 1 / 6: return p + (q - p) * 6 * t
|
||||
@@ -83,15 +107,16 @@ def hue_to_rgb(p:float, q:float, t:float) -> float:
|
||||
return p
|
||||
|
||||
def norm_hsl(h:int, s:int, l:int) -> Tuple[float,float,float]:
|
||||
""" Normalize hsl color values. """
|
||||
return h/360, s/100, l/100
|
||||
|
||||
# File conversion --------------------------------------------------------------
|
||||
|
||||
def svg_to_png(src_path:str, dest_path:str, width:int = 300) -> None:
|
||||
"""Generate pngs from svgs with a given width."""
|
||||
""" Generate pngs at given destination path from a given source folder with a given width. """
|
||||
|
||||
src_path = os.path.abspath(os.path.expanduser(src_path))
|
||||
dest_path = os.path.abspath(os.path.expanduser(dest_path))
|
||||
src_path = expand_path(src_path)
|
||||
dest_path = expand_path(dest_path)
|
||||
|
||||
try:
|
||||
subprocess.run(['inkscape', '--version'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
@@ -108,35 +133,39 @@ def svg_to_png(src_path:str, dest_path:str, width:int = 300) -> None:
|
||||
command = ['inkscape', svg_path, '-o', png_path, '-w', str(width)]
|
||||
subprocess.run(command)
|
||||
|
||||
# CSS handling -----------------------------------------------------------------
|
||||
# Preprocessing ----------------------------------------------------------------
|
||||
|
||||
def expand_css_rgba(match) -> None:
|
||||
def expand_css_rgba(match) -> str:
|
||||
""" Used by the css_to_hex function. """
|
||||
return rgba_to_hex((
|
||||
int(match.group(1)), int(match.group(2)),
|
||||
int(match.group(3)), float(match.group(4))
|
||||
))
|
||||
|
||||
def css_to_hex(text:str):
|
||||
""" Returns the given string with css rgba functions and named colors substituted for their corresponding hexadecimal codes. """
|
||||
|
||||
text = re.sub(r"rgba\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\)",
|
||||
lambda match: expand_css_rgba(match), text)
|
||||
expand_css_rgba, text)
|
||||
|
||||
for key in name_to_hex_dict:
|
||||
text = re.sub(key + "([,;])", name_to_hex_dict[key] + "\\1", text)
|
||||
text = re.sub(key + r"\b", name_to_hex_dict[key], text)
|
||||
|
||||
return text
|
||||
|
||||
def expand_hex(hex:str) -> str:
|
||||
"""Returns 6-digit version of any hexadecimal color code."""
|
||||
hex = hex.lstrip('#')
|
||||
def expand_all_hex(text:str) -> str:
|
||||
"""Expand all 3-digit hexadecimal codes in the input string to 6 digits."""
|
||||
|
||||
if len(hex) == 3:
|
||||
hex = ''.join([c * 2 for c in hex])
|
||||
|
||||
return '#' + hex.ljust(6, '0')
|
||||
return re.sub(
|
||||
r"((?<!&)#[A-Fa-f0-9]{3})\b",
|
||||
lambda match: ("#" + "".join([c * 2 for c in match.group(1)[1:]])),
|
||||
text
|
||||
)
|
||||
|
||||
# Color comparision ------------------------------------------------------------
|
||||
|
||||
def generate_palette_dict(colors:List[str]) -> Dict[str,LabColor]:
|
||||
""" Returns a dictionary mapping hexadecimal colors to lab colors. """
|
||||
palette_dict = {}
|
||||
|
||||
for color in colors:
|
||||
@@ -145,13 +174,8 @@ def generate_palette_dict(colors:List[str]) -> Dict[str,LabColor]:
|
||||
|
||||
return palette_dict
|
||||
|
||||
def load_json_file(path:str) -> Dict:
|
||||
with open(path, 'r') as file:
|
||||
palette = json.load(file)
|
||||
return palette
|
||||
|
||||
def get_input_colors(resource) -> Tuple[List[str],bool,bool]:
|
||||
"""Returns an HSL tuple, or a list of colors, depending on the input, as well as a boolean indicating which one, as well as if the palettes specifies smoothing pngs/jpgs."""
|
||||
""" Returns an HSL tuple, or a list of colors, depending on the input, as well as a boolean indicating which one, as well as if the palettes specifies smoothing pngs/jpgs. """
|
||||
|
||||
if isinstance(resource, tuple) and len(resource) == 3:
|
||||
return resource, False, True
|
||||
@@ -163,12 +187,11 @@ def get_input_colors(resource) -> Tuple[List[str],bool,bool]:
|
||||
else:
|
||||
return generate_palette_dict(resource["colors"]), palette_file["smooth"], False
|
||||
|
||||
def get_file_colors(file:str) -> Set[str]:
|
||||
"""Return a set of all unique colors within a given string
|
||||
representing an svg-file."""
|
||||
def get_file_colors(text:str) -> Set[str]:
|
||||
""" Return a set of all unique colors within a given string representing an svg-file. """
|
||||
|
||||
colors = set()
|
||||
matches = re.findall(r"#[A-Fa-f0-9]{6}", file)
|
||||
matches = re.findall(r"#[A-Fa-f0-9]{6}", text)
|
||||
|
||||
for match in matches:
|
||||
colors.add(match)
|
||||
@@ -176,9 +199,7 @@ def get_file_colors(file:str) -> Set[str]:
|
||||
return colors
|
||||
|
||||
def closest_match(color:str, palette:Dict[str,LabColor]) -> str:
|
||||
"""Compare the similarity of colors in the CIELAB colorspace. Return the
|
||||
closest match, i.e. the palette entry with the smallest euclidian distance
|
||||
to the given color."""
|
||||
""" Compare the similarity of colors in the CIELAB colorspace. Return the closest match, i.e. the palette entry with the smallest euclidian distance to the given color. """
|
||||
|
||||
closest_color = None
|
||||
min_distance = float('inf')
|
||||
@@ -203,12 +224,8 @@ def closest_match(color:str, palette:Dict[str,LabColor]) -> str:
|
||||
|
||||
# Pack management --------------------------------------------------------------
|
||||
|
||||
def expand_path(path:str) -> str:
|
||||
return os.path.abspath(os.path.expanduser(path))
|
||||
|
||||
def get_paths(folder: str, exts: List[str]) -> List[str]:
|
||||
"""Return paths of every file with the given extensions within a folder
|
||||
and its subfolders, excluding symbolic links."""
|
||||
""" Return paths of every file with the given extensions within a folder and its subfolders, excluding symbolic links. """
|
||||
|
||||
paths = []
|
||||
|
||||
@@ -230,9 +247,7 @@ def get_paths(folder: str, exts: List[str]) -> List[str]:
|
||||
return paths
|
||||
|
||||
def copy_file_structure(src_path:str, dest_path:str) -> None:
|
||||
"""Copies a directory tree, but changes symbolic links to point
|
||||
to files within the destination folder instead of the source.
|
||||
Assumes that no link points to files outside the source folder."""
|
||||
""" Copies a directory tree, but changes symbolic links to point to files within the destination folder instead of the source. Assumes that no link points to files outside the source folder. """
|
||||
|
||||
shutil.rmtree(dest_path, ignore_errors=True)
|
||||
shutil.copytree(src_path, dest_path, symlinks=True)
|
||||
@@ -257,8 +272,7 @@ def copy_file_structure(src_path:str, dest_path:str) -> None:
|
||||
os.symlink(relative_target, file_path)
|
||||
|
||||
def rename_pack(src_path, dest_path:str, name:str) -> None:
|
||||
"""If an index.theme file exists within the given folder, apply
|
||||
appropiate naming."""
|
||||
""" If an index.theme file exists within the given folder, apply appropiate naming. """
|
||||
|
||||
index_path = os.path.join(dest_path, "index.theme")
|
||||
|
||||
@@ -278,7 +292,7 @@ def rename_pack(src_path, dest_path:str, name:str) -> None:
|
||||
file.write(text)
|
||||
|
||||
def copy_pack(src_path:str, dest_path:str, name:str) -> str:
|
||||
"""Copy pack and return the resulting copy's directory path."""
|
||||
""" Copy pack and return the resulting copy's directory path. """
|
||||
|
||||
src_path = expand_path(src_path)
|
||||
dest_path = os.path.join(expand_path(dest_path), name)
|
||||
@@ -291,9 +305,7 @@ def copy_pack(src_path:str, dest_path:str, name:str) -> str:
|
||||
# SVG/CSS recoloring -----------------------------------------------------------
|
||||
|
||||
def monochrome_vec(svg:str, colors:Set[str], hsl:Tuple[float,float,float]) -> str:
|
||||
"""Replace every instance of color within the given list with their
|
||||
monochrome equivalent in the given string representing an svg-file,
|
||||
determined by the given hue, saturation and lightness offset."""
|
||||
""" Replace every instance of color within the given list with their monochrome equivalent in the given string representing an svg-file, determined by the given hue, saturation and lightness offset. """
|
||||
|
||||
h, s, l_offset = hsl
|
||||
|
||||
@@ -315,8 +327,7 @@ def monochrome_vec(svg:str, colors:Set[str], hsl:Tuple[float,float,float]) -> st
|
||||
return svg
|
||||
|
||||
def multichrome_vec(svg:str, colors:Set[str], new_colors:Dict[str,LabColor]) -> str:
|
||||
"""Replace colors in a given svg/css with the closest match within a given
|
||||
color palette."""
|
||||
""" Replace colors in a given svg/css with the closest match within a given color palette. """
|
||||
|
||||
for color in colors:
|
||||
new_color = closest_match(color, new_colors)
|
||||
@@ -327,8 +338,7 @@ def multichrome_vec(svg:str, colors:Set[str], new_colors:Dict[str,LabColor]) ->
|
||||
# PNG/JPG recoloring -----------------------------------------------------------
|
||||
|
||||
def monochrome_img(img:Image, hsl:Tuple[float,float,float]) -> Image:
|
||||
"""Replace every instance of color within the given list with their
|
||||
monochrome equivalent in the given image, determined by the given hue, saturation and lightness offset."""
|
||||
""" Replace every instance of color within the given list with their monochrome equivalent in the given image, determined by the given hue, saturation and lightness offset. """
|
||||
|
||||
mode = img.mode
|
||||
h, s, l_offset = hsl
|
||||
@@ -359,8 +369,7 @@ def monochrome_img(img:Image, hsl:Tuple[float,float,float]) -> Image:
|
||||
return img
|
||||
|
||||
def multichrome_img(img:Image, new_colors:Dict[str,LabColor], smooth:bool) -> Image:
|
||||
"""Replace colors in a given image with the closest match within a given
|
||||
color palette."""
|
||||
""" Replace colors in a given image with the closest match within a given color palette. """
|
||||
|
||||
if smooth: img = img.convert("P", palette=Image.ADAPTIVE, colors=256)
|
||||
else: img = img.convert("P")
|
||||
@@ -382,18 +391,19 @@ def multichrome_img(img:Image, new_colors:Dict[str,LabColor], smooth:bool) -> Im
|
||||
# User interface functions -----------------------------------------------------
|
||||
|
||||
def recolor(src_path:str, dest_path:str, name:str, replacement) -> None:
|
||||
"""Recursively copies and converts a source folder into a destination, given a either a color or a palette."""
|
||||
""" Recursively copies and converts a source folder into a destination, given a either a color or a palette. """
|
||||
|
||||
new_colors, smooth, is_mono = get_input_colors(replacement)
|
||||
dest_path = copy_pack(src_path, dest_path, name)
|
||||
svg_paths = get_paths(dest_path, [".svg"])
|
||||
svg_paths = get_paths(dest_path, [".svg", ".xml"])
|
||||
png_paths = get_paths(dest_path, [".png"])
|
||||
jpg_paths = get_paths(dest_path, [".jpg", ".jpeg"])
|
||||
css_paths = get_paths(dest_path, [".css", "rc"])
|
||||
|
||||
for path in tqdm(svg_paths, desc="svg", unit="file"):
|
||||
for path in tqdm(svg_paths, desc="svg", disable=is_empty(svg_paths)):
|
||||
with open(path, 'r') as file: x = file.read()
|
||||
|
||||
x = expand_all_hex(x)
|
||||
colors = get_file_colors(x)
|
||||
|
||||
if is_mono: x = monochrome_vec(x, colors, new_colors)
|
||||
@@ -401,7 +411,7 @@ def recolor(src_path:str, dest_path:str, name:str, replacement) -> None:
|
||||
|
||||
with open(path, 'w') as file: file.write(x)
|
||||
|
||||
for path in tqdm(png_paths, desc="png", unit="file"):
|
||||
for path in tqdm(png_paths, desc="png", disable=is_empty(png_paths)):
|
||||
x = Image.open(path)
|
||||
x = x.convert("RGBA")
|
||||
a = x.split()[3] # Save original alpha channel.
|
||||
@@ -414,7 +424,7 @@ def recolor(src_path:str, dest_path:str, name:str, replacement) -> None:
|
||||
x = Image.merge("RGBA",(r,g,b,a)) # Restore original alpha channel.
|
||||
x.save(path)
|
||||
|
||||
for path in tqdm(jpg_paths, desc="jpg", unit="file"):
|
||||
for path in tqdm(jpg_paths, desc="jpg", disable=is_empty(jpg_paths)):
|
||||
x = Image.open(path)
|
||||
x = x.convert("RGB")
|
||||
|
||||
@@ -424,10 +434,12 @@ def recolor(src_path:str, dest_path:str, name:str, replacement) -> None:
|
||||
x = x.convert("RGB")
|
||||
x.save(path)
|
||||
|
||||
for path in tqdm(css_paths, desc="css", unit="file"):
|
||||
for path in tqdm(css_paths, desc="css", disable=is_empty(css_paths)):
|
||||
with open(path, 'r') as file: x = file.read()
|
||||
|
||||
x = css_to_hex(x)
|
||||
x = expand_all_hex(x)
|
||||
|
||||
colors = get_file_colors(x)
|
||||
|
||||
if is_mono: x = monochrome_vec(x, colors, new_colors)
|
||||
@@ -436,7 +448,7 @@ def recolor(src_path:str, dest_path:str, name:str, replacement) -> None:
|
||||
with open(path, 'w') as file: file.write(x)
|
||||
|
||||
def extract_colors(img_path:str, num_colors:int=8, save_path:str=None, pixels:int=50, cols:int=10) -> List[str]:
|
||||
"""Returns and optionally saves the color palette of the given image, finding the specified number of colors."""
|
||||
""" Returns and optionally saves the color palette of the given image, finding the specified number of colors. """
|
||||
|
||||
_, ext = os.path.splitext(img_path)
|
||||
|
||||
@@ -475,7 +487,7 @@ def extract_colors(img_path:str, num_colors:int=8, save_path:str=None, pixels:in
|
||||
return colors
|
||||
|
||||
def clean_svg(input_path:str, output_path:str=None) -> str:
|
||||
"""Removes needless metadata from svgs and optionally saves as copy, if output path is specified."""
|
||||
""" Removes needless metadata from svgs and optionally saves as copy, if output path is specified. """
|
||||
|
||||
with open(input_path, 'r') as f:
|
||||
svg = f.read()
|
||||
@@ -496,6 +508,7 @@ def clean_svg(input_path:str, output_path:str=None) -> str:
|
||||
f.write(svg)
|
||||
|
||||
def add_backdrop(src_path:str, dest_path:str, name:str, color:str="#000000", padding=0, rounding=0):
|
||||
""" Add a customizable backdrop to all svg-based icons. """
|
||||
|
||||
dest_path = copy_pack(src_path, dest_path, name)
|
||||
svg_paths = get_paths(dest_path, [".svg"])
|
||||
@@ -518,8 +531,6 @@ def add_backdrop(src_path:str, dest_path:str, name:str, color:str="#000000", pad
|
||||
|
||||
# Global constants -------------------------------------------------------------
|
||||
|
||||
this_path = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# A dynamic dictionary to avoid multiple color conversions.
|
||||
hex_to_lab_dict = {
|
||||
"#ffffff": LabColor(9341.568974319263, -0.037058350415009045, -0.6906417562959177), # White.
|
||||
@@ -527,4 +538,9 @@ hex_to_lab_dict = {
|
||||
}
|
||||
|
||||
# A static dictionary of named colors from the css standard.
|
||||
name_to_hex_dict = load_json_file(os.path.join(this_path, "named_colors.json"))
|
||||
name_to_hex_dict = load_json_file(
|
||||
os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"named_colors.json"
|
||||
)
|
||||
)
|
||||
|
||||
@@ -41,6 +41,7 @@ Color Manager is a program for recoloring and manipulating existing icon packs,
|
||||
- [x] Remove metadata from svgs.
|
||||
- [x] Adding basic geometry to the backgrounds of svg icons.
|
||||
- [x] Preserve transparency in pngs after multichrome recoloring.
|
||||
- [ ] Add an option to map colors directly using a json dictionary.
|
||||
- [ ] Optional automatic palette extending.
|
||||
- [ ] Basic framework for manipulating GTK, Cinnamon and Metacity themes.
|
||||
- [ ] Intelligent color inversion.
|
||||
|
||||
29
test.ipynb
@@ -14,17 +14,34 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/home/nv/Downloads/my_pack/index.theme\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"svg: 100%|██████████| 43/43 [00:00<00:00, 250.05it/s]\n",
|
||||
"png: 100%|██████████| 439/439 [00:01<00:00, 360.71it/s]\n",
|
||||
"css: 100%|██████████| 12/12 [00:00<00:00, 84.68it/s]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"src = \"test_pack\" # = \"test_theme\"\n",
|
||||
"name = \"my_pack\" # = \"my_theme\"\n",
|
||||
"src = \"test_theme\" # = \"test_theme\"\n",
|
||||
"name = \"my_pack\" # = \"my_theme\"\n",
|
||||
"dest = \"~/Downloads\"\n",
|
||||
"hsl = (0.6, 0.54, 0.5) # = rc.normalize_hsl(180, 50, 50)\n",
|
||||
"hsl = (0.6, 0.54, 0.5) # = rc.normalize_hsl(180, 50, 50)\n",
|
||||
"palette = \"palettes/nord.json\"\n",
|
||||
"\n",
|
||||
"utils.recolor(src, dest, name, palette) # Either hsl or palette"
|
||||
"utils.recolor(src, dest, name, hsl) # Either hsl or palette"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# ==============================================================================
|
||||
# CHROME/-UIM SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
# Chromium lets us define some colours and settings for better integration
|
||||
|
||||
style "chrome-gtk-frame"
|
||||
{
|
||||
ChromeGtkFrame::frame-color = @wm_color
|
||||
ChromeGtkFrame::inactive-frame-color = @unfocused_wm_color
|
||||
|
||||
ChromeGtkFrame::frame-gradient-size = 16
|
||||
ChromeGtkFrame::frame-gradient-color = shade(1.07, @wm_color)
|
||||
|
||||
ChromeGtkFrame::incognito-frame-color = shade(0.85, @wm_color)
|
||||
ChromeGtkFrame::incognito-inactive-frame-color = @wm_color
|
||||
|
||||
ChromeGtkFrame::incognito-frame-gradient-color = @wm_color
|
||||
|
||||
ChromeGtkFrame::scrollbar-trough-color = shade(0.912, @wm_color)
|
||||
ChromeGtkFrame::scrollbar-slider-prelight-color = shade(1.04, @wm_color)
|
||||
ChromeGtkFrame::scrollbar-slider-normal-color = @wm_color
|
||||
}
|
||||
|
||||
class "ChromeGtkFrame" style "chrome-gtk-frame"
|
||||
|
||||
# Chromium uses base as the fill colour of its own entries
|
||||
# This would be fine but Gtk+ uses it to fill the surrounding space, so its set to bg
|
||||
# That results in Chromium using it for the fill, so we need to handle that
|
||||
|
||||
style "chrome_entry" {
|
||||
base[NORMAL] = @base_color
|
||||
base[INSENSITIVE] = @base_color
|
||||
}
|
||||
|
||||
widget_class "*Chrom*<GtkEntry>" style "chrome_entry"
|
||||
|
||||
# Chrome Menu item background
|
||||
|
||||
style "chrome_menu_item"
|
||||
{
|
||||
bg[SELECTED] = @wm_color
|
||||
}
|
||||
|
||||
widget_class "*<GtkCustomMenu>*<GtkCustomMenuItem>*" style "chrome_menu_item"
|
||||
|
||||
|
||||
# Chrome buttons
|
||||
|
||||
widget_class "*Chrom*Button*" style "button"
|
||||
@@ -1,83 +0,0 @@
|
||||
# ==============================================================================
|
||||
# GIMP SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
# TODO: This could really look nicer
|
||||
style "gimp_spin_scale" {
|
||||
|
||||
# Spin background
|
||||
bg[NORMAL] = @base_color
|
||||
|
||||
engine "pixmap" {
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = NORMAL
|
||||
detail = "spinbutton_up"
|
||||
overlay_file = "assets/spin-up.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = PRELIGHT
|
||||
detail = "spinbutton_up"
|
||||
overlay_file = "assets/spin-up.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = ACTIVE
|
||||
detail = "spinbutton_up"
|
||||
overlay_file = "assets/spin-up.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = INSENSITIVE
|
||||
detail = "spinbutton_up"
|
||||
overlay_file = "assets/spin-up-insensitive.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = NORMAL
|
||||
detail = "spinbutton_down"
|
||||
overlay_file = "assets/spin-down.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = PRELIGHT
|
||||
detail = "spinbutton_down"
|
||||
overlay_file = "assets/spin-down.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = ACTIVE
|
||||
detail = "spinbutton_down"
|
||||
overlay_file = "assets/spin-down.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
image {
|
||||
function = BOX
|
||||
state = INSENSITIVE
|
||||
detail = "spinbutton_down"
|
||||
overlay_file = "assets/spin-down-insensitive.png"
|
||||
overlay_stretch = FALSE
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Disable spin button assets for GimpSpinScale
|
||||
class "GimpSpinScale" style "gimp_spin_scale"
|
||||
@@ -1,12 +0,0 @@
|
||||
# ==============================================================================
|
||||
# OPEN/LIBREOFFICE SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
style "ooo_stepper_hack"
|
||||
{
|
||||
GtkScrollbar::stepper-size = 13
|
||||
GtkScrollbar::has-backward-stepper = 1
|
||||
GtkScrollbar::has-forward-stepper = 1
|
||||
}
|
||||
|
||||
widget "*openoffice-toplevel*" style "ooo_stepper_hack"
|
||||
@@ -1,48 +0,0 @@
|
||||
# ==============================================================================
|
||||
# GNOME TERMINAL SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
style "terminal_window" = "dark" {
|
||||
}
|
||||
|
||||
style "terminal_menubar"
|
||||
{
|
||||
|
||||
engine "murrine" {
|
||||
}
|
||||
}
|
||||
|
||||
style "terminal_notebook" = "dark"
|
||||
{
|
||||
fg[ACTIVE] = mix (0.8, "#DADBDB", "#DADBDB")
|
||||
|
||||
engine "murrine" {
|
||||
}
|
||||
}
|
||||
|
||||
style "terminal_scrollbar" = "scrollbar"
|
||||
{
|
||||
bg[NORMAL] = "#263238"
|
||||
bg[PRELIGHT] = shade(1.08, "#263238")
|
||||
bg[ACTIVE] = shade(0.94, "#263238")
|
||||
bg[SELECTED] = shade(1.0, @selected_bg_color)
|
||||
bg[INSENSITIVE] = "#263238"
|
||||
|
||||
engine "murrine" {
|
||||
}
|
||||
}
|
||||
|
||||
style "terminal_screen"
|
||||
{
|
||||
text[NORMAL] = "#DADBDB"
|
||||
base[NORMAL] = "#384952"
|
||||
|
||||
TerminalScreen::background-darkness = 0.95
|
||||
}
|
||||
|
||||
widget "*TerminalWindow*" style "terminal_window"
|
||||
#widget "*TerminalWindow.*.*enu?ar" style "terminal_menubar"
|
||||
widget "*TerminalWindow.*.GtkNotebook*" style "terminal_notebook"
|
||||
widget "*TerminalWindow.*.GtkNotebook.*.GtkVScrollbar*" style "terminal_scrollbar"
|
||||
#widget "*TerminalWindow.*.GtkNotebook*utton*" style "terminal_button"
|
||||
widget "*TerminalWindow.*.TerminalScreen*" style "terminal_screen"
|
||||
@@ -1,24 +0,0 @@
|
||||
# ==============================================================================
|
||||
# THUNAR SPECIFIC SETTINGS
|
||||
# ==============================================================================
|
||||
|
||||
style "sidepane" {
|
||||
|
||||
GtkTreeView::odd_row_color = @sidebar_bg
|
||||
GtkTreeView::even_row_color = @sidebar_bg
|
||||
base[NORMAL] = @bg_color
|
||||
base[INSENSITIVE] = mix(0.4, shade(1.35, @selected_bg_color), shade(0.9, @base_color))
|
||||
bg[NORMAL] = @bg_color
|
||||
text[NORMAL] = mix(0.9, @fg_color, @bg_color)
|
||||
}
|
||||
|
||||
style "thunar-frame" {
|
||||
xthickness = 0
|
||||
ythickness = 0
|
||||
}
|
||||
style "thunar-handle" { GtkPaned::handle-size = 2 }
|
||||
widget_class "*ThunarWindow*.<GtkScrolledWindow>" style "thunar-frame"
|
||||
widget_class "*ThunarWindow*.<GtkHPaned>" style "thunar-handle"
|
||||
|
||||
widget_class "*ThunarShortcutsView*" style "sidepane"
|
||||
widget_class "*ThunarTreeView*" style "sidepane"
|
||||
@@ -1,90 +0,0 @@
|
||||
style "theme-panel" = "dark" {
|
||||
xthickness = 1
|
||||
ythickness = 1
|
||||
bg[NORMAL] = @panel_bg_color
|
||||
}
|
||||
|
||||
style "xfdesktop-icon-view" {
|
||||
XfdesktopIconView::label-alpha = 0
|
||||
XfdesktopIconView::selected-label-alpha = 80
|
||||
XfdesktopIconView::shadow-x-offset = 0
|
||||
XfdesktopIconView::shadow-y-offset = 0
|
||||
XfdesktopIconView::selected-shadow-x-offset = 0
|
||||
XfdesktopIconView::selected-shadow-y-offset = 0
|
||||
XfdesktopIconView::shadow-color = @tooltip_bg_color
|
||||
XfdesktopIconView::selected-shadow-color = @tooltip_bg_color
|
||||
XfdesktopIconView::cell-spacing = 2
|
||||
XfdesktopIconView::cell-padding = 6
|
||||
XfdesktopIconView::cell-text-width-proportion = 1.9
|
||||
|
||||
fg[NORMAL] = shade (0.9, @selected_fg_color)
|
||||
fg[ACTIVE] = @selected_fg_color
|
||||
|
||||
}
|
||||
|
||||
style "theme-panel-text" = "dark" {
|
||||
}
|
||||
|
||||
style "panel-entry" = "dark" {
|
||||
}
|
||||
|
||||
style "theme-main-menu-text" = "theme-panel-text"
|
||||
{
|
||||
fg[PRELIGHT] = "#ffffff"
|
||||
text[PRELIGHT] = "#ffffff"
|
||||
}
|
||||
|
||||
style "workspace-switcher" = "dark"
|
||||
{
|
||||
bg[SELECTED] = shade (0.8, @selected_bg_color)
|
||||
}
|
||||
|
||||
style "window-buttons" = "dark" {
|
||||
|
||||
}
|
||||
|
||||
style "indicator" = "theme-panel"
|
||||
{
|
||||
xthickness = 0
|
||||
ythickness = 0
|
||||
}
|
||||
|
||||
widget "*PanelWidget*" style "theme-panel"
|
||||
widget "*PanelApplet*" style "theme-panel"
|
||||
widget "*fast-user-switch*" style "theme-panel"
|
||||
widget "*CPUFreq*Applet*" style "theme-panel"
|
||||
class "PanelApp*" style "theme-panel"
|
||||
class "PanelToplevel*" style "theme-panel"
|
||||
widget_class "*PanelToplevel*" style "theme-panel"
|
||||
widget_class "*notif*" style "theme-panel"
|
||||
widget_class "*Notif*" style "theme-panel"
|
||||
widget_class "*Tray*" style "theme-panel"
|
||||
widget_class "*tray*" style "theme-panel"
|
||||
widget_class "*computertemp*" style "theme-panel"
|
||||
widget_class "*Applet*Tomboy*" style "theme-panel"
|
||||
widget_class "*Applet*Netstatus*" style "theme-panel"
|
||||
|
||||
# Fixes for tooltip text in some apps.
|
||||
widget_class "*Notif*Beagle*" style "theme-panel"
|
||||
widget_class "*Notif*Brasero*" style "theme-panel"
|
||||
|
||||
# XFCE panel theming.
|
||||
widget "*Xfce*Panel*" style "theme-panel"
|
||||
class "*Xfce*Panel*" style "theme-panel"
|
||||
widget "*WnckPager*" style "workspace-switcher"
|
||||
widget "*XfdesktopIconView*" style "xfdesktop-icon-view"
|
||||
|
||||
# Fix gtk-entries in the panel
|
||||
class "*SexyIconEntry*" style:highest "entry" # fixes dict-plugin
|
||||
widget "*xfce4-verve-plugin*GtkEntry" style:highest "entry" # fixes verve-plugin
|
||||
|
||||
# Make sure panel text color doesn't change
|
||||
widget_class "*Panel*MenuBar*" style "theme-main-menu-text"
|
||||
widget_class "*Panel*<GtkMenuBar>*" style "theme-main-menu-text"
|
||||
widget "*.clock-applet-button.*" style "theme-panel-text"
|
||||
widget "*PanelApplet*" style "theme-panel-text"
|
||||
|
||||
# Override general panel-style with specific plugin-styles
|
||||
widget "*indicator-applet*" style "indicator"
|
||||
widget "*indicator-button*" style "indicator"
|
||||
#widget "*XfceTasklist*" style "dark_button"
|
||||
|
Before Width: | Height: | Size: 290 B |
|
Before Width: | Height: | Size: 348 B |
|
Before Width: | Height: | Size: 348 B |
|
Before Width: | Height: | Size: 419 B |
|
Before Width: | Height: | Size: 407 B |
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-checked-active-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-checked-hover-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-checked-insensitive-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-checked-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-mixed-active-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-mixed-hover-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-mixed-insensitive-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-mixed-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-unchecked-active-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-unchecked-hover-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-unchecked-insensitive-dark.png
|
||||
@@ -1 +0,0 @@
|
||||
../../assets/checkbox-unchecked-dark.png
|
||||
|
Before Width: | Height: | Size: 378 B |
|
Before Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 374 B |
|
Before Width: | Height: | Size: 371 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 378 B |
|
Before Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 374 B |
|
Before Width: | Height: | Size: 365 B |
|
Before Width: | Height: | Size: 376 B |
|
Before Width: | Height: | Size: 372 B |
|
Before Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 302 B |
|
Before Width: | Height: | Size: 302 B |
|
Before Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 307 B |
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 356 B |
|
Before Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 304 B |
|
Before Width: | Height: | Size: 289 B |
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 402 B |
|
Before Width: | Height: | Size: 509 B |
|
Before Width: | Height: | Size: 509 B |
|
Before Width: | Height: | Size: 363 B |
|
Before Width: | Height: | Size: 380 B |
|
Before Width: | Height: | Size: 366 B |
|
Before Width: | Height: | Size: 380 B |
|
Before Width: | Height: | Size: 375 B |
|
Before Width: | Height: | Size: 363 B |
|
Before Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 328 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 348 B |
|
Before Width: | Height: | Size: 324 B |
|
Before Width: | Height: | Size: 540 B |
|
Before Width: | Height: | Size: 540 B |
|
Before Width: | Height: | Size: 540 B |
|
Before Width: | Height: | Size: 501 B |
|
Before Width: | Height: | Size: 569 B |
|
Before Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 486 B |
|
Before Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 501 B |
|
Before Width: | Height: | Size: 301 B |
|
Before Width: | Height: | Size: 337 B |
|
Before Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 356 B |
|
Before Width: | Height: | Size: 348 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 328 B |
|
Before Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 343 B |
|
Before Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 325 B |