#!/usr/bin/env bash set -euo pipefail SCRIPT=$(basename "$0") BASE_LAUNCHER=('rofi' '-theme-str' 'window {width: 20%;}' '-c' '-dmenu' '-i') UPDATE_COMMAND="yay -Syu" CURRENT_THEME=$(wpg -c) THEME_LIST=$(wpg -l) # | grep -v "$CURRENT_THEME") log() { logger -i -t "$SCRIPT" "$*" } show_main_menu() { local options="Services\nSystem\nTools\nPassword" echo -e "$options" | "${BASE_LAUNCHER[@]}" -l "$(echo -e "$options" | wc -l)" -p "Menu:" } show_system_menu() { local options="Update\nRefresh Mirrors\nPurge Cache" echo -e "$options" | "${BASE_LAUNCHER[@]}" -l "$(echo -e "$options" | wc -l)" -p "System:" } show_tools_menu() { local options="Calculator\nClipboard\nColor Picker\nScreenshot\nSymbols\nTheme" echo -e "$options" | "${BASE_LAUNCHER[@]}" -l "$(echo -e "$options" | wc -l)" -p "Tools:" } show_screenshot_menu() { local options="Fullscreen\nSelection" echo -e "$options" | "${BASE_LAUNCHER[@]}" -l "$(echo -e "$options" | wc -l)" -p "Screenshot:" } handle_update() { local update_script="$UPDATE_COMMAND && echo 'Update completed successfully!' || { echo 'Update failed! Press any key to close...'; read -n 1; }" $TERMINAL --title "System Update" -e bash -c "$update_script" } handle_refresh_mirrors() { local mirror_script="sudo /usr/bin/reflector -c US -a 12 --sort rate --save /etc/pacman.d/mirrorlist && echo 'Mirrors refreshed successfully!' || { echo 'Mirror refresh failed! Press any key to close...'; read -n 1; }" $TERMINAL --title "Refresh Mirrors" -e bash -c "$mirror_script" } handle_purge_cache() { local purge_script="systemctl start paccache.service && systemctl start yaycache.service && localepurge && echo 'Cache purged successfully!' || { echo 'Cache purge failed! Press any key to close...'; read -n 1; }" $TERMINAL --title "Purge Cache" -e bash -c "$purge_script" } handle_calculator() { rofi -show calc -no-show-match -no-sort -i -theme-str 'window {width: 20%; height: 10%;}' } handle_clipboard() { clipcat-menu } handle_colorpicker() { sleep 0.5 hyprpicker 2>/dev/null | wl-copy } handle_screenshot() { local screenshot_type screenshot_type=$(show_screenshot_menu) case "$screenshot_type" in "Fullscreen") sleep 0.5 local filename="$(date +%Y%m%d-%H%M%S).png" local current_monitor current_monitor=$(hyprctl cursorpos -j | jq -r '. as $cursor | hyprctl monitors -j | .[] | select(.x <= $cursor.x and $cursor.x < (.x + .width) and .y <= $cursor.y and $cursor.y < (.y + .height)) | .name' 2>/dev/null || hyprctl monitors -j | jq -r '.[0].name') grim -o "$current_monitor" "$HOME/Pictures/Screenshots/$filename" wl-copy < "$HOME/Pictures/Screenshots/$filename" notify-send "Saved $filename" ;; "Selection") sleep 0.5 local filename="$(date +%Y%m%d-%H%M%S).png" if slurp | grim -g - "$HOME/Pictures/Screenshots/$filename"; then wl-copy < "$HOME/Pictures/Screenshots/$filename" notify-send "Saved $filename" else return 0 fi ;; "") return 0 ;; *) return 1 ;; esac } handle_symbols() { rofi -modi "emoji:rofimoji" -show emoji -i -theme-str 'window {width: 20%; height: 12%;}' } handle_passwords() { passwordmenu } handle_theme() { if [[ -z "$THEME_LIST" ]]; then log "No themes available" return 1 fi MONITORS=$(hyprctl monitors -j | jq -r '.[].name') local monitor1 monitor1=$(echo "$MONITORS" | head -n 1) local monitor2 monitor2=$(echo "$MONITORS" | tail -n 1) local wallpaper_mode wallpaper_mode=$(echo -e "Single\nDual" | "${BASE_LAUNCHER[@]}" -l 2 -p "Wallpaper:") if [[ -z "$wallpaper_mode" ]]; then return 0 fi local theme_count theme_count=$(echo "$THEME_LIST" | wc -l) local selected_theme selected_theme=$(echo "$THEME_LIST" | "${BASE_LAUNCHER[@]}" -l "$theme_count" -p "$CURRENT_THEME:") if [[ -n "$selected_theme" && "$selected_theme" != "$CURRENT_THEME" ]]; then if [[ "$wallpaper_mode" == "Dual" ]]; then local second_wallpaper second_wallpaper=$(echo "$THEME_LIST" | "${BASE_LAUNCHER[@]}" -l "$theme_count" -p "Second Wallpaper:") if [[ -z "$second_wallpaper" ]]; then return 0 fi wpg -s "$selected_theme" -n || { log "Failed to set theme: $selected_theme" return 1 } local wallpaper_conf="$XDG_CONFIG_HOME/hypr/wallpaper.conf" sed -i "s|exec-once = swaybg -o $monitor1.*|exec-once = swaybg -o $monitor1 -m fill -i \$XDG_CONFIG_HOME/wpg/wallpapers/$selected_theme|" "$wallpaper_conf" sed -i "s|exec-once = swaybg -o $monitor2.*|exec-once = swaybg -o $monitor2 -m fill -i \$XDG_CONFIG_HOME/wpg/wallpapers/$second_wallpaper|" "$wallpaper_conf" pkill swaybg swaybg -o "$monitor1" -i "$XDG_CONFIG_HOME/wpg/wallpapers/$selected_theme" -m fill & swaybg -o "$monitor2" -i "$XDG_CONFIG_HOME/wpg/wallpapers/$second_wallpaper" -m fill & log "Successfully set dual wallpapers: $selected_theme ($monitor1) and $second_wallpaper ($monitor2)" else wpg -s "$selected_theme" || { log "Failed to set theme: $selected_theme" return 1 } local wallpaper_conf="$XDG_CONFIG_HOME/hypr/wallpaper.conf" sed -i "s|exec-once = swaybg -o $monitor1.*|exec-once = swaybg -o $monitor1 -m fill -i \$XDG_CONFIG_HOME/wpg/wallpapers/\$(wpg -c)|" "$wallpaper_conf" sed -i "s|exec-once = swaybg -o $monitor2.*|exec-once = swaybg -o $monitor2 -m fill -i \$XDG_CONFIG_HOME/wpg/wallpapers/\$(wpg -c)|" "$wallpaper_conf" pkill swaybg swaybg -o "$monitor1" -i "$XDG_CONFIG_HOME/wpg/wallpapers/$selected_theme" -m fill & swaybg -o "$monitor2" -i "$XDG_CONFIG_HOME/wpg/wallpapers/$selected_theme" -m fill & log "Successfully changed theme to: $selected_theme" fi fi } handle_system() { local system_action system_action=$(show_system_menu) case "$system_action" in "Update") handle_update ;; "Refresh Mirrors") handle_refresh_mirrors ;; "Purge Cache") handle_purge_cache ;; "") return 0 ;; *) log "Unknown system action: $system_action" return 1 ;; esac } handle_tools() { local tools_action tools_action=$(show_tools_menu) case "$tools_action" in "Calculator") handle_calculator ;; "Clipboard") handle_clipboard ;; "Color Picker") handle_colorpicker ;; "Screenshot") handle_screenshot ;; "Symbols") handle_symbols ;; "Theme") handle_theme ;; "") return 0 ;; *) log "Unknown tools action: $tools_action" return 1 ;; esac } main() { local action action=$(show_main_menu) case "$action" in "Services") uuctl ;; "System") handle_system ;; "Tools") handle_tools ;; "Password") handle_passwords ;; "") exit 0 ;; *) log "Unknown action: $action" exit 1 ;; esac } if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi