From ab3169b469fa4dba29d96dfb4a34e68785f79fde Mon Sep 17 00:00:00 2001 From: shynd Date: Tue, 25 Feb 2025 18:48:15 +0100 Subject: [PATCH] update copy script --- copy.sh | 988 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 988 insertions(+) create mode 100644 copy.sh diff --git a/copy.sh b/copy.sh new file mode 100644 index 0000000..916e677 --- /dev/null +++ b/copy.sh @@ -0,0 +1,988 @@ +#!/bin/bash + +clear +wallpaper=$HOME/.config/hypr/wallpaper_effects/.wallpaper_current +waybar_style="$HOME/.config/waybar/style/[Extra] Modern-Combined - Transparent.css" +waybar_config="$HOME/.config/waybar/configs/[TOP] Default" +waybar_config_laptop="$HOME/.config/waybar/configs/[TOP] Default Laptop" + +# set some colors for output messages +OK="$(tput setaf 2)[OK]$(tput sgr0)" +ERROR="$(tput setaf 1)[ERROR]$(tput sgr0)" +NOTE="$(tput setaf 3)[NOTE]$(tput sgr0)" +INFO="$(tput setaf 4)[INFO]$(tput sgr0)" +WARN="$(tput setaf 1)[WARN]$(tput sgr0)" +CAT="$(tput setaf 6)[ACTION]$(tput sgr0)" +MAGENTA="$(tput setaf 5)" +ORANGE="$(tput setaf 214)" +WARNING="$(tput setaf 1)" +YELLOW="$(tput setaf 3)" +GREEN="$(tput setaf 2)" +BLUE="$(tput setaf 4)" +SKY_BLUE="$(tput setaf 6)" +RESET="$(tput sgr0)" + +# check if running as root. if root, the script will exit +if [[ $EUID -eq 0 ]]; then + echo "${ERROR} this script should ${WARNING}NOT${RESET} be executed as root! exiting..." + printf "\n%.0s" {1..2} + exit 1 +fi + +# function to print colorful text +print_color() { + printf "%b%s%b\n" "$1" "$2" "$CLEAR" +} + +# check /etc/os-release to see if this is an ubuntu or debian based distro +if grep -iq '^\(ID_LIKE\|ID\)=.*\(debian\|ubuntu\)' /etc/os-release >/dev/null 2>&1; then + printf "\n%.0s" {1..1} + print_color $WARNING " + █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ + NIXOS-DOTS INCOMPATIBLE + █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ + + debian / ubuntu detected. refer to nixos dots README + for instructions on how to update your nixos-dots. + + exiting... + " + printf "\n%.0s" {1..3} + exit 1 +fi + +printf "\n%.0s" {1..1} +echo -e "\e[35m + ██░ ██▓██ ██▓ ██▓███ ██▀███ ▓█████▄ ▒█████ ▄▄▄█████▓ ██████ +▓██░ ██▒▒██ ██▒▓██░ ██▒▓██ ▒ ██▒▒██▀ ██▌▒██▒ ██▒▓ ██▒ ▓▒▒██ ▒ +▒██▀▀██░ ▒██ ██░▓██░ ██▓▒▓██ ░▄█ ▒░██ █▌▒██░ ██▒▒ ▓██░ ▒░░ ▓██▄ +░▓█ ░██ ░ ▐██▓░▒██▄█▓▒ ▒▒██▀▀█▄ ░▓█▄ ▌▒██ ██░░ ▓██▓ ░ ▒ ██▒ +░▓█▒░██▓ ░ ██▒▓░▒██▒ ░ ░░██▓ ▒██▒░▒████▓ ░ ████▓▒░ ▒██▒ ░ ▒██████▒▒ + ▒ ░░▒░▒ ██▒▒▒ ▒▓▒░ ░ ░░ ▒▓ ░▒▓░ ▒▒▓ ▒ ░ ▒░▒░▒░ ▒ ░░ ▒ ▒▓▒ ▒ ░ + ▒ ░▒░ ░▓██ ░▒░ ░▒ ░ ░▒ ░ ▒░ ░ ▒ ▒ ░ ▒ ▒░ ░ ░ ░▒ ░ ░ + ░ ░░ ░▒ ▒ ░░ ░░ ░░ ░ ░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ + ░ ░ ░░ ░ ░ ░ ░ ░ ░ + ░ ░ ░ +\e[0m" +printf "\n%.0s" {1..1} + +# announcement +echo "${WARNING}! ! ! A T T E N T I O N ! ! !${RESET}" +echo "${SKY_BLUE}version v2.3.12 of nixos-dots requires nwg-displays and some fonts!${RESET}" +echo "${SKY_BLUE}if you installed using nixos-config install script, you do not need to tak eany actions${RESET}" +echo "${YELLOW}please visit the wiki for changelogs${RESET}" +printf "\n%.0s" {1..1} + +# create directory for copy logs +if [ ! -d copy-logs ]; then + mkdir copy-logs +fi + +# set the name of the log file to include the current date and time +LOG="copy-logs/install-$(date +%d-%H%M%S)_dots.log" + +# update home folders +xdg-user-dirs-update 2>&1 | tee -a "$LOG" || true + +# setting up for nvidia +if lspci -k | grep -A 2 -E "(VGA|3D)" | grep -iq nvidia; then + echo "${INFO} nvidia gpu detected, setting up proper env's and configs" 2>&1 | tee "$LOG" || true + sed -i '/env = LIBVA_DRIVER_NAME,nvidia/s/^#//' config/hypr/UserConfigs/ENVariables.conf + sed -i '/env = __GLX_VENDOR_LIBRARY_NAME,nvidia/s/^#//' config/hypr/UserConfigs/ENVariables.conf + sed -i '/env = NVD_BACKEND,direct/s/^#//' config/hypr/UserConfigs/ENVariables.conf + # enabling no hardware cursors if nvidia detected + sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)false/\1true/' config/hypr/UserConfigs/UserSettings.conf + # disabling explicit sync for nvidia for now (Hyprland 0.42.0) + #sed -i 's/ explicit_sync = 2/ explicit_sync = 0/' config/hypr/UserConfigs/UserSettings.conf +fi + +# uncommenting WLR_RENDERER_ALLOW_SOFTWARE,1 if running in a VM is detected +if hostnamectl | grep -q 'Chassis: vm'; then + echo "${INFO} system is running in a virtual machine. setting up proper env's and configs" 2>&1 | tee -a "$LOG" || true + # enabling proper ENV's for Virtual Environment which should help + sed -i 's/^\([[:space:]]*no_hardware_cursors[[:space:]]*=[[:space:]]*\)false/\1true/' config/hypr/UserConfigs/UserSettings.conf + sed -i '/env = WLR_RENDERER_ALLOW_SOFTWARE,1/s/^#//' config/hypr/UserConfigs/ENVariables.conf + #sed -i '/env = LIBGL_ALWAYS_SOFTWARE,1/s/^#//' config/hypr/UserConfigs/ENVariables.conf + sed -i '/monitor = Virtual-1, 1920x1080@60,auto,1/s/^#//' config/hypr/UserConfigs/Monitors.conf +fi + +# proper polkit for nixos +if hostnamectl | grep -q 'Operating System: NixOS'; then + echo "${INFO} nixos distro detected. Setting up proper env's and configs." 2>&1 | tee -a "$LOG" || true + sed -i -E '/^#?exec-once = \$scriptsDir\/Polkit-NixOS\.sh/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf + sed -i '/^exec-once = \$scriptsDir\/Polkit\.sh$/ s/^#*/#/' config/hypr/UserConfigs/Startup_Apps.conf +fi + +# check if dpkg is installed (used to check if Debian or Ubuntu or based distros) +if grep -iq '^\(ID_LIKE\|ID\)=.*\(debian\|ubuntu\)' /etc/os-release >/dev/null 2>&1; then + echo "${INFO} debian/ubuntu based distro. disabling pyprland since it does not work properly" 2>&1 | tee -a "$LOG" || true + # disabling pyprland as causing issues + sed -i '/^exec-once = pypr &/ s/^/#/' config/hypr/UserConfigs/Startup_Apps.conf +fi + +# activating hyprcursor on env by checking if the directory ~/.icons/Bibata-Modern-Ice/hyprcursors exists +if [ -d "$HOME/.icons/Bibata-Modern-Ice/hyprcursors" ]; then + HYPRCURSOR_ENV_FILE="config/hypr/UserConfigs/ENVariables.conf" + echo "${INFO} bibata-hyprcursor directory detected. activating hyprcursor...." 2>&1 | tee -a "$LOG" || true + sed -i 's/^#env = HYPRCURSOR_THEME,Bibata-Modern-Ice/env = HYPRCURSOR_THEME,Bibata-Modern-Ice/' "$HYPRCURSOR_ENV_FILE" + sed -i 's/^#env = HYPRCURSOR_SIZE,24/env = HYPRCURSOR_SIZE,24/' "$HYPRCURSOR_ENV_FILE" +fi + +printf "\n%.0s" {1..1} + +# Function to detect keyboard layout using localectl or setxkbmap +detect_layout() { + if command -v localectl >/dev/null 2>&1; then + layout=$(localectl status --no-pager | awk '/X11 Layout/ {print $3}') + if [ -n "$layout" ]; then + echo "$layout" + fi + elif command -v setxkbmap >/dev/null 2>&1; then + layout=$(setxkbmap -query | grep layout | awk '{print $2}') + if [ -n "$layout" ]; then + echo "$layout" + fi + fi +} + +# detect the current keyboard layout +layout=$(detect_layout) + +if [ "$layout" = "(unset)" ]; then + while true; do + printf "\n%.0s" {1..1} + print_color $WARNING " + █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ + STOP AND READ + █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ + + !!! IMPORTANT WARNING !!! + +the default keyboard layout could not be detected +you need to set it manually + + !!! WARNING !!! + +setting a wrong keyboard layout will cause Hyprland to crash +If you are not sure, just type ${YELLOW}us${RESET} +${SKYBLUE}you can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET} + +${MAGENTA} NOTE:${RESET} +• you can also set more than 2 keyboard layouts +• for example: ${YELLOW}us, kr, gb, no${RESET} +" + printf "\n%.0s" {1..1} + read -p "${CAT} - please enter the correct keyboard layout: " new_layout + + if [ -n "$new_layout" ]; then + layout="$new_layout" + break + else + echo "${CAT} please enter a keyboard layout." + fi + done +fi + +printf "${NOTE} detecting keyboard layout to prepare proper hyprland settings\n" + +# prompt the user to confirm whether the detected layout is correct +while true; do + printf "${INFO} current keyboard layout is ${MAGENTA}$layout${RESET}\n" + read -p "${CAT} is this correct? [y/n] " keyboard_layout + + case $keyboard_layout in + [yY]) + awk -v layout="$layout" '/kb_layout/ {$0 = " kb_layout = " layout} 1' config/hypr/UserConfigs/UserSettings.conf > temp.conf + mv temp.conf config/hypr/UserConfigs/UserSettings.conf + + echo "${NOTE} kb_layout ${MAGENTA}$layout${RESET} configured in settings" 2>&1 | tee -a "$LOG" + break ;; + [nN]) + printf: "\n%.0s" {1..2} + print_color $WARNING " + █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ + STOP AND READ + █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ + + !!! IMPORTANT WARNING !!! + +the default keyboard layout could not be detected +you need to set it Manually + + !!! WARNING !!! + +setting a wrong keyboard layout will cause hyprland to crash +if you are not sure, just type ${YELLOW}us${RESET} +${SKYBLUE}you can change later in ~/.config/hypr/UserConfigs/UserSettings.conf${RESET} + +${MAGENTA} NOTE:${RESET} +• you can also set more than 2 keyboard layouts +• for example: ${YELLOW}us, kr, gb, no${RESET} +" + printf "\n%.0s" {1..1} + + read -p "${CAT} - Please enter the correct keyboard layout: " new_layout + + awk -v new_layout="$new_layout" '/kb_layout/ {$0 = " kb_layout = " new_layout} 1' config/hypr/UserConfigs/UserSettings.conf > temp.conf + mv temp.conf config/hypr/UserConfigs/UserSettings.conf + echo "${OK} kb_layout $new_layout configured in settings." 2>&1 | tee -a "$LOG" + break ;; + *) + echo "${ERROR} Please enter either 'y' or 'n'." ;; + esac +done + +# Check if asusctl is installed and add rog-control-center on Startup +if command -v asusctl >/dev/null 2>&1; then + sed -i '/exec-once = rog-control-center &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf +fi + +# Check if blueman-applet is installed and add blueman-applet on Startup +if command -v blueman-applet >/dev/null 2>&1; then + sed -i '/exec-once = blueman-applet &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf +fi + +# Check if ags is installed edit ags behaviour on configs +if command -v ags >/dev/null 2>&1; then + sed -i '/#exec-once = ags &/s/^#//' config/hypr/UserConfigs/Startup_Apps.conf + sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/RefreshNoWaybar.sh + sed -i '/#ags -q && ags &/s/^#//' config/hypr/scripts/Refresh.sh +fi + +printf "\n%.0s" {1..1} + +# Checking if neovim or vim is installed and offer user if they want to make as default editor +# Function to modify the ENVariables.conf file +update_editor() { + local editor=$1 + sed -i "s/#env = EDITOR,.*/env = EDITOR,$editor #default editor/" config/hypr/UserConfigs/ENVariables.conf + echo "${OK} default editor set to ${MAGENTA}$editor${RESET}." 2>&1 | tee -a "$LOG" +} + +EDITOR_SET=0 +# Check for neovim if installed +if command -v nvim &> /dev/null; then + printf "${INFO} ${MAGENTA}neovim${RESET} is detected as installed\n" + read -p "${CAT} do you want to make ${MAGENTA}neovim${RESET} the default editor? (y/N): " EDITOR_CHOICE + if [[ "$EDITOR_CHOICE" == "y" ]]; then + update_editor "nvim" + EDITOR_SET=1 + fi +fi + +printf "\n" + +# Check for vim if installed, but only if neovim wasn't chosen +if [[ "$EDITOR_SET" -eq 0 ]] && command -v vim &> /dev/null; then + printf "${INFO} ${MAGENTA}vim${RESET} is detected as installed\n" + read -p "${CAT} do you want to make ${MAGENTA}vim${RESET} the default editor? (y/N): " EDITOR_CHOICE + if [[ "$EDITOR_CHOICE" == "y" ]]; then + update_editor "vim" + EDITOR_SET=1 + fi +fi + +if [[ "$EDITOR_SET" -eq 0 ]]; then + echo "${YELLOW} Neither neovim nor vim is installed or selected as default." 2>&1 | tee -a "$LOG" +fi + +printf "\n" + +# Action to do for better appearance +while true; do + echo "${NOTE} ${SKY_BLUE} by default, nixos-dots is configured for 1440p or 2k." + echo "${WARN} if you dont select proper resolution, Hyprlock will look weird" + echo "${INFO} if you are not sure what is your resolution, choose 1 here!" + echo "${MAGENTA}select monitor resolution to properly configure appearance and fonts:" + echo "$YELLOW -- enter 1. for monitor resolution less than 1440p (< 1440p)" + echo "$YELLOW -- enter 2. for monitor resolution equal to or higher than 1440p (≥ 1440p)" + read -p "$CAT enter the number of your choice (1 or 2): " res_choice + + case $res_choice in + 1) + resolution="< 1440p" + break + ;; + 2) + resolution="≥ 1440p" + break + ;; + *) + echo "${ERROR} invalid choice. please enter 1 for < 1440p or 2 for ≥ 1440p." + ;; + esac +done + +# Use the selected resolution in your existing script +echo "${OK} you have chosen $resolution resolution." 2>&1 | tee -a "$LOG" + +# Add your commands based on the resolution choice +if [ "$resolution" == "< 1440p" ]; then + #cp -r config/rofi/resolution/1080p/* config/rofi/ 10-Feb-2025 + sed -i 's/font_size 16.0/font_size 12.0/' config/kitty/kitty.conf + + # hyprlock matters + mv config/hypr/hyprlock.conf config/hypr/hyprlock-2k.conf && + mv config/hypr/hyprlock-1080p.conf config/hypr/hyprlock.conf + + # rofi fonts reduction + themes_dir="config/rofi/themes" + config_file="config/rofi/config.rasi" + + # Change rofi font size + find "$themes_dir" -type f | while read -r file; do + if grep -Pzoq 'element-text {\n font: "JetBrainsMono Nerd Font SemiBold 12";\n}' "$file"; then + sed -i 's/font: "JetBrainsMono Nerd Font SemiBold 12"/font: "JetBrainsMono Nerd Font SemiBold 10"/' "$file" + fi + done + + # Change rofi font size in ~/.config/rofi/config.rasi + if [ -f "$config_file" ]; then + if grep -Pzoq 'configuration {\n font: "JetBrainsMono Nerd Font SemiBold 13";\n}' "$config_file"; then + sed -i 's/font: "JetBrainsMono Nerd Font SemiBold 13"/font: "JetBrainsMono Nerd Font SemiBold 12"/' "$config_file" + fi + fi +fi + +printf "\n%.0s" {1..1} + +# Ask whether to change to 12hr format +while true; do + echo -e "${NOTE} ${SKY_BLUE} by default, nixos-dots is configured in 24H clock format." + read -p "$CAT do you want to change to 12H format or AM/PM format? (y/n): " answer + + # Convert the answer to lowercase for comparison + answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]') + + # Check if the answer is valid + if [[ "$answer" == "y" ]]; then + # Modify waybar clock modules if 12hr is selected + # Clock 1 + sed -i 's#^\(\s*\)//\("format": " {:%I:%M %p}",\) #\1\2 #g' config/waybar/Modules 2>&1 | tee -a "$LOG" + sed -i 's#^\(\s*\)\("format": " {:%H:%M:%S}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + + # Clock 2 + sed -i 's#^\(\s*\)\("format": " {:%H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + + # Clock 3 + sed -i 's#^\(\s*\)//\("format": "{:%I:%M %p - %d/%b}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + sed -i 's#^\(\s*\)\("format": "{:%H:%M - %d/%b}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + + # Clock 4 + sed -i 's#^\(\s*\)//\("format": "{:%B | %a %d, %Y | %I:%M %p}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + sed -i 's#^\(\s*\)\("format": "{:%B | %a %d, %Y | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + + # Clock 5 + sed -i 's#^\(\s*\)//\("format": "{:%A, %I:%M %P}",\) #\1\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + sed -i 's#^\(\s*\)\("format": "{:%a %d | %H:%M}",\) #\1//\2#g' config/waybar/Modules 2>&1 | tee -a "$LOG" + + # for hyprlock + sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%H")"/# &/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG" + sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/\1 text = cmd\[update:1000\] echo "\$(date +"%I")" #AM\/PM/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG" + + sed -i 's/^\s*text = cmd\[update:1000\] echo "\$(date +"%S")"/# &/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG" + sed -i 's/^\(\s*\)# *text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/\1 text = cmd\[update:1000\] echo "\$(date +"%S %p")" #AM\/PM/' config/hypr/hyprlock.conf 2>&1 | tee -a "$LOG" + + echo "${OK} 12H format set on waybar clocks successfully." 2>&1 | tee -a "$LOG" + + # Function to apply 12H format to SDDM themes + apply_sddm_12h_format() { + local sddm_directory=$1 + + # Check if the directory exists + if [ -d "$sddm_directory" ]; then + echo "editing ${SKY_BLUE}$sddm_directory${RESET} to 12H format" 2>&1 | tee -a "$LOG" + + sudo sed -i 's|^## HourFormat="hh:mm AP"|HourFormat="hh:mm AP"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true + sudo sed -i 's|^HourFormat="HH:mm"|## HourFormat="HH:mm"|' "$sddm_directory/theme.conf" 2>&1 | tee -a "$LOG" || true + fi + } + + # Applying to different SDDM themes + apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm" + apply_sddm_12h_format "/usr/share/sddm/themes/simple-sddm-2" + + # For SDDM (sequoia_2) + sddm_directory_3="/usr/share/sddm/themes/sequoia_2" + if [ -d "$sddm_directory_3" ]; then + echo "${YELLOW}sddm sequoia_2${RESET} theme exists. editing to 12H format" 2>&1 | tee -a "$LOG" + + # Comment out the existing clockFormat="HH:mm" line + sudo sed -i 's|^clockFormat="HH:mm"|## clockFormat="HH:mm"|' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true + + # Insert the new clockFormat="hh:mm AP" line if it's not already present + if ! grep -q 'clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf"; then + sudo sed -i '/^clockFormat=/a clockFormat="hh:mm AP"' "$sddm_directory_3/theme.conf" 2>&1 | tee -a "$LOG" || true + fi + + echo "${OK} 12H format set to SDDM successfully." 2>&1 | tee -a "$LOG" + fi + + break + + elif [[ "$answer" == "n" ]]; then + echo "${NOTE} you chose not to change to 12H format." 2>&1 | tee -a "$LOG" + break # Exit the loop if the user chooses "n" + else + echo "${ERROR} invalid choice. please enter y for yes or n for no." + fi +done +printf "\n%.0s" {1..1} + +# Check if the user wants to disable Rainbow borders +echo "${NOTE} ${SKY_BLUE}by default, rainbow borders animation is enabled" +echo "${WARN} however, this uses a bit more CPU and Memory resources." + +read -p "${CAT} do you want to disable Rainbow Borders animation? (y/N): " border_choice +if [[ "$border_choice" =~ ^[Yy]$ ]]; then + mv config/hypr/UserScripts/RainbowBorders.sh config/hypr/UserScripts/RainbowBorders.bak.sh + + sed -i '/exec-once = \$UserScripts\/RainbowBorders.sh \&/s/^/#/' config/hypr/UserConfigs/Startup_Apps.conf + sed -i '/^[[:space:]]*animation = borderangle, 1, 180, liner, loop/s/^/#/' config/hypr/UserConfigs/UserAnimations.conf + + echo "${OK} rainbow borders are now disabled." 2>&1 | tee -a "$LOG" +else + echo "${NOTE} no changes made. rainbow borders remain enabled." 2>&1 | tee -a "$LOG" +fi +printf "\n%.0s" {1..1} + +set -e + +# Function to create a unique backup directory name with month, day, hours, and minutes +get_backup_dirname() { + local timestamp + timestamp=$(date +"%m%d_%H%M") + echo "back-up_${timestamp}" +} + +# Check if the ~/.config/ directory exists +if [ ! -d "$HOME/.config" ]; then + echo "${ERROR} - $HOME/.config directory does not exist, creating it now" + mkdir -p "$HOME/.config" && echo "${OK}directory successfully created" || echo "${ERROR}failed to create directory!" +fi + +printf "${INFO} - copying dotfiles ${SKY_BLUE}first${RESET} part\n" +# config directories which will ask the user whether to replace or not +DIRS=" + ags + fastfetch + kitty + rofi + swaync +" +for DIR2 in $DIRS; do + DIRPATH="$HOME/.config/$DIR2" + + if [ -d "$DIRPATH" ]; then + while true; do + printf "\n${INFO} found ${YELLOW}$DIR2${RESET} config found in ${HOME}/.config/\n" + read -p "${CAT} do you want to replace ${YELLOW}$DIR2${RESET} config? (y/n): " DIR1_CHOICE + case "$DIR1_CHOICE" in + [Yy]* ) + BACKUP_DIR=$(get_backup_dirname) + # Backup the existing directory + mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG" + echo -e "${NOTE} - backed up $DIR2 to $DIRPATH-backup-$BACKUP_DIR." 2>&1 | tee -a "$LOG" + + # Copy the new config + cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG" + echo -e "${OK} - replaced $DIR2 with new configuration." 2>&1 | tee -a "$LOG" + + # Restoring rofi themes directory unique themes + if [ "$DIR2" = "rofi" ]; then + if [ -d "$DIRPATH-backup-$BACKUP_DIR/themes" ]; then + for file in "$DIRPATH-backup-$BACKUP_DIR/themes"/*; do + [ -e "$file" ] || continue # Skip if no files are found + echo "copying $file to $HOME/.config/rofi/themes/" >> "$LOG" + cp -n "$file" "$HOME/.config/rofi/themes/" + done || true + fi + fi + + break + ;; + [Nn]* ) + echo -e "${NOTE} - skipping ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG" + break + ;; + * ) + echo -e "${WARN} - invalid choice. please enter Y or N." + ;; + esac + done + else + # Copy new config if directory does not exist + cp -r "config/$DIR2" "$HOME/.config/$DIR2" 2>&1 | tee -a "$LOG" + echo -e "${OK} - copy completed for ${YELLOW}$DIR2${RESET}" 2>&1 | tee -a "$LOG" + fi +done + +printf "\n%.0s" {1..1} + +# special copy for waybar because of symlink +DIRW="waybar" +DIRPATHW="$HOME/.config/$DIRW" +if [ -d "$DIRPATHW" ]; then + while true; do + read -p "${CAT} do you want to replace ${YELLOW}$DIRW${RESET} config? (y/n): " DIR1_CHOICE + case "$DIR1_CHOICE" in + [Yy]* ) + BACKUP_DIR=$(get_backup_dirname) + cp -r "$DIRPATHW" "$DIRPATHW-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG" + echo -e "${NOTE} - backed up $DIRW to $DIRPATHW-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG" + + # remove old $DIRPATHW and copy the new one + rm -rf "$DIRPATHW" && cp "config/$DIRW" "$DIRPATHW" 2>&1 | tee -a "$LOG" + + # step 1: handle waybar symlinks + for file in "config" "style.css"; do + symlink="$DIRPATHW-backup-$BACKUP_DIR/$file" + target_file="$DIRPATHW/$file" + + if [ -L "$symlink" ]; then + symlink_target=$(readlink "$symlink") + if [ -f "$symlink_target" ]; then + rm -f "$target_file" && cp -f "$symlink_target" "$target_file" + echo -e "${NOTE} - copied $file as a regular file" + else + echo -e "${WARN} - symlink target for $file does not exist" + fi + fi + done + + # step 2: copy non-existing directories and files under waybar/configs + for dir in "$DIRPATHW-backup-$BACKUP_DIR/configs"/*; do + [ -e "$dir" ] || continue # skip if no files are found + if [ -d "$dir" ]; then + target_dir="$HOME/.config/waybar/configs/$(basename "$dir")" + if [ ! -d "$target_dir" ]; then + echo "copying directory $dir to $HOME/.config/waybar/configs/" >> "$LOG" + cp -r "$dir" "$HOME/.config/waybar/configs/" + else + echo "directory $target_dir already exists, skipping..." >> "$LOG" + fi + fi + done + + for file in "$DIRPATHW-backup-$BACKUP_DIR/configs"/*; do + [ -e "$file" ] || continue # skip if no files are found + target_file="$HOME/.config/waybar/configs/$(basename "$file")" + if [ ! -e "$target_file" ]; then + echo "copying $file to $HOME/.config/waybar/configs/" >> "$LOG" + cp "$file" "$HOME/.config/waybar/configs/" + else + echo "file $target_file already exists, skipping..." >> "$LOG" + fi + done || true + + # step 3: copy unique files in waybar/style + for file in "$DIRPATHW-backup-$BACKUP_DIR/style/"*; do + [ -e "$file" ] || continue # skip if no files are found + if [ -d "$file" ]; then + target_dir="$HOME/.config/waybar/style/$(basename "$file")" + if [ ! -d "$target_dir" ]; then + echo "copying directory $file to $HOME/.config/waybar/style/" >> "$LOG" + cp -r "$file" "$HOME/.config/waybar/style/" # TODO: shouldn't this be $target_dir instead of $file? + else + echo "directory $target_dir already_exists, skipping..." >> "$LOG" + fi + else + target_file="$HOME/.config/waybar/style/$(basename "$file")" + if [ ! -e "$target_file" ]; then + echo "copying file $file to $HOME/.config/waybar/style/" >> "$LOG" + cp "$file" "$HOME/.config/waybar/style/" + else + echo "file $target_file already exists, skipping..." >> "$LOG" + fi + fi + done || true + + # step 4: restore Modules_Extra + BACKUP_FILE="$DIRPATHW-backup-$BACKUP_DIR/UserModules" + if [ -f "$BACKUP_FILE" ]; then + cp -f "$BACKUP_FILE" "$DIRPATHW/UserModules" + fi + + break + ;; + [Nn]* ) + echo -e "${NOTE} - skipping ${YELLOW}$DIRW${RESET} config replacement" 2>&1 | tee -a "$LOG" + break + ;; + * ) + echo -e "${WARN} - invalid choice, please enter Y or N" + esac + done +else + cp -r "config/$DIRW" "$DIRWPATH" 2>&1 | tee -a "$LOG" + echo -e "${OK} - copy completed for ${YELLOW}$DIRW${RESET}" 2>&1 | tee -a "$LOG" +fi + +printf "\n%.0s" {1..1} + +printf "${INFO} - copying dotfiles ${SKY_BLUE}second${RESET} part\n" + +# check if the config directory exists +if [ ! -d "config" ]; then + echo "${ERROR} the 'config' directory does not exist" + exit 1 +fi + +DIR=" + btop + cava + hypr + Kvantum + qt5ct + qt6ct + swappy + wallust + wlogout +" +for DIR_NAME in $DIR; do + DIRPATH="$HOME/.config/$DIR_NAME" + + # Backup the existing directory if it exists + if [ -d "$DIRPATH" ]; then + echo -e "\n${NOTE} - config for ${YELLOW}$DIR_NAME${RESET} found, attempting to back up." + BACKUP_DIR=$(get_backup_dirname) + + # Backup the existing directory + mv "$DIRPATH" "$DIRPATH-backup-$BACKUP_DIR" 2>&1 | tee -a "$LOG" + if [ $? -eq 0 ]; then + echo -e "${NOTE} - backed up $DIR_NAME to $DIRPATH-backup-$BACKUP_DIR." + else + echo "${ERROR} - failed to back up $DIR_NAME." + exit 1 + fi + fi + + # Copy the new config + if [ -d "config/$DIR_NAME" ]; then + cp -r "config/$DIR_NAME/" $HOME/.config/"$DIR_NAME" 2>&1 | tee -a "$LOG" + if [ $? -eq 0 ]; then + echo "${OK} - copy of config for ${YELLOW}$DIR_NAME${RESET} completed!" + else + echo "${ERROR} - failed to copy $DIR_NAME." + exit 1 + fi + else + echo "${ERROR} - directory config/$DIR_NAME does not exist to copy." + fi +done + +printf "\n%.0s" {1..1} + +# automatically restore animations and monitor-profiles +# including monitors.conf and workspaces.conf +HYPR_DIR="$HOME/.config/hypr" +BACKUP_DIR=$(get_backup_dirname) +BACKUP_HYPR_PATH="$HYPR_DIR-backup-$BACKUP_DIR" + +if [ -d "$BACKUP_HYPR_PATH" ]; then + echo -e "\n${NOTE} restoring ${SKY_BLUE}animations and monitor profiles${RESET} directories into ${YELLOW}$HYPR_DIR${RESET}..." + + DIR_B=("Monitor_Profiles" "animations" "wallpaper_effects") + # Restore directories automatically + for DIR_RESTORE in "${DIR_B[@]}"; do + BACKUP_SUBDIR="$BACKUP_HYPR_PATH/$DIR_RESTORE" + + if [ -d "$BACKUP_SUBDIR" ]; then + cp -r "$BACKUP_SUBDIR" "$HYPR_DIR/" + echo "${OK} - restored directory: ${MAGENTA}$DIR_RESTORE${RESET}" 2>&1 | tee -a "$LOG" + fi + done + + # Restore files automatically + FILE_B=("monitors.conf" "workspaces.conf" "pyprland.toml") + for FILE_RESTORE in "${FILE_B[@]}"; do + BACKUP_FILE="$BACKUP_HYPR_PATH/$FILE_RESTORE" + + if [ -f "$BACKUP_FILE" ]; then + cp "$BACKUP_FILE" "$HYPR_DIR/$FILE_RESTORE" + echo "${OK} - restored file: ${MAGENTA}$FILE_RESTORE${RESET}" 2>&1 | tee -a "$LOG" + fi + done +fi + +printf "\n%.0s" {1..1} + +# Restoring UserConfigs and UserScripts +DIRH="hypr" +FILES_TO_RESTORE=( + "ENVariables.conf" + "LaptopDisplay.conf" + "Laptops.conf" + "Startup_Apps.conf" + "UserDecorations.conf" + "UserAnimations.conf" + "UserKeybinds.conf" + "UserSettings.conf" + "WindowRules.conf" +) + +DIRPATH="$HOME/.config/$DIRH" +BACKUP_DIR=$(get_backup_dirname) +BACKUP_DIR_PATH="$DIRPATH-backup-$BACKUP_DIR/UserConfigs" + +if [ -z "$BACKUP_DIR" ]; then + echo "${ERROR} - backup directory name is empty, exiting." + exit 1 +fi + +if [ -d "$BACKUP_DIR_PATH" ]; then + echo -e "${NOTE} restoring previous ${MAGENTA}user-configs${RESET}... " + echo -e "${WARN} ${WARNING}if you decide to restore the old configs, make sure to handle the updates or changes manually${RESET}." + + for FILE_NAME in "${FILES_TO_RESTORE[@]}"; do + BACKUP_FILE="$BACKUP_DIR_PATH/$FILE_NAME" + if [ -f "$BACKUP_FILE" ]; then + printf "\n${INFO} found ${YELLOW}$FILE_NAME${RESET} in hypr backup...\n" + read -p "${CAT} do you want to restore ${YELLOW}$FILE_NAME${RESET} from backup? (y/N): " file_restore + + if [[ "$file_restore" == [Yy]* ]]; then + if cp "$BACKUP_FILE" "$DIRPATH/UserConfigs/$FILE_NAME"; then + echo "${OK} - $FILE_NAME restored!" 2>&1 | tee -a "$LOG" + else + echo "${ERROR} - failed to restore $FILE_NAME!" 2>&1 | tee -a "$LOG" + fi + else + echo "${NOTE} - skipped restoring $FILE_NAME." + fi + fi + done +fi + +printf "\n%.0s" {1..1} + +# Restoring previous UserScripts +DIRSH="hypr" +SCRIPTS_TO_RESTORE=( + "RofiBeats.sh" + "Weather.py" + "Weather.sh" +) + +DIRSHPATH="$HOME/.config/$DIRSH" +BACKUP_DIR_PATH="$DIRSHPATH-backup-$BACKUP_DIR/UserScripts" + +if [ -d "$BACKUP_DIR_PATH" ]; then + echo -e "${NOTE} restoring previous ${MAGENTA}user-scripts${RESET}..." + + for SCRIPT_NAME in "${SCRIPTS_TO_RESTORE[@]}"; do + BACKUP_SCRIPT="$BACKUP_DIR_PATH/$SCRIPT_NAME" + + if [ -f "$BACKUP_SCRIPT" ]; then + printf "\n${INFO} found ${YELLOW}$SCRIPT_NAME${RESET} in hypr backup...\n" + read -p "${CAT} do you want to restore ${YELLOW}$SCRIPT_NAME${RESET} from backup? (y/N): " script_restore + if [[ "$script_restore" == [Yy]* ]]; then + if cp "$BACKUP_SCRIPT" "$DIRSHPATH/UserScripts/$SCRIPT_NAME"; then + echo "${OK} - $SCRIPT_NAME restored!" 2>&1 | tee -a "$LOG" + else + echo "${ERROR} - failed to restore $SCRIPT_NAME!" 2>&1 | tee -a "$LOG" + fi + else + echo "${NOTE} - skipped restoring $SCRIPT_NAME." + fi + fi + done +fi + +printf "\n%.0s" {1..1} + +# restoring some files in ~/.config/hypr +DIR_H="hypr" +FILES_2_RESTORE=( + "hyprlock.conf" + "hypridle.conf" +) + +DIRPATH="$HOME/.config/$DIR_H" +BACKUP_DIR=$(get_backup_dirname) +BACKUP_DIR_PATH_F="$DIRPATH-backup-$BACKUP_DIR" + +if [ -d "$BACKUP_DIR_PATH_F" ]; then + echo -e "${NOTE} restoring some files in ${MAGENTA}$HOME/.config/hypr directory${RESET}..." + + for FILE_RESTORE in "${FILES_2_RESTORE[@]}"; do + BACKUP_FILE="$BACKUP_DIR_PATH_F/$FILE_RESTORE" + + if [ -f "$BACKUP_FILE" ]; then + echo -e "\n${INFO} found ${YELLOW}$FILE_RESTORE${RESET} in hypr backup..." + read -p "${CAT} do you want to restore ${YELLOW}$FILE_RESTORE${RESET} from backup? (y/N): " file2restore + + if [[ "$file2restore" == [Yy]* ]]; then + if cp "$BACKUP_FILE" "$DIRPATH/$FILE_RESTORE"; then + echo "${OK} - $FILE_RESTORE restored!" 2>&1 | tee -a "$LOG" + else + echo "${ERROR} - failed to restore $FILE_RESTORE!" 2>&1 | tee -a "$LOG" + fi + else + echo "${NOTE} - skipped restoring $FILE_RESTORE." + fi + else + echo "${ERROR} - backup file $BACKUP_FILE does not exist." + fi + done +fi + +printf "\n%.0s" {1..1} + +# Define the target directory for rofi themes +rofi_DIR="$HOME/.local/share/rofi/themes" + +if [ ! -d "$rofi_DIR" ]; then + mkdir -p "$rofi_DIR" +fi +if [ -d "$HOME/.config/rofi/themes" ]; then + if [ -z "$(ls -A $HOME/.config/rofi/themes)" ]; then + echo '/* Dummy Rofi theme */' > "$HOME/.config/rofi/themes/dummy.rasi" + fi + ln -snf ~/.config/rofi/themes/* ~/.local/share/rofi/themes/ + # Delete the dummy file if it was created + if [ -f "$HOME/.config/rofi/themes/dummy.rasi" ]; then + rm "$HOME/.config/rofi/themes/dummy.rasi" + fi +fi + +printf "\n%.0s" {1..1} + +# wallpaper stuff +mkdir -p $HOME/Pictures/wallpapers +if cp -r wallpapers $HOME/Pictures/; then + echo "${OK} some ${MAGENTA}wallpapers${RESET} copied successfully!" | tee -a "$LOG" +else + echo "${ERROR} failed to copy some ${YELLOW}wallpapers${RESET}" | tee -a "$LOG" +fi + +# Set some files as executable +chmod +x "$HOME/.config/hypr/scripts/"* 2>&1 | tee -a "$LOG" +chmod +x "$HOME/.config/hypr/UserScripts/"* 2>&1 | tee -a "$LOG" +# Set executable for initial-boot.sh +chmod +x "$HOME/.config/hypr/initial-boot.sh" 2>&1 | tee -a "$LOG" + +# Waybar config to symlink & retain based on machine type +if hostnamectl | grep -q 'Chassis: desktop'; then + config_file="$waybar_config" + config_remove=" Laptop" +else + config_file="$waybar_config_laptop" + config_remove="" +fi + +# check if ~/.config/waybar/config does not exist or is a symlink +if [ ! -e "$HOME/.config/waybar/config" ] || [ -L "$HOME/.config/waybar/config" ]; then + ln -sf "$config_file" "$HOME/.config/waybar/config" 2>&1 | tee -a "$LOG" +fi + +# Remove inappropriate waybar configs +rm -rf "$HOME/.config/waybar/configs/[TOP] Default$config_remove" \ + "$HOME/.config/waybar/configs/[BOT] Default$config_remove" \ + "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v1)" \ + "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v2)" \ + "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v3)" \ + "$HOME/.config/waybar/configs/[TOP] Default$config_remove (old v4)" 2>&1 | tee -a "$LOG" || true + +printf "\n%.0s" {1..1} + +# for SDDM (sequoia_2) +sddm_sequioa="/usr/share/sddm/themes/sequoia_2" +if [ -d "$sddm_sequioa" ]; then + while true; do + read -rp "${CAT} SDDM sequoia_2 theme detected! apply current wallpaper as SDDM background? (y/n): " SDDM_WALL + + # Remove any leading/trailing whitespace or newlines from input + SDDM_WALL=$(echo "$SDDM_WALL" | tr -d '\n' | tr -d ' ') + + case $SDDM_WALL in + [Yy]) + # Copy the wallpaper, ignore errors if the file exists or fails + sudo cp -r "config/hypr/wallpaper_effects/.wallpaper_current" "/usr/share/sddm/themes/sequoia_2/backgrounds/default" || true + echo "${NOTE} current wallpaper applied as default SDDM background" 2>&1 | tee -a "$LOG" + break + ;; + [Nn]) + echo "${NOTE} you chose not to apply the current wallpaper to SDDM." 2>&1 | tee -a "$LOG" + break + ;; + *) + echo "please enter 'y' or 'n' to proceed." + ;; + esac + done +fi + +# additional wallpapers +printf "\n%.0s" {1..1} +echo "${MAGENTA}by default only a few wallpapers are copied${RESET}..." + +# TODO: download more wallpapers? + +cleanup_backups() { + CONFIG_DIR="$HOME/.config" + BACKUP_PREFIX="-backup" + + # Loop through directories in $HOME/.config + for DIR in "$CONFIG_DIR"/*; do + if [ -d "$DIR" ]; then + BACKUP_DIRS=() + + # Check for backup directories + for BACKUP in "$DIR"$BACKUP_PREFIX*; do + if [ -d "$BACKUP" ]; then + BACKUP_DIRS+=("$BACKUP") + fi + done + + # If more than one backup found + if [ ${#BACKUP_DIRS[@]} -gt 1 ]; then + printf "\n%.0s" {1..2} + echo -e "${INFO} found ${MAGENTA}multiple backups${RESET} for: ${YELLOW}${DIR##*/}${RESET}" + echo "${YELLOW}backups: ${RESET}" + + # List the backups + for BACKUP in "${BACKUP_DIRS[@]}"; do + echo " - ${BACKUP##*/}" + done + + read -p "${CAT} do you want to delete the older backups of ${YELLOW}${DIR##*/}${RESET} and keep the latest backup only? (y/N): " back_choice + if [[ "$back_choice" == [Yy]* ]]; then + # Sort backups by modification time + latest_backup="${BACKUP_DIRS[0]}" + for BACKUP in "${BACKUP_DIRS[@]}"; do + if [ "$BACKUP" -nt "$latest_backup" ]; then + latest_backup="$BACKUP" + fi + done + + for BACKUP in "${BACKUP_DIRS[@]}"; do + if [ "$BACKUP" != "$latest_backup" ]; then + echo "deleting: ${BACKUP##*/}" + rm -rf "$BACKUP" + fi + done + echo "old backups of ${YELLOW}${DIR##*/}${RESET} deleted, keeping: ${MAGENTA}${latest_backup##*/}${RESET}" + fi + fi + fi + done +} +# Execute the cleanup function +cleanup_backups + +# ln -sf "$waybar_style" "$HOME/.config/waybar/style.css" && \ +# check if ~/.config/waybar/style.css does not exist or is a symlink +if [ ! -e "$HOME/.config/waybar/style.css" ] || [ -L "$HOME/.config/waybar/style.css" ]; then + ln -sf "$waybar_style" "$HOME/.config/waybar/style.css" 2>&1 | tee -a "$LOG" +fi + +printf "\n%.0s" {1..1} + +# initialize wallust to avoid config error on hyprland +wallust run -s $wallpaper 2>&1 | tee -a "$LOG" + +printf "\n%.0s" {1..2} +printf "${OK} nixos-dots is now ready" +printf "\n%.0s" {1..1} +printf "${INFO} however, it is ${MAGENTA}HIGHLY SUGGESTED${RESET} to logout and re-login or better reboot to avoid any issues" +printf "\n%.0s" {1..3} \ No newline at end of file