rokosun
0600a8f119
Now the script won't set the XFWM theme twice on hiDPI systems every time the user changes their theme. Also replaced read only variables inside loops with mutable ones.
205 lines
7.2 KiB
Bash
Executable File
205 lines
7.2 KiB
Bash
Executable File
#!/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/file paths
|
|
declare -r flatpak_themes_dir="$HOME/.themes"
|
|
declare -r config_dir="${XDG_CONFIG_HOME:-$HOME/.config}"
|
|
declare -r profile="$HOME/.profile"
|
|
|
|
# Create directories if they don't exist
|
|
mkdir -p "$flatpak_themes_dir" "$config_dir" ||
|
|
{ echo "failed to make directories $flatpak_themes_dir & $config_dir"; exit 1; }
|
|
|
|
# Enable option for syncing the current theme with XFWM theme if not already enabled
|
|
[ "$(xfconf-query -c xsettings -p /Xfce/SyncThemes)" != 'true' ] &&
|
|
xfconf-query -c xsettings -p /Xfce/SyncThemes -n -t bool -s true
|
|
|
|
xdg_directory_lookup() {
|
|
# Go through each item in $XDG_DATA_DIRS and find the subdirectory $1
|
|
while read -r dir; do
|
|
local subdir="${dir%/}/$1"
|
|
if [ -d "$subdir" ]; then
|
|
echo "$subdir"
|
|
break
|
|
fi
|
|
done < <(printf '%s:%s\n' "$HOME/.local/share" "$XDG_DATA_DIRS" | tr ':' '\n')
|
|
}
|
|
|
|
theme_exists() {
|
|
local -r theme_dir=$(xdg_directory_lookup "themes/$1")
|
|
[ -d "$theme_dir" ]
|
|
}
|
|
|
|
# Function for setting variables in ~/.profile
|
|
profile_set_variable() {
|
|
# Return if the variable is already set to the correct value
|
|
grep -xq "\s*export\s\+$1=$2\s*" "$profile" && return
|
|
|
|
# If the variable is set to a different value then remove that line
|
|
grep -q "^\s*export\s\+$1=" "$profile" && sed -i "/^\s*export\s\+$1=/d" "$profile"
|
|
|
|
# Set the variable to the correct value under a comment mentioning this script
|
|
if grep -xq '\s*#\s*Values set by the fix-theming script\s*' "$profile"; then
|
|
sed -i "/^\s*#\s*Values set by the fix-theming script\s*$/a export $1=$2" "$profile"
|
|
elif grep -q '\s' "$profile"; then
|
|
# shellcheck disable=SC2015
|
|
tail -n1 "$profile" | grep -qx '\s*' &&
|
|
local -r begin='' || local -r begin='\n'
|
|
printf '%b# Values set by the fix-theming script\nexport %s=%s\n' "$begin" "$1" "$2" >> "$profile"
|
|
else
|
|
printf '# Values set by the fix-theming script\nexport %s=%s\n' "$1" "$2" > "$profile"
|
|
fi
|
|
|
|
logout_required='true'
|
|
}
|
|
|
|
set_QT_scaling() {
|
|
for var in QT_SCALE_FACTOR QT_AUTO_SCREEN_SCALE_FACTOR QT_ENABLE_HIGHDPI_SCALING; do
|
|
profile_set_variable "$var" "$1"
|
|
done
|
|
}
|
|
|
|
set_cursor_size() {
|
|
xfconf-query -c xsettings -p /Gtk/CursorThemeSize -s "$1"
|
|
}
|
|
|
|
set_xfwm_theme() {
|
|
xfconf-query -c xfwm4 -p /general/theme -n -t string -s "$1"
|
|
}
|
|
|
|
# Use the highDPI variant of the XFWM theme
|
|
use_hdpi_theme_variant() {
|
|
# shellcheck disable=SC2015
|
|
[ -n "$1" ] && local -r xfwm_theme="$1" ||
|
|
local -r xfwm_theme=$(xfconf-query -c xfwm4 -p /general/theme)
|
|
|
|
for variant in xhdpi hdpi; do
|
|
# If this variant of the theme is already enabled then break out of the loop
|
|
[ "${xfwm_theme##*-}" = "$variant" ] && break
|
|
|
|
# Store the name for this variant of the theme in highDPI_theme variable
|
|
local highDPI_theme=$xfwm_theme-$variant
|
|
|
|
if theme_exists "$highDPI_theme"; then
|
|
set_xfwm_theme "$highDPI_theme"
|
|
[ -z "$1" ] &&
|
|
notify-send "XFWM theme changed to $highDPI_theme" "Changed to the highDPI variant of your chosen theme because you've enabled highDPI on your system"
|
|
break
|
|
fi
|
|
done
|
|
if ! theme_exists "$highDPI_theme"; then
|
|
[ -n "$1" ] && theme_exists "$1" && set_xfwm_theme "$1"
|
|
fi
|
|
}
|
|
|
|
# Use the normal variant of the XFWM theme
|
|
use_normal_theme_variant() {
|
|
local -r current_xfwm_theme=$(xfconf-query -c xfwm4 -p /general/theme)
|
|
|
|
for variant in xhdpi hdpi; do
|
|
# Continue looping if this (highDPI) variant of the theme is not enabled
|
|
[ "${current_xfwm_theme##*-}" != "$variant" ] && continue
|
|
|
|
# Store the name for the normal variant of this theme in normal_theme variable
|
|
local normal_theme=${current_xfwm_theme%-"$variant"}
|
|
|
|
if theme_exists "$normal_theme"; then
|
|
set_xfwm_theme "$normal_theme"
|
|
notify-send "XFWM theme changed to $normal_theme" "Changed to the normal variant of your chosen theme because you've disabled highDPI on your system"
|
|
break
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Change XFWM theme, QT apps scaling, and mouse cursor size according to
|
|
# the user's current window scaling (highDPI setting)
|
|
hdpi_theme_fix() {
|
|
local -r current_window_scaling=$(xfconf-query -c xsettings -p /Gdk/WindowScalingFactor)
|
|
local -r current_cursor_size=$(xfconf-query -c xsettings -p /Gtk/CursorThemeSize)
|
|
|
|
unset logout_required
|
|
|
|
if [ "$current_window_scaling" -eq '2' ]; then
|
|
# Increase scaling for QT apps
|
|
set_QT_scaling 2
|
|
# Use the highDPI variant of the XFWM theme
|
|
use_hdpi_theme_variant
|
|
if [ "$current_cursor_size" -eq 25 ]; then
|
|
set_cursor_size '45'
|
|
notify-send 'Mouse cursor size increased to 45' "Changed to a larger mouse cursor because you've enabled highDPI on your system"
|
|
fi
|
|
else
|
|
# Decrease scaling for QT apps
|
|
set_QT_scaling 1
|
|
# Use the normal variant of the XFWM theme
|
|
use_normal_theme_variant
|
|
if [ "$current_cursor_size" -eq 45 ]; then
|
|
set_cursor_size '25'
|
|
notify-send 'Mouse cursor size decreased to 25' "Changed to a smaller mouse cursor because you've disabled highDPI on your system"
|
|
fi
|
|
fi
|
|
|
|
# Show popup menu about logout if it's required
|
|
[ "$logout_required" = 'true' ] &&
|
|
yad --image "dialog-question" --title "Alert" --buttons-layout=center --text-align=center --button=yad-yes:0 --button=yad-no:1 --text 'Logout is required in order to apply your DPI preferences to QT apps.\nWould you like to logout now?' &&
|
|
xfce4-session-logout --logout
|
|
}
|
|
|
|
sync_theme() {
|
|
# Get the current system theme
|
|
local -r current_theme=$(xfconf-query -c xsettings -p /Net/ThemeName)
|
|
# Get the current window scaling factor (highDPI setting)
|
|
local -r current_window_scaling=$(xfconf-query -c xsettings -p /Gdk/WindowScalingFactor)
|
|
|
|
# Apply the current theme with gsettings
|
|
gsettings set org.gnome.desktop.interface gtk-theme "$current_theme"
|
|
|
|
# Apply the current theme for GTK and Libadwaita apps on flatpak
|
|
flatpak override --user --env=GTK_THEME="$current_theme"
|
|
|
|
# Apply the current theme for XFWM unless it's initial_sync on system reboot
|
|
if [ "$1" != 'initial_sync' ]; then
|
|
# Use the highDPI variant of the XFWM theme if the current_window_scaling factor is 2
|
|
if [ "$current_window_scaling" -eq '2' ]; then
|
|
use_hdpi_theme_variant "$current_theme"
|
|
else
|
|
set_xfwm_theme "$current_theme"
|
|
fi
|
|
fi
|
|
|
|
# Cleanup flatpak_themes_dir and remove ~/.config/gtk-4.0
|
|
rm -rf "${flatpak_themes_dir:?}"/{*,.*} "$config_dir/gtk-4.0"
|
|
|
|
# Find the directory where the current theme is stored
|
|
local -r current_theme_dir=$(xdg_directory_lookup "themes/$current_theme")
|
|
|
|
if [ -d "$current_theme_dir" ]; then
|
|
# Copy/sync current_theme_dir to flatpak_themes_dir
|
|
rsync -av --delete --progress "$current_theme_dir" "$flatpak_themes_dir"
|
|
# Create symlink for gtk-4.0 directory
|
|
ln -s "$current_theme_dir/gtk-4.0" "$config_dir"
|
|
fi
|
|
}
|
|
|
|
sync_font() {
|
|
# Get the current system font
|
|
local -r current_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 "$current_font"
|
|
}
|
|
|
|
# Initial synchronization
|
|
sync_theme 'initial_sync'
|
|
sync_font
|
|
|
|
# Monitor when the user changes their system theme/icons/font in XFCE and sync them as needed
|
|
while read -r line; do
|
|
case "$line" in
|
|
'set: /Net/ThemeName') sync_theme ;;
|
|
'set: /Gdk/WindowScalingFactor') hdpi_theme_fix ;;
|
|
'set: /Gtk/FontName') sync_font ;;
|
|
esac
|
|
done < <(xfconf-query -c xsettings -m)
|