From 74f8b6ef5e79c6574efb93822fe249f7bc7b5f69 Mon Sep 17 00:00:00 2001 From: crowetic Date: Tue, 15 Jul 2025 16:48:51 -0700 Subject: [PATCH] testing create-icon-theme universal --- create-icon-theme-uni.sh | 144 ++++++++++++++++++++++++++++++++ create-icon-theme.sh | 174 +++++++++++++++++++++------------------ 2 files changed, 237 insertions(+), 81 deletions(-) create mode 100644 create-icon-theme-uni.sh diff --git a/create-icon-theme-uni.sh b/create-icon-theme-uni.sh new file mode 100644 index 0000000..4c37e53 --- /dev/null +++ b/create-icon-theme-uni.sh @@ -0,0 +1,144 @@ +#!/bin/bash + +set -euo pipefail + +for cmd in rsync curl unzip convert; do + if ! command -v "$cmd" >/dev/null; then + echo "[!] Required command '$cmd' is not installed. Please install it and re-run." + exit 1 + fi +done + +ICON_SOURCE_DIR="${HOME}/Pictures/icons/icons_theme" +ICON_THEME_NAME="Yaru-blue-qortal" +ICON_CACHE_DIR="${HOME}/.icons/${ICON_THEME_NAME}" +TARGET_THEME_DIR="${ICON_CACHE_DIR}/48x48/apps" + +# Download icons if missing +if [ ! -d "${ICON_SOURCE_DIR}" ]; then + echo "🔽 Downloading Qortal icon set..." + mkdir -p "${HOME}/iconTemp" + trap 'rm -rf "${HOME}/iconTemp"' EXIT + cd "${HOME}/iconTemp" + curl -L -o icons.zip https://cloud.qortal.org/s/machinePicturesFolder/download + unzip icons.zip + mv Pictures/* "${HOME}/Pictures/" + cd +fi + +# Define icon mappings +declare -A ICON_MAP=( + ["qortal-menu-button.png"]="qortal-menu-button" + ["qortal-menu-button-2.png"]="qortal-menu-button-2" + ["qortal-menu-button-3.png"]="qortal-menu-button-3" + ["qortal-menu-button-4.png"]="qortal-menu-button-4" + ["qortal-ui.png"]="qortal-ui" + ["qortal-hub.png"]="qortal-hub" + ["qortal.png"]="qortal" +) + +# Step 1: Choose base theme +BASE_THEME_DIR="" +if [ -d "/usr/share/icons/Yaru-dark" ]; then + BASE_THEME_DIR="/usr/share/icons/Yaru-dark" + echo "[*] Using Yaru-dark as base." +else + CURRENT_THEME=$(gsettings get org.gnome.desktop.interface icon-theme 2>/dev/null | tr -d "'") + if [ -n "$CURRENT_THEME" ] && [ -d "/usr/share/icons/$CURRENT_THEME" ]; then + BASE_THEME_DIR="/usr/share/icons/$CURRENT_THEME" + echo "[*] Falling back to current icon theme: $CURRENT_THEME" + else + echo "[!] Could not find Yaru-dark or current theme. Creating minimal fallback..." + mkdir -p "${ICON_CACHE_DIR}/48x48/apps" + cat < "${ICON_CACHE_DIR}/index.theme" +[Icon Theme] +Name=${ICON_THEME_NAME} +Inherits=hicolor +Directories=48x48/apps + +[48x48/apps] +Size=48 +Context=Applications +Type=Fixed +EOF + fi +fi + +# Step 2: Copy base theme if found +if [ -n "$BASE_THEME_DIR" ] && [ ! -d "${ICON_CACHE_DIR}" ]; then + echo "[*] Copying base theme from: $BASE_THEME_DIR" + mkdir -p "${ICON_CACHE_DIR}" + rsync -a "$BASE_THEME_DIR/" "${ICON_CACHE_DIR}/" + + if [ -f "/usr/share/icons/Yaru-blue-dark/index.theme" ]; then + cp /usr/share/icons/Yaru-blue-dark/index.theme "${ICON_CACHE_DIR}/index.theme" + fi + + sed -i 's/^Name=.*/Name=Yaru-blue-qortal/' "${ICON_CACHE_DIR}/index.theme" + sed -i 's/^Inherits=.*/Inherits=Yaru-blue-dark,Yaru-dark,Yaru,hicolor/' "${ICON_CACHE_DIR}/index.theme" + + if ! grep -q "48x48/apps" "${ICON_CACHE_DIR}/index.theme"; then + echo "Directories=48x48/apps" >> "${ICON_CACHE_DIR}/index.theme" + echo " +[48x48/apps] +Size=48 +Context=Applications +Type=Fixed" >> "${ICON_CACHE_DIR}/index.theme" + fi +fi + +# Step 3: Install icons +mkdir -p "${TARGET_THEME_DIR}" + +install_icon() { + local src="$1" + local name="$2" + local dest="${TARGET_THEME_DIR}/${name}.png" + + if [ ! -f "$src" ]; then + echo "[!] Missing source icon: $src" + return + fi + + echo "[*] Installing icon: $name" + convert "$src" -resize 48x48 "$dest" +} + +for src in "${!ICON_MAP[@]}"; do + install_icon "${ICON_SOURCE_DIR}/${src}" "${ICON_MAP[$src]}" +done + +# Step 4: Update icon cache +if [ -f "${ICON_CACHE_DIR}/index.theme" ]; then + gtk-update-icon-cache -f "${ICON_CACHE_DIR}" || echo "[!] gtk-update-icon-cache failed or not found." +fi + +# Step 5: Set icon theme if DE supports it +CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP,,}" +echo "[*] Attempting to set theme on $CURRENT_DESKTOP..." + +if command -v gsettings >/dev/null; then + case "$CURRENT_DESKTOP" in + cinnamon) + gsettings set org.cinnamon.desktop.interface icon-theme "${ICON_THEME_NAME}" + ;; + gnome) + gsettings set org.gnome.desktop.interface icon-theme "${ICON_THEME_NAME}" + ;; + xfce|xfce4) + xfconf-query -c xsettings -p /Net/IconThemeName -s "${ICON_THEME_NAME}" 2>/dev/null + ;; + kde|plasma) + kwriteconfig5 --file kdeglobals --group Icons --key Theme "${ICON_THEME_NAME}" + ;; + *) + echo "[!] Unsupported or unknown DE: '$CURRENT_DESKTOP'. Set icon theme manually if needed." + ;; + esac +else + echo "[!] gsettings not available. Please set icon theme manually if needed." +fi + +echo "✅ Qortal icons installed into local theme: ${ICON_THEME_NAME}" +echo "ℹ️ You can now use Icon=qortal-ui (etc.) in .desktop files." +echo "💡 If icons don't show up immediately, try logging out and back in." diff --git a/create-icon-theme.sh b/create-icon-theme.sh index 00d70ff..43b5296 100644 --- a/create-icon-theme.sh +++ b/create-icon-theme.sh @@ -1,31 +1,84 @@ #!/bin/bash +set -e + +DEBUG=${DEBUG:-false} + +log() { + echo -e "$1" +} + +debug() { + if [ "$DEBUG" = true ]; then echo -e "[DEBUG] $1"; fi +} + +# Dependencies for cmd in rsync curl unzip convert; do - if ! command -v $cmd >/dev/null; then - echo "[!] Required command '$cmd' is not installed. Please install it and re-run." + if ! command -v $cmd &>/dev/null; then + echo "[!] Required command '$cmd' is not installed." exit 1 fi done -# Customize Yaru-blue-dark icon theme locally and add Qortal icons +# Detect icon install path ICON_THEME_NAME="Yaru-blue-qortal" ICON_SOURCE_DIR="${HOME}/Pictures/icons/icons_theme" -ICON_CACHE_DIR="${HOME}/.icons/${ICON_THEME_NAME}" -TARGET_THEME_DIR="${ICON_CACHE_DIR}/48x48/apps" +if [ -d "$HOME/.local/share/icons" ]; then + USER_ICON_ROOT="$HOME/.local/share/icons" +else + USER_ICON_ROOT="$HOME/.icons" +fi +ICON_CACHE_DIR="${USER_ICON_ROOT}/${ICON_THEME_NAME}" +TARGET_THEME_DIR="${ICON_CACHE_DIR}/48x48/apps" +mkdir -p "${TARGET_THEME_DIR}" + +# Download icons if missing if [ ! -d "${ICON_SOURCE_DIR}" ]; then - echo "downloading icon files..." + log "📥 Downloading Qortal icons..." mkdir -p "${HOME}/iconTemp" trap 'rm -rf "${HOME}/iconTemp"' EXIT cd "${HOME}/iconTemp" curl -L -O https://cloud.qortal.org/s/machinePicturesFolder/download unzip download mv Pictures/* "${HOME}/Pictures/" - rm -rf "${HOME}/iconTemp" cd fi -# Mapping of source icons to icon names +# Copy and modify base icon theme +if [ ! -d "${ICON_CACHE_DIR}" ]; then + log "🎨 Creating theme '${ICON_THEME_NAME}' from Yaru-dark..." + + if [ -d /usr/share/icons/Yaru-dark ]; then + rsync -a /usr/share/icons/Yaru-dark/ "${ICON_CACHE_DIR}/" + else + echo "[!] Yaru-dark not found. Cannot create icon theme." + exit 1 + fi + + # Copy over index.theme + if [ -f /usr/share/icons/Yaru-blue-dark/index.theme ]; then + cp /usr/share/icons/Yaru-blue-dark/index.theme "${ICON_CACHE_DIR}/index.theme" + elif [ ! -f "${ICON_CACHE_DIR}/index.theme" ]; then + cat < "${ICON_CACHE_DIR}/index.theme" +[Icon Theme] +Name=${ICON_THEME_NAME} +Comment=Qortal custom icons with Yaru base +Inherits=Yaru-dark,Yaru,hicolor +Directories=48x48/apps + +[48x48/apps] +Size=48 +Context=Applications +Type=Fixed +EOF + fi + + sed -i "s/^Name=.*/Name=${ICON_THEME_NAME}/" "${ICON_CACHE_DIR}/index.theme" + sed -i "s/^Inherits=.*/Inherits=Yaru-blue-dark,Yaru-dark,Yaru,hicolor/" "${ICON_CACHE_DIR}/index.theme" +fi + +# Map and install icons declare -A ICON_MAP=( ["qortal-menu-button.png"]="qortal-menu-button" ["qortal-menu-button-2.png"]="qortal-menu-button-2" @@ -36,101 +89,60 @@ declare -A ICON_MAP=( ["qortal.png"]="qortal" ) -# Step 1: Copy system Yaru-dark theme as base -if [ ! -d "${ICON_CACHE_DIR}" ]; then - echo "[*] Creating local copy of Yaru-dark theme as '${ICON_THEME_NAME}'..." - mkdir -p "${ICON_CACHE_DIR}" - rsync -a /usr/share/icons/Yaru-dark/ "${ICON_CACHE_DIR}/" - - # Copy index.theme from Yaru-blue-dark if it exists - if [ -f /usr/share/icons/Yaru-blue-dark/index.theme ]; then - cp /usr/share/icons/Yaru-blue-dark/index.theme "${ICON_CACHE_DIR}/index.theme" - fi - - # Update index.theme metadata - sed -i 's/^Name=.*/Name=Yaru-blue-qortal/' "${ICON_CACHE_DIR}/index.theme" - sed -i 's/^Inherits=.*/Inherits=Yaru-blue-dark,Yaru-dark,Yaru,hicolor/' "${ICON_CACHE_DIR}/index.theme" - - # Ensure Directories includes 48x48/apps - if ! grep -q "48x48/apps" "${ICON_CACHE_DIR}/index.theme"; then - echo "Directories=48x48/apps" >> "${ICON_CACHE_DIR}/index.theme" - echo " -[48x48/apps] -Size=48 -Context=Applications -Type=Fixed" >> "${ICON_CACHE_DIR}/index.theme" - fi -fi - -# Step 2: Ensure target icon directory exists -mkdir -p "${TARGET_THEME_DIR}" - -# Step 3: Install icons (resized if possible) install_icon() { local src="$1" local name="$2" local dest="${TARGET_THEME_DIR}/${name}.png" if [ ! -f "$src" ]; then - echo "[!] Source icon not found: $src" + echo "[!] Icon not found: $src" return fi if command -v convert &>/dev/null; then - echo "[*] Resizing and installing $name to ${TARGET_THEME_DIR}" convert "$src" -resize 48x48 "$dest" + debug "Installed and resized $name to $dest" else - echo "[*] Copying $name without resizing to ${TARGET_THEME_DIR}" cp "$src" "$dest" + debug "Copied $name to $dest without resizing" fi } -# Step 4: Loop through and install icons +log "🧩 Installing icons..." for src in "${!ICON_MAP[@]}"; do install_icon "${ICON_SOURCE_DIR}/${src}" "${ICON_MAP[$src]}" done -# Step 5: Update the icon cache -if [ -f "${ICON_CACHE_DIR}/index.theme" ]; then - echo "[*] Updating icon cache for '${ICON_THEME_NAME}'..." - gtk-update-icon-cache -f "${ICON_CACHE_DIR}" || echo "[!] gtk-update-icon-cache failed or not found." -else - echo "[!] No index.theme file found. Cannot update icon cache." +# Update icon cache +if command -v gtk-update-icon-cache &>/dev/null && [ -f "${ICON_CACHE_DIR}/index.theme" ]; then + gtk-update-icon-cache -f "${ICON_CACHE_DIR}" || true fi -# Step 6: Set as active icon theme -if [ -z "$CURRENT_DESKTOP" ]; then - echo "[!] XDG_CURRENT_DESKTOP not set. Unable to auto-detect DE. Set icon theme manually if needed." -else - echo "[*] Setting '${ICON_THEME_NAME}' as the current icon theme..." - CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP,,}" +# Set icon theme based on DE +CURRENT_DE=$(echo "${XDG_CURRENT_DESKTOP:-${DESKTOP_SESSION:-unknown}}" | tr '[:upper:]' '[:lower:]') - if command -v gsettings >/dev/null; then - case "$CURRENT_DESKTOP" in - cinnamon) - gsettings set org.cinnamon.desktop.interface icon-theme "${ICON_THEME_NAME}" - ;; - gnome) - gsettings set org.gnome.desktop.interface icon-theme "${ICON_THEME_NAME}" - ;; - xfce|xfce4) - xfconf-query -c xsettings -p /Net/IconThemeName -s "${ICON_THEME_NAME}" 2>/dev/null - ;; - kde|plasma) - kwriteconfig5 --file kdeglobals --group Icons --key Theme "${ICON_THEME_NAME}" - ;; - *) - echo "[!] Unsupported or unknown DE: '$CURRENT_DESKTOP'. Set icon theme manually if needed." - ;; - esac - else - echo "[!] gsettings not found. Cannot apply icon theme automatically." - fi -fi +log "🖥️ Detected Desktop Environment: $CURRENT_DE" +case "$CURRENT_DE" in + cinnamon) + gsettings set org.cinnamon.desktop.interface icon-theme "${ICON_THEME_NAME}" 2>/dev/null || true + ;; + gnome) + gsettings set org.gnome.desktop.interface icon-theme "${ICON_THEME_NAME}" 2>/dev/null || true + ;; + mate) + gsettings set org.mate.interface icon-theme "${ICON_THEME_NAME}" 2>/dev/null || true + ;; + xfce|xfce4) + xfconf-query -c xsettings -p /Net/IconThemeName -s "${ICON_THEME_NAME}" 2>/dev/null || true + ;; + kde|plasma) + kwriteconfig5 --file kdeglobals --group Icons --key Theme "${ICON_THEME_NAME}" 2>/dev/null || true + ;; + *) + log "[ℹ️] Unknown or unsupported DE. Please set '${ICON_THEME_NAME}' manually in system settings." + ;; +esac -echo "✅ Qortal icons installed into local theme: ${ICON_THEME_NAME}" -echo " You can now use Icon=qortal-ui (etc.) in .desktop files." -echo " Theme is now active with blue-dark base styling." -echo "ℹ️ If icons don't update immediately, try logging out and back in." - +log "✅ Qortal icons installed into theme '${ICON_THEME_NAME}'" +log "ℹ️ If icons don't appear immediately, restart your session or reapply theme."