diff --git a/Fluent/README.md b/Fluent/README.md index eecdc8f17..f5002eac3 100644 --- a/Fluent/README.md +++ b/Fluent/README.md @@ -8,8 +8,8 @@ This is a repackaging of the Fluent theme for convenience of installation and ea ## Installation -Most easily installed via Cinnamon's Themes module in Cinnamon settings. +Install via Cinnamon's Themes module in Cinnamon settings or download from Cinnamon Spices and unzip into your ~/.themes directory. ## Options/Configuration -Various options are available such as light/dark theme, accent color, transparency, etc. Simply go to `~/.themes/Fluent` directory and run `options.py` +Various options are available such as light/dark theme, accent color, transparency, etc. Go to `~/.themes/Fluent` directory and run `options.py`. You may need to give execute permissions to `options.py` first in order to run it (right click on file > Properties > Permissions tab). diff --git a/Fluent/files/Fluent/config/README.txt b/Fluent/files/Fluent/config/CREDITS similarity index 100% rename from Fluent/files/Fluent/config/README.txt rename to Fluent/files/Fluent/config/CREDITS diff --git a/Fluent/files/Fluent/config/__init__.py b/Fluent/files/Fluent/config/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/Fluent/files/Fluent/config/config_gui.py b/Fluent/files/Fluent/config/config_gui.py deleted file mode 100755 index f5e30dff2..000000000 --- a/Fluent/files/Fluent/config/config_gui.py +++ /dev/null @@ -1,244 +0,0 @@ - -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gtk -import json -import os -import subprocess -import shutil -import string -import random - -class OptionsWindow(Gtk.Window): - def __init__(self, desktop_environment, rename_theme_on_update, is_current_theme, set_theme): - super().__init__(title="") - - self.desktop_environment = desktop_environment - self.rename_theme_on_update = rename_theme_on_update - self.is_current_theme = is_current_theme - self.set_theme = set_theme - - self.current_theme_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - self.current_theme_name = os.path.basename(self.current_theme_dir) - - self.set_default_size(500, 100) - - box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 5) - box.set_margin_top(15) - box.set_margin_bottom(15) - box.set_margin_start(25) - box.set_margin_end(25) - self.add(box) - - self.load_config_file() - self.set_title(self.options["theme_name"] + " theme options") - self.set_icon_name("applications-graphics") - - self.widgets = {} - - for option in self.options["options"]: - if option["desktop"] == "all" or option["desktop"] == self.desktop_environment: - if option["type"] == "combo": - combobox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - combobox_label = Gtk.Label.new(option["label"]) - combobox_label.set_halign(Gtk.Align.START) - combobox.pack_start(combobox_label, True, True, 0) - combo_widget = Gtk.ComboBoxText() - for label in option["labels"]: - combo_widget.append_text(label) - combo_widget.set_active(option["value"]) - combo_widget.set_halign(Gtk.Align.END) - combo_widget.connect("changed", self.on_combo_changed) - combobox.pack_start(combo_widget, True, True, 0) - box.pack_start(combobox, False, True, 0) - self.widgets[option["name"]] = combo_widget - elif option["type"] == "switch": - switchbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - switchbox_label = Gtk.Label.new(option["label"]) - switchbox_label.set_halign(Gtk.Align.START) - switchbox.pack_start(switchbox_label, True, True, 0) - switch_widget = Gtk.Switch() - switch_widget.set_active(option["value"]) - switch_widget.set_halign(Gtk.Align.END) - switch_widget.set_valign(Gtk.Align.CENTER) - switch_widget.connect("state-set", self.on_switch_changed) - switchbox.pack_start(switch_widget, True, True, 0) - box.pack_start(switchbox, False, True, 0) - self.widgets[option["name"]] = switch_widget - #--------------------------- - self.applybutton = Gtk.Button.new_with_label("Apply") - self.applybutton.set_halign(Gtk.Align.CENTER) - self.applybutton.set_valign(Gtk.Align.END) - self.applybutton.set_sensitive(False) - self.applybutton.connect("clicked", self.on_apply_button_clicked) - box.pack_start(self.applybutton, False, True, 0) - #--------------------------- - separator = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL) - separator.set_valign(Gtk.Align.END) - box.pack_start(separator, False, True, 0) - #--------------------------- - setthemebox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - self.setthemebox_label = Gtk.Label.new("") - self.setthemebox_label.set_halign(Gtk.Align.START) - self.setthemebox_label.set_line_wrap(True) - setthemebox.pack_start(self.setthemebox_label, True, True, 0) - self.setthemebox_button = Gtk.Button.new() - self.setthemebox_button.set_label("Set theme") - self.setthemebox_button.set_halign(Gtk.Align.END) - self.setthemebox_button.set_valign(Gtk.Align.CENTER) - self.setthemebox_button.connect("clicked", self.on_setthemebox_button_clicked) - setthemebox.pack_start(self.setthemebox_button, True, True, 0) - box.pack_start(setthemebox, False, True, 0) - self.update_setthemebox() - #--------------------------- - if self.options.get("adwaita_link_to_gtk4", False): - adwaitabox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - self.adwaitabox_label = Gtk.Label.new("") - self.adwaitabox_label.set_halign(Gtk.Align.START) - self.adwaitabox_label.set_line_wrap(True) - adwaitabox.pack_start(self.adwaitabox_label, True, True, 0) - self.adwaitabox_button = Gtk.Button.new() - self.adwaitabox_button.set_halign(Gtk.Align.END) - self.adwaitabox_button.set_valign(Gtk.Align.CENTER) - self.adwaitabox_button.connect("clicked", self.on_adwaitabox_button_clicked) - adwaitabox.pack_start(self.adwaitabox_button, True, True, 0) - box.pack_start(adwaitabox, False, True, 0) - self.update_adwaitabox() - - - def update_adwaitabox(self): - if is_libadwaita_linked(self.current_theme_dir): - self.adwaitabox_label.set_text("This theme is your current libadwaita theme") - self.adwaitabox_button.set_label("Remove") - else: - self.adwaitabox_label.set_text("Set this theme as your current libadwaita theme") - self.adwaitabox_button.set_label("Install") - - def on_adwaitabox_button_clicked(self, button): - if is_libadwaita_linked(self.current_theme_dir): # "Remove" clicked - unlink_libadwaita() - else: # "Install" clicked - unlink_libadwaita() - link_libadwaita(self.current_theme_dir) - - self.update_adwaitabox() - - def update_setthemebox(self): - if self.is_current_theme(self.current_theme_name): - self.setthemebox_label.set_text("This theme is your current desktop theme") - self.setthemebox_button.set_sensitive(False) - else: - self.setthemebox_label.set_text("This theme is not your current desktop theme") - self.setthemebox_button.set_sensitive(True) - - def on_setthemebox_button_clicked(self, button): - self.set_theme(self.current_theme_name, self.current_theme_name, reload_only = False) - self.update_setthemebox() - - def on_combo_changed(self, combo): - self.applybutton.set_sensitive(True) - - def on_switch_changed(self, switch, state): - self.applybutton.set_sensitive(True) - - def load_config_file(self): - file_name = os.path.join(self.current_theme_dir, "config", "options_config.json") - with open(file_name, "r") as file: - self.options = json.load(file) - - def save_config_file(self, new_theme_dir): - file_name = os.path.join(new_theme_dir, "config", "options_config.json") - with open(file_name, "w") as file: - json.dump(self.options, file, indent=4) - - def get_new_theme_names(self): - if self.rename_theme_on_update: - random_chars = "".join(random.choices(string.digits, k=3)) - new_theme_name = self.options["theme_name"] + random_chars - new_theme_dir = os.path.join(os.path.dirname(self.current_theme_dir), new_theme_name) - else: #keep same name - new_theme_dir = self.current_theme_dir - new_theme_name = self.current_theme_name - return (new_theme_dir, new_theme_name) - - def on_apply_button_clicked(self, button): - new_theme_dir, new_theme_name = self.get_new_theme_names() - #Rename theme directory if neccessary - if new_theme_dir != self.current_theme_dir: - os.rename(self.current_theme_dir, new_theme_dir) - - #prepare install command and store settings - command = [os.path.join(new_theme_dir, 'config', self.options["script_name"])] - command.append("--name") - command.append(new_theme_name) - command.append("--dest") - command.append(os.path.dirname(new_theme_dir)) - - for option in self.options["options"]: - if option["desktop"] == "all" or option["desktop"] == self.desktop_environment: - if option["type"] == "combo": - command.append("--" + option["name"]) - value = self.widgets[option["name"]].get_active() - option["value"] = value - value_id = option["ids"][value] - command.append(value_id) - elif option["type"] == "switch": - value = self.widgets[option["name"]].get_active() - option["value"] = value - if value: - command.append("--" + option["name"]) - - #Install theme - try: - print ("Running..." + " ".join(command)) - subprocess.run(command, check=True) - print("Install finished OK") - except subprocess.CalledProcessError as e: - print(f"Install script error. Return code: {e.returncode}") - print(f"Output:\n{e.output.decode('utf-8')}") - - #save settings - self.save_config_file(new_theme_dir) - - #apply desktop theme - self.set_theme(self.current_theme_name, new_theme_name, reload_only = True) - self.applybutton.set_sensitive(False) - - #Relink libadwaita if neccessary - if new_theme_name != self.current_theme_name and is_libadwaita_linked(self.current_theme_dir): - unlink_libadwaita() - link_libadwaita(new_theme_dir) - - #update theme name - self.current_theme_dir = new_theme_dir - self.current_theme_name = new_theme_name - -def is_link_to(link, target): - return os.path.islink(link) and os.readlink(link) == target - -def is_libadwaita_linked(theme_dir): - config_dir = os.path.expanduser('~/.config/gtk-4.0/') - return (is_link_to(os.path.join(config_dir, 'assets'), os.path.join(theme_dir, 'gtk-4.0', 'assets')) and - is_link_to(os.path.join(config_dir, 'gtk.css'), os.path.join(theme_dir, 'gtk-4.0', 'gtk.css')) and - is_link_to(os.path.join(config_dir, 'gtk-dark.css'), os.path.join(theme_dir, 'gtk-4.0', 'gtk-dark.css'))) - -def link_libadwaita(theme_dir): - config_dir = os.path.expanduser('~/.config/gtk-4.0/') - os.makedirs(config_dir, exist_ok=True) - os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'assets'), os.path.join(config_dir, 'assets'), target_is_directory = True) - os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'gtk.css'), os.path.join(config_dir, 'gtk.css')) - os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'gtk-dark.css'), os.path.join(config_dir, 'gtk-dark.css')) - -def unlink_libadwaita(): - config_dir = os.path.expanduser('~/.config/gtk-4.0/') - subprocess.run(["rm", "-rf", config_dir + "assets"]) - subprocess.run(["rm", "-rf", config_dir + "gtk.css"]) - subprocess.run(["rm", "-rf", config_dir + "gtk-dark.css"]) - -def main(desktop_environment, rename_theme_on_update, is_current_theme, set_theme): - Gtk.init() - - win = OptionsWindow(desktop_environment, rename_theme_on_update, is_current_theme, set_theme) - win.connect("destroy", Gtk.main_quit) - win.show_all() - Gtk.main() diff --git a/Fluent/files/Fluent/config/install.sh b/Fluent/files/Fluent/config/install.sh index 70cdd2bed..ef592a969 100755 --- a/Fluent/files/Fluent/config/install.sh +++ b/Fluent/files/Fluent/config/install.sh @@ -5,9 +5,6 @@ SRC_DIR="$REPO_DIR/src" export LD_LIBRARY_PATH="$REPO_DIR/libsass" SASSC_BIN="$REPO_DIR/libsass/sassc" -ROOT_UID=0 -DEST_DIR= - # For tweaks opacity= panel= @@ -17,20 +14,12 @@ outline= titlebutton= icon='-default' -# Destination directory -if [ "$UID" -eq "$ROOT_UID" ]; then - DEST_DIR="/usr/share/themes" -else - DEST_DIR="$HOME/.themes" -fi +THEME_DIR=$(dirname $REPO_DIR) +DEST_DIR=$(dirname $THEME_DIR) +THEME_NAME=$(basename $THEME_DIR) SASSC_OPT="-M -t expanded" -THEME_NAME=Fluent -THEME_VARIANTS=('' '-purple' '-pink' '-red' '-orange' '-yellow' '-green' '-teal' '-grey') -COLOR_VARIANTS=('' '-Light' '-Dark') -SIZE_VARIANTS=('' '-compact') - if [[ "$(command -v gnome-shell)" ]]; then gnome-shell --version SHELL_VERSION="$(gnome-shell --version | cut -d ' ' -f 3 | cut -d . -f -1)" @@ -52,175 +41,12 @@ else GS_VERSION="44-0" fi -install() { - local dest="$1" - local name="$2" - local theme="$3" - local color="$4" - local size="$5" - local icon="$6" - - [[ "$color" == '-Dark' ]] && local ELSE_DARK="$color" - [[ "$color" == '-Light' ]] && local ELSE_LIGHT="$color" - [[ "$color" == '-Dark' ]] || [[ "$color" == '' ]] && local ACTIVITIES_ASSETS_SUFFIX="-Dark" - - if [[ "$window" == 'round' ]]; then - round='-round' - else - round=$window - fi - - local THEME_DIR="$dest/$name" - - theme_tweaks && install_theme_color - - echo "Installing '$THEME_DIR'..." - - mkdir -p "$THEME_DIR" - cp -r "$REPO_DIR/COPYING" "$THEME_DIR" - - echo "[Desktop Entry]" >> "$THEME_DIR/index.theme" - echo "Type=X-GNOME-Metatheme" >> "$THEME_DIR/index.theme" - echo "Name=$name" >> "$THEME_DIR/index.theme" - echo "Comment=An Materia Gtk+ theme based on Elegant Design" >> "$THEME_DIR/index.theme" - echo "Encoding=UTF-8" >> "$THEME_DIR/index.theme" - echo "" >> "$THEME_DIR/index.theme" - echo "[X-GNOME-Metatheme]" >> "$THEME_DIR/index.theme" - echo "GtkTheme=$name" >> "$THEME_DIR/index.theme" - echo "MetacityTheme=$name" >> "$THEME_DIR/index.theme" - echo "IconTheme=$name${ELSE_DARK:-}" >> "$THEME_DIR/index.theme" - echo "CursorTheme=$name${ELSE_DARK:-}" >> "$THEME_DIR/index.theme" - echo "ButtonLayout=close,minimize,maximize:menu" >> "$THEME_DIR/index.theme" - - mkdir -p "$THEME_DIR/gnome-shell" - cp -r "$SRC_DIR/gnome-shell/pad-osd.css" "$THEME_DIR/gnome-shell" - - $SASSC_BIN $SASSC_OPT "$SRC_DIR/gnome-shell/shell-$GS_VERSION/gnome-shell$color$size.scss" "$THEME_DIR/gnome-shell/gnome-shell.css" - - cp -r "${SRC_DIR}/gnome-shell/common-assets" "$THEME_DIR/gnome-shell/assets" - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/"*.svg "$THEME_DIR/gnome-shell/assets" - cp -r "${SRC_DIR}/gnome-shell/theme$theme/"*.svg "$THEME_DIR/gnome-shell/assets" - cp -r "${SRC_DIR}/gnome-shell/assets${ACTIVITIES_ASSETS_SUFFIX:-}/activities/activities${icon}.svg" "$THEME_DIR/gnome-shell/assets/activities.svg" - - if [[ "$window" = "round" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/buttons-round/"*.svg "$THEME_DIR/gnome-shell/assets" - else - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/buttons/"*.svg "$THEME_DIR/gnome-shell/assets" - fi - - if [[ "$color" = "-Light" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets-Dark/activities/activities${icon}.svg" "$THEME_DIR/gnome-shell/assets/activities-white.svg" - fi - - if [[ "$opacity" = "solid" ]] ; then - if [[ "$window" = "round" ]] ; then - if [[ "$outline" = "" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-round/"*.svg "$THEME_DIR/gnome-shell/assets" - else - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-round-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" - fi - else - if [[ "$outline" = "" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid/"*.svg "$THEME_DIR/gnome-shell/assets" - else - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" - fi - fi - else - if [[ "$window" = "round" ]] ; then - if [[ "$outline" = "" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-round/"*.svg "$THEME_DIR/gnome-shell/assets" - else - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-round-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" - fi - else - if [[ "$outline" = "" ]] ; then - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default/"*.svg "$THEME_DIR/gnome-shell/assets" - else - cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" - fi - fi - fi - - cd "$THEME_DIR/gnome-shell" - ln -sf assets/no-events.svg no-events.svg - ln -sf assets/process-working.svg process-working.svg - ln -sf assets/no-notifications.svg no-notifications.svg - - mkdir -p "$THEME_DIR/gtk-2.0" - cp -r "$SRC_DIR/gtk-2.0/common/"{apps.rc,hacks.rc,main.rc} "$THEME_DIR/gtk-2.0" - cp -r "$SRC_DIR/gtk-2.0/assets-folder/assets$theme${ELSE_DARK:-}" "$THEME_DIR/gtk-2.0/assets" - cp -r "$SRC_DIR/gtk-2.0/gtkrc$theme${ELSE_DARK:-}" "$THEME_DIR/gtk-2.0/gtkrc" - - mkdir -p "$THEME_DIR/gtk-3.0" - cp -r "$SRC_DIR/gtk/assets$theme" "$THEME_DIR/gtk-3.0/assets" - cp -r "$SRC_DIR/gtk/scalable" "$THEME_DIR/gtk-3.0/assets" - cp -r "$SRC_DIR/gtk/thumbnail$theme${ELSE_DARK:-}.png" "$THEME_DIR/gtk-3.0/thumbnail.png" - - $SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/3.0/gtk$color$size.scss" "$THEME_DIR/gtk-3.0/gtk.css" - $SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/3.0/gtk-Dark$size.scss" "$THEME_DIR/gtk-3.0/gtk-dark.css" - - mkdir -p "$THEME_DIR/gtk-4.0" - cp -r "$SRC_DIR/gtk/assets$theme" "$THEME_DIR/gtk-4.0/assets" - cp -r "$SRC_DIR/gtk/scalable" "$THEME_DIR/gtk-4.0/assets" - - $SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/4.0/gtk$color$size.scss" "$THEME_DIR/gtk-4.0/gtk.css" - $SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/4.0/gtk-Dark$size.scss" "$THEME_DIR/gtk-4.0/gtk-dark.css" - - mkdir -p "$THEME_DIR/cinnamon" - cp -r "$SRC_DIR/cinnamon/common-assets" "$THEME_DIR/cinnamon/assets" - cp -r "$SRC_DIR/cinnamon/assets${ELSE_DARK:-}/"*.svg "$THEME_DIR/cinnamon/assets" - - $SASSC_BIN $SASSC_OPT "$SRC_DIR/cinnamon/cinnamon$color$size.scss" "$THEME_DIR/cinnamon/cinnamon.css" - - cp -r "$SRC_DIR/cinnamon/thumbnail$theme$color.png" "$THEME_DIR/cinnamon/thumbnail.png" - - if [[ "$size" == '' ]]; then - mkdir -p "$THEME_DIR/xfwm4" - - if [[ "$titlebutton" = "square" ]] ; then - cp -r "$SRC_DIR/xfwm4/assets-square$color/"*.png "$THEME_DIR/xfwm4" - cp -r "$SRC_DIR/xfwm4/themerc-square${ELSE_LIGHT:-}" "$THEME_DIR/xfwm4/themerc" - else - cp -r "$SRC_DIR/xfwm4/assets$color/"*.png "$THEME_DIR/xfwm4" - cp -r "$SRC_DIR/xfwm4/themerc${ELSE_LIGHT:-}" "$THEME_DIR/xfwm4/themerc" - fi - - mkdir -p "$THEME_DIR/metacity-1" - cp -r "$SRC_DIR/metacity-1/metacity-theme-2$color.xml" "$THEME_DIR/metacity-1/metacity-theme-2.xml" - - if [[ "$window" = "round" ]] ; then - cp -r "$SRC_DIR/metacity-1/metacity-theme-3-round.xml" "$THEME_DIR/metacity-1/metacity-theme-3.xml" - cp -r "$SRC_DIR/metacity-1/assets-round" "$THEME_DIR/metacity-1/assets" - else - cp -r "$SRC_DIR/metacity-1/metacity-theme-3.xml" "$THEME_DIR/metacity-1" - cp -r "$SRC_DIR/metacity-1/assets" "$THEME_DIR/metacity-1" - fi - - cp -r "$SRC_DIR/metacity-1/thumbnail${ELSE_DARK:-}.png" "$THEME_DIR/metacity-1/thumbnail.png" - cd "$THEME_DIR/metacity-1" && ln -sf metacity-theme-2.xml metacity-theme-1.xml - fi - - mkdir -p "$THEME_DIR/plank" - cp -r "$SRC_DIR/plank/theme${ELSE_LIGHT:-}/dock.theme" "$THEME_DIR/plank" -} - -themes=() -colors=() -sizes=() -lcolors=() +theme= +color= +size= while [[ "$#" -gt 0 ]]; do case "${1:-}" in - --dest) - dest="$2" - mkdir -p "$dest" - shift 2 - ;; - --name) - _name="$2" - shift 2 - ;; --solid) opacity="solid" shift @@ -257,43 +83,39 @@ while [[ "$#" -gt 0 ]]; do for variant in "$@"; do case "$variant" in default) - themes+=("${THEME_VARIANTS[0]}") + theme='' shift ;; purple) - themes+=("${THEME_VARIANTS[1]}") + theme='-purple' shift ;; pink) - themes+=("${THEME_VARIANTS[2]}") + theme='-pink' shift ;; red) - themes+=("${THEME_VARIANTS[3]}") + theme='-red' shift ;; orange) - themes+=("${THEME_VARIANTS[4]}") + theme='-orange' shift ;; yellow) - themes+=("${THEME_VARIANTS[5]}") + theme='-yellow' shift ;; green) - themes+=("${THEME_VARIANTS[6]}") + theme='-green' shift ;; teal) - themes+=("${THEME_VARIANTS[7]}") + theme='-teal' shift ;; grey) - themes+=("${THEME_VARIANTS[8]}") - shift - ;; - all) - themes+=("${THEME_VARIANTS[@]}") + theme='-grey' shift ;; -*) @@ -301,8 +123,8 @@ while [[ "$#" -gt 0 ]]; do ;; *) echo "ERROR: Unrecognized theme variant '$1'." - echo "Try '$0 --help' for more information." - exit 1 + echo "Ignoring..." + shift ;; esac done @@ -384,8 +206,8 @@ while [[ "$#" -gt 0 ]]; do ;; *) echo "ERROR: Unrecognized icon variant '$1'." - echo "Try '$0 --help' for more information." - exit 1 + echo "Ignoring..." + shift ;; esac echo "Install $icons icon for gnome-shell panel..." @@ -396,18 +218,15 @@ while [[ "$#" -gt 0 ]]; do for variant in "$@"; do case "$variant" in standard) - colors+=("${COLOR_VARIANTS[0]}") - lcolors+=("${COLOR_VARIANTS[0]}") + color='' shift ;; light) - colors+=("${COLOR_VARIANTS[1]}") - lcolors+=("${COLOR_VARIANTS[1]}") + color='-Light' shift ;; dark) - colors+=("${COLOR_VARIANTS[2]}") - lcolors+=("${COLOR_VARIANTS[2]}") + color='-Dark' shift ;; -*|--*) @@ -415,8 +234,8 @@ while [[ "$#" -gt 0 ]]; do ;; *) echo "ERROR: Unrecognized color variant '$1'." - echo "Try '$0 --help' for more information." - exit 1 + echo "Ignoring..." + shift ;; esac done @@ -426,11 +245,11 @@ while [[ "$#" -gt 0 ]]; do for variant in "$@"; do case "$variant" in standard) - sizes+=("${SIZE_VARIANTS[0]}") + size='' shift ;; compact) - sizes+=("${SIZE_VARIANTS[1]}") + size='-compact' shift ;; -*) @@ -438,163 +257,244 @@ while [[ "$#" -gt 0 ]]; do ;; *) echo "ERROR: Unrecognized size variant '${1:-}'." - echo "Try '$0 --help' for more information." - exit 1 + echo "Ignoring..." + shift ;; esac done ;; *) echo "ERROR: Unrecognized installation option '${1:-}'." - echo "Try '$0 --help' for more information." - exit 1 + echo "Ignoring..." + shift ;; esac done -if [[ "${#themes[@]}" -eq 0 ]] ; then - themes=("${THEME_VARIANTS[0]}") -fi - -if [[ "${#colors[@]}" -eq 0 ]] ; then - colors=("${COLOR_VARIANTS[@]}") -fi - -if [[ "${#lcolors[@]}" -eq 0 ]] ; then - lcolors=("${COLOR_VARIANTS[1]}") -fi +# clean theme +rm -rf "${THEME_DIR}"/{cinnamon,gnome-shell,gtk-2.0,gtk-3.0,gtk-4.0,metacity-1,plank,xfwm4,index.theme} -if [[ "${#sizes[@]}" -eq 0 ]] ; then - sizes=("${SIZE_VARIANTS[@]}") -fi +# install theme +[[ "$color" == '-Dark' ]] && ELSE_DARK="$color" +[[ "$color" == '-Light' ]] && ELSE_LIGHT="$color" +[[ "$color" == '-Dark' ]] || [[ "$color" == '' ]] && ACTIVITIES_ASSETS_SUFFIX="-Dark" -tweaks_temp() { +#tweaks +if [[ "$panel" = "float" || "$opacity" == 'solid' || "$window" == 'round' || "$accent" == 'true' || "$blur" == 'true' || "$outline" == 'false' || "$titlebutton" == 'square' ]]; then + tweaks='true' cp -rf ${SRC_DIR}/_sass/_tweaks.scss ${SRC_DIR}/_sass/_tweaks-temp.scss cp -rf ${SRC_DIR}/gnome-shell/sass/_tweaks.scss ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss -} +fi -install_float_panel() { +if [[ "$panel" = "float" ]] ; then sed -i "/\$panel_style:/s/compact/float/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss sed -i "/\$panel_style:/s/compact/float/" ${SRC_DIR}/_sass/_tweaks-temp.scss -} +fi -install_solid() { +if [[ "$opacity" = "solid" ]] ; then sed -i "/\$opacity:/s/default/solid/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss sed -i "/\$opacity:/s/default/solid/" ${SRC_DIR}/_sass/_tweaks-temp.scss echo -e "Install solid version ..." -} +fi -install_round() { +if [[ "$window" = "round" ]] ; then sed -i "/\$window:/s/default/round/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss sed -i "/\$window:/s/default/round/" ${SRC_DIR}/_sass/_tweaks-temp.scss -} +fi -install_blur() { +if [[ "$blur" = "true" ]] ; then sed -i "/\$blur:/s/false/true/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss sed -i "/\$blur:/s/false/true/" ${SRC_DIR}/_sass/_tweaks-temp.scss -} +fi -install_noborder() { +if [[ "$outline" = "false" ]] ; then sed -i "/\$outline:/s/true/false/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss sed -i "/\$outline:/s/true/false/" ${SRC_DIR}/_sass/_tweaks-temp.scss -} +fi -install_square() { +if [[ "$titlebutton" = "square" ]] ; then sed -i "/\$titlebutton:/s/circular/square/" ${SRC_DIR}/_sass/_tweaks-temp.scss -} +fi -activities_style() { +if [[ "$activities" = "default" ]] ; then sed -i "/\$activities:/s/icon/default/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss -} - -install_theme_color() { - if [[ "$theme" != '' ]]; then - case "$theme" in - -purple) - theme_color='purple' - ;; - -pink) - theme_color='pink' - ;; - -red) - theme_color='red' - ;; - -orange) - theme_color='orange' - ;; - -yellow) - theme_color='yellow' - ;; - -green) - theme_color='green' - ;; - -teal) - theme_color='teal' - ;; - -grey) - theme_color='grey' - ;; - esac - sed -i "/\$theme:/s/default/${theme_color}/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss - sed -i "/\$theme:/s/default/${theme_color}/" ${SRC_DIR}/_sass/_tweaks-temp.scss - fi -} +fi -theme_tweaks() { - if [[ "$panel" = "float" || "$opacity" == 'solid' || "$window" == 'round' || "$accent" == 'true' || "$blur" == 'true' || "$outline" == 'false' || "$titlebutton" == 'square' ]]; then - tweaks='true' - tweaks_temp - fi +#install_theme_color +if [[ "$theme" != '' ]]; then + case "$theme" in + -purple) + theme_color='purple' + ;; + -pink) + theme_color='pink' + ;; + -red) + theme_color='red' + ;; + -orange) + theme_color='orange' + ;; + -yellow) + theme_color='yellow' + ;; + -green) + theme_color='green' + ;; + -teal) + theme_color='teal' + ;; + -grey) + theme_color='grey' + ;; + esac + sed -i "/\$theme:/s/default/${theme_color}/" ${SRC_DIR}/gnome-shell/sass/_tweaks-temp.scss + sed -i "/\$theme:/s/default/${theme_color}/" ${SRC_DIR}/_sass/_tweaks-temp.scss +fi - if [[ "$panel" = "float" ]] ; then - install_float_panel - fi +echo "Installing '$THEME_DIR'..." - if [[ "$opacity" = "solid" ]] ; then - install_solid - fi +mkdir -p "$THEME_DIR" +cp -r "$REPO_DIR/COPYING" "$THEME_DIR" + +echo "[Desktop Entry]" >> "$THEME_DIR/index.theme" +echo "Type=X-GNOME-Metatheme" >> "$THEME_DIR/index.theme" +echo "Name=$THEME_NAME" >> "$THEME_DIR/index.theme" +echo "Comment=An Materia Gtk+ theme based on Elegant Design" >> "$THEME_DIR/index.theme" +echo "Encoding=UTF-8" >> "$THEME_DIR/index.theme" +echo "" >> "$THEME_DIR/index.theme" +echo "[X-GNOME-Metatheme]" >> "$THEME_DIR/index.theme" +echo "GtkTheme=$THEME_NAME" >> "$THEME_DIR/index.theme" +echo "MetacityTheme=$THEME_NAME" >> "$THEME_DIR/index.theme" +echo "IconTheme=Fluent${ELSE_DARK:-}" >> "$THEME_DIR/index.theme" +echo "CursorTheme=Fluent${ELSE_DARK:-}" >> "$THEME_DIR/index.theme" +echo "ButtonLayout=close,minimize,maximize:menu" >> "$THEME_DIR/index.theme" + +# gnome-shell + +mkdir -p "$THEME_DIR/gnome-shell" +cp -r "$SRC_DIR/gnome-shell/pad-osd.css" "$THEME_DIR/gnome-shell" +$SASSC_BIN $SASSC_OPT "$SRC_DIR/gnome-shell/shell-$GS_VERSION/gnome-shell$color$size.scss" "$THEME_DIR/gnome-shell/gnome-shell.css" + +cp -r "${SRC_DIR}/gnome-shell/common-assets" "$THEME_DIR/gnome-shell/assets" +cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/"*.svg "$THEME_DIR/gnome-shell/assets" +cp -r "${SRC_DIR}/gnome-shell/theme$theme/"*.svg "$THEME_DIR/gnome-shell/assets" +cp -r "${SRC_DIR}/gnome-shell/assets${ACTIVITIES_ASSETS_SUFFIX:-}/activities/activities${icon}.svg" "$THEME_DIR/gnome-shell/assets/activities.svg" + +if [[ "$window" = "round" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/buttons-round/"*.svg "$THEME_DIR/gnome-shell/assets" +else + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/buttons/"*.svg "$THEME_DIR/gnome-shell/assets" +fi + +if [[ "$color" = "-Light" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets-Dark/activities/activities${icon}.svg" "$THEME_DIR/gnome-shell/assets/activities-white.svg" +fi + +if [[ "$opacity" = "solid" ]] ; then if [[ "$window" = "round" ]] ; then - install_round + if [[ "$outline" = "" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-round/"*.svg "$THEME_DIR/gnome-shell/assets" + else + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-round-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" + fi + else + if [[ "$outline" = "" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid/"*.svg "$THEME_DIR/gnome-shell/assets" + else + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/solid-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" + fi fi - - if [[ "$blur" = "true" ]] ; then - install_blur +else + if [[ "$window" = "round" ]] ; then + if [[ "$outline" = "" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-round/"*.svg "$THEME_DIR/gnome-shell/assets" + else + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-round-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" + fi + else + if [[ "$outline" = "" ]] ; then + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default/"*.svg "$THEME_DIR/gnome-shell/assets" + else + cp -r "${SRC_DIR}/gnome-shell/assets${ELSE_DARK:-}/default-borderless/"*.svg "$THEME_DIR/gnome-shell/assets" + fi fi +fi - if [[ "$outline" = "false" ]] ; then - install_noborder - fi +cd "$THEME_DIR/gnome-shell" +ln -sf assets/no-events.svg no-events.svg +ln -sf assets/process-working.svg process-working.svg +ln -sf assets/no-notifications.svg no-notifications.svg - if [[ "$titlebutton" = "square" ]] ; then - install_square - fi +# gtk-2.0 - if [[ "$activities" = "default" ]] ; then - activities_style - fi -} - -clean_theme() { - local dest="${dest:-$DEST_DIR}" - local name="${_name:-$THEME_NAME}" - - local THEME_DIR="$dest/$name" - - rm -rf "${THEME_DIR}"/{cinnamon,gnome-shell,gtk-2.0,gtk-3.0,gtk-4.0,metacity-1,plank,xfwm4,index.theme} -} - -install_theme() { - for theme in "${themes[@]}"; do - for color in "${colors[@]}"; do - for size in "${sizes[@]}"; do - install "${dest:-$DEST_DIR}" "${_name:-$THEME_NAME}" "$theme" "$color" "$size" "$icon" - done - done - done -} +mkdir -p "$THEME_DIR/gtk-2.0" +cp -r "$SRC_DIR/gtk-2.0/common/"{apps.rc,hacks.rc,main.rc} "$THEME_DIR/gtk-2.0" +cp -r "$SRC_DIR/gtk-2.0/assets-folder/assets$theme${ELSE_DARK:-}" "$THEME_DIR/gtk-2.0/assets" +cp -r "$SRC_DIR/gtk-2.0/gtkrc$theme${ELSE_DARK:-}" "$THEME_DIR/gtk-2.0/gtkrc" + +# gtk-3.0 + +mkdir -p "$THEME_DIR/gtk-3.0" +cp -r "$SRC_DIR/gtk/assets$theme" "$THEME_DIR/gtk-3.0/assets" +cp -r "$SRC_DIR/gtk/scalable" "$THEME_DIR/gtk-3.0/assets" +cp -r "$SRC_DIR/gtk/thumbnail$theme${ELSE_DARK:-}.png" "$THEME_DIR/gtk-3.0/thumbnail.png" + +$SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/3.0/gtk$color$size.scss" "$THEME_DIR/gtk-3.0/gtk.css" +$SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/3.0/gtk-Dark$size.scss" "$THEME_DIR/gtk-3.0/gtk-dark.css" + +# gtk-4.0 + +mkdir -p "$THEME_DIR/gtk-4.0" +cp -r "$SRC_DIR/gtk/assets$theme" "$THEME_DIR/gtk-4.0/assets" +cp -r "$SRC_DIR/gtk/scalable" "$THEME_DIR/gtk-4.0/assets" + +$SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/4.0/gtk$color$size.scss" "$THEME_DIR/gtk-4.0/gtk.css" +$SASSC_BIN $SASSC_OPT "$SRC_DIR/gtk/4.0/gtk-Dark$size.scss" "$THEME_DIR/gtk-4.0/gtk-dark.css" + +# cinnamon + +mkdir -p "$THEME_DIR/cinnamon" +cp -r "$SRC_DIR/cinnamon/common-assets" "$THEME_DIR/cinnamon/assets" +cp -r "$SRC_DIR/cinnamon/assets${ELSE_DARK:-}/"*.svg "$THEME_DIR/cinnamon/assets" + +$SASSC_BIN $SASSC_OPT "$SRC_DIR/cinnamon/cinnamon$color$size.scss" "$THEME_DIR/cinnamon/cinnamon.css" + +cp -r "$SRC_DIR/cinnamon/thumbnail$theme$color.png" "$THEME_DIR/cinnamon/thumbnail.png" + +# xfwm4 + +mkdir -p "$THEME_DIR/xfwm4" + +if [[ "$titlebutton" = "square" ]] ; then + cp -r "$SRC_DIR/xfwm4/assets-square$color/"*.png "$THEME_DIR/xfwm4" + cp -r "$SRC_DIR/xfwm4/themerc-square${ELSE_LIGHT:-}" "$THEME_DIR/xfwm4/themerc" +else + cp -r "$SRC_DIR/xfwm4/assets$color/"*.png "$THEME_DIR/xfwm4" + cp -r "$SRC_DIR/xfwm4/themerc${ELSE_LIGHT:-}" "$THEME_DIR/xfwm4/themerc" +fi + +# metacity + +mkdir -p "$THEME_DIR/metacity-1" +cp -r "$SRC_DIR/metacity-1/metacity-theme-2$color.xml" "$THEME_DIR/metacity-1/metacity-theme-2.xml" + +if [[ "$window" = "round" ]] ; then + cp -r "$SRC_DIR/metacity-1/metacity-theme-3-round.xml" "$THEME_DIR/metacity-1/metacity-theme-3.xml" + cp -r "$SRC_DIR/metacity-1/assets-round" "$THEME_DIR/metacity-1/assets" +else + cp -r "$SRC_DIR/metacity-1/metacity-theme-3.xml" "$THEME_DIR/metacity-1" + cp -r "$SRC_DIR/metacity-1/assets" "$THEME_DIR/metacity-1" +fi + +cp -r "$SRC_DIR/metacity-1/thumbnail${ELSE_DARK:-}.png" "$THEME_DIR/metacity-1/thumbnail.png" +cd "$THEME_DIR/metacity-1" && ln -sf metacity-theme-2.xml metacity-theme-1.xml + +# plank -clean_theme && install_theme +mkdir -p "$THEME_DIR/plank" +cp -r "$SRC_DIR/plank/theme${ELSE_LIGHT:-}/dock.theme" "$THEME_DIR/plank" echo echo "Done." diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets-Dark.svg b/Fluent/files/Fluent/config/src/xfwm4/assets-Dark.svg deleted file mode 100644 index faa18b120..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets-Dark.svg +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets-Light.svg b/Fluent/files/Fluent/config/src/xfwm4/assets-Light.svg deleted file mode 100644 index d296576d3..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets-Light.svg +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets-square-Dark.svg b/Fluent/files/Fluent/config/src/xfwm4/assets-square-Dark.svg deleted file mode 100644 index bdc6c1dea..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets-square-Dark.svg +++ /dev/null @@ -1,1329 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets-square-Light.svg b/Fluent/files/Fluent/config/src/xfwm4/assets-square-Light.svg deleted file mode 100644 index 614e81e5b..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets-square-Light.svg +++ /dev/null @@ -1,1375 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets-square.svg b/Fluent/files/Fluent/config/src/xfwm4/assets-square.svg deleted file mode 100644 index 24cd8ef12..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets-square.svg +++ /dev/null @@ -1,1361 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets.svg b/Fluent/files/Fluent/config/src/xfwm4/assets.svg deleted file mode 100644 index f08678e68..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets.svg +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Fluent/files/Fluent/config/src/xfwm4/assets.txt b/Fluent/files/Fluent/config/src/xfwm4/assets.txt deleted file mode 100644 index a25776e1d..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/assets.txt +++ /dev/null @@ -1,60 +0,0 @@ -close-active -close-inactive -close-prelight -close-pressed -hide-active -hide-inactive -hide-prelight -hide-pressed -maximize-active -maximize-inactive -maximize-prelight -maximize-pressed -maximize-toggled-active -maximize-toggled-inactive -maximize-toggled-prelight -maximize-toggled-pressed -menu-active -menu-inactive -menu-prelight -menu-pressed -shade-active -shade-inactive -shade-prelight -shade-pressed -shade-toggled-active -shade-toggled-inactive -shade-toggled-prelight -shade-toggled-pressed -stick-active -stick-inactive -stick-prelight -stick-pressed -stick-toggled-active -stick-toggled-inactive -stick-toggled-prelight -stick-toggled-pressed -title-1-active -title-1-inactive -title-2-active -title-2-inactive -title-3-active -title-3-inactive -title-4-active -title-4-inactive -title-5-active -title-5-inactive -top-left-active -top-left-inactive -top-right-active -top-right-inactive -left-active -left-inactive -right-active -right-inactive -bottom-active -bottom-inactive -bottom-left-active -bottom-left-inactive -bottom-right-active -bottom-right-inactive diff --git a/Fluent/files/Fluent/config/src/xfwm4/render-assets.sh b/Fluent/files/Fluent/config/src/xfwm4/render-assets.sh deleted file mode 100755 index 7618235a7..000000000 --- a/Fluent/files/Fluent/config/src/xfwm4/render-assets.sh +++ /dev/null @@ -1,32 +0,0 @@ -#! /bin/bash - -INKSCAPE="/usr/bin/inkscape" -OPTIPNG="/usr/bin/optipng" - -INDEX="assets.txt" - -for window in '' '-square'; do -for color in '' '-Light' '-Dark'; do - -ASSETS_DIR="assets${window}${color}" -SRC_FILE="assets${window}${color}.svg" - -mkdir -p $ASSETS_DIR - -for i in `cat $INDEX`; do -if [ -f $ASSETS_DIR/$i.png ]; then - echo $ASSETS_DIR/$i.png exists. -else - echo - echo Rendering $ASSETS_DIR/$i.png - $INKSCAPE --export-id=$i \ - --export-id-only \ - --export-filename=$ASSETS_DIR/$i.png $SRC_FILE >/dev/null \ - && $OPTIPNG -o7 --quiet $ASSETS_DIR/$i.png -fi -done - -done -done - -exit 0 diff --git a/Fluent/files/Fluent/index.theme b/Fluent/files/Fluent/index.theme index 57a7d51a2..390dd0cb6 100644 --- a/Fluent/files/Fluent/index.theme +++ b/Fluent/files/Fluent/index.theme @@ -1,12 +1,12 @@ [Desktop Entry] Type=X-GNOME-Metatheme -Name=Fluent321 +Name=Fluent Comment=An Materia Gtk+ theme based on Elegant Design Encoding=UTF-8 [X-GNOME-Metatheme] -GtkTheme=Fluent321 -MetacityTheme=Fluent321 -IconTheme=Fluent321 -CursorTheme=Fluent321 +GtkTheme=Fluent +MetacityTheme=Fluent +IconTheme=Fluent +CursorTheme=Fluent ButtonLayout=close,minimize,maximize:menu diff --git a/Fluent/files/Fluent/options.py b/Fluent/files/Fluent/options.py index 5be7547f9..8385e5786 100755 --- a/Fluent/files/Fluent/options.py +++ b/Fluent/files/Fluent/options.py @@ -1,29 +1,38 @@ #!/usr/bin/python3 +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +gi.require_version('Gdk', '3.0') +from gi.repository import Gdk +from gi.repository import Gio, GLib +import json import os -from gi.repository import Gio import subprocess -from config import config_gui +import string +import random import time ''' -$XDG_CURRENT_DESKTOP values: -Cinnamon: "X-Cinnamon" -GNOME: "GNOME" -MATE: "MATE" -XFCE: "XFCE" -pop: "pop:GNOME" -Pantheon: "Pantheon" - -Desktops: -GNOME, XFCE (xubuntu 23, Manjaro xfce 22), MATE, Unity (Ubuntu Unity 23): Works OK -Cinnamon, Pantheon (elementaryos-7): Works OK, but don't know how to update wm - theme without renaming theme -pop (popOS 22): Treat as GNOME but doesn't seem to affect some gtk3 apps or wm - theme (and neither does GNOME tweaks) -Budgie (Ubuntu Budgie 23): Works OK, but don't know how to update wm theme without - renaming theme and have to set org.gnome.desktop.interface color-scheme as it changes - to "prefer-dark" each time. +Dist, $XDG_CURRENT_DESKTOP, $XDG_SESSION_TYPE +Ubuntu 18.04, ubuntu:GNOME, x11, rename theme. +Ubuntu 20.04, ubuntu:GNOME, x11, rename theme. +Ubuntu 22.04, ubuntu:GNOME, x11, rename theme. +Manjaro gnome 23 GNOME, x11, rename theme. +Fedora 39, GNOME, wayland, ok +Ubuntu Unity 23 Unity:Unity7:ubuntu, x11 ok +xubuntu 23 XFCE, x11, ok +Manjaro xfce 22 XFCE, x11, ok +MX Linux 23.2 XFCE, x11, +Manjaro Cinnamon X-Cinnamon, x11, rename theme. +Manjaro Cinnamon X-Cinnamon, wayland, ok +Mint 21.3 cinnamon X-Cinnamon, x11, rename theme +Mint 21.1 cinnamon X-Cinnamon, x11, rename theme +Mint 21.3 mate MATE, x11, ok +elementaryos-7 Pantheon, x11, rename theme. Has no effect on gtk3 apps +popOS 22, pop:GNOME, x11, rename theme. +Ubuntu Budgie 23 Budgie:GNOME, x11, rename theme and set org.gnome.desktop.interface + color-scheme as it changes to "prefer-dark" each time. ''' rename_theme_on_update = False desktop_environment = os.environ.get('XDG_CURRENT_DESKTOP') @@ -36,11 +45,16 @@ desktop_environment = 'Unity' elif "pop" in desktop_environment: desktop_environment = 'pop' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" +elif "ubuntu:GNOME" in desktop_environment: + desktop_environment = 'ubuntu:GNOME' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "GNOME" in desktop_environment: desktop_environment = 'GNOME' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "Cinnamon" in desktop_environment: desktop_environment = "Cinnamon" - rename_theme_on_update = True + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "MATE" in desktop_environment: desktop_environment = "MATE" elif "XFCE" in desktop_environment: @@ -48,11 +62,285 @@ elif "Pantheon" in desktop_environment: desktop_environment = "Pantheon" rename_theme_on_update = True -else: - desktop_environment = "Unknown" print(f"Desktop environment is: {desktop_environment}...") +class OptionsWindow(Gtk.Window): + def __init__(self, desktop_environment, rename_theme_on_update): + super().__init__(title="") + + self.desktop_environment = desktop_environment + self.rename_theme_on_update = rename_theme_on_update + + self.current_theme_dir = os.path.dirname(os.path.abspath(__file__)) + self.current_theme_name = os.path.basename(self.current_theme_dir) + + self.set_default_size(500, 100) + + box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 15) + box.set_margin_top(20) + box.set_margin_bottom(20) + box.set_margin_start(35) + box.set_margin_end(35) + self.add(box) + self.set_icon_name("applications-graphics") + + self.load_config_file() + theme_name = self.options.get("theme_name", "?") + self.set_title("%s theme options" % theme_name) + + self.widgets = {} + + for option in self.options["options"]: + desktops = option["desktop"] + if isinstance(desktops, str): + desktops = [desktops] + if not ("all" in desktops or self.desktop_environment in desktops): + continue + + if option["type"] == "combo": + combobox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + combobox_label = Gtk.Label.new(option["label"]) + combobox_label.set_halign(Gtk.Align.START) + combobox.pack_start(combobox_label, True, True, 0) + combo_widget = Gtk.ComboBoxText.new() + for label in option["labels"]: + combo_widget.append_text(label) + combo_widget.set_active(option["value"]) + combo_widget.set_halign(Gtk.Align.END) + combo_widget.connect("changed", self.on_setting_changed) + combobox.pack_start(combo_widget, True, True, 0) + box.pack_start(combobox, False, True, 0) + self.widgets[option["name"]] = combo_widget + elif option["type"] == "switch": + switchbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + switchbox_label = Gtk.Label.new(option["label"]) + switchbox_label.set_halign(Gtk.Align.START) + switchbox.pack_start(switchbox_label, True, True, 0) + switch = Gtk.Switch.new() + switch.set_active(option["value"]) + switch.set_halign(Gtk.Align.END) + switch.set_valign(Gtk.Align.CENTER) + switch.connect("state-set", self.on_setting_changed) + switchbox.pack_start(switch, True, True, 0) + box.pack_start(switchbox, False, True, 0) + self.widgets[option["name"]] = switch + elif option["type"] == "color-chooser": + colorbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + colorbox_label = Gtk.Label.new(option["label"]) + colorbox_label.set_halign(Gtk.Align.START) + colorbox.pack_start(colorbox_label, True, True, 0) + colorButton = Gtk.ColorButton.new() + color = Gdk.RGBA() + color.parse(option["value"]) + colorButton.set_rgba(color) + colorButton.set_halign(Gtk.Align.END) + colorButton.set_valign(Gtk.Align.CENTER) + colorButton.connect("color-set", self.on_setting_changed) + colorbox.pack_start(colorButton, True, True, 0) + box.pack_start(colorbox, False, True, 0) + self.widgets[option["name"]] = colorButton + elif option["type"] == "spinbutton": + spinbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + spinbox_label = Gtk.Label.new(option["label"]) + spinbox_label.set_halign(Gtk.Align.START) + spinbox.pack_start(spinbox_label, True, True, 0) + spinbutton = Gtk.SpinButton.new_with_range(option["min"],option["max"],option["step"]) + spinbutton.set_value(option["value"]) + spinbutton.set_snap_to_ticks(True) + spinbutton.set_halign(Gtk.Align.END) + spinbutton.set_valign(Gtk.Align.CENTER) + spinbutton.connect("changed", self.on_setting_changed) + spinbox.pack_start(spinbutton, True, True, 0) + box.pack_start(spinbox, False, True, 0) + self.widgets[option["name"]] = spinbutton + #--------------------------- + if len(self.widgets) > 0: + xfwm_dir = os.path.join(self.current_theme_dir, "xfwm4") + if (self.desktop_environment == "XFCE" and os.path.exists(xfwm_dir)): + label = Gtk.Label.new("For title bar changes, ensure 'Set matching Xfwm4 theme'"\ + " in Appearance settings is checked.") + label.set_line_wrap(True) + label.set_size_request(450, -1) + box.pack_start(label, False, True, 0) + #--------------------------- + self.applybutton = Gtk.Button.new_with_label("Apply") + self.applybutton.set_halign(Gtk.Align.CENTER) + self.applybutton.set_valign(Gtk.Align.END) + self.applybutton.set_sensitive(False) + self.applybutton.connect("clicked", self.on_apply_button_clicked) + box.pack_start(self.applybutton, False, True, 0) + #--------------------------- + separator = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL) + separator.set_valign(Gtk.Align.END) + box.pack_start(separator, False, True, 0) + #--------------------------- + setthemebox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + self.setthemebox_label = Gtk.Label.new("") + self.setthemebox_label.set_halign(Gtk.Align.START) + setthemebox.pack_start(self.setthemebox_label, True, True, 0) + self.setthemebox_button = Gtk.Button.new() + self.setthemebox_button.set_label("Set theme") + self.setthemebox_button.set_halign(Gtk.Align.END) + self.setthemebox_button.set_valign(Gtk.Align.CENTER) + self.setthemebox_button.connect("clicked", self.on_setthemebox_button_clicked) + setthemebox.pack_start(self.setthemebox_button, True, True, 0) + box.pack_start(setthemebox, False, True, 0) + self.update_setthemebox() + #--------------------------- + if self.options.get("adwaita_link_to_gtk4", False): + adwaitabox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + self.adwaitabox_label = Gtk.Label.new("") + self.adwaitabox_label.set_halign(Gtk.Align.START) + adwaitabox.pack_start(self.adwaitabox_label, True, True, 0) + self.adwaitabox_button = Gtk.Button.new() + self.adwaitabox_button.set_halign(Gtk.Align.END) + self.adwaitabox_button.set_valign(Gtk.Align.CENTER) + self.adwaitabox_button.connect("clicked", self.on_adwaitabox_button_clicked) + adwaitabox.pack_start(self.adwaitabox_button, True, True, 0) + box.pack_start(adwaitabox, False, True, 0) + self.update_adwaitabox() + + def update_adwaitabox(self): + if is_libadwaita_linked(self.current_theme_dir): + self.adwaitabox_label.set_text("This theme is your current libadwaita theme") + self.adwaitabox_button.set_label("Remove") + else: + self.adwaitabox_label.set_text("Set this theme as your current libadwaita theme") + self.adwaitabox_button.set_label("Install") + + def on_adwaitabox_button_clicked(self, button): + if is_libadwaita_linked(self.current_theme_dir): # "Remove" clicked + unlink_libadwaita() + else: # "Install" clicked + unlink_libadwaita() + link_libadwaita(self.current_theme_dir) + + self.update_adwaitabox() + + def update_setthemebox(self): + if is_current_theme(self.current_theme_name): + self.setthemebox_label.set_text("This theme is your current desktop theme") + self.setthemebox_button.set_sensitive(False) + else: + self.setthemebox_label.set_text("This theme is not your current desktop theme") + self.setthemebox_button.set_sensitive(True) + + def on_setthemebox_button_clicked(self, button): + set_theme(self.current_theme_name) + self.update_setthemebox() + + def on_setting_changed(self, *args): + self.applybutton.set_sensitive(True) + + def load_config_file(self): + file_name = os.path.join(self.current_theme_dir, "config", "options_config.json") + with open(file_name, "r") as file: + self.options = json.load(file) + + def save_config_file(self, new_theme_dir): + file_name = os.path.join(new_theme_dir, "config", "options_config.json") + with open(file_name, "w") as file: + json.dump(self.options, file, indent=4) + + def get_new_theme_names(self): + if self.rename_theme_on_update: + random_chars = "".join(random.choices(string.digits, k=3)) + new_theme_name = self.options["theme_name"] + random_chars + new_theme_dir = os.path.join(os.path.dirname(self.current_theme_dir), new_theme_name) + print ("Renaming theme to " + new_theme_name + "...") + else: #keep same name + new_theme_dir = self.current_theme_dir + new_theme_name = self.current_theme_name + return (new_theme_dir, new_theme_name) + + def on_apply_button_clicked(self, button): + new_theme_dir, new_theme_name = self.get_new_theme_names() + #Rename theme directory if neccessary + if new_theme_dir != self.current_theme_dir: + os.rename(self.current_theme_dir, new_theme_dir) + + #prepare install command and store settings + command = ['bash', os.path.join(new_theme_dir, 'config', self.options["script_name"])] + + for option in self.options["options"]: + desktops = option["desktop"] + if isinstance(desktops, str): + desktops = [desktops] + if "all" in desktops or self.desktop_environment in desktops: + if option["type"] == "combo": + command.append("--" + option["name"]) + value = self.widgets[option["name"]].get_active() + option["value"] = value + value_id = option["ids"][value] + command.append(value_id) + elif option["type"] == "switch": + value = self.widgets[option["name"]].get_active() + option["value"] = value + if value: + command.append("--" + option["name"]) + elif option["type"] == "color-chooser": + command.append("--" + option["name"]) + rgba = self.widgets[option["name"]].get_rgba() + red = int(round(rgba.red * 255)) + green = int(round(rgba.green * 255)) + blue = int(round(rgba.blue * 255)) + value = f"#{red:02x}{green:02x}{blue:02x}" + option["value"] = value + command.append(value) + elif option["type"] == "spinbutton": + command.append("--" + option["name"]) + value = self.widgets[option["name"]].get_value() + if value == int(value): + value = int(value) + option["value"] = value + command.append(str(value)) + + #Install theme + print ("Running..." + " ".join(command)) + subprocess.run(command, check=True) + print("Install finished OK") + + #save settings + self.save_config_file(new_theme_dir) + + #apply desktop theme + update_theme(self.current_theme_name, new_theme_name) + self.applybutton.set_sensitive(False) + + #Relink libadwaita if neccessary + if new_theme_name != self.current_theme_name and is_libadwaita_linked(self.current_theme_dir): + unlink_libadwaita() + link_libadwaita(new_theme_dir) + + #update theme name + self.current_theme_dir = new_theme_dir + self.current_theme_name = new_theme_name + +def is_link_to(link, target): + return os.path.islink(link) and os.readlink(link) == target + +def is_libadwaita_linked(theme_dir): + config_dir = os.path.expanduser('~/.config/gtk-4.0/') + return (is_link_to(os.path.join(config_dir, 'assets'), os.path.join(theme_dir, 'gtk-4.0', 'assets')) and + is_link_to(os.path.join(config_dir, 'gtk.css'), os.path.join(theme_dir, 'gtk-4.0', 'gtk.css')) and + is_link_to(os.path.join(config_dir, 'gtk-dark.css'), os.path.join(theme_dir, 'gtk-4.0', 'gtk-dark.css'))) + +def link_libadwaita(theme_dir): + config_dir = os.path.expanduser('~/.config/gtk-4.0/') + os.makedirs(config_dir, exist_ok=True) + os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'assets'), os.path.join(config_dir, 'assets'), target_is_directory = True) + os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'gtk.css'), os.path.join(config_dir, 'gtk.css')) + os.symlink(os.path.join(theme_dir, 'gtk-4.0', 'gtk-dark.css'), os.path.join(config_dir, 'gtk-dark.css')) + +def unlink_libadwaita(): + config_dir = os.path.expanduser('~/.config/gtk-4.0/') + subprocess.run(["rm", "-rf", config_dir + "assets"]) + subprocess.run(["rm", "-rf", config_dir + "gtk.css"]) + subprocess.run(["rm", "-rf", config_dir + "gtk-dark.css"]) + +#--------------------------------------------------- + def gsettings_get(schema, key): if Gio.SettingsSchemaSource.get_default().lookup(schema, True) is not None: setting = Gio.Settings.new(schema) @@ -60,14 +348,11 @@ def gsettings_get(schema, key): else: return "" -def gsettings_set(schema, key, old_value, new_value, reload_only): - if not reload_only or gsettings_get(schema, key) == old_value: - if Gio.SettingsSchemaSource.get_default().lookup(schema, True) is not None: - print ("gsettings resetting " + schema + " " + key) - setting = Gio.Settings.new(schema) - if new_value == old_value: - setting.set_string(key, "") - setting.set_string(key, new_value) +def gsettings_set(schema, key, value): + if Gio.SettingsSchemaSource.get_default().lookup(schema, True) is not None: + print ("gsettings setting " + schema + " " + key + " " + value) + setting = Gio.Settings.new(schema) + setting.set_string(key, value) def xfconf_get(channel, key): try: @@ -78,53 +363,113 @@ def xfconf_get(channel, key): output = "" return output.rstrip("\n") -def xfconf_set(channel, key, theme_name, reload_only): - if not reload_only or xfconf_get(channel, key) == theme_name: +def xfconf_set(channel, key, value): + try: + print ("xfconf-query setting ", channel, key, value) + subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-s", value]) + except Exception as e: + print("xfconf-query error: ", e) + +def xfconf_reset(channel, key): + try: print ("xfconf-query resetting ", channel, key) subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-r"]) - subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-s", theme_name]) + except Exception as e: + print("xfconf-query error: ", e) def is_current_theme(current_theme_name): - if desktop_environment in {"GNOME", "pop", "Pantheon", "Budgie", "Unity"}: + if desktop_environment in {"GNOME", "ubuntu:GNOME", "pop", "Pantheon", "Budgie", "Unity"}: return gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name elif desktop_environment == "Cinnamon": - return gsettings_get("org.cinnamon.desktop.interface", - "gtk-theme") == current_theme_name + return gsettings_get("org.cinnamon.desktop.interface", "gtk-theme") == current_theme_name #return gsettings_get("org.cinnamon.theme", "name") == current_theme_name elif desktop_environment == "XFCE": return xfconf_get("xsettings", "/Net/ThemeName") == current_theme_name elif desktop_environment == "MATE": return gsettings_get("org.mate.interface", "gtk-theme") == current_theme_name -def set_theme(current_theme_name, new_theme_name, reload_only): - if desktop_environment in {"GNOME", "pop", "Pantheon"}: - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) +def set_theme(theme_name): + if desktop_environment in {"ubuntu:GNOME", "GNOME", "pop", "Pantheon"}: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) elif desktop_environment == "Cinnamon": - gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) - gsettings_set("org.cinnamon.theme", "name", current_theme_name, - new_theme_name, reload_only) + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", theme_name) elif desktop_environment == "XFCE": - xfconf_set("xsettings", "/Net/ThemeName", current_theme_name, reload_only) + xfconf_set("xsettings", "/Net/ThemeName", theme_name) #xfconf_set("xfwm4", "/general/theme", current_theme_name, reload_only) elif desktop_environment == "MATE": - gsettings_set("org.mate.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.mate.interface", "gtk-theme", theme_name) elif desktop_environment == "Budgie": setting = Gio.Settings.new("org.gnome.desktop.interface") current_color_scheme = setting.get_string("color-scheme") - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) time.sleep(1) setting.set_string("color-scheme", current_color_scheme) elif desktop_environment == "Unity": - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) - gsettings_set("org.gnome.desktop.wm.preferences", "theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) + gsettings_set("org.gnome.desktop.wm.preferences", "theme", theme_name) + +def update_theme(current_theme_name, new_theme_name): + if desktop_environment in {"ubuntu:GNOME", "GNOME", "pop", "Pantheon"}: + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + + elif desktop_environment == "Cinnamon": + def reset_cinnamon_theme(): + if current_theme_name == new_theme_name: + gsettings_set("org.cinnamon.theme", "name", "") + gsettings_set("org.cinnamon.theme", "name", new_theme_name) + return False + + if gsettings_get("org.cinnamon.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", "") + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", new_theme_name) + + if gsettings_get("org.cinnamon.theme", "name") == current_theme_name: + GLib.timeout_add_seconds(1, reset_cinnamon_theme) + elif gsettings_get("org.cinnamon.theme", "name") == current_theme_name: + reset_cinnamon_theme() + + elif desktop_environment == "XFCE": + if xfconf_get("xsettings", "/Net/ThemeName") == current_theme_name: + xfconf_reset("xsettings", "/Net/ThemeName") + xfconf_set("xsettings", "/Net/ThemeName", new_theme_name) + #xfconf_set("xfwm4", "/general/theme", current_theme_name, reload_only) + + elif desktop_environment == "MATE": + def set_mate_theme(): + gsettings_set("org.mate.interface", "gtk-theme", new_theme_name) + return False + + if gsettings_get("org.mate.interface", "gtk-theme") == current_theme_name: + gsettings_set("org.mate.interface", "gtk-theme", "") + GLib.timeout_add_seconds(1, set_mate_theme) + + elif desktop_environment == "Budgie": + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + setting = Gio.Settings.new("org.gnome.desktop.interface") + current_color_scheme = setting.get_string("color-scheme") + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + time.sleep(1) + setting.set_string("color-scheme", current_color_scheme) + + elif desktop_environment == "Unity": + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.wm.preferences", "theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + gsettings_set("org.gnome.desktop.wm.preferences", "theme", new_theme_name) if __name__ == "__main__": - config_gui.main(desktop_environment, rename_theme_on_update, - is_current_theme, set_theme) + Gtk.init() + + win = OptionsWindow(desktop_environment, rename_theme_on_update) + win.connect("destroy", Gtk.main_quit) + win.show_all() + Gtk.main() diff --git a/Fluent/info.json b/Fluent/info.json index 6bab9ffcf..5a90acd89 100644 --- a/Fluent/info.json +++ b/Fluent/info.json @@ -1,6 +1,6 @@ { "author": "fredcw", "name": "Fluent", - "description": "Run options.py in theme folder for options including light/dark, accent color, transparency, etc. Cinnamon, gtk2 - gtk4, and libadwata supported.", + "description": "Give execute permissions to and run options.py in theme folder for options including light/dark, accent color, transparency, etc. Cinnamon, gtk2, gtk3, gtk4, and libadwaita supported.", "license": "GPLv3" } diff --git a/Graphite/README.md b/Graphite/README.md index 4ae290040..a0b3d8ea2 100644 --- a/Graphite/README.md +++ b/Graphite/README.md @@ -8,8 +8,8 @@ This is a repackaging of the Graphite theme for convenience of installation and ## Installation -Most easily installed via Cinnamon's Themes module in Cinnamon settings. +Install via Cinnamon's Themes module in Cinnamon settings or download from Cinnamon Spices and unzip into your ~/.themes directory. ## Options/Configuration -Various options are available such as light/dark theme, accent color, etc. Simply go to `~/.themes/Graphite` directory and run `options.py` +Various options are available such as light/dark theme, accent color, etc. Go to `~/.themes/Graphite` directory and run `options.py`. You may need to give execute permissions to `options.py` first in order to run it (right click on file > Properties > Permissions tab). diff --git a/Graphite/files/Graphite/config/README.txt b/Graphite/files/Graphite/config/CREDITS similarity index 100% rename from Graphite/files/Graphite/config/README.txt rename to Graphite/files/Graphite/config/CREDITS diff --git a/Graphite/files/Graphite/config/install.sh b/Graphite/files/Graphite/config/install.sh index 70d327543..c8548412c 100755 --- a/Graphite/files/Graphite/config/install.sh +++ b/Graphite/files/Graphite/config/install.sh @@ -20,7 +20,6 @@ THEME_NAME=$(basename $THEME_DIR) SASSC_OPT="-M -t expanded" -THEME_NAME=Graphite THEME_VARIANTS=('' '-purple' '-pink' '-red' '-orange' '-yellow' '-green' '-teal' '-blue') COLOR_VARIANTS=('' '-Light' '-Dark') SIZE_VARIANTS=('' '-compact') diff --git a/Graphite/files/Graphite/options.py b/Graphite/files/Graphite/options.py index c47f03d5f..8385e5786 100755 --- a/Graphite/files/Graphite/options.py +++ b/Graphite/files/Graphite/options.py @@ -5,7 +5,7 @@ from gi.repository import Gtk gi.require_version('Gdk', '3.0') from gi.repository import Gdk -from gi.repository import Gio +from gi.repository import Gio, GLib import json import os import subprocess @@ -14,23 +14,25 @@ import time ''' -$XDG_CURRENT_DESKTOP values: -Cinnamon: "X-Cinnamon" -GNOME: "GNOME" -MATE: "MATE" -XFCE: "XFCE" -pop: "pop:GNOME" -Pantheon: "Pantheon" - -Desktops: -GNOME, XFCE (xubuntu 23, Manjaro xfce 22), MATE, Unity (Ubuntu Unity 23): Works OK -Cinnamon, Pantheon (elementaryos-7): Works OK, but don't know how to update wm - theme without renaming theme -pop (popOS 22): Treat as GNOME but doesn't seem to affect some gtk3 apps or wm - theme (and neither does GNOME tweaks) -Budgie (Ubuntu Budgie 23): Works OK, but don't know how to update wm theme without - renaming theme and have to set org.gnome.desktop.interface color-scheme as it changes - to "prefer-dark" each time. +Dist, $XDG_CURRENT_DESKTOP, $XDG_SESSION_TYPE +Ubuntu 18.04, ubuntu:GNOME, x11, rename theme. +Ubuntu 20.04, ubuntu:GNOME, x11, rename theme. +Ubuntu 22.04, ubuntu:GNOME, x11, rename theme. +Manjaro gnome 23 GNOME, x11, rename theme. +Fedora 39, GNOME, wayland, ok +Ubuntu Unity 23 Unity:Unity7:ubuntu, x11 ok +xubuntu 23 XFCE, x11, ok +Manjaro xfce 22 XFCE, x11, ok +MX Linux 23.2 XFCE, x11, +Manjaro Cinnamon X-Cinnamon, x11, rename theme. +Manjaro Cinnamon X-Cinnamon, wayland, ok +Mint 21.3 cinnamon X-Cinnamon, x11, rename theme +Mint 21.1 cinnamon X-Cinnamon, x11, rename theme +Mint 21.3 mate MATE, x11, ok +elementaryos-7 Pantheon, x11, rename theme. Has no effect on gtk3 apps +popOS 22, pop:GNOME, x11, rename theme. +Ubuntu Budgie 23 Budgie:GNOME, x11, rename theme and set org.gnome.desktop.interface + color-scheme as it changes to "prefer-dark" each time. ''' rename_theme_on_update = False desktop_environment = os.environ.get('XDG_CURRENT_DESKTOP') @@ -43,11 +45,16 @@ desktop_environment = 'Unity' elif "pop" in desktop_environment: desktop_environment = 'pop' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" +elif "ubuntu:GNOME" in desktop_environment: + desktop_environment = 'ubuntu:GNOME' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "GNOME" in desktop_environment: desktop_environment = 'GNOME' + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "Cinnamon" in desktop_environment: desktop_environment = "Cinnamon" - rename_theme_on_update = True + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "MATE" in desktop_environment: desktop_environment = "MATE" elif "XFCE" in desktop_environment: @@ -55,8 +62,6 @@ elif "Pantheon" in desktop_environment: desktop_environment = "Pantheon" rename_theme_on_update = True -else: - desktop_environment = "Unknown" print(f"Desktop environment is: {desktop_environment}...") @@ -72,11 +77,11 @@ def __init__(self, desktop_environment, rename_theme_on_update): self.set_default_size(500, 100) - box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 5) - box.set_margin_top(15) - box.set_margin_bottom(15) - box.set_margin_start(25) - box.set_margin_end(25) + box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 15) + box.set_margin_top(20) + box.set_margin_bottom(20) + box.set_margin_start(35) + box.set_margin_end(35) self.add(box) self.set_icon_name("applications-graphics") @@ -90,65 +95,75 @@ def __init__(self, desktop_environment, rename_theme_on_update): desktops = option["desktop"] if isinstance(desktops, str): desktops = [desktops] - if "all" in desktops or self.desktop_environment in desktops: - if option["type"] == "combo": - combobox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - combobox_label = Gtk.Label.new(option["label"]) - combobox_label.set_halign(Gtk.Align.START) - combobox.pack_start(combobox_label, True, True, 0) - combo_widget = Gtk.ComboBoxText.new() - for label in option["labels"]: - combo_widget.append_text(label) - combo_widget.set_active(option["value"]) - combo_widget.set_halign(Gtk.Align.END) - combo_widget.connect("changed", self.on_setting_changed) - combobox.pack_start(combo_widget, True, True, 0) - box.pack_start(combobox, False, True, 0) - self.widgets[option["name"]] = combo_widget - elif option["type"] == "switch": - switchbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - switchbox_label = Gtk.Label.new(option["label"]) - switchbox_label.set_halign(Gtk.Align.START) - switchbox.pack_start(switchbox_label, True, True, 0) - switch = Gtk.Switch.new() - switch.set_active(option["value"]) - switch.set_halign(Gtk.Align.END) - switch.set_valign(Gtk.Align.CENTER) - switch.connect("state-set", self.on_setting_changed) - switchbox.pack_start(switch, True, True, 0) - box.pack_start(switchbox, False, True, 0) - self.widgets[option["name"]] = switch - elif option["type"] == "color-chooser": - colorbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - colorbox_label = Gtk.Label.new(option["label"]) - colorbox_label.set_halign(Gtk.Align.START) - colorbox.pack_start(colorbox_label, True, True, 0) - colorButton = Gtk.ColorButton.new() - color = Gdk.RGBA() - color.parse(option["value"]) - colorButton.set_rgba(color) - colorButton.set_halign(Gtk.Align.END) - colorButton.set_valign(Gtk.Align.CENTER) - colorButton.connect("color-set", self.on_setting_changed) - colorbox.pack_start(colorButton, True, True, 0) - box.pack_start(colorbox, False, True, 0) - self.widgets[option["name"]] = colorButton - elif option["type"] == "spinbutton": - spinbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) - spinbox_label = Gtk.Label.new(option["label"]) - spinbox_label.set_halign(Gtk.Align.START) - spinbox.pack_start(spinbox_label, True, True, 0) - spinbutton = Gtk.SpinButton.new_with_range(option["min"],option["max"],option["step"]) - spinbutton.set_value(option["value"]) - spinbutton.set_snap_to_ticks(True) - spinbutton.set_halign(Gtk.Align.END) - spinbutton.set_valign(Gtk.Align.CENTER) - spinbutton.connect("changed", self.on_setting_changed) - spinbox.pack_start(spinbutton, True, True, 0) - box.pack_start(spinbox, False, True, 0) - self.widgets[option["name"]] = spinbutton + if not ("all" in desktops or self.desktop_environment in desktops): + continue + + if option["type"] == "combo": + combobox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + combobox_label = Gtk.Label.new(option["label"]) + combobox_label.set_halign(Gtk.Align.START) + combobox.pack_start(combobox_label, True, True, 0) + combo_widget = Gtk.ComboBoxText.new() + for label in option["labels"]: + combo_widget.append_text(label) + combo_widget.set_active(option["value"]) + combo_widget.set_halign(Gtk.Align.END) + combo_widget.connect("changed", self.on_setting_changed) + combobox.pack_start(combo_widget, True, True, 0) + box.pack_start(combobox, False, True, 0) + self.widgets[option["name"]] = combo_widget + elif option["type"] == "switch": + switchbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + switchbox_label = Gtk.Label.new(option["label"]) + switchbox_label.set_halign(Gtk.Align.START) + switchbox.pack_start(switchbox_label, True, True, 0) + switch = Gtk.Switch.new() + switch.set_active(option["value"]) + switch.set_halign(Gtk.Align.END) + switch.set_valign(Gtk.Align.CENTER) + switch.connect("state-set", self.on_setting_changed) + switchbox.pack_start(switch, True, True, 0) + box.pack_start(switchbox, False, True, 0) + self.widgets[option["name"]] = switch + elif option["type"] == "color-chooser": + colorbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + colorbox_label = Gtk.Label.new(option["label"]) + colorbox_label.set_halign(Gtk.Align.START) + colorbox.pack_start(colorbox_label, True, True, 0) + colorButton = Gtk.ColorButton.new() + color = Gdk.RGBA() + color.parse(option["value"]) + colorButton.set_rgba(color) + colorButton.set_halign(Gtk.Align.END) + colorButton.set_valign(Gtk.Align.CENTER) + colorButton.connect("color-set", self.on_setting_changed) + colorbox.pack_start(colorButton, True, True, 0) + box.pack_start(colorbox, False, True, 0) + self.widgets[option["name"]] = colorButton + elif option["type"] == "spinbutton": + spinbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) + spinbox_label = Gtk.Label.new(option["label"]) + spinbox_label.set_halign(Gtk.Align.START) + spinbox.pack_start(spinbox_label, True, True, 0) + spinbutton = Gtk.SpinButton.new_with_range(option["min"],option["max"],option["step"]) + spinbutton.set_value(option["value"]) + spinbutton.set_snap_to_ticks(True) + spinbutton.set_halign(Gtk.Align.END) + spinbutton.set_valign(Gtk.Align.CENTER) + spinbutton.connect("changed", self.on_setting_changed) + spinbox.pack_start(spinbutton, True, True, 0) + box.pack_start(spinbox, False, True, 0) + self.widgets[option["name"]] = spinbutton #--------------------------- if len(self.widgets) > 0: + xfwm_dir = os.path.join(self.current_theme_dir, "xfwm4") + if (self.desktop_environment == "XFCE" and os.path.exists(xfwm_dir)): + label = Gtk.Label.new("For title bar changes, ensure 'Set matching Xfwm4 theme'"\ + " in Appearance settings is checked.") + label.set_line_wrap(True) + label.set_size_request(450, -1) + box.pack_start(label, False, True, 0) + #--------------------------- self.applybutton = Gtk.Button.new_with_label("Apply") self.applybutton.set_halign(Gtk.Align.CENTER) self.applybutton.set_valign(Gtk.Align.END) @@ -163,7 +178,6 @@ def __init__(self, desktop_environment, rename_theme_on_update): setthemebox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) self.setthemebox_label = Gtk.Label.new("") self.setthemebox_label.set_halign(Gtk.Align.START) - self.setthemebox_label.set_line_wrap(True) setthemebox.pack_start(self.setthemebox_label, True, True, 0) self.setthemebox_button = Gtk.Button.new() self.setthemebox_button.set_label("Set theme") @@ -178,7 +192,6 @@ def __init__(self, desktop_environment, rename_theme_on_update): adwaitabox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 10) self.adwaitabox_label = Gtk.Label.new("") self.adwaitabox_label.set_halign(Gtk.Align.START) - self.adwaitabox_label.set_line_wrap(True) adwaitabox.pack_start(self.adwaitabox_label, True, True, 0) self.adwaitabox_button = Gtk.Button.new() self.adwaitabox_button.set_halign(Gtk.Align.END) @@ -214,7 +227,7 @@ def update_setthemebox(self): self.setthemebox_button.set_sensitive(True) def on_setthemebox_button_clicked(self, button): - set_theme(self.current_theme_name, self.current_theme_name, reload_only = False) + set_theme(self.current_theme_name) self.update_setthemebox() def on_setting_changed(self, *args): @@ -235,6 +248,7 @@ def get_new_theme_names(self): random_chars = "".join(random.choices(string.digits, k=3)) new_theme_name = self.options["theme_name"] + random_chars new_theme_dir = os.path.join(os.path.dirname(self.current_theme_dir), new_theme_name) + print ("Renaming theme to " + new_theme_name + "...") else: #keep same name new_theme_dir = self.current_theme_dir new_theme_name = self.current_theme_name @@ -247,7 +261,7 @@ def on_apply_button_clicked(self, button): os.rename(self.current_theme_dir, new_theme_dir) #prepare install command and store settings - command = [os.path.join(new_theme_dir, 'config', self.options["script_name"])] + command = ['bash', os.path.join(new_theme_dir, 'config', self.options["script_name"])] for option in self.options["options"]: desktops = option["desktop"] @@ -283,19 +297,15 @@ def on_apply_button_clicked(self, button): command.append(str(value)) #Install theme - try: - print ("Running..." + " ".join(command)) - subprocess.run(command, check=True) - print("Install finished OK") - except subprocess.CalledProcessError as e: - print(f"Install script error. Return code: {e.returncode}") - print(f"Output:\n{e.output.decode('utf-8')}") + print ("Running..." + " ".join(command)) + subprocess.run(command, check=True) + print("Install finished OK") #save settings self.save_config_file(new_theme_dir) #apply desktop theme - set_theme(self.current_theme_name, new_theme_name, reload_only = True) + update_theme(self.current_theme_name, new_theme_name) self.applybutton.set_sensitive(False) #Relink libadwaita if neccessary @@ -338,14 +348,11 @@ def gsettings_get(schema, key): else: return "" -def gsettings_set(schema, key, old_value, new_value, reload_only): - if not reload_only or gsettings_get(schema, key) == old_value: - if Gio.SettingsSchemaSource.get_default().lookup(schema, True) is not None: - print ("gsettings resetting " + schema + " " + key) - setting = Gio.Settings.new(schema) - if new_value == old_value: - setting.set_string(key, "") - setting.set_string(key, new_value) +def gsettings_set(schema, key, value): + if Gio.SettingsSchemaSource.get_default().lookup(schema, True) is not None: + print ("gsettings setting " + schema + " " + key + " " + value) + setting = Gio.Settings.new(schema) + setting.set_string(key, value) def xfconf_get(channel, key): try: @@ -356,52 +363,108 @@ def xfconf_get(channel, key): output = "" return output.rstrip("\n") -def xfconf_set(channel, key, theme_name, reload_only): - if not reload_only or xfconf_get(channel, key) == theme_name: +def xfconf_set(channel, key, value): + try: + print ("xfconf-query setting ", channel, key, value) + subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-s", value]) + except Exception as e: + print("xfconf-query error: ", e) + +def xfconf_reset(channel, key): + try: print ("xfconf-query resetting ", channel, key) subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-r"]) - subprocess.run(["xfconf-query", "-c", channel, "-p", key, "-s", theme_name]) + except Exception as e: + print("xfconf-query error: ", e) def is_current_theme(current_theme_name): - if desktop_environment in {"GNOME", "pop", "Pantheon", "Budgie", "Unity"}: + if desktop_environment in {"GNOME", "ubuntu:GNOME", "pop", "Pantheon", "Budgie", "Unity"}: return gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name elif desktop_environment == "Cinnamon": - return gsettings_get("org.cinnamon.desktop.interface", - "gtk-theme") == current_theme_name + return gsettings_get("org.cinnamon.desktop.interface", "gtk-theme") == current_theme_name #return gsettings_get("org.cinnamon.theme", "name") == current_theme_name elif desktop_environment == "XFCE": return xfconf_get("xsettings", "/Net/ThemeName") == current_theme_name elif desktop_environment == "MATE": return gsettings_get("org.mate.interface", "gtk-theme") == current_theme_name -def set_theme(current_theme_name, new_theme_name, reload_only): - if desktop_environment in {"GNOME", "pop", "Pantheon"}: - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) +def set_theme(theme_name): + if desktop_environment in {"ubuntu:GNOME", "GNOME", "pop", "Pantheon"}: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) elif desktop_environment == "Cinnamon": - gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) - gsettings_set("org.cinnamon.theme", "name", current_theme_name, - new_theme_name, reload_only) + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", theme_name) elif desktop_environment == "XFCE": - xfconf_set("xsettings", "/Net/ThemeName", current_theme_name, reload_only) + xfconf_set("xsettings", "/Net/ThemeName", theme_name) #xfconf_set("xfwm4", "/general/theme", current_theme_name, reload_only) elif desktop_environment == "MATE": - gsettings_set("org.mate.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.mate.interface", "gtk-theme", theme_name) elif desktop_environment == "Budgie": setting = Gio.Settings.new("org.gnome.desktop.interface") current_color_scheme = setting.get_string("color-scheme") - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) time.sleep(1) setting.set_string("color-scheme", current_color_scheme) elif desktop_environment == "Unity": - gsettings_set("org.gnome.desktop.interface", "gtk-theme", - current_theme_name, new_theme_name, reload_only) - gsettings_set("org.gnome.desktop.wm.preferences", "theme", - current_theme_name, new_theme_name, reload_only) + gsettings_set("org.gnome.desktop.interface", "gtk-theme", theme_name) + gsettings_set("org.gnome.desktop.wm.preferences", "theme", theme_name) + +def update_theme(current_theme_name, new_theme_name): + if desktop_environment in {"ubuntu:GNOME", "GNOME", "pop", "Pantheon"}: + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + + elif desktop_environment == "Cinnamon": + def reset_cinnamon_theme(): + if current_theme_name == new_theme_name: + gsettings_set("org.cinnamon.theme", "name", "") + gsettings_set("org.cinnamon.theme", "name", new_theme_name) + return False + + if gsettings_get("org.cinnamon.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", "") + gsettings_set("org.cinnamon.desktop.interface", "gtk-theme", new_theme_name) + + if gsettings_get("org.cinnamon.theme", "name") == current_theme_name: + GLib.timeout_add_seconds(1, reset_cinnamon_theme) + elif gsettings_get("org.cinnamon.theme", "name") == current_theme_name: + reset_cinnamon_theme() + + elif desktop_environment == "XFCE": + if xfconf_get("xsettings", "/Net/ThemeName") == current_theme_name: + xfconf_reset("xsettings", "/Net/ThemeName") + xfconf_set("xsettings", "/Net/ThemeName", new_theme_name) + #xfconf_set("xfwm4", "/general/theme", current_theme_name, reload_only) + + elif desktop_environment == "MATE": + def set_mate_theme(): + gsettings_set("org.mate.interface", "gtk-theme", new_theme_name) + return False + + if gsettings_get("org.mate.interface", "gtk-theme") == current_theme_name: + gsettings_set("org.mate.interface", "gtk-theme", "") + GLib.timeout_add_seconds(1, set_mate_theme) + + elif desktop_environment == "Budgie": + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + setting = Gio.Settings.new("org.gnome.desktop.interface") + current_color_scheme = setting.get_string("color-scheme") + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + time.sleep(1) + setting.set_string("color-scheme", current_color_scheme) + + elif desktop_environment == "Unity": + if gsettings_get("org.gnome.desktop.interface", "gtk-theme") == current_theme_name: + if current_theme_name == new_theme_name: + gsettings_set("org.gnome.desktop.interface", "gtk-theme", "") + gsettings_set("org.gnome.desktop.wm.preferences", "theme", "") + gsettings_set("org.gnome.desktop.interface", "gtk-theme", new_theme_name) + gsettings_set("org.gnome.desktop.wm.preferences", "theme", new_theme_name) if __name__ == "__main__": Gtk.init() @@ -409,4 +472,4 @@ def set_theme(current_theme_name, new_theme_name, reload_only): win = OptionsWindow(desktop_environment, rename_theme_on_update) win.connect("destroy", Gtk.main_quit) win.show_all() - Gtk.main() \ No newline at end of file + Gtk.main() diff --git a/Graphite/info.json b/Graphite/info.json index 33199be2a..4ca3d4903 100644 --- a/Graphite/info.json +++ b/Graphite/info.json @@ -1,6 +1,6 @@ { "author": "fredcw", "name": "Graphite", - "description": "Run options.py in theme folder for options including light/dark, accent color, etc. Cinnamon, gtk2, gtk3, gtk4, and libadwaita supported.", + "description": "Give execute permissions to and run options.py in theme folder for options including light/dark, accent color, etc. Cinnamon, gtk2, gtk3, gtk4, and libadwaita supported.", "license": "GPLv3" } diff --git a/Material/README.md b/Material/README.md index c623539c8..e1befc700 100644 --- a/Material/README.md +++ b/Material/README.md @@ -6,8 +6,8 @@ This is a repackaging of the Material Gtk theme for convenience of installation ## Installation -Most easily installed via Cinnamon's Themes module in Cinnamon settings. +Install via Cinnamon's Themes module in Cinnamon settings or download from Cinnamon Spices and unzip into your ~/.themes directory. ## Options/Configuration -Two color schemes, and other options are available. Simply go to `~/.themes/Material` directory and run `options.py` +Two color schemes, and other options are available. Go to `~/.themes/Material` directory and run `options.py`. You may need to give execute permissions to `options.py` first in order to run it (right click on file > Properties > Permissions tab). diff --git a/Material/files/Material/index.theme b/Material/files/Material/index.theme index 02d5daf6c..90ffed07a 100644 --- a/Material/files/Material/index.theme +++ b/Material/files/Material/index.theme @@ -5,8 +5,8 @@ Comment=An Materia Gtk+ theme based on Elegant Design Encoding=UTF-8 [X-GNOME-Metatheme] -GtkTheme=Material975 -MetacityTheme=Material975 +GtkTheme=Material +MetacityTheme=Material IconTheme=Material-DeepOcean CursorTheme=Material-DeepOcean ButtonLayout=close,minimize,maximize:menu diff --git a/Material/files/Material/options.py b/Material/files/Material/options.py index d70707374..8385e5786 100755 --- a/Material/files/Material/options.py +++ b/Material/files/Material/options.py @@ -26,7 +26,9 @@ MX Linux 23.2 XFCE, x11, Manjaro Cinnamon X-Cinnamon, x11, rename theme. Manjaro Cinnamon X-Cinnamon, wayland, ok -LinuxMint 21.3 mate MATE, x11, ok +Mint 21.3 cinnamon X-Cinnamon, x11, rename theme +Mint 21.1 cinnamon X-Cinnamon, x11, rename theme +Mint 21.3 mate MATE, x11, ok elementaryos-7 Pantheon, x11, rename theme. Has no effect on gtk3 apps popOS 22, pop:GNOME, x11, rename theme. Ubuntu Budgie 23 Budgie:GNOME, x11, rename theme and set org.gnome.desktop.interface @@ -43,16 +45,16 @@ desktop_environment = 'Unity' elif "pop" in desktop_environment: desktop_environment = 'pop' - rename_theme_on_update = os.environ["XDG_SESSION_TYPE"] == "x11" + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "ubuntu:GNOME" in desktop_environment: desktop_environment = 'ubuntu:GNOME' - rename_theme_on_update = os.environ["XDG_SESSION_TYPE"] == "x11" + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "GNOME" in desktop_environment: desktop_environment = 'GNOME' - rename_theme_on_update = os.environ["XDG_SESSION_TYPE"] == "x11" + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "Cinnamon" in desktop_environment: desktop_environment = "Cinnamon" - rename_theme_on_update = os.environ["XDG_SESSION_TYPE"] == "x11" + rename_theme_on_update = os.environ.get("XDG_SESSION_TYPE") == "x11" elif "MATE" in desktop_environment: desktop_environment = "MATE" elif "XFCE" in desktop_environment: @@ -259,7 +261,7 @@ def on_apply_button_clicked(self, button): os.rename(self.current_theme_dir, new_theme_dir) #prepare install command and store settings - command = [os.path.join(new_theme_dir, 'config', self.options["script_name"])] + command = ['bash', os.path.join(new_theme_dir, 'config', self.options["script_name"])] for option in self.options["options"]: desktops = option["desktop"] diff --git a/Material/info.json b/Material/info.json index ab32de9c4..3a7e63133 100644 --- a/Material/info.json +++ b/Material/info.json @@ -1,6 +1,6 @@ { "author": "fredcw", "name": "Material", - "description": "A configurable dark theme. Run options.py in theme folder for options. Cinnamon, gtk2, gtk3, and gtk4 supported.", + "description": "A configurable dark theme. Give execute permissions to and run options.py in theme folder for options. Cinnamon, gtk2, gtk3, and gtk4 supported.", "license": "GPLv3" }