diff --git a/assets/close.png b/assets/close.png index eed4400e..8a10feeb 100644 Binary files a/assets/close.png and b/assets/close.png differ diff --git a/assets/close@2.png b/assets/close@2.png index d7df9584..30ee9e76 100644 Binary files a/assets/close@2.png and b/assets/close@2.png differ diff --git a/assets/close_prelight.png b/assets/close_prelight.png index 51419605..d6408581 100644 Binary files a/assets/close_prelight.png and b/assets/close_prelight.png differ diff --git a/assets/close_prelight@2.png b/assets/close_prelight@2.png index bb3fb49b..99aa7fb4 100644 Binary files a/assets/close_prelight@2.png and b/assets/close_prelight@2.png differ diff --git a/assets/close_unfocused.png b/assets/close_unfocused.png index 1807b931..66d3d27c 100644 Binary files a/assets/close_unfocused.png and b/assets/close_unfocused.png differ diff --git a/assets/close_unfocused@2.png b/assets/close_unfocused@2.png index 8440ae85..1a13d5a9 100644 Binary files a/assets/close_unfocused@2.png and b/assets/close_unfocused@2.png differ diff --git a/assets/close_unfocused_prelight.png b/assets/close_unfocused_prelight.png new file mode 100644 index 00000000..82d884f6 Binary files /dev/null and b/assets/close_unfocused_prelight.png differ diff --git a/assets/close_unfocused_prelight@2.png b/assets/close_unfocused_prelight@2.png new file mode 100644 index 00000000..dbf1f8ca Binary files /dev/null and b/assets/close_unfocused_prelight@2.png differ diff --git a/assets/maximize.png b/assets/maximize.png index 454cab7c..b6125694 100644 Binary files a/assets/maximize.png and b/assets/maximize.png differ diff --git a/assets/maximize@2.png b/assets/maximize@2.png index 3adbfde1..117c697c 100644 Binary files a/assets/maximize@2.png and b/assets/maximize@2.png differ diff --git a/assets/maximize_prelight.png b/assets/maximize_prelight.png index 4b8a2f9c..55af09df 100644 Binary files a/assets/maximize_prelight.png and b/assets/maximize_prelight.png differ diff --git a/assets/maximize_prelight@2.png b/assets/maximize_prelight@2.png index de447957..d6ad7f3b 100644 Binary files a/assets/maximize_prelight@2.png and b/assets/maximize_prelight@2.png differ diff --git a/assets/maximize_unfocused_prelight.png b/assets/maximize_unfocused_prelight.png new file mode 100644 index 00000000..68614c92 Binary files /dev/null and b/assets/maximize_unfocused_prelight.png differ diff --git a/assets/maximize_unfocused_prelight@2.png b/assets/maximize_unfocused_prelight@2.png new file mode 100644 index 00000000..f2005ed4 Binary files /dev/null and b/assets/maximize_unfocused_prelight@2.png differ diff --git a/assets/min.png b/assets/min.png index c3ab9b3b..9d2d12b4 100644 Binary files a/assets/min.png and b/assets/min.png differ diff --git a/assets/min@2.png b/assets/min@2.png index b058ce74..331f8eb7 100644 Binary files a/assets/min@2.png and b/assets/min@2.png differ diff --git a/assets/min_prelight.png b/assets/min_prelight.png index c0100950..00d0136d 100644 Binary files a/assets/min_prelight.png and b/assets/min_prelight.png differ diff --git a/assets/min_prelight@2.png b/assets/min_prelight@2.png index f6aa9e04..cd85cf9e 100644 Binary files a/assets/min_prelight@2.png and b/assets/min_prelight@2.png differ diff --git a/assets/min_unfocused_prelight.png b/assets/min_unfocused_prelight.png new file mode 100644 index 00000000..f53a03ff Binary files /dev/null and b/assets/min_unfocused_prelight.png differ diff --git a/assets/min_unfocused_prelight@2.png b/assets/min_unfocused_prelight@2.png new file mode 100644 index 00000000..9cc0f7ac Binary files /dev/null and b/assets/min_unfocused_prelight@2.png differ diff --git a/assets/restore.png b/assets/restore.png new file mode 100644 index 00000000..b6125694 Binary files /dev/null and b/assets/restore.png differ diff --git a/assets/restore@2.png b/assets/restore@2.png new file mode 100644 index 00000000..117c697c Binary files /dev/null and b/assets/restore@2.png differ diff --git a/assets/restore_prelight.png b/assets/restore_prelight.png new file mode 100644 index 00000000..a4b5c7e8 Binary files /dev/null and b/assets/restore_prelight.png differ diff --git a/assets/restore_prelight@2.png b/assets/restore_prelight@2.png new file mode 100644 index 00000000..86237bb3 Binary files /dev/null and b/assets/restore_prelight@2.png differ diff --git a/assets/restore_unfocused_prelight.png b/assets/restore_unfocused_prelight.png new file mode 100644 index 00000000..95b66a28 Binary files /dev/null and b/assets/restore_unfocused_prelight.png differ diff --git a/assets/restore_unfocused_prelight@2.png b/assets/restore_unfocused_prelight@2.png new file mode 100644 index 00000000..7a371125 Binary files /dev/null and b/assets/restore_unfocused_prelight@2.png differ diff --git a/gtk-3.20/gtk-dark.css b/gtk-3.20/gtk-dark.css index ff0a7cba..97fdd884 100755 --- a/gtk-3.20/gtk-dark.css +++ b/gtk-3.20/gtk-dark.css @@ -4490,18 +4490,28 @@ button.titlebutton { background-image: -gtk-scaled(url("../assets/close.png"), url("../assets/close@2.png")); } button.titlebutton.close:hover, button.titlebutton.close:active { background-image: -gtk-scaled(url("../assets/close_prelight.png"), url("../assets/close_prelight@2.png")); } + button.titlebutton.close:backdrop:hover { + background-image: -gtk-scaled(url("../assets/close_unfocused_prelight.png"), url("../assets/close_unfocused_prelight@2.png")); } button.titlebutton.maximize { background-image: -gtk-scaled(url("../assets/maximize.png"), url("../assets/maximize@2.png")); } button.titlebutton.maximize:hover, button.titlebutton.maximize:active { background-image: -gtk-scaled(url("../assets/maximize_prelight.png"), url("../assets/maximize_prelight@2.png")); } + button.titlebutton.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/maximize_unfocused_prelight.png"), url("../assets/maximize_unfocused_prelight@2.png")); } button.titlebutton.minimize { background-image: -gtk-scaled(url("../assets/min.png"), url("../assets/min@2.png")); } button.titlebutton.minimize:hover, button.titlebutton.minimize:active { background-image: -gtk-scaled(url("../assets/min_prelight.png"), url("../assets/min_prelight@2.png")); } + button.titlebutton.minimize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/min_unfocused_prelight.png"), url("../assets/min_unfocused_prelight@2.png")); } button.titlebutton.close:backdrop, button.titlebutton.minimize:backdrop, button.titlebutton.maximize:backdrop { background-image: -gtk-scaled(url("../assets/close_unfocused.png"), url("../assets/close_unfocused@2.png")); } button.titlebutton:backdrop { -gtk-icon-shadow: none; } + .fullscreen button.titlebutton.maximize:hover, .maximized button.titlebutton.maximize:hover { + background-image: -gtk-scaled(url("../assets/restore_prelight.png"), url("../assets/restore_prelight@2.png"));} + .fullscreen button.titlebutton.maximize:backdrop:hover, .maximized button.titlebutton.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/restore_unfocused_prelight.png"), url("../assets/restore_unfocused_prelight@2.png"));} headerbar.selection-mode button.titlebutton, .titlebar.selection-mode button.titlebutton { diff --git a/gtk-3.20/gtk.css b/gtk-3.20/gtk.css index 1dea6fce..770c3abf 100755 --- a/gtk-3.20/gtk.css +++ b/gtk-3.20/gtk.css @@ -4490,19 +4490,29 @@ button.titlebutton { background-image: -gtk-scaled(url("../assets/close.png"), url("../assets/close@2.png")); } button.titlebutton.close:hover, button.titlebutton.close:active { background-image: -gtk-scaled(url("../assets/close_prelight.png"), url("../assets/close_prelight@2.png")); } + button.titlebutton.close:backdrop:hover { + background-image: -gtk-scaled(url("../assets/close_unfocused_prelight.png"), url("../assets/close_unfocused_prelight@2.png")); } button.titlebutton.maximize { background-image: -gtk-scaled(url("../assets/maximize.png"), url("../assets/maximize@2.png")); } button.titlebutton.maximize:hover, button.titlebutton.maximize:active { background-image: -gtk-scaled(url("../assets/maximize_prelight.png"), url("../assets/maximize_prelight@2.png")); } + button.titlebutton.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/maximize_unfocused_prelight.png"), url("../assets/maximize_unfocused_prelight@2.png")); } button.titlebutton.minimize { background-image: -gtk-scaled(url("../assets/min.png"), url("../assets/min@2.png")); } button.titlebutton.minimize:hover, button.titlebutton.minimize:active { background-image: -gtk-scaled(url("../assets/min_prelight.png"), url("../assets/min_prelight@2.png")); } + button.titlebutton.minimize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/min_unfocused_prelight.png"), url("../assets/min_unfocused_prelight@2.png")); } button.titlebutton.close:backdrop, button.titlebutton.minimize:backdrop, button.titlebutton.maximize:backdrop { background-image: -gtk-scaled(url("../assets/close_unfocused.png"), url("../assets/close_unfocused@2.png")); } button.titlebutton:backdrop { -gtk-icon-shadow: none; } - + .fullscreen button.titlebutton.maximize:hover, .maximized button.titlebutton.maximize:hover { + background-image: -gtk-scaled(url("../assets/restore_prelight.png"), url("../assets/restore_prelight@2.png"));} + .fullscreen button.titlebutton.maximize:backdrop:hover, .maximized button.titlebutton.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/restore_unfocused_prelight.png"), url("../assets/restore_unfocused_prelight@2.png"));} + headerbar.selection-mode button.titlebutton, .titlebar.selection-mode button.titlebutton { text-shadow: 0 -1px rgba(0, 0, 0, 0.3788235294); diff --git a/gtk-3.20/tittlebuttons-maker.py b/gtk-3.20/tittlebuttons-maker.py new file mode 100755 index 00000000..86367175 --- /dev/null +++ b/gtk-3.20/tittlebuttons-maker.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# titlebuttons-maker.py +# + +import matplotlib.pyplot as plt +import itertools +from pathlib import Path + +OUTPUT_DIR = Path("../assets/") +OUTPUT_DIR.mkdir(exist_ok=True) + +#- Buttons colors +COLOR_MAP = { + "close": ("#FF5555", "#6272a4"), + "maximize": ("#50FA7B", "#6272a4"), + "min": ("#F1FA8C", "#6272a4"), + "restore": ("#50FA7B", "#6272a4"), +} + +dpi = 5 +pixels = 22 + +def make_figure(dpi=None, pixels=None): + fig_size = pixels / dpi + fig, ax = plt.subplots(figsize=(fig_size, fig_size), dpi=dpi) + ax.set_aspect('equal') + ax.set_xlim(-0.5, 0.5) + ax.set_ylim(-0.5, 0.5) + ax.axis('off') + return ax + +class GtkButtons: + def __init__(self, action, state, hover, theme='', format='svg', scaled=True, dpi=None, pixels=None): + self.action = action + self.state = state + self.hover = hover + self.theme = theme + self.format = format + self.scaled = scaled + self.pixels = pixels * 2 if scaled else pixels + self.dpi = dpi + self.artifacts = self.define_artifacts() + + def define_artifacts(self): + return { + "close": [-0.12, 0.12], + "maximize": { + "top": ((-0.1, 0.2, 0.2, -0.1), (0.2, 0.2, -0.1, 0.2)), + "low": ((-0.2, -0.2, 0.1, -0.2), (0.1, -0.2, -0.2, 0.1)), + }, + "restore": { + "top": ((0.02, 0.02, 0.28, 0.02), (0.28, 0.02, 0.02, 0.28)), + "low": ((-0.28, -0.02, -0.02, -0.28), (-0.02, -0.28, -0.02, -0.02)), + } + } + + def draw_circle(self, ax, center=(0, 0), radius=0.4, color='r'): + ax.add_artist(plt.Circle(center, radius, color=color)) + + def draw_fill(self, ax): + lw = 60 if self.scaled else 30 + if self.action == 'close': + + ax.plot(self.artifacts["close"], self.artifacts["close"][::-1], c='k', lw=lw) + ax.plot(self.artifacts["close"], self.artifacts["close"], c='k', lw=lw) + + elif self.action == 'maximize': + ax.fill(self.artifacts["maximize"]["low"][0], self.artifacts["maximize"]["low"][1], color='k') + ax.fill(self.artifacts["maximize"]["top"][0], self.artifacts["maximize"]["top"][1], color='k') + + elif self.action == 'min': + ax.plot((-0.15, 0.15), (0, 0), c='k', lw=lw) + + elif self.action == 'restore': + ax.fill_between(self.artifacts["restore"]["top"][0], self.artifacts["restore"]["top"][1], color='k') + ax.fill_between(self.artifacts["restore"]["low"][0], self.artifacts["restore"]["low"][1], color='k') + + def decide_color_and_action(self, button_color): + + ax = make_figure(dpi=self.dpi, pixels=self.pixels) + + self.draw_circle(ax, color=button_color) + + if self.state == "_prelight" or ( self.state == "_unfocused" and self.hover == '_prelight'): + self.draw_fill(ax) + + suffix = "@2" if self.scaled else "" + button_name = f"{OUTPUT_DIR}/{self.action}{self.state}{self.hover}{self.theme}{suffix}.{self.format}" + + plt.savefig(button_name, format=self.format, pad_inches=0, transparent=True, bbox_inches='tight') + plt.close() + + def draw_button(self): + button_color = COLOR_MAP[self.action][1 if self.state == "_unfocused" else 0] + self.decide_color_and_action(button_color) + +#- All possible combinations +action_buttons = ['close', 'maximize', 'min', 'restore'] +state_values = ["", "_prelight", "_unfocused"] +hover_values = ["", "_prelight"] +scale_values = [True, False] +#format_values = ['png', 'svg'] + +for action, state, hover, scale, in itertools.product(action_buttons, state_values, hover_values, scale_values): + + if action != "close" and state == "_unfocused" and hover != "_prelight": + continue + + if state == "_prelight" and hover == "_prelight": + continue + + GtkButtons(action, state, hover, theme='', format='png', scaled=scale, dpi=dpi, pixels=pixels).draw_button() diff --git a/gtk-4.0/gtk-dark.css b/gtk-4.0/gtk-dark.css index b1cde7ed..8d891ef4 100755 --- a/gtk-4.0/gtk-dark.css +++ b/gtk-4.0/gtk-dark.css @@ -4781,17 +4781,27 @@ windowcontrols button.close { background-image: -gtk-scaled(url("../assets/close.png"), url("../assets/close@2.png")); } windowcontrols button.close:hover, windowcontrols button.close:active { background-image: -gtk-scaled(url("../assets/close_prelight.png"), url("../assets/close_prelight@2.png")); } + windowcontrols button.close:backdrop:hover { + background-image: -gtk-scaled(url("../assets/close_unfocused_prelight.png"), url("../assets/close_unfocused_prelight@2.png"));} windowcontrols button.maximize { background-image: -gtk-scaled(url("../assets/maximize.png"), url("../assets/maximize@2.png")); } windowcontrols button.maximize:hover, windowcontrols button.maximize:active { background-image: -gtk-scaled(url("../assets/maximize_prelight.png"), url("../assets/maximize_prelight@2.png")); } + windowcontrols button.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/maximize_unfocused_prelight.png"), url("../assets/maximize_unfocused_prelight@2.png"));} windowcontrols button.minimize { background-image: -gtk-scaled(url("../assets/min.png"), url("../assets/min@2.png")); } windowcontrols button.minimize:hover, windowcontrols button.minimize:active { background-image: -gtk-scaled(url("../assets/min_prelight.png"), url("../assets/min_prelight@2.png")); } + windowcontrols button.minimize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/min_unfocused_prelight.png"), url("../assets/min_unfocused_prelight@2.png"));} windowcontrols button:backdrop { -gtk-icon-shadow: none; background-image: -gtk-scaled(url("../assets/close_unfocused.png"), url("../assets/close_unfocused@2.png")); } +.fullscreen headerbar windowcontrols button.maximize:backdrop:hover, .maximized headerbar windowcontrols button.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/restore_unfocused_prelight.png"), url("../assets/restore_unfocused_prelight@2.png")); } +.fullscreen headerbar windowcontrols button.maximize:hover, .maximized headerbar windowcontrols button.maximize:hover { + background-image: -gtk-scaled(url("../assets/restore_prelight.png"), url("../assets/restore_prelight@2.png")); } headerbar.selection-mode button.titlebutton, .titlebar.selection-mode button.titlebutton { diff --git a/gtk-4.0/gtk.css b/gtk-4.0/gtk.css index 55be4194..6dc85443 100755 --- a/gtk-4.0/gtk.css +++ b/gtk-4.0/gtk.css @@ -4781,17 +4781,27 @@ windowcontrols button.close { background-image: -gtk-scaled(url("../assets/close.png"), url("../assets/close@2.png")); } windowcontrols button.close:hover, windowcontrols button.close:active { background-image: -gtk-scaled(url("../assets/close_prelight.png"), url("../assets/close_prelight@2.png")); } + windowcontrols button.close:backdrop:hover { + background-image: -gtk-scaled(url("../assets/close_unfocused_prelight.png"), url("../assets/close_unfocused_prelight@2.png"));} windowcontrols button.maximize { background-image: -gtk-scaled(url("../assets/maximize.png"), url("../assets/maximize@2.png")); } windowcontrols button.maximize:hover, windowcontrols button.maximize:active { background-image: -gtk-scaled(url("../assets/maximize_prelight.png"), url("../assets/maximize_prelight@2.png")); } + windowcontrols button.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/maximize_unfocused_prelight.png"), url("../assets/maximize_unfocused_prelight@2.png"));} windowcontrols button.minimize { background-image: -gtk-scaled(url("../assets/min.png"), url("../assets/min@2.png")); } windowcontrols button.minimize:hover, windowcontrols button.minimize:active { background-image: -gtk-scaled(url("../assets/min_prelight.png"), url("../assets/min_prelight@2.png")); } + windowcontrols button.minimize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/min_unfocused_prelight.png"), url("../assets/min_unfocused_prelight@2.png"));} windowcontrols button:backdrop { -gtk-icon-shadow: none; background-image: -gtk-scaled(url("../assets/close_unfocused.png"), url("../assets/close_unfocused@2.png")); } +.fullscreen headerbar windowcontrols button.maximize:backdrop:hover, .maximized headerbar windowcontrols button.maximize:backdrop:hover { + background-image: -gtk-scaled(url("../assets/restore_unfocused_prelight.png"), url("../assets/restore_unfocused_prelight@2.png")); } +.fullscreen headerbar windowcontrols button.maximize:hover, .maximized headerbar windowcontrols button.maximize:hover { + background-image: -gtk-scaled(url("../assets/restore_prelight.png"), url("../assets/restore_prelight@2.png")); } headerbar.selection-mode button.titlebutton, .titlebar.selection-mode button.titlebutton {