#!/bin/bash # Exit out if the same script is already running in the background pidof -sq -o %PPID -x "$(basename "$0")" && exit # Set the directory paths target_themes_dir="$HOME/.themes" target_icons_dir="$HOME/.icons" # Create target directories if they don't exist mkdir -p "$target_themes_dir" "$target_icons_dir" || { echo "failed to make directories $target_themes_dir & $target_icons_dir"; exit 1; } sync_theme() { # Get the current system theme theme_name=$(xfconf-query -c xsettings -p /Net/ThemeName) # Cleanup source & target themes directories source_themes_dirs=() rm -rf "$target_themes_dir"/* # Go through each item in $XDG_DATA_DIRS to find all other directories where # themes are stored, and save only the current one to source_themes_dirs while read -r dir; do themes_subdir=${dir%/}/themes/${theme_name} [ -d "$themes_subdir" ] && source_themes_dirs+=("$themes_subdir") done < <(printf '%s:%s\n' "$XDG_DATA_DIRS" "$HOME/.local/share" | tr ':' '\n' | sort -u) rsync -av --delete --progress "${source_themes_dirs[@]}" "$target_themes_dir" echo "Directory $target_themes_dir is synchronized with source directories" # Enable syncing the current theme with xfwm4 if not already enabled [ "$(xfconf-query -c xsettings -p /Xfce/SyncThemes)" != 'true' ] && xfconf-query -c xsettings -p /Xfce/SyncThemes -n -t bool -s true # Apply the current theme with gsettings gsettings set org.gnome.desktop.interface gtk-theme "$theme_name" # Apply the current theme for the all the GTK flatpaks flatpak override --user --env=GTK_THEME="$theme_name" } sync_icons() { # Get the current icons theme icons_theme_name=$(xfconf-query -c xsettings -p /Net/IconThemeName) # Cleanup source & target themes directories source_icons_dirs=() rm -rf "$target_icons_dir"/* # Go through each item in $XDG_DATA_DIRS to find all other directories where # icons are stored, and save only the current one to source_icons_dirs while read -r dir; do icons_subdir=${dir%/}/icons/${icons_theme_name} [ -d "$icons_subdir" ] && source_icons_dirs+=("$icons_subdir") done < <(printf '%s:%s\n' "$XDG_DATA_DIRS" "$HOME/.local/share" | tr ':' '\n' | sort -u) rsync -av --delete --progress "${source_icons_dirs[@]}" "$target_icons_dir" echo "Directory $target_icons_dir is synchronized with source directories" } sync_font() { # Get the current system font font=$(xfconf-query -c xsettings -p /Gtk/FontName) # Apply the same font for the title of xfce windows xfconf-query -c xfwm4 -p /general/title_font -n -t string -s "$font" } sync_theme sync_icons sync_font # Monitor when the user changes their system theme or font in XFCE and sync them as needed while read -r line; do case "$line" in 'set: /Net/ThemeName') sync_theme ;; 'set: /Net/IconThemeName') sync_icons ;; 'set: /Gtk/FontName') sync_font ;; esac done < <(xfconf-query -c xsettings -m)