#!/bin/bash # SPDX-FileCopyrightText: Christian Schendel # SPDX-License-Identifier: 0BSD set -eo pipefail ## NOTE If KDE Plasma is installed, a patched version of qt6ct is required. ## NOTE The benefits are ## NOTE KDE color schemes support,KDE QML applications theming support and ## NOTE KDE's icon engine support ## NOTE See https://aur.archlinux.org/pkgbase/qt6ct-kde/ version='@VERSION@' pkgname='night-theme-switcher' default_config_file="/usr/share/$pkgname/nts.skel" user_name=$(getent passwd "$USER") homedir=$(echo "$user_name" | cut -d: -f6) # allow user to override from cli thus using multiple files as needed XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$homedir/.config}" user_config_file=${user_config_file:-$XDG_CONFIG_HOME/$pkgname/$pkgname.conf} icon_theme_light= icon_theme_dark= kcolorscheme_light= kcolorscheme_dark= gtk_theme_light= gtk_theme_dark= ### Begin insert of Arch script # Avoid any encoding problems export LANG=C # check if messages are to be printed using color unset all_off bold blue green red yellow if [[ -t 2 ]]; then # prefer terminal safe colored and bold text when tput is supported if tput setaf 0 &>/dev/null; then all_off="$(tput sgr0)" bold="$(tput bold)" blue="${bold}$(tput setaf 4)" green="${bold}$(tput setaf 2)" red="${bold}$(tput setaf 1)" yellow="${bold}$(tput setaf 3)" else all_off="\e[1;0m" bold="\e[1;1m" blue="${bold}\e[1;34m" green="${bold}\e[1;32m" red="${bold}\e[1;31m" yellow="${bold}\e[1;33m" fi fi readonly all_off bold blue green red yellow ### End insert of Arch script # dependency checks probably not needed but they do not hurt if ! command -v qt6ct >/dev/null 2>&1; then notify-send \ 'Missing dependency' \ 'Please install qt6ct.' \ -h string:x-canonical-private-synchronous:sys-notify \ -u critical \ -i dialog-error mesg="qt6ct is required to use this script." echo -e "${red}==> ERROR:${all_off}${bold} ${mesg}${all_off}" exit 1 fi if ! command -v gsettings >/dev/null 2>&1; then notify-send \ 'Missing dependency' \ 'gsettings not found.\nPlease install glib2.' \ -h string:x-canonical-private-synchronous:sys-notify \ -u critical \ -i dialog-error mesg="glib2 is required to use this script." echo -e "${red}==> ERROR:${all_off}${bold} ${mesg}${all_off}" exit 1 fi check_config() { if [[ ! -f $default_config_file ]]; then local mesg="$default_config_file is missing. Reinstall this package to continue." echo -e "${red}==> ERROR:${all_off}${bold} ${mesg}${all_off}" # exit 1 fi if [[ ! -f "$user_config_file" ]]; then echo -e "${bold}------------------------------------------------------------${all_off}" echo -e "${bold} No config file found so creating a fresh one in:${all_off}" echo -e "${bold}${blue} $XDG_CONFIG_HOME/$pkgname.conf${all_off}" echo echo -e "${bold} Edit this file before invoking $pkgname again.${all_off}" echo -e "${bold}------------------------------------------------------------${all_off}" #install -Dm644 $default_config_file "$user_config_file" exit 0 else # shellcheck source=nts.skel . "$user_config_file" # parse config file for correctness if [[ ! -f "$kcolorscheme_light" ]]; then local mesg="Invalid kcolorscheme_light defined in\n ${blue}$user_config_file" echo -e "${red}==> ERROR:${all_off}${bold} ${mesg}${all_off}" exit 1 fi if [[ ! -f "$kcolorscheme_dark" ]]; then local mesg="Invalid kcolorscheme_dark defined in ${blue}$user_config_file" echo -e "${red}==> ERROR:${all_off}${bold} ${mesg}${all_off}" exit 1 fi fi } _set_theme() { ## gtk-theme gsettings set org.gnome.desktop.interface color-scheme "$gtk_color_scheme" gsettings set org.gnome.desktop.interface gtk-theme "$gtk_theme" gsettings set org.gnome.desktop.interface icon-theme "$icon_theme" ## GTK2 if [[ -w "$HOME/.gtkrc-2.0" ]]; then sed -i "s/gtk-theme-name=.*/gtk-theme-name=$gtk_theme/g" \ "$HOME/.gtkrc-2.0" sed -i "s/gtk-icon-theme-name=.*/gtk-icon-theme-name=$icon_theme/g" \ "$HOME/.gtkrc-2.0" fi ## GTK3 if [[ -w "$HOME/.config/gtk-3.0/settings.ini" ]]; then sed -i "s/gtk-application-prefer-dark-theme=.*/gtk-application-prefer-dark-theme=$gtk_prefer_dark_theme/g" \ "$HOME/.config/gtk-3.0/settings.ini" sed -i "s/gtk-theme-name=.*/gtk-theme-name=$gtk_theme/g" \ "$HOME/.config/gtk-3.0/settings.ini" sed -i "s/gtk-icon-theme-name=.*/gtk-icon-theme-name=$icon_theme/g" \ "$HOME/.config/gtk-3.0/settings.ini" fi ## GTK4 if [[ -w "$HOME/.config/gtk-4.0/settings.ini" ]]; then sed -i "s/gtk-application-prefer-dark-theme=.*/gtk-application-prefer-dark-theme=$gtk_prefer_dark_theme/g" \ "$HOME/.config/gtk-4.0/settings.ini" sed -i "s/gtk-icon-theme-name=.*/gtk-icon-theme-name=$icon_theme/g" \ "$HOME/.config/gtk-4.0/settings.ini" sed -i "s/gtk-theme-name=.*/gtk-theme-name=$gtk_theme/g" \ "$HOME/.config/gtk-4.0/settings.ini" fi ## QT if [[ -w "$HOME/.config/qt5ct/qt5ct.conf" ]]; then sed -i "s/icon_theme=.*/icon_theme=$icon_theme/g" \ "$HOME/.config/qt5ct/qt5ct.conf" sed -i "s,custom_palette=.*,custom_palette=$qt_color_scheme_path,g" \ "$HOME/.config/qt5ct/qt5ct.conf" fi if [[ -w "$HOME/.config/qt6ct/qt6ct.conf" ]]; then sed -i "s/icon_theme=.*/icon_theme=$icon_theme/g" \ "$HOME/.config/qt6ct/qt6ct.conf" sed -i "s/custom_palette=.*/custom_palette=$qt_custom_palette/g" \ "$HOME/.config/qt6ct/qt6ct.conf" sed -i "s,color_scheme_path=.*,color_scheme_path=$qt_color_scheme_path,g" \ "$HOME/.config/qt6ct/qt6ct.conf" fi ## workaround if plasma-workspace is installed if [ -x "$(command -v /usr/lib/plasma-changeicon)" ]; then /usr/lib/plasma-changeicons "$icon_theme" fi } switch-dark-light() { gtk_color_scheme=$(gsettings get org.gnome.desktop.interface color-scheme) if [[ ! $gtk_color_scheme == ''\''prefer-dark'\''' ]]; then gtk_color_scheme=prefer-dark gtk_prefer_dark_theme=true gtk_theme=adw-gtk3-dark icon_theme=Papirus-Dark qt_custom_palette=true qt_color_scheme_path=/usr/share/color-schemes/BreezeDark.colors _set_theme else gtk_color_scheme=default gtk_prefer_dark_theme=false gtk_theme=adw-gtk3 icon_theme=Papirus qt_custom_palette=true qt_color_scheme_path=/usr/share/color-schemes/BreezeLight.colors _set_theme fi } restore-theme-on-login() { find "$HOME/.config//gtk-3.0/" ! -name 'bookmarks' -type f -exec rm -f {} + find "$HOME/.config//gtk-4.0/" ! -name 'bookmarks' -type f -exec rm -f {} + gtk_color_scheme=$(gsettings get org.gnome.desktop.interface color-scheme) if [[ ! $gtk_color_scheme == ''\''prefer-dark'\''' ]]; then gtk_color_scheme=default gtk_prefer_dark_theme=false gtk_theme=adw-gtk3 icon_theme=Papirus qt_custom_palette=true qt_color_scheme_path=/usr/share/color-schemes/BreezeLight.colors _set_theme else gtk_color_scheme=prefer-dark gtk_prefer_dark_theme=true gtk_theme=adw-gtk3-dark icon_theme=Papirus-Dark qt_custom_palette=true qt_color_scheme_path=/usr/share/color-schemes/BreezeDark.colors _set_theme fi } preview() { echo -e "${bold}$pkgname v$version${all_off}" echo echo -e "${bold} KColorScheme" if [[ -f "$kcolorscheme_light" ]]; then echo -en "${bold} Light:" echo -e "$(tput cr)$(tput cuf 10)${blue}$kcolorscheme_light${all_off}${bold}${all_off}" fi if [[ -f "$kcolorscheme_dark" ]]; then echo -en "${bold} Dark:" echo -e "$(tput cr)$(tput cuf 10)${blue}$kcolorscheme_dark${all_off}${bold}${all_off}" fi echo echo -e "${bold} Icon Theme" if [[ -d "/usr/share/icons/$icon_theme_light" ]]; then echo -en "${bold} Light:" echo -e "$(tput cr)$(tput cuf 10)${blue}$icon_theme_light${all_off}${bold}${all_off}" fi if [[ -d "/usr/share/icons/$icon_theme_dark" ]]; then echo -en "${bold} Dark:" echo -e "$(tput cr)$(tput cuf 10)${blue}$icon_theme_dark${all_off}${bold}${all_off}" fi echo echo -e "${bold} GTK Theme" if [[ -d "/usr/share/themes/$gtk_theme_light" ]]; then echo -en "${bold} Light:" echo -e "$(tput cr)$(tput cuf 10)${blue}$gtk_theme_light${all_off}${bold}${all_off}" fi if [[ -d "/usr/share/themes/$gtk_theme_dark" ]]; then echo -en "${bold} Dark:" echo -e "$(tput cr)$(tput cuf 10)${blue}$gtk_theme_dark${all_off}${bold}${all_off}" fi } case "$1" in s) check_config && switch-dark-light ;; r) check_config && restore-theme-on-login ;; p) check_config && preview ;; *) echo -e "${bold}$pkgname v$version${all_off}" echo echo -e "${bold} Usage: ${red}$0${all_off}${bold} ${all_off}${blue}[option]${all_off}" echo echo -e "${bold} s) swith between dark and light theme${all_off}" echo -e "${bold} r) restore theme (usefull only once after login)${all_off}" echo -e "${bold} p) Preview settings${all_off}" ;; esac # vim: set ts=4 sw=4 et: