diff --git a/core/tabs/applications-setup/browsers/brave.sh b/core/tabs/applications-setup/browsers/brave.sh index bb8fa6cbd..00b398c9c 100644 --- a/core/tabs/applications-setup/browsers/brave.sh +++ b/core/tabs/applications-setup/browsers/brave.sh @@ -5,7 +5,40 @@ installBrave() { if ! command_exists com.brave.Browser && ! command_exists brave; then printf "%b\n" "${YELLOW}Installing Brave...${RC}" - curl -fsS https://dl.brave.com/install.sh | sh + case "$PACKAGER" in + apt-get|nala) + if [ "$DTYPE" = "ubuntu" ] && command_exists snap; then + "$ESCALATION_TOOL" snap install brave + else + "$ESCALATION_TOOL" curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg + "$ESCALATION_TOOL" curl -fsSLo /etc/apt/sources.list.d/brave-browser-release.sources https://brave-browser-apt-release.s3.brave.com/brave-browser.sources + "$ESCALATION_TOOL" "$PACKAGER" update + "$ESCALATION_TOOL" "$PACKAGER" install -y brave-browser + fi + ;; + dnf) + "$ESCALATION_TOOL" "$PACKAGER" install -y dnf-plugins-core + if command_exists dnf5; then + "$ESCALATION_TOOL" dnf5 config-manager addrepo --from-repofile=https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo + else + "$ESCALATION_TOOL" "$PACKAGER" config-manager --add-repo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo + fi + "$ESCALATION_TOOL" "$PACKAGER" install -y brave-browser + ;; + zypper) + "$ESCALATION_TOOL" "$PACKAGER" addrepo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo + "$ESCALATION_TOOL" "$PACKAGER" --gpg-auto-import-keys refresh + "$ESCALATION_TOOL" "$PACKAGER" install -y brave-browser + ;; + pacman) + "$AUR_HELPER" -S --needed --noconfirm brave-bin + ;; + *) + checkFlatpak + "$ESCALATION_TOOL" flatpak install --noninteractive flathub com.brave.Browser 2>/dev/null || \ + curl -fsS https://dl.brave.com/install.sh | sh + ;; + esac else printf "%b\n" "${GREEN}Brave Browser is already installed.${RC}" fi diff --git a/core/tabs/applications-setup/browsers/chromium.sh b/core/tabs/applications-setup/browsers/chromium.sh index 29ca96be5..2ee9425a7 100644 --- a/core/tabs/applications-setup/browsers/chromium.sh +++ b/core/tabs/applications-setup/browsers/chromium.sh @@ -15,7 +15,14 @@ if ! command_exists chromium; then xbps-install) "$ESCALATION_TOOL" "$PACKAGER" -Sy chromium ;; - apt-get|nala|zypper|dnf|eopkg) + apt-get|nala) + if [ "$DTYPE" = "ubuntu" ] && command_exists snap; then + "$ESCALATION_TOOL" snap install chromium + else + "$ESCALATION_TOOL" "$PACKAGER" install -y chromium + fi + ;; + zypper|dnf|eopkg) "$ESCALATION_TOOL" "$PACKAGER" install -y chromium ;; *) diff --git a/core/tabs/applications-setup/browsers/firefox.sh b/core/tabs/applications-setup/browsers/firefox.sh index f984963f4..5e78ea358 100644 --- a/core/tabs/applications-setup/browsers/firefox.sh +++ b/core/tabs/applications-setup/browsers/firefox.sh @@ -2,12 +2,43 @@ . ../../common-script.sh +setupMozillaRepo() { + "$ESCALATION_TOOL" install -d -m 0755 /etc/apt/keyrings + curl -fsSL https://packages.mozilla.org/apt/repo-signing-key.gpg -o /tmp/mozilla-key.gpg + "$ESCALATION_TOOL" gpg --batch --yes --dearmor -o /etc/apt/keyrings/packages.mozilla.org.gpg /tmp/mozilla-key.gpg 2>/dev/null || { + "$ESCALATION_TOOL" cp /tmp/mozilla-key.gpg /etc/apt/keyrings/packages.mozilla.org.asc + } + rm -f /tmp/mozilla-key.gpg + + "$ESCALATION_TOOL" tee /etc/apt/sources.list.d/mozilla.sources > /dev/null << 'EOF' +Types: deb +URIs: https://packages.mozilla.org/apt +Suites: mozilla +Components: main +Signed-By: /etc/apt/keyrings/packages.mozilla.org.gpg +EOF + + "$ESCALATION_TOOL" tee /etc/apt/preferences.d/mozilla > /dev/null << 'EOF' +Package: * +Pin: origin packages.mozilla.org +Pin-Priority: 1000 +EOF +} + installFirefox() { if ! command_exists firefox; then printf "%b\n" "${YELLOW}Installing Mozilla Firefox...${RC}" case "$PACKAGER" in apt-get|nala) - if [ "$DTYPE" != "ubuntu" ]; then + if [ "$DTYPE" = "ubuntu" ]; then + if command_exists snap && snap list firefox 2>/dev/null | grep -q firefox; then + printf "%b\n" "${YELLOW}Removing Snap Firefox...${RC}" + "$ESCALATION_TOOL" snap remove firefox + fi + setupMozillaRepo + "$ESCALATION_TOOL" "$PACKAGER" update + "$ESCALATION_TOOL" "$PACKAGER" install -y firefox + else "$ESCALATION_TOOL" "$PACKAGER" install -y firefox-esr fi ;; diff --git a/core/tabs/applications-setup/browsers/google-chrome.sh b/core/tabs/applications-setup/browsers/google-chrome.sh index 0a69ae2c4..ccd5569d5 100644 --- a/core/tabs/applications-setup/browsers/google-chrome.sh +++ b/core/tabs/applications-setup/browsers/google-chrome.sh @@ -7,9 +7,10 @@ installChrome() { printf "%b\n" "${YELLOW}Installing Google Chrome...${RC}" case "$PACKAGER" in apt-get|nala) - curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb - "$ESCALATION_TOOL" "$PACKAGER" install -y ./google-chrome-stable_current_amd64.deb - "$ESCALATION_TOOL" rm ./google-chrome-stable_current_amd64.deb + "$ESCALATION_TOOL" "$PACKAGER" install -y wget ca-certificates + wget -O /tmp/google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + "$ESCALATION_TOOL" "$PACKAGER" install -y /tmp/google-chrome.deb + rm -f /tmp/google-chrome.deb ;; zypper) "$ESCALATION_TOOL" "$PACKAGER" addrepo http://dl.google.com/linux/chrome/rpm/stable/x86_64 Google-Chrome @@ -39,13 +40,13 @@ uninstallChrome() { printf "%b\n" "${YELLOW}Uninstalling Google Chrome...${RC}" case "$PACKAGER" in apt-get|nala) - "$ESCALATION_TOOL" "$PACKAGER" purge --autoremove -y google-chrome + "$ESCALATION_TOOL" "$PACKAGER" purge --autoremove -y google-chrome-stable ;; zypper) "$ESCALATION_TOOL" "$PACKAGER" --non-interactive uninstall google-chrome-stable ;; pacman) - "$AUR_HELPER" -Rns --needed --noconfirm google-chrome + "$AUR_HELPER" -Rns --noconfirm google-chrome ;; dnf) "$ESCALATION_TOOL" "$PACKAGER" remove -y google-chrome-stable @@ -55,38 +56,29 @@ uninstallChrome() { ;; esac else - printf "%b\n" "${GREEN}Google Chrome Browser is already installed.${RC}" + printf "%b\n" "${GREEN}Google Chrome Browser is not installed.${RC}" fi } removeLocalAI() { - # Set Chrome AI path CHROME_USER_DIR="$HOME/.config/google-chrome" - - # Path where Chrome AI model is stored AI_MODEL_DIR="$CHROME_USER_DIR/AI" - # Remove AI model if it exists if [ -d "$AI_MODEL_DIR" ]; then - echo "Removing existing Chrome AI model..." + printf "%b\n" "${YELLOW}Removing existing Chrome AI model...${RC}" rm -rf "$AI_MODEL_DIR" - echo "Removed AI model." + printf "%b\n" "${GREEN}AI model removed.${RC}" else - echo "No AI model found at $AI_MODEL_DIR" + printf "%b\n" "${GREEN}No AI model found.${RC}" fi - # Prevent re-download - # Create an empty directory and make it read-only - echo "Creating read-only placeholder to block AI download..." mkdir -p "$AI_MODEL_DIR" chmod 000 "$AI_MODEL_DIR" - - echo "Chrome AI model removed and blocked from redownloading." + printf "%b\n" "${YELLOW}AI download blocked (read-only placeholder created).${RC}" } - main() { - printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Chrome${RC}" + printf "%b\n" "${YELLOW}Do you want to Install or Uninstall Chrome${RC}" printf "%b\n" "1. ${YELLOW}Install Chrome${RC}" printf "%b\n" "2. ${YELLOW}Uninstall Chrome${RC}" printf "%b\n" "3. ${YELLOW}Remove Local AI (Prevents Chrome From Reinstalling)${RC}" diff --git a/core/tabs/applications-setup/browsers/lynx.sh b/core/tabs/applications-setup/browsers/lynx.sh index ab7ed3f0d..4b06575bd 100644 --- a/core/tabs/applications-setup/browsers/lynx.sh +++ b/core/tabs/applications-setup/browsers/lynx.sh @@ -18,10 +18,10 @@ installLynx() { apt-get|nala|zypper|dnf|eopkg) "$ESCALATION_TOOL" "$PACKAGER" install -y lynx ;; - *) - printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}" - exit 1 - ;; + *) + printf "%b\n" "${RED}Unsupported package manager: ""$PACKAGER""${RC}" + exit 1 + ;; esac else printf "%b\n" "${GREEN}Lynx TUI Browser is already installed.${RC}" diff --git a/core/tabs/applications-setup/browsers/thorium.sh b/core/tabs/applications-setup/browsers/thorium.sh index 656530db2..42c0fa06a 100644 --- a/core/tabs/applications-setup/browsers/thorium.sh +++ b/core/tabs/applications-setup/browsers/thorium.sh @@ -2,13 +2,13 @@ . ../../common-script.sh -installThrorium() { +installThorium() { if ! command_exists thorium-browser; then printf "%b\n" "${YELLOW}Installing Thorium Browser...${RC}" case "$PACKAGER" in apt-get|nala) "$ESCALATION_TOOL" rm -fv /etc/apt/sources.list.d/thorium.list - "$ESCALATION_TOOL" curl http://dl.thorium.rocks/debian/dists/stable/thorium.list -o /etc/apt/sources.list.d/thorium.list + "$ESCALATION_TOOL" wget --no-hsts -P /etc/apt/sources.list.d/ http://dl.thorium.rocks/debian/dists/stable/thorium.list "$ESCALATION_TOOL" "$PACKAGER" update "$ESCALATION_TOOL" "$PACKAGER" install -y thorium-browser ;; @@ -53,4 +53,4 @@ installThrorium() { } checkEnv -installThrorium +installThorium diff --git a/core/tabs/applications-setup/browsers/vivaldi.sh b/core/tabs/applications-setup/browsers/vivaldi.sh index b63dd27e7..d3de6e596 100644 --- a/core/tabs/applications-setup/browsers/vivaldi.sh +++ b/core/tabs/applications-setup/browsers/vivaldi.sh @@ -7,12 +7,16 @@ installVivaldi() { printf "%b\n" "${YELLOW}Installing Vivaldi...${RC}" case "$PACKAGER" in apt-get|nala) + if [ "$DTYPE" = "ubuntu" ] && command_exists snap; then + "$ESCALATION_TOOL" snap install vivaldi + else "$ESCALATION_TOOL" "$PACKAGER" install -y curl "$ESCALATION_TOOL" curl -fsSL https://repo.vivaldi.com/archive/linux_signing_key.pub | gpg --dearmor | sudo dd of=/usr/share/keyrings/vivaldi-browser.gpg "$ESCALATION_TOOL" echo "deb [signed-by=/usr/share/keyrings/vivaldi-browser.gpg arch=$(dpkg --print-architecture)] https://repo.vivaldi.com/archive/deb/ stable main" | sudo dd of=/etc/apt/sources.list.d/vivaldi-archive.list "$ESCALATION_TOOL" "$PACKAGER" update "$ESCALATION_TOOL" "$PACKAGER" install -y vivaldi-stable - ;; + fi + ;; dnf) "$ESCALATION_TOOL" "$PACKAGER" install -y dnf-plugins-core dnf_version=$(dnf --version | head -n 1 | cut -d '.' -f 1) diff --git a/core/tabs/applications-setup/browsers/waterfox.sh b/core/tabs/applications-setup/browsers/waterfox.sh index ff13d91a7..93eb70f85 100644 --- a/core/tabs/applications-setup/browsers/waterfox.sh +++ b/core/tabs/applications-setup/browsers/waterfox.sh @@ -6,6 +6,10 @@ installWaterfox() { if ! command_exists net.waterfox.waterfox && ! command_exists waterfox; then printf "%b\n" "${YELLOW}Installing waterfox...${RC}" case "$PACKAGER" in + apt-get|nala) + checkFlatpak + "$ESCALATION_TOOL" flatpak install --noninteractive flathub net.waterfox.waterfox + ;; pacman) "$AUR_HELPER" -S --needed --noconfirm waterfox-bin ;; diff --git a/core/tabs/applications-setup/browsers/zen-browser.sh b/core/tabs/applications-setup/browsers/zen-browser.sh index 714a0b2a7..0e74a6c8e 100755 --- a/core/tabs/applications-setup/browsers/zen-browser.sh +++ b/core/tabs/applications-setup/browsers/zen-browser.sh @@ -6,13 +6,21 @@ installZenBrowser() { if ! command_exists io.github.zen_browser.zen && ! command_exists zen-browser; then printf "%b\n" "${YELLOW}Installing Zen Browser...${RC}" case "$PACKAGER" in - pacman) - "$AUR_HELPER" -S --needed --noconfirm zen-browser-bin - ;; - *) - checkFlatpak - "$ESCALATION_TOOL" flatpak install --noninteractive flathub io.github.zen_browser.zen - ;; + apt-get|nala) + if [ "$DTYPE" = "ubuntu" ] && command_exists snap; then + "$ESCALATION_TOOL" snap install zen-browser-snap --candidate + else + checkFlatpak + "$ESCALATION_TOOL" flatpak install --noninteractive flathub io.github.zen_browser.zen + fi + ;; + pacman) + "$AUR_HELPER" -S --needed --noconfirm zen-browser-bin + ;; + *) + checkFlatpak + "$ESCALATION_TOOL" flatpak install --noninteractive flathub io.github.zen_browser.zen + ;; esac else printf "%b\n" "${GREEN}Zen Browser is already installed.${RC}" diff --git a/core/tabs/common-script.sh b/core/tabs/common-script.sh index 5bba966da..da49f8472 100644 --- a/core/tabs/common-script.sh +++ b/core/tabs/common-script.sh @@ -179,6 +179,15 @@ checkCurrentDirectoryWritable() { fi } +checkSnap() { + if ! command_exists snap; then + printf "%b\n" "${YELLOW}Snap is not available on this system.${RC}" + return 1 + fi + printf "%b\n" "${CYAN}Snap is available${RC}" + return 0 +} + checkDistro() { DTYPE="unknown" # Default to unknown # Use /etc/os-release for modern distro identification diff --git a/core/tabs/system-setup/arch/pacman-config.sh b/core/tabs/system-setup/arch/pacman-config.sh new file mode 100644 index 000000000..81a2c3098 --- /dev/null +++ b/core/tabs/system-setup/arch/pacman-config.sh @@ -0,0 +1,41 @@ +#!/bin/sh -e + +. ../../common-script.sh + +configurePacman() { + conf="/etc/pacman.conf" + + if [ ! -f "$conf" ]; then + printf "%b\n" "${RED}${conf} not found.${RC}" + exit 1 + fi + + "$ESCALATION_TOOL" sed -i 's/^#Color/Color/' "$conf" + "$ESCALATION_TOOL" sed -i '/^Color/a ILoveCandy' "$conf" + "$ESCALATION_TOOL" sed -i 's/^#VerbosePkgLists/VerbosePkgLists/' "$conf" + "$ESCALATION_TOOL" sed -i 's/^#ParallelDownloads/ParallelDownloads/' "$conf" + if ! grep -q "^ParallelDownloads" "$conf"; then + printf "%b\n" "${YELLOW}Adding ParallelDownloads...${RC}" + "$ESCALATION_TOOL" sed -i '/^#ParallelDownloads/a ParallelDownloads = 5' "$conf" + fi + "$ESCALATION_TOOL" sed -i "/\[multilib\]/,/Include/"'s/^#//' "$conf" + + printf "%b\n" "${GREEN}pacman.conf configured: Color, ILoveCandy, VerbosePkgLists, ParallelDownloads=5, multilib enabled.${RC}" +} + +configureMakepkg() { + conf="/etc/makepkg.conf" + + cores=$(nproc) + "$ESCALATION_TOOL" sed -i "s/^#MAKEFLAGS=\"-j[0-9]*\"/MAKEFLAGS=\"-j${cores}\"/" "$conf" + "$ESCALATION_TOOL" sed -i "s/^MAKEFLAGS=\"-j[0-9]*\"/MAKEFLAGS=\"-j${cores}\"/" "$conf" + if ! grep -q "^MAKEFLAGS" "$conf"; then + printf "%b\n" "${YELLOW}Adding MAKEFLAGS...${RC}" + printf "MAKEFLAGS=\"-j%s\"\n" "$cores" | "$ESCALATION_TOOL" tee -a "$conf" > /dev/null + fi + printf "%b\n" "${GREEN}MAKEFLAGS set to -j${cores} in makepkg.conf${RC}" +} + +checkEnv +configurePacman +configureMakepkg diff --git a/core/tabs/system-setup/arch/pipewire-setup.sh b/core/tabs/system-setup/arch/pipewire-setup.sh new file mode 100644 index 000000000..30684e6ed --- /dev/null +++ b/core/tabs/system-setup/arch/pipewire-setup.sh @@ -0,0 +1,17 @@ +#!/bin/sh -e + +. ../../common-script.sh + +installPipewire() { + "$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm pipewire pipewire-pulse pipewire-alsa pipewire-jack wireplumber lib32-pipewire + + if command_exists systemctl; then + systemctl --user enable --now pipewire.service pipewire-pulse.service wireplumber.service 2>/dev/null || true + printf "%b\n" "${GREEN}PipeWire services enabled.${RC}" + fi + + printf "%b\n" "${GREEN}PipeWire with WirePlumber installed. Reboot or relogin to apply.${RC}" +} + +checkEnv +installPipewire diff --git a/core/tabs/system-setup/arch/snapshot-setup.sh b/core/tabs/system-setup/arch/snapshot-setup.sh new file mode 100644 index 000000000..645a5810c --- /dev/null +++ b/core/tabs/system-setup/arch/snapshot-setup.sh @@ -0,0 +1,51 @@ +#!/bin/sh -e + +. ../../common-script.sh + +checkBtrfs() { + if ! command_exists btrfs; then + printf "%b\n" "${RED}btrfs-progs not installed. Install it first.${RC}" + exit 1 + fi + + if ! mount | grep -q "btrfs"; then + printf "%b\n" "${RED}No Btrfs filesystem detected. Snapshots require Btrfs.${RC}" + exit 1 + fi +} + +setupSnapper() { + "$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm snapper snap-pac grub-btrfs + + if [ -f "/etc/snapper/configs/root" ]; then + printf "%s\n" "${RED}Error: Existing Snapper 'root' configuration detected. Aborting.${RC}" >&2 + exit 1 + fi + + if mountpoint -q "/.snapshots"; then + printf "%s\n" "${RED}Error: /.snapshots is actively mounted. Aborting.${RC}" >&2 + exit 1 + fi + + if [ -d "/.snapshots" ]; then + if "$ESCALATION_TOOL" rmdir "/.snapshots" 2>/dev/null; then + printf "%s\n" "${GREEN}Removed empty /.snapshots directory.${RC}" + else + printf "%s\n" "${RED}Error: /.snapshots exists and is not empty or could not be removed. Aborting to avoid data loss.${RC}" >&2 + exit 1 + fi + fi + + "$ESCALATION_TOOL" snapper -c root create-config / + + "$ESCALATION_TOOL" systemctl enable --now snapper-timeline.timer snapper-cleanup.timer 2>/dev/null || true + "$ESCALATION_TOOL" systemctl enable --now grub-btrfsd 2>/dev/null || true + + printf "%b\n" "${GREEN}Snapper configured with hourly snapshots.${RC}" + printf "%b\n" "${GREEN}snap-pac installed (auto snapshots on pacman operations).${RC}" + printf "%b\n" "${GREEN}grub-btrfs installed (boot into snapshots from GRUB menu).${RC}" +} + +checkEnv +checkBtrfs +setupSnapper diff --git a/core/tabs/system-setup/arch/system-maintenance.sh b/core/tabs/system-setup/arch/system-maintenance.sh new file mode 100644 index 000000000..20abea1c4 --- /dev/null +++ b/core/tabs/system-setup/arch/system-maintenance.sh @@ -0,0 +1,34 @@ +#!/bin/sh -e + +. ../../common-script.sh + +setupPaccache() { + if ! command_exists paccache; then + "$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm pacman-contrib + fi + + "$ESCALATION_TOOL" systemctl enable --now paccache.timer 2>/dev/null || true + printf "%b\n" "${GREEN}paccache.timer enabled (weekly cache cleanup).${RC}" +} + +removeOrphans() { + orphans=$(pacman -Qtdq 2>/dev/null || true) + if [ -n "$orphans" ]; then + printf "%b\n" "${YELLOW}Removing orphan packages...${RC}" + printf "%s\n" "$orphans" + printf "%s\n" "$orphans" | "$ESCALATION_TOOL" xargs "$PACKAGER" -Rns --noconfirm 2>/dev/null || true + else + printf "%b\n" "${GREEN}No orphan packages found.${RC}" + fi +} + +cleanJournal() { + "$ESCALATION_TOOL" journalctl --vacuum-time=30d 2>/dev/null || true + printf "%b\n" "${GREEN}System journal trimmed to 30 days.${RC}" +} + +printf "%b\n" "${YELLOW}Arch System Maintenance${RC}" +checkEnv +setupPaccache +removeOrphans +cleanJournal diff --git a/core/tabs/system-setup/arch/zram-setup.sh b/core/tabs/system-setup/arch/zram-setup.sh new file mode 100644 index 000000000..5c0eedd3f --- /dev/null +++ b/core/tabs/system-setup/arch/zram-setup.sh @@ -0,0 +1,30 @@ +#!/bin/sh -e + +. ../../common-script.sh + +setupZram() { + "$ESCALATION_TOOL" "$PACKAGER" -S --needed --noconfirm zram-generator + + conf="/etc/systemd/zram-generator.conf" + "$ESCALATION_TOOL" tee "$conf" > /dev/null << 'EOF' +[zram0] +zram-size = ram / 2 +compression-algorithm = zstd +swap-priority = 100 +EOF + + "$ESCALATION_TOOL" systemctl daemon-reexec + "$ESCALATION_TOOL" systemctl start systemd-zram-setup@zram0 2>/dev/null || true + + sysctl_conf="/etc/sysctl.d/99-vm-zram-parameters.conf" + "$ESCALATION_TOOL" tee "$sysctl_conf" > /dev/null << 'EOF' +vm.swappiness = 10 +vm.vfs_cache_pressure = 50 +EOF + + printf "%b\n" "${GREEN}zram configured: zstd compression, swappiness=10.${RC}" + printf "%b\n" "${YELLOW}Reboot or run: sudo systemctl start systemd-zram-setup@zram0${RC}" +} + +checkEnv +setupZram diff --git a/core/tabs/system-setup/global-theme.sh b/core/tabs/system-setup/global-theme.sh index c8ccf6f79..d5190d292 100755 --- a/core/tabs/system-setup/global-theme.sh +++ b/core/tabs/system-setup/global-theme.sh @@ -2,6 +2,8 @@ . ../common-script.sh +# --- Dark theme functions --- + install_theme_tools() { printf "%b\n" "${YELLOW}Installing Qt theming tools (qt5ct, qt6ct)...${RC}" case "$PACKAGER" in @@ -142,8 +144,6 @@ set_environment_variables() { add_env_var "QT_QPA_PLATFORMTHEME" "qt6ct" add_env_var "GTK_THEME" "Adwaita:dark" - # Also export to profile files so it applies in the current WM session - # without requiring a PAM re-login for profile in "$HOME/.xprofile" "$HOME/.profile"; do if [ -f "$profile" ] || [ "$profile" = "$HOME/.xprofile" ]; then if ! grep -q "GTK_THEME" "$profile" 2>/dev/null; then @@ -161,7 +161,7 @@ applyTheming() { KDE) lookandfeeltool -a org.kde.breezedark.desktop successOutput - exit 0 + return ;; GNOME) gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark" @@ -195,17 +195,409 @@ successOutput() { printf "%b\n" "${YELLOW}NOTE: Qt app theming (qt5ct/qt6ct) requires a re-login to take effect.${RC}" } +applyDarkTheme() { + applyTheming + install_theme_tools + configure_gtk2 + configure_gtk3 + configure_gtk4 + configure_xfce + configure_qt5ct + configure_qt6ct + set_environment_variables + apply_dconf_immediate + restart_thunar + successOutput +} + +# --- Reset theme functions --- + +detectGNOMEVersion() { + GNOME_VER=0 + if command_exists gnome-shell; then + GNOME_VER=$(gnome-shell --version 2>/dev/null | sed 's/[^0-9]*\([0-9]*\)\.\([0-9]*\).*/\1\2/') + fi +} + +detectPlasmaVersion() { + PLASMA_VER=5 + if command_exists plasmashell; then + if plasmashell --version 2>/dev/null | grep -q "6\."; then + PLASMA_VER=6 + fi + fi +} + +detectDE() { + DE="${XDG_CURRENT_DESKTOP:-${XDG_SESSION_DESKTOP:-}}" + case "$DE" in + *GNOME*|*gnome*|*Ubuntu*|*ubuntu*) DE=gnome ;; + *KDE*|*kde*|*Plasma*|*plasma*) DE=kde ;; + *XFCE*|*xfce*|*Xfce*) DE=xfce ;; + *Cinnamon*|*cinnamon*) DE=cinnamon ;; + *MATE*|*mate*) DE=mate ;; + *Budgie*|*budgie*) DE=budgie ;; + *LXDE*|*lxde*) DE=lxde ;; + *LXQt*|*lxqt*) DE=lxqt ;; + *Deepin*|*deepin*) DE=deepin ;; + *Pantheon*|*pantheon*) DE=pantheon ;; + *Sway*|*sway*) DE=sway ;; + *Hyprland*|*hyprland*) DE=hyprland ;; + *i3*|*i3wm*) DE=i3 ;; + *Enlightenment*|*enlightenment*) DE=enlightenment ;; + *Openbox*|*openbox*) DE=openbox ;; + *bspwm*) DE=bspwm ;; + *dwm*) DE=dwm ;; + *qtile*) DE=qtile ;; + *ukui*) DE=ukui ;; + *Lomiri*|*lomiri*) DE=lomiri ;; + *COSMIC*|*cosmic*) DE=cosmic ;; + *) DE=unknown ;; + esac + printf "%b\n" "${CYAN}DE: ${DE} | Distro: ${DTYPE} ${DVER} | GNOME: ${GNOME_VER} | Plasma: ${PLASMA_VER}${RC}" +} + +resetGNOME() { + if ! command_exists gsettings; then return; fi + + GTK_THEME=Adwaita + ICON_THEME=Adwaita + CURSOR_THEME=Adwaita + FONT_NAME="Cantarell 11" + BG_LIGHT="" + BG_DARK="" + + case "$DTYPE" in + ubuntu|ubuntu-core) + if [ "$DVER_MAJOR" -ge 24 ]; then + GTK_THEME=Yaru; ICON_THEME=Yaru; CURSOR_THEME=Yaru + FONT_NAME="Ubuntu 11" + BG_LIGHT="file:///usr/share/backgrounds/ubuntu-default-greyscale-wallpaper.png" + BG_DARK="$BG_LIGHT" + elif [ "$DVER_MAJOR" -ge 20 ]; then + GTK_THEME=Yaru; ICON_THEME=Yaru; CURSOR_THEME=Yaru + FONT_NAME="Ubuntu 11" + BG_LIGHT="file:///usr/share/backgrounds/ubuntu-default-greyscale-wallpaper.png" + elif [ "$DVER_MAJOR" -ge 18 ]; then + GTK_THEME=Yaru; ICON_THEME=Yaru; CURSOR_THEME=Yaru + FONT_NAME="Ubuntu 11" + else + GTK_THEME=Ambiance; ICON_THEME=ubuntu-mono-dark + FONT_NAME="Ubuntu 11" + fi + ;; + pop|popos) + GTK_THEME=Pop; ICON_THEME=Pop; CURSOR_THEME=Pop + FONT_NAME="Fira Sans 10" + BG_LIGHT="file:///usr/share/backgrounds/pop/default.png" + ;; + zorin) + GTK_THEME=ZorinBlue-Dark; ICON_THEME=Zorin; CURSOR_THEME=Zorin + FONT_NAME="Inter 11" + BG_LIGHT="file:///usr/share/backgrounds/zorin-default.jpg" + ;; + fedora|rhel|centos|rocky|alma|nobara) + GTK_THEME=Adwaita; ICON_THEME=Adwaita; CURSOR_THEME=Adwaita + FONT_NAME="Cantarell 11" + BG_LIGHT="file:///usr/share/backgrounds/default.png" + BG_DARK="$BG_LIGHT" + ;; + debian) + FONT_NAME="Cantarell 11" + ;; + esac + + gsettings set org.gnome.desktop.interface gtk-theme "$GTK_THEME" 2>/dev/null || true + gsettings set org.gnome.desktop.interface icon-theme "$ICON_THEME" 2>/dev/null || true + gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR_THEME" 2>/dev/null || true + gsettings set org.gnome.desktop.interface font-name "$FONT_NAME" 2>/dev/null || true + + if [ "$GNOME_VER" -ge 42 ] || [ "$GNOME_VER" = "0" ]; then + gsettings set org.gnome.desktop.interface color-scheme "default" 2>/dev/null || true + fi + if [ -n "$BG_LIGHT" ]; then + gsettings set org.gnome.desktop.background picture-uri "$BG_LIGHT" 2>/dev/null || true + fi + if [ -n "$BG_DARK" ] && [ "$GNOME_VER" -ge 42 ] || [ "$GNOME_VER" = "0" ]; then + gsettings set org.gnome.desktop.background picture-uri-dark "$BG_DARK" 2>/dev/null || true + fi + gsettings set org.gnome.desktop.wm.preferences theme "$GTK_THEME" 2>/dev/null || true + printf "%b\n" "${GREEN}GNOME theme reset to ${GTK_THEME}.${RC}" +} + +resetKDE() { + printf "%b\n" "${YELLOW}Resetting KDE Plasma ${PLASMA_VER} theme...${RC}" + if command_exists lookandfeeltool; then + lookandfeeltool -a org.kde.breeze.desktop 2>/dev/null || true + fi + KW="kwriteconfig${PLASMA_VER}" + if ! command_exists "$KW"; then + for kw in kwriteconfig6 kwriteconfig5; do + command_exists "$kw" && KW="$kw" && break + done + fi + if command_exists "$KW"; then + "$KW" --file ~/.config/kdeglobals --group KDE --key widgetStyle Breeze 2>/dev/null || true + "$KW" --file ~/.config/kdeglobals --group General --key ColorScheme Breeze 2>/dev/null || true + "$KW" --file ~/.config/kdeglobals --group Icons --key Theme breeze 2>/dev/null || true + "$KW" --file ~/.config/plasmarc --group Theme --key name default 2>/dev/null || true + "$KW" --file ~/.config/kcminputrc --group Mouse --key cursorTheme breeze 2>/dev/null || true + "$KW" --file ~/.config/kwinrc --group org.kde.kdecoration2 --key theme Breeze 2>/dev/null || true + fi + if command_exists plasma-apply-desktoptheme; then + plasma-apply-desktoptheme breeze 2>/dev/null || true + fi + if command_exists plasma-apply-colorscheme; then + plasma-apply-colorscheme Breeze 2>/dev/null || true + fi + printf "%b\n" "${GREEN}KDE Plasma theme reset to Breeze.${RC}" +} + +resetXFCE() { + if command_exists xfconf-query; then + xfconf-query -c xsettings -p /Net/ThemeName -s "Adwaita" 2>/dev/null || true + xfconf-query -c xsettings -p /Net/IconThemeName -s "Adwaita" 2>/dev/null || true + xfconf-query -c xsettings -p /Gtk/CursorThemeName -s "Adwaita" 2>/dev/null || true + xfconf-query -c xsettings -p /Gtk/FontName -s "Cantarell 11" 2>/dev/null || true + xfconf-query -c xfwm4 -p /general/theme -s "Adwaita" 2>/dev/null || true + xfconf-query -c xfce4-panel -p /panels/panel-0/position -s "p=6;x=0;y=0" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}XFCE theme reset to Adwaita.${RC}" +} + +resetCinnamon() { + if ! command_exists gsettings; then return; fi + if [ "$DVER_MAJOR" -ge 21 ]; then + GTK_THEME="Mint-Y"; ICON_THEME="Mint-Y" + THEME_NAME="Mint-Y-Dark"; WM_THEME="Mint-Y" + else + GTK_THEME="Adwaita"; ICON_THEME="Adwaita" + THEME_NAME="cinnamon"; WM_THEME="Adwaita" + fi + gsettings set org.cinnamon.desktop.interface gtk-theme "$GTK_THEME" 2>/dev/null || true + gsettings set org.cinnamon.desktop.interface icon-theme "$ICON_THEME" 2>/dev/null || true + gsettings set org.cinnamon.desktop.interface cursor-theme "Adwaita" 2>/dev/null || true + gsettings set org.cinnamon.desktop.interface font-name "Cantarell 11" 2>/dev/null || true + gsettings set org.cinnamon.theme name "$THEME_NAME" 2>/dev/null || true + gsettings set org.cinnamon.desktop.wm.preferences theme "$WM_THEME" 2>/dev/null || true + printf "%b\n" "${GREEN}Cinnamon theme reset to ${GTK_THEME}.${RC}" +} + +resetMATE() { + if ! command_exists gsettings; then return; fi + if [ "$DTYPE" = "ubuntu" ] || [ "$DTYPE" = "ubuntu-core" ]; then + GTK_THEME="Yaru"; ICON_THEME="Yaru" + else + GTK_THEME="Adwaita"; ICON_THEME="Adwaita" + fi + gsettings set org.mate.interface gtk-theme "$GTK_THEME" 2>/dev/null || true + gsettings set org.mate.interface icon-theme "$ICON_THEME" 2>/dev/null || true + gsettings set org.mate.interface cursor-theme "Adwaita" 2>/dev/null || true + gsettings set org.mate.interface font-name "Cantarell 11" 2>/dev/null || true + gsettings set org.mate.Marco.general theme "$GTK_THEME" 2>/dev/null || true + printf "%b\n" "${GREEN}MATE theme reset to ${GTK_THEME}.${RC}" +} + +resetBudgie() { + resetGNOME + if command_exists gsettings; then + gsettings set com.solus-project.budgie.panel layout "" 2>/dev/null || true + gsettings set com.solus-project.budgie.wm button-layout "appmenu:close" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Budgie theme reset.${RC}" +} + +resetLXDE() { + mkdir -p "$HOME/.config/lxde" + cat > "$HOME/.config/lxde/config" <<-EOF 2>/dev/null || true +[GTK] +sNet/ThemeName=Adwaita +sNet/IconThemeName=Adwaita +sGtk/CursorThemeName=Adwaita +sGtk/FontName=Cantarell 11 +EOF + printf "%b\n" "${GREEN}LXDE theme reset.${RC}" +} + +resetLXQt() { + rm -f "$HOME/.config/lxqt/lxqt.conf" "$HOME/.config/lxqt/panel.conf" "$HOME/.config/lxqt/session.conf" 2>/dev/null || true + printf "%b\n" "${GREEN}LXQt theme reset.${RC}" +} + +resetDeepin() { + if command_exists gsettings; then + gsettings set com.deepin.dde.appearance gtk-theme "deepin" 2>/dev/null || \ + gsettings set com.deepin.dde.appearance gtk-theme "Adwaita" 2>/dev/null || true + gsettings set com.deepin.dde.appearance icon-theme "deepin" 2>/dev/null || \ + gsettings set com.deepin.dde.appearance icon-theme "Adwaita" 2>/dev/null || true + gsettings set com.deepin.dde.appearance cursor-theme "deepin" 2>/dev/null || \ + gsettings set com.deepin.dde.appearance cursor-theme "Adwaita" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Deepin theme reset.${RC}" +} + +resetPantheon() { + if command_exists gsettings; then + gsettings set org.gnome.desktop.interface gtk-theme "io.elementary.stylesheet.blueberry" 2>/dev/null || \ + gsettings set org.gnome.desktop.interface gtk-theme "Adwaita" 2>/dev/null || true + gsettings set org.gnome.desktop.interface icon-theme "elementary" 2>/dev/null || \ + gsettings set org.gnome.desktop.interface icon-theme "Adwaita" 2>/dev/null || true + gsettings set org.gnome.desktop.interface cursor-theme "elementary" 2>/dev/null || \ + gsettings set org.gnome.desktop.interface cursor-theme "Adwaita" 2>/dev/null || true + gsettings set org.gnome.desktop.interface font-name "Inter 10" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Pantheon theme reset.${RC}" +} + +resetSway() { + rm -f "$HOME/.config/sway/config" 2>/dev/null || true + if [ -f /etc/sway/config ]; then + mkdir -p "$HOME/.config/sway" + cp /etc/sway/config "$HOME/.config/sway/" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Sway config reset.${RC}" +} + +resetHyprland() { + rm -f "$HOME/.config/hypr/hyprland.conf" 2>/dev/null || true + if [ -f /usr/share/hyprland/hyprland.conf ]; then + mkdir -p "$HOME/.config/hypr" + cp /usr/share/hyprland/hyprland.conf "$HOME/.config/hypr/" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Hyprland config reset.${RC}" +} + +resetWMCommon() { + for wm_dir in i3 bspwm qtile dwm; do + rm -f "$HOME/.config/$wm_dir/config" "$HOME/.config/$wm_dir/theme" 2>/dev/null || true + done + if [ -f /etc/i3/config ]; then + mkdir -p "$HOME/.config/i3" + cp /etc/i3/config "$HOME/.config/i3/" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}WM configs reset.${RC}" +} + +resetOpenbox() { + rm -f "$HOME/.config/openbox/rc.xml" 2>/dev/null || true + if [ -f /etc/xdg/openbox/rc.xml ]; then + mkdir -p "$HOME/.config/openbox" + cp /etc/xdg/openbox/rc.xml "$HOME/.config/openbox/" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Openbox config reset.${RC}" +} + +resetEnlightenment() { + rm -rf "$HOME/.e/e/config" 2>/dev/null || true + if command_exists enlightenment_remote; then + enlightenment_remote -default-all 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Enlightenment reset.${RC}" +} + +resetUKUI() { + if command_exists gsettings; then + gsettings set org.ukui.desktop.interface gtk-theme "ukui" 2>/dev/null || \ + gsettings set org.ukui.desktop.interface gtk-theme "Adwaita" 2>/dev/null || true + gsettings set org.ukui.desktop.interface icon-theme "ukui-icon-theme" 2>/dev/null || \ + gsettings set org.ukui.desktop.interface icon-theme "Adwaita" 2>/dev/null || true + gsettings set org.ukui.desktop.interface cursor-theme "ukui" 2>/dev/null || \ + gsettings set org.ukui.desktop.interface cursor-theme "Adwaita" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}UKUI theme reset.${RC}" +} + +resetLomiri() { + if command_exists gsettings; then + gsettings set com.lomiri.interface gtk-theme "Adwaita" 2>/dev/null || true + gsettings set com.lomiri.interface icon-theme "Adwaita" 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Lomiri theme reset.${RC}" +} + +resetCOSMIC() { + rm -f "$HOME/.config/cosmic/com.system76.CosmicTheme" 2>/dev/null || true + rm -f "$HOME/.config/cosmic/com.system76.CosmicBg" 2>/dev/null || true + printf "%b\n" "${GREEN}COSMIC theme reset.${RC}" +} + +cleanThemeConfigs() { + rm -f "$HOME/.gtkrc-2.0" "$HOME/.gtkrc.mine" + rm -f "$HOME/.config/gtk-3.0/settings.ini" + rm -f "$HOME/.config/gtk-4.0/settings.ini" + rm -rf "$HOME/.config/qt5ct" "$HOME/.config/qt6ct" + printf "%b\n" "${GREEN}Theme config files removed.${RC}" +} + +cleanThemeEnv() { + for f in "$HOME/.profile" "$HOME/.xprofile" "$HOME/.bashrc" \ + "$HOME/.zshrc" "$HOME/.xsessionrc" "$HOME/.xinitrc"; do + if [ -f "$f" ]; then + sed -i '/^export GTK_THEME/d; /^export QT_QPA_PLATFORMTHEME/d' "$f" 2>/dev/null || true + fi + done + if command_exists sudo; then + sudo sed -i '/^QT_QPA_PLATFORMTHEME=/d; /^GTK_THEME=/d' /etc/environment 2>/dev/null || true + fi + printf "%b\n" "${GREEN}Theme environment variables cleaned.${RC}" +} + +resetDE() { + case "$DE" in + gnome) resetGNOME ;; + kde) resetKDE ;; + xfce) resetXFCE ;; + cinnamon) resetCinnamon ;; + mate) resetMATE ;; + budgie) resetBudgie ;; + lxde) resetLXDE ;; + lxqt) resetLXQt ;; + deepin) resetDeepin ;; + pantheon) resetPantheon ;; + sway) resetSway; resetWMCommon ;; + hyprland) resetHyprland; resetWMCommon ;; + i3|bspwm|qtile|dwm) resetWMCommon ;; + openbox) resetOpenbox ;; + enlightenment) resetEnlightenment ;; + ukui) resetUKUI ;; + lomiri) resetLomiri ;; + cosmic) resetCOSMIC ;; + *) + printf "%b\n" "${YELLOW}Unknown DE, applying generic reset...${RC}" + resetGNOME + resetWMCommon ;; + esac +} + +applyReset() { + detectGNOMEVersion + detectPlasmaVersion + detectDE + cleanThemeConfigs + cleanThemeEnv + resetDE + printf "%b\n" "${GREEN}Theme reset complete. Reboot or log out to apply.${RC}" +} + +# --- Main menu --- + +main() { + printf "%b\n" "${YELLOW}Global Theme Manager${RC}" + printf "%b\n" "1. ${YELLOW}Apply Dark Theme${RC}" + printf "%b\n" "2. ${YELLOW}Reset Theme to Defaults${RC}" + printf "%b\n" "3. ${YELLOW}Cancel${RC}" + printf "%b" "Enter your choice [1-3]: " + read -r CHOICE + case "$CHOICE" in + 1) applyDarkTheme ;; + 2) applyReset ;; + 3) printf "%b\n" "${GREEN}Cancelled.${RC}" && exit 0 ;; + *) printf "%b\n" "${RED}Invalid choice.${RC}" && exit 1 ;; + esac +} + checkEnv -checkEscalationTool -applyTheming -install_theme_tools -configure_gtk2 -configure_gtk3 -configure_gtk4 -configure_xfce -configure_qt5ct -configure_qt6ct -set_environment_variables -apply_dconf_immediate -restart_thunar -successOutput \ No newline at end of file +checkDistro +DVER=${VERSION_ID:-0} +DVER_MAJOR=$(echo "$DVER" | cut -d. -f1) +main diff --git a/core/tabs/system-setup/tab_data.toml b/core/tabs/system-setup/tab_data.toml index eb1fec6ab..606d40bd8 100644 --- a/core/tabs/system-setup/tab_data.toml +++ b/core/tabs/system-setup/tab_data.toml @@ -97,6 +97,41 @@ description = "Yet Another Yogurt - An AUR Helper Written in Go. To know more ab script = "arch/yay-setup.sh" task_list = "I" +[[data.entries]] +name = "Pacman Config" +description = "Enables Color, ILoveCandy, ParallelDownloads, VerbosePkgLists, multilib in pacman.conf and sets MAKEFLAGS in makepkg.conf." +script = "arch/pacman-config.sh" +task_list = "PFM" + +[[data.entries]] +name = "PipeWire Audio" +description = "Installs PipeWire with WirePlumber session manager for audio (replaces PulseAudio)." +script = "arch/pipewire-setup.sh" +task_list = "I" + +[[data.entries]] +name = "Zram Swap" +description = "Configures compressed RAM swap via zram-generator with zstd algorithm." +script = "arch/zram-setup.sh" +task_list = "PFM" + +[[data.entries]] +name = "Snapper Snapshots" +description = "Sets up Snapper with hourly Btrfs snapshots, snap-pac hooks, and GRUB boot menu entries." +script = "arch/snapshot-setup.sh" +task_list = "I PFM SS" + +[[data.entries.preconditions]] +matches = true +data = "command_exists" +values = ["btrfs"] + +[[data.entries]] +name = "System Maintenance" +description = "Enables paccache.timer, removes orphan packages, and cleans system journals." +script = "arch/system-maintenance.sh" +task_list = "PFM RP" + [[data]] name = "Debian"