diff options
| author | Pinapelz <yukais@pinapelz.com> | 2026-03-30 21:58:55 -0700 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2026-03-30 21:58:55 -0700 |
| commit | 4acf85db722ebe7e019e7427436083b3b9f4959e (patch) | |
| tree | 6d5b416ad605730a6d573d1b4178c7676dc8a015 /config/hypr/scripts | |
| parent | 89e10cd0c0331fc727889d41e34309db1fb5735f (diff) | |
| parent | e4b9059d346e6a6dbd6216cd1fb5e41085bb6e7b (diff) | |
Merge remote-tracking branch 'upstream/main'
Diffstat (limited to 'config/hypr/scripts')
70 files changed, 1741 insertions, 222 deletions
diff --git a/config/hypr/scripts/AirplaneMode.sh b/config/hypr/scripts/AirplaneMode.sh index ba692f98..21aa04a8 100755 --- a/config/hypr/scripts/AirplaneMode.sh +++ b/config/hypr/scripts/AirplaneMode.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Airplane Mode. Turning on or off all wifi using rfkill. notif="$HOME/.config/swaync/images/ja.png" diff --git a/config/hypr/scripts/Animations.sh b/config/hypr/scripts/Animations.sh index ff3a6e45..5fb77750 100755 --- a/config/hypr/scripts/Animations.sh +++ b/config/hypr/scripts/Animations.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For applying Animations from different users # Check if rofi is already running diff --git a/config/hypr/scripts/Battery.sh b/config/hypr/scripts/Battery.sh index 2baed6ca..c42a4dac 100755 --- a/config/hypr/scripts/Battery.sh +++ b/config/hypr/scripts/Battery.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash - +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== for i in {0..3}; do if [ -f /sys/class/power_supply/BAT$i/capacity ]; then battery_level=$(cat /sys/class/power_supply/BAT$i/status) diff --git a/config/hypr/scripts/Brightness.sh b/config/hypr/scripts/Brightness.sh index e0091417..bf0f4bf1 100755 --- a/config/hypr/scripts/Brightness.sh +++ b/config/hypr/scripts/Brightness.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script for Monitor backlights (if supported) using brightnessctl iDIR="$HOME/.config/swaync/icons" diff --git a/config/hypr/scripts/BrightnessKbd.sh b/config/hypr/scripts/BrightnessKbd.sh index f9015fe0..5bd09a78 100755 --- a/config/hypr/scripts/BrightnessKbd.sh +++ b/config/hypr/scripts/BrightnessKbd.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script for keyboard backlights (if supported) using brightnessctl iDIR="$HOME/.config/swaync/icons" diff --git a/config/hypr/scripts/ChangeBlur.sh b/config/hypr/scripts/ChangeBlur.sh index 084af2cb..10b5914e 100755 --- a/config/hypr/scripts/ChangeBlur.sh +++ b/config/hypr/scripts/ChangeBlur.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script for changing blurs on the fly notif="$HOME/.config/swaync/images" diff --git a/config/hypr/scripts/ChangeLayout.sh b/config/hypr/scripts/ChangeLayout.sh index 499fa1e2..f52d783f 100755 --- a/config/hypr/scripts/ChangeLayout.sh +++ b/config/hypr/scripts/ChangeLayout.sh @@ -1,39 +1,112 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## -# for changing Hyprland Layouts (Master or Dwindle) on the fly +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# for changing Hyprland Layouts (master, dwindle, scrolling, monocle) on the fly notif="$HOME/.config/swaync/images/ja.png" -LAYOUT=$(hyprctl -j getoption general:layout | jq '.str' | sed 's/"//g') +layouts=(master dwindle scrolling monocle) -# Reverse layout value to reuse toggle logic. So layouts don't get swapped initially. -if [ "$1" = "init" ]; then - if [ "$LAYOUT" = "master" ]; then - LAYOUT="dwindle" - else - LAYOUT="master" - fi -fi +get_layout() { + hyprctl -j getoption general:layout | jq -r '.str' +} -case $LAYOUT in -"master") - hyprctl keyword general:layout dwindle - hyprctl keyword unbind SUPER,J - hyprctl keyword unbind SUPER,K - hyprctl keyword bind SUPER,J,cyclenext - hyprctl keyword bind SUPER,K,cyclenext,prev - hyprctl keyword bind SUPER,O,togglesplit - notify-send -e -u low -i "$notif" " Dwindle Layout" - ;; -"dwindle") - hyprctl keyword general:layout master - hyprctl keyword unbind SUPER,J - hyprctl keyword unbind SUPER,K +next_layout() { + local current="$1" + local i + for i in "${!layouts[@]}"; do + if [[ "${layouts[i]}" == "$current" ]]; then + echo "${layouts[((i + 1) % ${#layouts[@]})]}" + return + fi + done + echo "${layouts[0]}" +} + +set_layout() { + local target="$1" + + hyprctl keyword general:layout "$target" + hyprctl keyword unbind SUPER,j + hyprctl keyword unbind SUPER,k + hyprctl keyword unbind SUPER,left + hyprctl keyword unbind SUPER,right + hyprctl keyword unbind SUPER,up + hyprctl keyword unbind SUPER,down hyprctl keyword unbind SUPER,O - hyprctl keyword bind SUPER,J,layoutmsg,cyclenext - hyprctl keyword bind SUPER,K,layoutmsg,cycleprev - notify-send -e -u low -i "$notif" " Master Layout" - ;; -*) ;; + hyprctl keyword unbind SUPER_SHIFT,M + + case "$target" in + "dwindle") + hyprctl keyword bind SUPER,j,cyclenext + hyprctl keyword bind SUPER,k,cyclenext,prev + hyprctl keyword bind SUPER,left,cyclenext,prev + hyprctl keyword bind SUPER,up,cyclenext,prev + hyprctl keyword bind SUPER,right,cyclenext + hyprctl keyword bind SUPER,down,cyclenext + hyprctl keyword bind SUPER,O,layoutmsg,togglesplit + notify-send -e -u low -i "$notif" " Dwindle Layout" + ;; + "scrolling") + hyprctl keyword bind SUPER,j,cyclenext + hyprctl keyword bind SUPER,k,cyclenext,prev + hyprctl keyword bind SUPER,left,cyclenext,prev + hyprctl keyword bind SUPER,up,cyclenext,prev + hyprctl keyword bind SUPER,right,cyclenext + hyprctl keyword bind SUPER,down,cyclenext + notify-send -e -u low -i "$notif" " Scrolling Layout" + ;; + "monocle") + hyprctl keyword bind SUPER,j,layoutmsg,cyclenext + hyprctl keyword bind SUPER,k,layoutmsg,cycleprev + hyprctl keyword bind SUPER,left,layoutmsg,cycleprev + hyprctl keyword bind SUPER,up,layoutmsg,cycleprev + hyprctl keyword bind SUPER,right,layoutmsg,cyclenext + hyprctl keyword bind SUPER,down,layoutmsg,cyclenext + hyprctl keyword bind SUPER_SHIFT,M,layoutmsg,swapnext + notify-send -e -u low -i "$notif" " Monocle Layout" + ;; + "master") + hyprctl keyword bind SUPER,j,layoutmsg,cyclenext + hyprctl keyword bind SUPER,k,layoutmsg,cycleprev + hyprctl keyword bind SUPER,left,movefocus,l + hyprctl keyword bind SUPER,right,movefocus,r + hyprctl keyword bind SUPER,up,movefocus,u + hyprctl keyword bind SUPER,down,movefocus,d + notify-send -e -u low -i "$notif" " Master Layout" + ;; + *) + hyprctl keyword bind SUPER,j,layoutmsg,cyclenext + hyprctl keyword bind SUPER,k,layoutmsg,cycleprev + hyprctl keyword bind SUPER,left,movefocus,l + hyprctl keyword bind SUPER,right,movefocus,r + hyprctl keyword bind SUPER,up,movefocus,u + hyprctl keyword bind SUPER,down,movefocus,d + echo "Unknown layout: $target" >&2 + return 1 + ;; + esac +} +current="$(get_layout)" +arg="${1:-toggle}" + +case "$arg" in +init) + set_layout "$current" + ;; +toggle|next) + set_layout "$(next_layout "$current")" + ;; +master|dwindle|scrolling|monocle) + set_layout "$arg" + ;; +*) + echo "Usage: $(basename "$0") [toggle|next|init|master|dwindle|scrolling|monocle]" >&2 + exit 1 + ;; esac diff --git a/config/hypr/scripts/ClipManager.sh b/config/hypr/scripts/ClipManager.sh index d08fd8f4..e3fbd066 100755 --- a/config/hypr/scripts/ClipManager.sh +++ b/config/hypr/scripts/ClipManager.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Clipboard Manager. This script uses cliphist, rofi, and wl-copy. # Variables diff --git a/config/hypr/scripts/DarkLight.sh b/config/hypr/scripts/DarkLight.sh index 62bad62b..5b1cc3e7 100755 --- a/config/hypr/scripts/DarkLight.sh +++ b/config/hypr/scripts/DarkLight.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -## /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For Dark and Light switching # Note: Scripts are looking for keywords Light or Dark except for wallpapers as the are in a separate directories @@ -12,6 +17,8 @@ hypr_config_path="$HOME/.config/hypr" swaync_style="$HOME/.config/swaync/style.css" ags_style="$HOME/.config/ags/user/style.css" SCRIPTSDIR="$HOME/.config/hypr/scripts" +# shellcheck source=/dev/null +. "$SCRIPTSDIR/WallpaperCmd.sh" notif="$HOME/.config/swaync/images/bell.png" wallust_rofi="$HOME/.config/wallust/templates/colors-rofi.rasi" @@ -31,11 +38,11 @@ for pid in waybar rofi swaync ags swaybg; do done -# Initialize swww if needed -swww query || swww-daemon --format xrgb +# Initialize wallpaper daemon if needed +"$WWW_CMD" query || "$WWW_DAEMON" "${WWW_DAEMON_ARGS[@]}" # Set swww options -swww="swww img" +swww="$WWW_CMD img" effect="--transition-bezier .43,1.19,1,.4 --transition-fps 60 --transition-type grow --transition-pos 0.925,0.977 --transition-duration 2" # Determine current theme mode diff --git a/config/hypr/scripts/Distro_update.sh b/config/hypr/scripts/Distro_update.sh index b4b8e90c..b9bcae71 100755 --- a/config/hypr/scripts/Distro_update.sh +++ b/config/hypr/scripts/Distro_update.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Simple bash script to check and will try to update your system # Local Paths diff --git a/config/hypr/scripts/Dropterminal.sh b/config/hypr/scripts/Dropterminal.sh index 2a9eb5b1..81c0f157 100755 --- a/config/hypr/scripts/Dropterminal.sh +++ b/config/hypr/scripts/Dropterminal.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # # Made and brought to by Kiran George # /* -- ⨠https://github.com/SherLock707 ⨠-- */ ## @@ -12,7 +17,13 @@ DEBUG=false SPECIAL_WS="special:scratchpad" +SPECIAL_NAME="${SPECIAL_WS#special:}" ADDR_FILE="/tmp/dropdown_terminal_addr" +STATE_FILE="/tmp/dropdown_terminal_state" +LOCK_FILE="/tmp/dropdown_terminal_lock" +LAST_TOGGLE_FILE="/tmp/dropdown_terminal_last_toggle" +MIN_TOGGLE_INTERVAL_MS=250 +DROPDOWN_KITTY_CLASS="kitty-dropterm" # Dropdown size and position configuration (percentages) WIDTH_PERCENT=65 # Width as percentage of screen width @@ -31,12 +42,63 @@ if [ "$1" = "-d" ]; then fi TERMINAL_CMD="$1" +if [[ "$TERMINAL_CMD" == kitty* ]] && [[ "$TERMINAL_CMD" != *"--class"* ]] && [[ "$TERMINAL_CMD" != *"--name"* ]] && [[ "$TERMINAL_CMD" != *"--app-id"* ]]; then + TERMINAL_CMD="$TERMINAL_CMD --class $DROPDOWN_KITTY_CLASS" +fi + +# Ensure only one instance runs at a time (prevents overlapping animations) +exec 9>"$LOCK_FILE" +flock -n 9 || exit 0 + +# Debounce rapid toggles +now_ms="" +if date +%s%3N >/dev/null 2>&1; then + now_ms=$(date +%s%3N) +else + now_ms=$(( $(date +%s) * 1000 )) +fi +if [ -f "$LAST_TOGGLE_FILE" ]; then + last_ms=$(cat "$LAST_TOGGLE_FILE" 2>/dev/null || echo 0) + if [ -n "$last_ms" ] && [ "$last_ms" -ge 0 ] 2>/dev/null; then + delta_ms=$((now_ms - last_ms)) + if [ "$delta_ms" -lt "$MIN_TOGGLE_INTERVAL_MS" ] 2>/dev/null; then + if [ "$DEBUG" = true ]; then + echo "Toggle debounced (${delta_ms}ms < ${MIN_TOGGLE_INTERVAL_MS}ms)" >&2 + fi + exit 0 + fi + fi +fi +echo "$now_ms" >"$LAST_TOGGLE_FILE" # Debug echo function debug_echo() { if [ "$DEBUG" = true ]; then - echo "$@" + echo "$@" >&2 + fi +} + +# Resolve terminal address, recovering by class if needed +resolve_terminal_address() { + local addr + addr=$(get_terminal_address) + if [ -n "$addr" ] && window_exists "$addr"; then + echo "$addr" + return 0 + fi + + local recovered + recovered=$(find_terminal_by_class) + if [ -n "$recovered" ] && [ "$recovered" != "null" ]; then + local mon_name + mon_name=$(get_monitor_info | awk '{print $6}') + echo "$recovered $mon_name" >"$ADDR_FILE" + echo "$recovered" + return 0 fi + + rm -f "$ADDR_FILE" + return 1 } # Validate input @@ -62,6 +124,28 @@ get_window_geometry() { hyprctl clients -j | jq -r --arg ADDR "$addr" '.[] | select(.address == $ADDR) | "\(.at[0]) \(.at[1]) \(.size[0]) \(.size[1])"' } +# Function to check if window is currently hidden off-screen +window_is_hidden() { + local addr="$1" + local y + y=$(hyprctl clients -j 2>/dev/null | jq -r --arg ADDR "$addr" '.[] | select(.address == $ADDR) | .at[1]' 2>/dev/null) + if [[ "$y" =~ ^-?[0-9]+$ ]] && [ "$y" -lt 0 ]; then + return 0 + fi + return 1 +} + +# State helpers +get_hidden_state() { + if [ -f "$STATE_FILE" ]; then + cat "$STATE_FILE" 2>/dev/null + fi +} + +set_hidden_state() { + echo "$1" >"$STATE_FILE" +} + # Function to animate window slide down (show) animate_slide_down() { local addr="$1" @@ -121,7 +205,30 @@ animate_slide_up() { # Function to get monitor info including scale and name of focused monitor get_monitor_info() { - local monitor_data=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x) \(.y) \(.width) \(.height) \(.scale) \(.name)"') + local monitor_data + monitor_data=$(hyprctl monitors -j 2>/dev/null | jq -er 'map(select(.focused == true)) | .[0] | "\(.x) \(.y) \(.width) \(.height) \(.scale) \(.name)"' 2>/dev/null) || monitor_data="" + if [ -z "$monitor_data" ]; then + # Fallback for older Hyprland without -j support + monitor_data=$(hyprctl monitors 2>/dev/null | awk ' + /^Monitor / {name=$2; sub(/\(.*/, "", name); x=y=w=h=scale=""; focused="no"} + / at / { + # e.g. "1920x1080@74.97300 at 0x0" + split($1, res, "x"); w=res[1]; split(res[2], tmp, "@"); h=tmp[1] + split($4, pos, "x"); x=pos[1]; y=pos[2] + } + /scale:/ {scale=$2} + /focused:/ {focused=$2} + /^$/ { + if (focused=="yes" && x!="" && y!="" && w!="" && h!="" && scale!="" && name!="") { + print x, y, w, h, scale, name; exit + } + } + END { + if (focused=="yes" && x!="" && y!="" && w!="" && h!="" && scale!="" && name!="") { + print x, y, w, h, scale, name + } + }') + fi if [ -z "$monitor_data" ] || [[ "$monitor_data" =~ ^null ]]; then debug_echo "Error: Could not get focused monitor information" return 1 @@ -129,6 +236,7 @@ get_monitor_info() { echo "$monitor_data" } + # Function to calculate dropdown position with proper scaling and centering calculate_dropdown_position() { local monitor_info=$(get_monitor_info) @@ -148,6 +256,13 @@ calculate_dropdown_position() { debug_echo "Monitor info: x=$mon_x, y=$mon_y, width=$mon_width, height=$mon_height, scale=$mon_scale" + # Validate numeric fields + if ! [[ "$mon_x" =~ ^-?[0-9]+$ && "$mon_y" =~ ^-?[0-9]+$ && "$mon_width" =~ ^[0-9]+$ && "$mon_height" =~ ^[0-9]+$ ]]; then + debug_echo "Invalid monitor info format, using fallback values" + echo "100 100 800 600 fallback-monitor" + return 1 + fi + # Validate scale value and provide fallback if [ -z "$mon_scale" ] || [ "$mon_scale" = "null" ] || [ "$mon_scale" = "0" ]; then debug_echo "Invalid scale value, using 1.0 as fallback" @@ -207,6 +322,12 @@ get_terminal_address() { fi } +# Try to find an existing dropdown terminal by class (kitty only) +find_terminal_by_class() { + hyprctl clients -j 2>/dev/null | jq -r --arg CLASS "$DROPDOWN_KITTY_CLASS" \ + '.[] | select(.class == $CLASS) | .address' | head -1 +} + # Function to get stored monitor name get_terminal_monitor() { if [ -f "$ADDR_FILE" ] && [ -s "$ADDR_FILE" ]; then @@ -218,22 +339,48 @@ get_terminal_monitor() { terminal_exists() { local addr=$(get_terminal_address) if [ -n "$addr" ]; then - hyprctl clients -j | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR)' >/dev/null 2>&1 + hyprctl clients -j 2>/dev/null | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR)' >/dev/null 2>&1 else return 1 fi } -# Function to check if terminal is in special workspace -terminal_in_special() { - local addr=$(get_terminal_address) +# Function to check if a window address exists +window_exists() { + local addr="$1" + if [ -n "$addr" ]; then + hyprctl clients -j 2>/dev/null | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR)' >/dev/null 2>&1 + else + return 1 + fi +} + + +# Function to check if window is pinned +window_is_pinned() { + local addr="$1" if [ -n "$addr" ]; then - hyprctl clients -j | jq -e --arg ADDR "$addr" 'any(.[]; .address == $ADDR and .workspace.name == "special:scratchpad")' >/dev/null 2>&1 + hyprctl clients -j 2>/dev/null | jq -e --arg ADDR "$addr" '.[] | select(.address == $ADDR) | .pinned == true' >/dev/null 2>&1 else return 1 fi } +# Ensure pin state without toggling unexpectedly +ensure_pinned() { + local addr="$1" + if ! window_is_pinned "$addr"; then + hyprctl dispatch pin "address:$addr" >/dev/null 2>&1 + fi +} + +ensure_unpinned() { + local addr="$1" + if window_is_pinned "$addr"; then + hyprctl dispatch pin "address:$addr" >/dev/null 2>&1 + fi +} + # Function to spawn terminal and capture its address spawn_terminal() { debug_echo "Creating new dropdown terminal with command: $TERMINAL_CMD" @@ -288,12 +435,13 @@ spawn_terminal() { # Small delay to ensure it's properly in special workspace sleep 0.2 - - # Now bring it back with the same animation as subsequent shows - # Use movetoworkspacesilent to avoid affecting workspace history + # Move to current workspace but start hidden off-screen hyprctl dispatch movetoworkspacesilent "$CURRENT_WS,address:$new_addr" - hyprctl dispatch pin "address:$new_addr" - animate_slide_down "$new_addr" "$target_x" "$target_y" "$width" "$height" + ensure_pinned "$new_addr" + hyprctl dispatch resizewindowpixel "exact $width $height,address:$new_addr" >/dev/null 2>&1 + local off_y=$((target_y - height - 200)) + hyprctl dispatch movewindowpixel "exact $target_x $off_y,address:$new_addr" >/dev/null 2>&1 + set_hidden_state "hidden" return 0 fi @@ -303,8 +451,9 @@ spawn_terminal() { } # Main logic -if terminal_exists; then - TERMINAL_ADDR=$(get_terminal_address) +TERMINAL_ADDR=$(resolve_terminal_address) + +if [ -n "$TERMINAL_ADDR" ]; then debug_echo "Found existing terminal: $TERMINAL_ADDR" focused_monitor=$(get_monitor_info | awk '{print $6}') dropdown_monitor=$(get_terminal_monitor) @@ -324,8 +473,9 @@ if terminal_exists; then echo "$TERMINAL_ADDR $monitor_name" >"$ADDR_FILE" fi - if terminal_in_special; then - debug_echo "Bringing terminal from scratchpad with slide down animation" + hidden_state=$(get_hidden_state) + if [ "$hidden_state" = "hidden" ] || [ -z "$hidden_state" ] || window_is_hidden "$TERMINAL_ADDR"; then + debug_echo "Bringing terminal from hidden position with slide down animation" # Calculate target position pos_info=$(calculate_dropdown_position) @@ -334,17 +484,16 @@ if terminal_exists; then width=$(echo $pos_info | cut -d' ' -f3) height=$(echo $pos_info | cut -d' ' -f4) - # Use movetoworkspacesilent to avoid affecting workspace history - hyprctl dispatch movetoworkspacesilent "$CURRENT_WS,address:$TERMINAL_ADDR" - hyprctl dispatch pin "address:$TERMINAL_ADDR" + ensure_pinned "$TERMINAL_ADDR" # Set size and animate slide down hyprctl dispatch resizewindowpixel "exact $width $height,address:$TERMINAL_ADDR" animate_slide_down "$TERMINAL_ADDR" "$target_x" "$target_y" "$width" "$height" hyprctl dispatch focuswindow "address:$TERMINAL_ADDR" + set_hidden_state "shown" else - debug_echo "Hiding terminal to scratchpad with slide up animation" + debug_echo "Hiding terminal off-screen with slide up animation" # Get current geometry for animation geometry=$(get_window_geometry "$TERMINAL_ADDR") @@ -359,14 +508,16 @@ if terminal_exists; then # Animate slide up first animate_slide_up "$TERMINAL_ADDR" "$curr_x" "$curr_y" "$curr_width" "$curr_height" - # Small delay then move to special workspace and unpin - sleep 0.1 - hyprctl dispatch pin "address:$TERMINAL_ADDR" # Unpin (toggle) - hyprctl dispatch movetoworkspacesilent "$SPECIAL_WS,address:$TERMINAL_ADDR" + # Move off-screen after animation + off_y=$((curr_y - curr_height - 200)) + hyprctl dispatch movewindowpixel "exact $curr_x $off_y,address:$TERMINAL_ADDR" >/dev/null 2>&1 + ensure_unpinned "$TERMINAL_ADDR" + set_hidden_state "hidden" else - debug_echo "Could not get window geometry, moving to scratchpad without animation" - hyprctl dispatch pin "address:$TERMINAL_ADDR" - hyprctl dispatch movetoworkspacesilent "$SPECIAL_WS,address:$TERMINAL_ADDR" + debug_echo "Could not get window geometry, moving off-screen without animation" + hyprctl dispatch movewindowpixel "exact 0 -1000,address:$TERMINAL_ADDR" >/dev/null 2>&1 + ensure_unpinned "$TERMINAL_ADDR" + set_hidden_state "hidden" fi fi else diff --git a/config/hypr/scripts/ExternalBrightness.sh b/config/hypr/scripts/ExternalBrightness.sh new file mode 100755 index 00000000..29c1b238 --- /dev/null +++ b/config/hypr/scripts/ExternalBrightness.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# External monitor brightness via ddcutil + +set -u + +step=10 +vcp_code=10 + +usage() { + cat <<'EOF' +Usage: ExternalBrightness.sh [--get|--inc|--dec|--set N] [--display N] +Env: + DDCUTIL_DISPLAY Optional display number passed to ddcutil --display + DDCUTIL_OPTS Extra options passed to ddcutil (e.g. "--sleep-multiplier 0.2") +EOF +} + +ddcutil_cmd() { + local display_arg=() + local display="${DDCUTIL_DISPLAY:-}" + if [[ -n "${display}" ]]; then + display_arg+=(--display "${display}") + fi + ddcutil ${DDCUTIL_OPTS:-} "${display_arg[@]}" "$@" +} + +get_brightness() { + # Example output: "VCP code 0x10 (Brightness): current value = 50, max value = 100" + local line + if ! line="$(ddcutil_cmd getvcp "${vcp_code}" 2>/dev/null | tail -n 1)"; then + return 1 + fi + local current max + current="$(printf "%s" "${line}" | sed -n 's/.*current value = \([0-9]\+\).*/\1/p')" + max="$(printf "%s" "${line}" | sed -n 's/.*max value = \([0-9]\+\).*/\1/p')" + [[ -n "${current}" && -n "${max}" ]] || return 1 + printf "%s %s\n" "${current}" "${max}" +} + +set_brightness() { + local value="$1" + ddcutil_cmd setvcp "${vcp_code}" "${value}" >/dev/null 2>&1 +} + +json_output() { + local current max percent icon + if ! read -r current max < <(get_brightness); then + printf '{"text":"ķ° N/A","tooltip":"External brightness unavailable (load i2c-dev, allow i2c access)","class":"brightness-external-off"}\n' + return 0 + fi + percent=$(( current * 100 / max )) + if (( percent >= 80 )); then + icon="ķ° " + elif (( percent >= 60 )); then + icon="ķ°" + elif (( percent >= 40 )); then + icon="ķ°" + elif (( percent >= 20 )); then + icon="ķ°" + else + icon="î" + fi + printf '{"text":"%s %s%%","tooltip":"External display brightness: %s%%","class":"brightness-external"}\n' "${icon}" "${percent}" "${percent}" +} + +case "${1:-}" in + --get|"") + json_output + ;; + --inc|--dec) + read -r current max < <(get_brightness) || exit 1 + delta=$step + [[ "$1" == "--dec" ]] && delta=$(( -step )) + new=$(( current + delta )) + (( new < 5 )) && new=5 + (( new > max )) && new="${max}" + set_brightness "${new}" + json_output + ;; + --set) + [[ -n "${2:-}" ]] || { usage; exit 1; } + set_brightness "${2}" + json_output + ;; + --display) + [[ -n "${2:-}" ]] || { usage; exit 1; } + DDCUTIL_DISPLAY="${2}" shift 2 + "${0}" "${@:-"--get"}" + ;; + -h|--help) + usage + ;; + *) + usage + exit 1 + ;; +esac diff --git a/config/hypr/scripts/Float-all-Windows.sh b/config/hypr/scripts/Float-all-Windows.sh new file mode 100755 index 00000000..e658cabb --- /dev/null +++ b/config/hypr/scripts/Float-all-Windows.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== + +ws=$(hyprctl activeworkspace -j | jq -r .id) +hyprctl clients -j | jq -r --arg ws "$ws" '.[] | select(.workspace.id == ($ws|tonumber)) | .address' | xargs -r -I {} hyprctl dispatch togglefloating address:{} diff --git a/config/hypr/scripts/GameMode.sh b/config/hypr/scripts/GameMode.sh index a28a27fb..9c5b8264 100755 --- a/config/hypr/scripts/GameMode.sh +++ b/config/hypr/scripts/GameMode.sh @@ -1,9 +1,16 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Game Mode. Turning off all animations notif="$HOME/.config/swaync/images/ja.png" SCRIPTSDIR="$HOME/.config/hypr/scripts" +# shellcheck source=/dev/null +. "$SCRIPTSDIR/WallpaperCmd.sh" HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}') @@ -17,13 +24,13 @@ if [ "$HYPRGAMEMODE" = 1 ] ; then keyword general:border_size 1;\ keyword decoration:rounding 0" - hyprctl keyword "windowrule opacity 1 override 1 override 1 override, ^(.*)$" - swww kill +\thyprctl keyword "windowrule opacity 1 override 1 override 1 override, ^(.*)$" + "$WWW_CMD" kill notify-send -e -u low -i "$notif" " Gamemode:" " enabled" sleep 0.1 exit else - swww-daemon --format xrgb && swww img "$HOME/.config/rofi/.current_wallpaper" & +\t"$WWW_DAEMON" "${WWW_DAEMON_ARGS[@]}" && "$WWW_CMD" img "$HOME/.config/rofi/.current_wallpaper" & sleep 0.1 ${SCRIPTSDIR}/WallustSwww.sh sleep 0.5 diff --git a/config/hypr/scripts/Ghostty_themes.sh b/config/hypr/scripts/Ghostty_themes.sh new file mode 100755 index 00000000..a69f246e --- /dev/null +++ b/config/hypr/scripts/Ghostty_themes.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# Ghostty theme selector + +config_file="$HOME/.config/ghostty/config" +iDIR="$HOME/.config/swaync/images" +rofi_theme_primary="$HOME/.config/rofi/config-ghostty-theme.rasi" +rofi_theme_fallback="$HOME/.config/rofi/config-edit.rasi" + +notify_user() { + local icon="$1" + local title="$2" + local body="$3" + if [[ -n "$icon" && -f "$icon" ]]; then + notify-send -u low -i "$icon" "$title" "$body" + else + notify-send -u low "$title" "$body" + fi +} + +if [[ ! -f "$config_file" ]]; then + notify_user "$iDIR/error.png" "Ghostty Theme" "Config not found: $config_file" + exit 1 +fi + +rofi_config_args=() +if [[ -f "$rofi_theme_primary" ]]; then + rofi_config_args=(-config "$rofi_theme_primary") +elif [[ -f "$rofi_theme_fallback" ]]; then + rofi_config_args=(-config "$rofi_theme_fallback") +fi + +current_theme=$( + awk -F'=' '/^[[:space:]]*theme[[:space:]]*=/ { + val=$2 + sub(/^[[:space:]]+/, "", val) + sub(/[[:space:]]+$/, "", val) + gsub(/^"|"$/, "", val) + print val + exit + }' "$config_file" +) + +mapfile -t available_theme_names < <( + awk -F'=' '/^[[:space:]]*#[[:space:]]*theme[[:space:]]*=/ { + val=$2 + sub(/^[[:space:]]+/, "", val) + sub(/[[:space:]]+$/, "", val) + gsub(/^"|"$/, "", val) + print val + }' "$config_file" +) + +if [[ ${#available_theme_names[@]} -eq 0 ]]; then + notify_user "$iDIR/error.png" "Ghostty Theme" "No commented themes found in $config_file" + exit 1 +fi + +menu_entries=() +if [[ -n "$current_theme" ]]; then + menu_entries+=("Current: $current_theme") +fi +for t in "${available_theme_names[@]}"; do + menu_entries+=("$t") +done + +choice=$( + printf "%s\n" "${menu_entries[@]}" | + rofi -i -dmenu -p "Ghostty Theme" "${rofi_config_args[@]}" -mesg "Select a theme to apply" +) + +[[ -z "$choice" ]] && exit 0 + +if [[ "$choice" == "Current: "* ]]; then + exit 0 +fi + +selected_theme="$choice" + +if [[ -n "$current_theme" && "$selected_theme" == "$current_theme" ]]; then + exit 0 +fi + +format_theme_value() { + if [[ "$1" =~ [[:space:]] ]]; then + printf "\"%s\"" "$1" + else + printf "%s" "$1" + fi +} + +selected_formatted=$(format_theme_value "$selected_theme") + +tmp_file=$(mktemp) +awk -v selected="$selected_theme" -v selected_formatted="$selected_formatted" ' +function trim(s) { sub(/^[[:space:]]+/, "", s); sub(/[[:space:]]+$/, "", s); return s } +function strip_quotes(s) { gsub(/^"|"$/, "", s); return s } +{ + line=$0 + if ($0 ~ /^[[:space:]]*theme[[:space:]]*=/) { + sub(/^[[:space:]]*theme[[:space:]]*=/, "#theme =", line) + print line + next + } + if ($0 ~ /^[[:space:]]*#[[:space:]]*theme[[:space:]]*=/) { + val=$0 + sub(/^[[:space:]]*#[[:space:]]*theme[[:space:]]*=[[:space:]]*/, "", val) + val=trim(val) + val=strip_quotes(val) + if (val == selected) { + print "theme = " selected_formatted + next + } + } + print $0 +}' "$config_file" > "$tmp_file" + +mv "$tmp_file" "$config_file" + +pkill -SIGUSR2 ghostty >/dev/null 2>&1 || true + +notify_user "$iDIR/ja.png" "Ghostty Theme Applied" "$selected_theme" + +exit 0 diff --git a/config/hypr/scripts/Hypridle.sh b/config/hypr/scripts/Hypridle.sh index 4bf6a985..240fec3e 100755 --- a/config/hypr/scripts/Hypridle.sh +++ b/config/hypr/scripts/Hypridle.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # This is for custom version of waybar idle_inhibitor which activates / deactivates hypridle instead PROCESS="hypridle" diff --git a/config/hypr/scripts/Hyprsunset.sh b/config/hypr/scripts/Hyprsunset.sh index 4a2b52f4..52140728 100755 --- a/config/hypr/scripts/Hyprsunset.sh +++ b/config/hypr/scripts/Hyprsunset.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== set -euo pipefail # Hyprsunset toggle + Waybar status helper diff --git a/config/hypr/scripts/KeyBinds.sh b/config/hypr/scripts/KeyBinds.sh index 341f104f..69111047 100755 --- a/config/hypr/scripts/KeyBinds.sh +++ b/config/hypr/scripts/KeyBinds.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # searchable enabled keybinds using rofi (supports bindd descriptions) # kill yad to not interfere with this binds diff --git a/config/hypr/scripts/KeyHints.sh b/config/hypr/scripts/KeyHints.sh index 3916a925..f00837d3 100755 --- a/config/hypr/scripts/KeyHints.sh +++ b/config/hypr/scripts/KeyHints.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # GDK BACKEND. Change to either wayland or x11 if having issues BACKEND=wayland @@ -40,8 +45,8 @@ GDK_BACKEND=$BACKEND yad \ "î¯ ALT mouse scroll up/down " "Desktop Zoom" "Desktop Magnifier" \ "î¯ Alt V" "Clipboard Manager" "(cliphist)" \ "î¯ W" "Choose wallpaper" "(Wallpaper Menu)" \ -"î¯ Shift W" "Choose wallpaper effects" "(imagemagick + swww)" \ -"CTRL ALT W" "Random wallpaper" "(via swww)" \ +"î¯ Shift W" "Choose wallpaper effects" "(imagemagick + awww)" \ +"CTRL ALT W" "Random wallpaper" "(via awww)" \ "î¯ CTRL ALT B" "Hide/UnHide Waybar" "waybar" \ "î¯ CTRL B" "Choose waybar styles" "(waybar styles)" \ "î¯ ALT B" "Choose waybar layout" "(waybar layout)" \ diff --git a/config/hypr/scripts/KeybindsLayoutInit.sh b/config/hypr/scripts/KeybindsLayoutInit.sh index 80bee9d6..f47197af 100755 --- a/config/hypr/scripts/KeybindsLayoutInit.sh +++ b/config/hypr/scripts/KeybindsLayoutInit.sh @@ -1,14 +1,19 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Initialize J/K keybinds so they always cycle windows globally (no layout-specific behavior) # This avoids double-actions when layouts change. set -euo pipefail # Always reset and bind SUPER+J/K the same way on startup -hyprctl keyword unbind SUPER,J || true -hyprctl keyword unbind SUPER,K || true +hyprctl keyword unbind SUPER,j || true +hyprctl keyword unbind SUPER,k || true -# Cycle windows globally: J = next, K = previous -hyprctl keyword bind SUPER,J,cyclenext -hyprctl keyword bind SUPER,K,cyclenext,prev +# Cycle windows globally +hyprctl keyword bind SUPER,j,layoutmsg,cyclenext +hyprctl keyword bind SUPER,k,layoutmsg,cycleprev diff --git a/config/hypr/scripts/KeyboardLayout.sh b/config/hypr/scripts/KeyboardLayout.sh index 926514dd..fe092e7f 100755 --- a/config/hypr/scripts/KeyboardLayout.sh +++ b/config/hypr/scripts/KeyboardLayout.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # This is for changing kb_layouts. Set kb_layouts in "$HOME/.config/hypr/UserConfigs/UserSettings.conf" notif_icon="$HOME/.config/swaync/images/ja.png" diff --git a/config/hypr/scripts/KillActiveProcess.sh b/config/hypr/scripts/KillActiveProcess.sh index ff0628b2..66d6b009 100755 --- a/config/hypr/scripts/KillActiveProcess.sh +++ b/config/hypr/scripts/KillActiveProcess.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Copied from Discord post. Thanks to @Zorg diff --git a/config/hypr/scripts/Kitty_themes.sh b/config/hypr/scripts/Kitty_themes.sh index 8bc6e0f0..3183b20b 100755 --- a/config/hypr/scripts/Kitty_themes.sh +++ b/config/hypr/scripts/Kitty_themes.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ # +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Kitty Themes Source https://github.com/dexpota/kitty-themes # # Define directories and variables @@ -23,6 +28,8 @@ apply_kitty_theme_to_config() { fi local theme_file_path_to_apply if [ "$theme_name_to_apply" = "Set by wallpaper" ]; then + theme_file_path_to_apply="$kitty_themes_DiR/01-Wallust.conf" + elif [ "$theme_name_to_apply" = "Default no color" ]; then theme_file_path_to_apply="$kitty_themes_DiR/00-Default.conf" else theme_file_path_to_apply="$kitty_themes_DiR/$theme_name_to_apply.conf" @@ -80,7 +87,7 @@ fi original_kitty_config_content_backup=$(cat "$kitty_config") mapfile -t available_theme_names < <(find "$kitty_themes_DiR" -maxdepth 1 -name "*.conf" -type f -printf "%f\n" | sed 's/\.conf$//' | grep -v -E '^(00-Default|01-Wallust)$' | sort) -available_theme_names=("Set by wallpaper" "${available_theme_names[@]}") +available_theme_names=("Set by wallpaper" "Default no color" "${available_theme_names[@]}") if [ ${#available_theme_names[@]} -eq 0 ]; then notify_user "$iDIR/error.png" "No Kitty Themes" "No .conf files found in $kitty_themes_DiR." @@ -89,8 +96,10 @@ fi current_selection_index=0 current_active_theme_name=$(awk -F'include ./kitty-themes/|\\.conf' '/^[[:space:]]*include \\.\/kitty-themes\/.*\\.conf/{print $2; exit}' "$kitty_config") -if [ "$current_active_theme_name" = "00-Default" ]; then +if [ "$current_active_theme_name" = "01-Wallust" ]; then current_active_theme_name="Set by wallpaper" +elif [ "$current_active_theme_name" = "00-Default" ]; then + current_active_theme_name="Default no color" fi if [ -n "$current_active_theme_name" ]; then diff --git a/config/hypr/scripts/KooLsDotsUpdate.sh b/config/hypr/scripts/KooLsDotsUpdate.sh index 8ed50f27..887993a5 100755 --- a/config/hypr/scripts/KooLsDotsUpdate.sh +++ b/config/hypr/scripts/KooLsDotsUpdate.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # simple bash script to check if update is available by comparing local version and github version # Local Paths diff --git a/config/hypr/scripts/Kool_Quick_Settings.sh b/config/hypr/scripts/Kool_Quick_Settings.sh index 5081fe72..fcd04998 100755 --- a/config/hypr/scripts/Kool_Quick_Settings.sh +++ b/config/hypr/scripts/Kool_Quick_Settings.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Rofi menu for KooL Hyprland Quick Settings (SUPER SHIFT E) # Updated for UserConfigs/configs separation @@ -193,6 +198,7 @@ Edit System Default Settings --- UTILITIES --- Set SDDM Wallpaper Choose Kitty Terminal Theme +Choose Ghostty Terminal Theme Configure Monitors (nwg-displays) Configure Workspace Rules (nwg-displays) GTK Settings (nwg-look) @@ -230,6 +236,7 @@ main() { "Edit System Default Settings") file="$configs/SystemSettings.conf" ;; "Set SDDM Wallpaper") $scriptsDir/sddm_wallpaper.sh --normal ;; "Choose Kitty Terminal Theme") $scriptsDir/Kitty_themes.sh ;; + "Choose Ghostty Terminal Theme") $scriptsDir/Ghostty_themes.sh ;; "Configure Monitors (nwg-displays)") if ! command -v nwg-displays &>/dev/null; then notify-send -i "$iDIR/error.png" "E-R-R-O-R" "Install nwg-displays first" diff --git a/config/hypr/scripts/LockScreen.sh b/config/hypr/scripts/LockScreen.sh index 548a7652..a7b27ad9 100755 --- a/config/hypr/scripts/LockScreen.sh +++ b/config/hypr/scripts/LockScreen.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For Hyprlock #pidof hyprlock || hyprlock -q diff --git a/config/hypr/scripts/MediaCtrl.sh b/config/hypr/scripts/MediaCtrl.sh index b49a967b..aeabcac9 100755 --- a/config/hypr/scripts/MediaCtrl.sh +++ b/config/hypr/scripts/MediaCtrl.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Playerctl music_icon="$HOME/.config/swaync/icons/music.png" diff --git a/config/hypr/scripts/MonitorProfiles.sh b/config/hypr/scripts/MonitorProfiles.sh index 62213490..78825986 100755 --- a/config/hypr/scripts/MonitorProfiles.sh +++ b/config/hypr/scripts/MonitorProfiles.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For applying Pre-configured Monitor Profiles # Check if rofi is already running diff --git a/config/hypr/scripts/OverviewToggle.sh b/config/hypr/scripts/OverviewToggle.sh index 3fe9ba96..719788da 100755 --- a/config/hypr/scripts/OverviewToggle.sh +++ b/config/hypr/scripts/OverviewToggle.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ # +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Overview toggle wrapper - tries Quickshell first, falls back to AGS set -euo pipefail diff --git a/config/hypr/scripts/Polkit-NixOS.sh b/config/hypr/scripts/Polkit-NixOS.sh index 925deab5..c1e6e0a2 100755 --- a/config/hypr/scripts/Polkit-NixOS.sh +++ b/config/hypr/scripts/Polkit-NixOS.sh @@ -1,6 +1,26 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## -# For NixOS starting of polkit-gnome. Dec 2023, the settings stated in NixOS wiki does not work so have to manual start it +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# For NixOS starting of polkit agents. Prefer xfce4-polkit, fallback to polkit-gnome. + +# Find all xfce4-polkit executables in the Nix store +xfce_polkit_paths=$(find /nix/store -name 'xfce4-polkit' -type f 2>/dev/null) + +for xfce_polkit_path in $xfce_polkit_paths; do + # Extract the directory containing the executable + xfce_polkit_dir=$(dirname "$xfce_polkit_path") + + # Check if the executable is valid and exists + if [ -x "$xfce_polkit_dir/xfce4-polkit" ]; then + # Start the xfce4-polkit Authentication Agent + "$xfce_polkit_dir/xfce4-polkit" & + exit 0 + fi +done # Find all polkit-gnome executables in the Nix store polkit_gnome_paths=$(find /nix/store -name 'polkit-gnome-authentication-agent-1' -type f 2>/dev/null) @@ -18,4 +38,4 @@ for polkit_gnome_path in $polkit_gnome_paths; do done # If no valid executable is found, report an error -echo "No valid Polkit-GNOME Authentication Agent executable found."
\ No newline at end of file +echo "No valid polkit authentication agent executable found." diff --git a/config/hypr/scripts/Polkit.sh b/config/hypr/scripts/Polkit.sh index 9db94d89..768747ab 100755 --- a/config/hypr/scripts/Polkit.sh +++ b/config/hypr/scripts/Polkit.sh @@ -1,19 +1,47 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # This script starts the first available Polkit agent from a list of possible locations +# Avoid duplicate agents (common with UWSM/session autostart) +if pgrep -u "$UID" -f 'xfce-polkit|polkit-gnome-authentication-agent-1|polkit-kde-authentication-agent-1|polkit-mate-authentication-agent-1|mate-polkit|hyprpolkitagent' >/dev/null 2>&1; then + echo "Polkit agent already running. Skipping start." + exit 0 +fi + +# Ensure Qt apps default to Wayland in a Wayland session +if [ -n "${WAYLAND_DISPLAY:-}" ] && [ -z "${QT_QPA_PLATFORM:-}" ]; then + export QT_QPA_PLATFORM=wayland +fi -# List of potential Polkit agent file paths +# Avoid KDE polkit agent crashing if Kvantum QML module is missing +if [ -z "${QT_QUICK_CONTROLS_STYLE:-}" ]; then + export QT_QUICK_CONTROLS_STYLE=Basic +fi +if [ -z "${QT_STYLE_OVERRIDE:-}" ]; then + export QT_STYLE_OVERRIDE=Fusion +fi + +# List of potential Polkit agent file paths (preferred order) polkit=( + "/usr/bin/xfce-polkit" + "/usr/lib/xfce4/polkit-agent/xfce-polkit" + "/usr/libexec/xfce-polkit" "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" - "/usr/libexec/hyprpolkitagent" - "/usr/lib/hyprpolkitagent" - "/usr/lib/hyprpolkitagent/hyprpolkitagent" - "/usr/lib/polkit-kde-authentication-agent-1" "/usr/lib/polkit-gnome-authentication-agent-1" "/usr/libexec/polkit-gnome-authentication-agent-1" "/usr/libexec/polkit-mate-authentication-agent-1" - "/usr/lib/x86_64-linux-gnu/libexec/polkit-kde-authentication-agent-1" + "/usr/lib/polkit-mate/polkit-mate-authentication-agent-1" + "/usr/bin/polkit-mate-authentication-agent-1" "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1" + "/usr/lib/polkit-kde-authentication-agent-1" + "/usr/libexec/polkit-kde-authentication-agent-1" + "/usr/libexec/hyprpolkitagent" + "/usr/lib/hyprpolkitagent" + "/usr/lib/hyprpolkitagent/hyprpolkitagent" ) executed=false diff --git a/config/hypr/scripts/PortalHyprland.sh b/config/hypr/scripts/PortalHyprland.sh index 79b1bb96..243ee2e8 100755 --- a/config/hypr/scripts/PortalHyprland.sh +++ b/config/hypr/scripts/PortalHyprland.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For manually starting xdg-desktop-portal-hyprland set -euo pipefail diff --git a/config/hypr/scripts/PortalHyprlandUbuntu.sh b/config/hypr/scripts/PortalHyprlandUbuntu.sh new file mode 100755 index 00000000..86e1a6d3 --- /dev/null +++ b/config/hypr/scripts/PortalHyprlandUbuntu.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# Ubuntu-based workaround: start portals manually before waybar. + +set -euo pipefail + +if [[ -r /etc/os-release ]]; then + # shellcheck disable=SC1091 + . /etc/os-release + if [[ "${ID:-}" == "ubuntu" \ + || "${ID:-}" == "linuxmint" \ + || "${ID:-}" == "zorin" \ + || "${ID:-}" == "rhino" \ + || "${ID_LIKE:-}" == *ubuntu* ]]; then + if [[ -x "$HOME/.config/hypr/scripts/PortalHyprland.sh" ]]; then + "$HOME/.config/hypr/scripts/PortalHyprland.sh" + fi + fi +fi diff --git a/config/hypr/scripts/PortalHyprlandUbuntu2604.sh b/config/hypr/scripts/PortalHyprlandUbuntu2604.sh deleted file mode 100755 index 5cb3c01b..00000000 --- a/config/hypr/scripts/PortalHyprlandUbuntu2604.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## -# Ubuntu 26.04 workaround: start portals manually before waybar. - -set -euo pipefail - -if [[ -r /etc/os-release ]]; then - # shellcheck disable=SC1091 - . /etc/os-release - if [[ "${ID:-}" == "ubuntu" && "${VERSION_ID:-}" == "26.04" ]]; then - if [[ -x "$HOME/.config/hypr/scripts/PortalHyprland.sh" ]]; then - "$HOME/.config/hypr/scripts/PortalHyprland.sh" - fi - fi -fi diff --git a/config/hypr/scripts/Refresh.sh b/config/hypr/scripts/Refresh.sh index 71c653c6..2f02773b 100755 --- a/config/hypr/scripts/Refresh.sh +++ b/config/hypr/scripts/Refresh.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Scripts for refreshing ags, waybar, rofi, swaync, wallust SCRIPTSDIR=$HOME/.config/hypr/scripts @@ -14,8 +19,8 @@ file_exists() { fi } -# Kill already running processes -_ps=(waybar rofi swaync ags) +# Kill already running processes (exclude waybar to avoid double reloads) +_ps=(rofi swaync ags) for _prs in "${_ps[@]}"; do if pidof "${_prs}" >/dev/null; then pkill "${_prs}" @@ -25,10 +30,6 @@ done # Clean up any Waybar-spawned cava instances (unique temp conf names) pkill -f 'waybar-cava\..*\.conf' 2>/dev/null || true -# added since wallust sometimes not applying -killall -SIGUSR2 waybar -# Added sleep for GameMode causing multiple waybar -sleep 0.1 # quit ags & relaunch ags ags -q && ags & @@ -36,15 +37,22 @@ ags -q && ags & # quit quickshell & relaunch quickshell pkill qs && qs & -# some process to kill -for pid in $(pidof waybar rofi swaync ags swaybg); do +# some process to kill (exclude waybar to avoid restart loops) +for pid in $(pidof rofi swaync ags swaybg); do kill -SIGUSR1 "$pid" sleep 0.1 done -#Restart waybar -sleep 0.1 -waybar & +# Reload or start waybar once +if pidof waybar >/dev/null; then + if command -v waybar-msg >/dev/null 2>&1; then + waybar-msg cmd reload >/dev/null 2>&1 || true + else + killall -SIGUSR2 waybar 2>/dev/null || true + fi +else + waybar & +fi # relaunch swaync sleep 0.3 diff --git a/config/hypr/scripts/RefreshNoWaybar.sh b/config/hypr/scripts/RefreshNoWaybar.sh index d6930423..e92780b1 100755 --- a/config/hypr/scripts/RefreshNoWaybar.sh +++ b/config/hypr/scripts/RefreshNoWaybar.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Modified version of Refresh.sh but waybar wont refresh # Used by automatic wallpaper change @@ -31,9 +36,6 @@ ags -q && ags & # quit quickshell & relaunch quickshell pkill qs && qs & -# Wallust refresh (synchronous to ensure colors are ready) -${SCRIPTSDIR}/WallustSwww.sh -sleep 0.2 # reload swaync swaync-client --reload-config diff --git a/config/hypr/scripts/RofiEmoji.sh b/config/hypr/scripts/RofiEmoji.sh index a21c2374..539a03b6 100755 --- a/config/hypr/scripts/RofiEmoji.sh +++ b/config/hypr/scripts/RofiEmoji.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Variables rofi_theme="$HOME/.config/rofi/config-emoji.rasi" diff --git a/config/hypr/scripts/RofiSearch.sh b/config/hypr/scripts/RofiSearch.sh index d7dd5726..42b54d75 100755 --- a/config/hypr/scripts/RofiSearch.sh +++ b/config/hypr/scripts/RofiSearch.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For Searching via web browsers # Define the path to the config file diff --git a/config/hypr/scripts/RofiThemeSelector-modified.sh b/config/hypr/scripts/RofiThemeSelector-modified.sh index de3ebf4a..535b7313 100755 --- a/config/hypr/scripts/RofiThemeSelector-modified.sh +++ b/config/hypr/scripts/RofiThemeSelector-modified.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # A modified version of Rofi-Theme-Selector, concentrating only on ~/.local and also, applying only 10 @themes in ~/.config/rofi/config.rasi # as opposed to continous adding of //@theme diff --git a/config/hypr/scripts/RofiThemeSelector.sh b/config/hypr/scripts/RofiThemeSelector.sh index 66327d09..db723b6f 100755 --- a/config/hypr/scripts/RofiThemeSelector.sh +++ b/config/hypr/scripts/RofiThemeSelector.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ # +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Rofi Themes - Script to preview and apply themes by live-reloading the config. # --- Configuration --- diff --git a/config/hypr/scripts/ScreenShot.sh b/config/hypr/scripts/ScreenShot.sh index b12c08f0..baad89a1 100755 --- a/config/hypr/scripts/ScreenShot.sh +++ b/config/hypr/scripts/ScreenShot.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Screenshots scripts # variables @@ -25,7 +30,7 @@ notify_cmd_NOT="notify-send -u low -i ${iDoR}/note.png " notify_view() { if [[ "$1" == "active" ]]; then if [[ -e "${active_window_path}" ]]; then - "${sDIR}/Sounds.sh" --screenshot + "${sDIR}/Sounds.sh" --screenshot >/dev/null 2>&1 & resp=$(timeout 5 ${notify_cmd_shot_win} " Screenshot of:" " ${active_window_class} Saved.") case "$resp" in action1) @@ -37,11 +42,11 @@ notify_view() { esac else ${notify_cmd_NOT} " Screenshot of:" " ${active_window_class} NOT Saved." - "${sDIR}/Sounds.sh" --error + "${sDIR}/Sounds.sh" --error >/dev/null 2>&1 & fi elif [[ "$1" == "swappy" ]]; then - "${sDIR}/Sounds.sh" --screenshot + "${sDIR}/Sounds.sh" --screenshot >/dev/null 2>&1 & resp=$(${notify_cmd_shot} " Screenshot:" " Captured by Swappy") case "$resp" in action1) @@ -55,7 +60,7 @@ notify_view() { else local check_file="${dir}/${file}" if [[ -e "$check_file" ]]; then - "${sDIR}/Sounds.sh" --screenshot + "${sDIR}/Sounds.sh" --screenshot >/dev/null 2>&1 & resp=$(timeout 5 ${notify_cmd_shot} " Screenshot" " Saved") case "$resp" in action1) @@ -67,7 +72,7 @@ notify_view() { esac else ${notify_cmd_NOT} " Screenshot" " NOT Saved" - "${sDIR}/Sounds.sh" --error + "${sDIR}/Sounds.sh" --error >/dev/null 2>&1 & fi fi } @@ -83,14 +88,12 @@ countdown() { # take shots shotnow() { cd ${dir} && grim - | tee "$file" | wl-copy - sleep 2 notify_view } shot5() { countdown '5' sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy - sleep 1 notify_view } @@ -125,7 +128,6 @@ shotactive() { active_window_path="${dir}/${active_window_file}" hyprctl -j activewindow | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' | grim -g - "${active_window_path}" - sleep 1 notify_view "active" } @@ -156,10 +158,10 @@ elif [[ "$1" == "--area" ]]; then shotarea elif [[ "$1" == "--active" ]]; then shotactive -elif [[ "$1" == "--swappy" ]]; then +elif [[ "$1" == "--swappy" || "$1" == "--swapp" || "$1" == "--swap" ]]; then shotswappy else - echo -e "Available Options : --now --in5 --in10 --win --area --active --swappy" + echo -e "Available Options : --now --in5 --in10 --win --area --active --swappy (--swapp/--swap)" fi exit 0 diff --git a/config/hypr/scripts/Sounds.sh b/config/hypr/scripts/Sounds.sh index 7c0bf57c..3af4944f 100755 --- a/config/hypr/scripts/Sounds.sh +++ b/config/hypr/scripts/Sounds.sh @@ -1,10 +1,16 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # This script is used to play system sounds. # Script is used by Volume.Sh and ScreenShots.sh theme="freedesktop" # Set the theme for the system sounds. mute=false # Set to true to mute the system sounds. +directSoundDir="$HOME/.config/hypr/sounds" # Mute individual sounds here. muteScreenshots=false @@ -20,16 +26,19 @@ if [[ "$1" == "--screenshot" ]]; then if [[ "$muteScreenshots" = true ]]; then exit 0 fi + directSound="$directSoundDir/screenshot.ogg" soundoption="screen-capture.*" elif [[ "$1" == "--volume" ]]; then if [[ "$muteVolume" = true ]]; then exit 0 fi + directSound="$directSoundDir/volume.ogg" soundoption="audio-volume-change.*" elif [[ "$1" == "--error" ]]; then if [[ "$muteScreenshots" = true ]]; then exit 0 fi + directSound="$directSoundDir/error.ogg" soundoption="dialog-error.*" else echo -e "Available sounds: --screenshot, --volume, --error" @@ -57,6 +66,29 @@ fi iTheme=$(cat "$sDIR/index.theme" | grep -i "inherits" | cut -d "=" -f 2) iDIR="$sDIR/../$iTheme" +# Helper to play in the background (fast return). +play_sound() { + if command -v paplay >/dev/null 2>&1; then + paplay "$1" >/dev/null 2>&1 & + exit 0 + fi + if command -v pw-play >/dev/null 2>&1; then + pw-play "$1" >/dev/null 2>&1 & + exit 0 + fi + if command -v aplay >/dev/null 2>&1; then + aplay "$1" >/dev/null 2>&1 & + exit 0 + fi + echo "Error: No suitable audio player found. Install paplay (pulseaudio-utils) or PipeWire/ALSA tools." + exit 1 +} + +# If a direct sound file exists, play it immediately to avoid lookup delay. +if [[ -n "$directSound" && -f "$directSound" ]]; then + play_sound "$directSound" +fi + # Find the sound file and play it. sound_file=$(find -L $sDIR/stereo -name "$soundoption" -print -quit) if ! test -f "$sound_file"; then @@ -72,19 +104,5 @@ if ! test -f "$sound_file"; then fi fi fi - -# Play the sound: prefer PipeWire, then PulseAudio, then ALSA -if command -v pw-play >/dev/null 2>&1; then - pw-play "$sound_file" && exit 0 -fi - -if command -v paplay >/dev/null 2>&1; then - paplay "$sound_file" && exit 0 -fi - -if command -v aplay >/dev/null 2>&1; then - aplay "$sound_file" && exit 0 -fi - -echo "Error: No suitable audio player (pw-play/paplay/aplay) found." -exit 1 +# Play the sound (background for quick return). +play_sound "$sound_file" diff --git a/config/hypr/scripts/Tak0-Autodispatch.sh b/config/hypr/scripts/Tak0-Autodispatch.sh index 6ed7ec13..034a6402 100755 --- a/config/hypr/scripts/Tak0-Autodispatch.sh +++ b/config/hypr/scripts/Tak0-Autodispatch.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash - +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ # Tak0-Autodispatch.sh # âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ diff --git a/config/hypr/scripts/Tak0-Per-Window-Switch.sh b/config/hypr/scripts/Tak0-Per-Window-Switch.sh index 3ba2c7af..04baebe0 100755 --- a/config/hypr/scripts/Tak0-Per-Window-Switch.sh +++ b/config/hypr/scripts/Tak0-Per-Window-Switch.sh @@ -1,3 +1,9 @@ +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== ################################################################## # # # # diff --git a/config/hypr/scripts/ThemeChanger.sh b/config/hypr/scripts/ThemeChanger.sh index 19ee3298..b41738f6 100755 --- a/config/hypr/scripts/ThemeChanger.sh +++ b/config/hypr/scripts/ThemeChanger.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== set -euo pipefail # SPDX-FileCopyrightText: 2025-present Ahum Maitra theahummaitra@gmail.com diff --git a/config/hypr/scripts/Toggle-Active-Window-Audio.sh b/config/hypr/scripts/Toggle-Active-Window-Audio.sh index 4d9bcd33..f32ded0e 100755 --- a/config/hypr/scripts/Toggle-Active-Window-Audio.sh +++ b/config/hypr/scripts/Toggle-Active-Window-Audio.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== set -euo pipefail XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" diff --git a/config/hypr/scripts/Toggle-weather-waybar-units.sh b/config/hypr/scripts/Toggle-weather-waybar-units.sh index 4007536c..abc089ff 100755 --- a/config/hypr/scripts/Toggle-weather-waybar-units.sh +++ b/config/hypr/scripts/Toggle-weather-waybar-units.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Toggle waybar-weather units between metric and imperial CONFIG_FILE="$HOME/.config/waybar-weather/config.toml" diff --git a/config/hypr/scripts/TouchPad.sh b/config/hypr/scripts/TouchPad.sh index 56506382..1042a652 100755 --- a/config/hypr/scripts/TouchPad.sh +++ b/config/hypr/scripts/TouchPad.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # For disabling touchpad. # Edit the Touchpad_Device on ~/.config/hypr/UserConfigs/Laptops.conf according to your system # use hyprctl devices to get your system touchpad device name diff --git a/config/hypr/scripts/UptimeNixOS.sh b/config/hypr/scripts/UptimeNixOS.sh index 654ae2c8..5c3085b1 100755 --- a/config/hypr/scripts/UptimeNixOS.sh +++ b/config/hypr/scripts/UptimeNixOS.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script parses /proc/uptime to get the system uptime # and prints it in a human-readable format # This is a workaround for system where `uptime` command is taken from coreutils diff --git a/config/hypr/scripts/UserConfigsSwitcher.sh b/config/hypr/scripts/UserConfigsSwitcher.sh index ac44b4bc..7d9968a6 100755 --- a/config/hypr/scripts/UserConfigsSwitcher.sh +++ b/config/hypr/scripts/UserConfigsSwitcher.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script to manage UserConfigs and UserConfigsBak HYPR_CONFIG_DIR="$HOME/.config/hypr" diff --git a/config/hypr/scripts/Volume.sh b/config/hypr/scripts/Volume.sh index 41e474d0..dec7837c 100755 --- a/config/hypr/scripts/Volume.sh +++ b/config/hypr/scripts/Volume.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Scripts for volume controls for audio and mic iDIR="$HOME/.config/swaync/icons" diff --git a/config/hypr/scripts/WallpaperCmd.sh b/config/hypr/scripts/WallpaperCmd.sh new file mode 100755 index 00000000..0191ee14 --- /dev/null +++ b/config/hypr/scripts/WallpaperCmd.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# Wallpaper command selector (awww preferred, swww fallback) + +if command -v awww >/dev/null 2>&1; then + WWW_CMD="awww" + WWW_DAEMON="awww-daemon" + WWW_CACHE_DIR="$HOME/.cache/awww" + WWW_DAEMON_ARGS=() + WWW_MIGRATION_MARKER="$WWW_CACHE_DIR/.cache_cleared" +else + WWW_CMD="swww" + WWW_DAEMON="swww-daemon" + WWW_CACHE_DIR="$HOME/.cache/swww" + WWW_DAEMON_ARGS=(--format xrgb) +fi +# One-time cache clear when migrating from swww to awww +if [ "$WWW_CMD" = "awww" ]; then + mkdir -p "$WWW_CACHE_DIR" + if [ ! -f "$WWW_MIGRATION_MARKER" ]; then + awww clear-cache >/dev/null 2>&1 || true + touch "$WWW_MIGRATION_MARKER" + fi +fi + +export WWW_CMD WWW_DAEMON WWW_CACHE_DIR WWW_DAEMON_ARGS WWW_MIGRATION_MARKER diff --git a/config/hypr/scripts/WallpaperDaemon.sh b/config/hypr/scripts/WallpaperDaemon.sh new file mode 100755 index 00000000..fc7f71c0 --- /dev/null +++ b/config/hypr/scripts/WallpaperDaemon.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# Start wallpaper daemon, preferring awww with swww fallback + +SCRIPTSDIR="$HOME/.config/hypr/scripts" +# shellcheck source=/dev/null +. "$SCRIPTSDIR/WallpaperCmd.sh" + +if command -v "$WWW_DAEMON" >/dev/null 2>&1 && command -v "$WWW_CMD" >/dev/null 2>&1; then + "$WWW_DAEMON" "${WWW_DAEMON_ARGS[@]}" & +fi + +# Give the daemon a moment to become ready +for _ in {1..20}; do + "$WWW_CMD" query >/dev/null 2>&1 && break + sleep 0.1 +done + +wallpaper_link="$HOME/.config/rofi/.current_wallpaper" +wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current" +wallpaper_path="" + +# Prefer the symlink target if it's valid +if [ -L "$wallpaper_link" ]; then + resolved="$(readlink -f "$wallpaper_link")" + if [ -n "$resolved" ] && [ -f "$resolved" ]; then + wallpaper_path="$resolved" + fi +fi + +# Fall back to link file or copied current wallpaper +if [ -z "$wallpaper_path" ] && [ -f "$wallpaper_link" ]; then + wallpaper_path="$wallpaper_link" +fi +if [ -z "$wallpaper_path" ] && [ -f "$wallpaper_current" ]; then + wallpaper_path="$wallpaper_current" +fi + +# Last resort: use cached swww/awww wallpaper paths +if [ -z "$wallpaper_path" ]; then + for cache_dir in "$HOME/.cache/awww" "$HOME/.cache/swww"; do + [ -d "$cache_dir" ] || continue + for cache_file in "$cache_dir"/*; do + [ -f "$cache_file" ] || continue + candidate="$(awk 'NF && $0 !~ /^filter/ {print; exit}' "$cache_file")" + if [ -n "$candidate" ] && [ -f "$candidate" ]; then + wallpaper_path="$candidate" + break + fi + done + [ -n "$wallpaper_path" ] && break + done +fi + +if [ -n "$wallpaper_path" ] && [ -f "$wallpaper_path" ]; then + if ! "$WWW_CMD" img "$wallpaper_path" >/dev/null 2>&1; then + # Retry once after a short delay + sleep 0.3 + "$WWW_CMD" img "$wallpaper_path" >/dev/null 2>&1 & + fi +fi diff --git a/config/hypr/scripts/WallustSwww.sh b/config/hypr/scripts/WallustSwww.sh index 1f0f50c7..9df3ed61 100755 --- a/config/hypr/scripts/WallustSwww.sh +++ b/config/hypr/scripts/WallustSwww.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Wallust: derive colors from the current wallpaper and update templates # Usage: WallustSwww.sh [absolute_path_to_wallpaper] @@ -7,7 +12,15 @@ set -euo pipefail # Inputs and paths passed_path="${1:-}" -cache_dir="$HOME/.cache/swww/" +if command -v awww >/dev/null 2>&1; then + WWW="awww" + cache_dir="$HOME/.cache/awww/" + cache_dir_fallback="$HOME/.cache/swww/" +else + WWW="swww" + cache_dir="$HOME/.cache/swww/" + cache_dir_fallback="$HOME/.cache/awww/" +fi rofi_link="$HOME/.config/rofi/.current_wallpaper" wallpaper_current="$HOME/.config/hypr/wallpaper_effects/.wallpaper_current" read_cached_wallpaper() { @@ -19,7 +32,7 @@ read_cached_wallpaper() { read_wallpaper_from_query() { local monitor="$1" - swww query | awk -v mon="$monitor" ' + $WWW query | awk -v mon="$monitor" ' /^Monitor/ { cur=$2 gsub(":", "", cur) @@ -46,17 +59,21 @@ wallpaper_path="" if [[ -n "$passed_path" && -f "$passed_path" ]]; then wallpaper_path="$passed_path" else - # Try to read from swww cache for the focused monitor, with a short retry loop + # Try to read from awww/swww cache for the focused monitor, with a short retry loop current_monitor="$(get_focused_monitor)" cache_file="$cache_dir$current_monitor" + alt_cache_file="${cache_dir_fallback}${current_monitor}" - # Wait briefly for swww to write its cache after an image change + # Wait briefly for awww/swww to write its cache after an image change for i in {1..10}; do - if [[ -f "$cache_file" ]]; then + if [[ -f "$cache_file" || -f "$alt_cache_file" ]]; then break fi sleep 0.1 done + if [[ ! -f "$cache_file" && -f "$alt_cache_file" ]]; then + cache_file="$alt_cache_file" + fi if [[ -f "$cache_file" ]]; then # The first non-filter line is the original wallpaper path @@ -111,9 +128,28 @@ wallust run -s "$wallpaper_path" || true wallust_targets=( "$HOME/.config/waybar/wallust/colors-waybar.css" "$HOME/.config/rofi/wallust/colors-rofi.rasi" + "$HOME/.config/hypr/wallust/wallust-hyprland.conf" ) wait_for_templates "$start_ts" "${wallust_targets[@]}" || true +# Normalize Rofi selection colors to a brighter accent and readable foreground +rofi_colors="$HOME/.config/rofi/wallust/colors-rofi.rasi" +if [ -f "$rofi_colors" ]; then + accent_hex=$(sed -n 's/^\s*color13:\s*\(#[0-9A-Fa-f]\{6\}\).*/\1/p' "$rofi_colors" | head -n1) + [ -z "$accent_hex" ] && accent_hex=$(sed -n 's/^\s*color12:\s*\(#[0-9A-Fa-f]\{6\}\).*/\1/p' "$rofi_colors" | head -n1) + fg_hex=$(sed -n 's/^\s*foreground:\s*\(#[0-9A-Fa-f]\{6\}\).*/\1/p' "$rofi_colors" | head -n1) + if [ -n "$accent_hex" ]; then + sed -i -E "s|^(\s*selected-normal-background:\s*).*$|\1$accent_hex;|" "$rofi_colors" + sed -i -E "s|^(\s*selected-active-background:\s*).*$|\1$accent_hex;|" "$rofi_colors" + sed -i -E "s|^(\s*selected-urgent-background:\s*).*$|\1$accent_hex;|" "$rofi_colors" + fi + if [ -n "$fg_hex" ]; then + sed -i -E "s|^(\s*selected-normal-foreground:\s*).*$|\1$fg_hex;|" "$rofi_colors" + sed -i -E "s|^(\s*selected-active-foreground:\s*).*$|\1$fg_hex;|" "$rofi_colors" + sed -i -E "s|^(\s*selected-urgent-foreground:\s*).*$|\1$fg_hex;|" "$rofi_colors" + fi +fi + # Run kitty-only wallust config to keep terminal palette separate run_wallust_with_config() { local cfg="$1" @@ -125,43 +161,42 @@ run_wallust_with_config() { } kitty_cfg="$HOME/.config/wallust/wallust-kitty.toml" -if [ -f "$kitty_cfg" ]; then - kitty_ts=$(date +%s) - run_wallust_with_config "$kitty_cfg" - wait_for_templates "$kitty_ts" "$HOME/.config/kitty/kitty-themes/01-Wallust.conf" || true -fi - -# Reload kitty colors when wallpaper-based theme is active -kitty_wallust_theme="$HOME/.config/kitty/kitty-themes/01-Wallust.conf" -if [ -s "$kitty_wallust_theme" ]; then - if command -v kitty >/dev/null 2>&1; then - kitty @ load-config >/dev/null 2>&1 || true - kitty @ set-colors --all --configured "$kitty_wallust_theme" >/dev/null 2>&1 || true +( + if [ -f "$kitty_cfg" ]; then + kitty_ts=$(date +%s) + run_wallust_with_config "$kitty_cfg" + wait_for_templates "$kitty_ts" "$HOME/.config/kitty/kitty-themes/01-Wallust.conf" || true fi - if pidof kitty >/dev/null 2>&1; then - for pid in $(pidof kitty); do - kill -SIGUSR1 "$pid" 2>/dev/null || true - done - fi -fi -# Normalize Ghostty palette syntax in case ':' was used by older files -if [ -f "$HOME/.config/ghostty/wallust.conf" ]; then - sed -i -E 's/^(\s*palette\s*=\s*)([0-9]{1,2}):/\1\2=/' "$HOME/.config/ghostty/wallust.conf" 2>/dev/null || true -fi + # Reload kitty colors when wallpaper-based theme is active + kitty_wallust_theme="$HOME/.config/kitty/kitty-themes/01-Wallust.conf" + if [ -s "$kitty_wallust_theme" ]; then + if command -v kitty >/dev/null 2>&1; then + kitty @ load-config >/dev/null 2>&1 || true + kitty @ set-colors --all --configured "$kitty_wallust_theme" >/dev/null 2>&1 || true + fi + if pidof kitty >/dev/null 2>&1; then + for pid in $(pidof kitty); do + kill -SIGUSR1 "$pid" 2>/dev/null || true + done + fi + fi -# Light wait for Ghostty colors file to be present then signal Ghostty to reload (SIGUSR2) -for _ in 1 2 3; do - [ -s "$HOME/.config/ghostty/wallust.conf" ] && break - sleep 0.1 -done -if pidof ghostty >/dev/null; then - for pid in $(pidof ghostty); do kill -SIGUSR2 "$pid" 2>/dev/null || true; done -fi + # Normalize Ghostty palette syntax in case ':' was used by older files + if [ -f "$HOME/.config/ghostty/wallust.conf" ]; then + sed -i -E 's/^(\s*palette\s*=\s*)([0-9]{1,2}):/\1\2=/' "$HOME/.config/ghostty/wallust.conf" 2>/dev/null || true + fi -# Prompt Waybar to reload colors -if command -v waybar-msg >/dev/null 2>&1; then - waybar-msg cmd reload >/dev/null 2>&1 || true -elif pidof waybar >/dev/null; then - killall -SIGUSR2 waybar 2>/dev/null || true -fi + # Light wait for Ghostty colors file to be present then signal Ghostty to reload (SIGUSR2) + for _ in 1 2 3; do + [ -s "$HOME/.config/ghostty/wallust.conf" ] && break + sleep 0.1 + done + if pidof ghostty >/dev/null; then + for pid in $(pidof ghostty); do kill -SIGUSR2 "$pid" 2>/dev/null || true; done + fi + # Reload Hyprland so new border colors from wallust-hyprland.conf take effect + if command -v hyprctl >/dev/null 2>&1; then + hyprctl reload >/dev/null 2>&1 || true + fi +) >/dev/null 2>&1 & diff --git a/config/hypr/scripts/WaybarCava.sh b/config/hypr/scripts/WaybarCava.sh index 98db60dd..2295f0ab 100755 --- a/config/hypr/scripts/WaybarCava.sh +++ b/config/hypr/scripts/WaybarCava.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # WaybarCava.sh â safer single-instance handling, cleanup, and robustness # Original concept by LinuxBeginnings; this variant focuses on lifecycle hardening. diff --git a/config/hypr/scripts/WaybarLayout.sh b/config/hypr/scripts/WaybarLayout.sh index 247ccf78..66d45a07 100755 --- a/config/hypr/scripts/WaybarLayout.sh +++ b/config/hypr/scripts/WaybarLayout.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script for waybar layout or configs IFS=$'\n\t' diff --git a/config/hypr/scripts/WaybarScripts.sh b/config/hypr/scripts/WaybarScripts.sh index 142b548d..afb55712 100755 --- a/config/hypr/scripts/WaybarScripts.sh +++ b/config/hypr/scripts/WaybarScripts.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ # +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # This file used on waybar modules sourcing defaults set in $HOME/.config/hypr/UserConfigs/01-UserDefaults.conf # Define the path to the config file diff --git a/config/hypr/scripts/WaybarStyles.sh b/config/hypr/scripts/WaybarStyles.sh index 2ed8bf26..611e0a12 100755 --- a/config/hypr/scripts/WaybarStyles.sh +++ b/config/hypr/scripts/WaybarStyles.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script for waybar styles IFS=$'\n\t' diff --git a/config/hypr/scripts/Wlogout.sh b/config/hypr/scripts/Wlogout.sh index e33222cc..973c5704 100755 --- a/config/hypr/scripts/Wlogout.sh +++ b/config/hypr/scripts/Wlogout.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ ## +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # wlogout (Power, Screen Lock, Suspend, etc) # Set variables for parameters. First numbers corresponts to Monitor Resolution diff --git a/config/hypr/scripts/build-awww.sh b/config/hypr/scripts/build-awww.sh new file mode 100755 index 00000000..c59c34c0 --- /dev/null +++ b/config/hypr/scripts/build-awww.sh @@ -0,0 +1,209 @@ +#!/usr/bin/env bash +set -euo pipefail + +RED="\033[0;31m" +GREEN="\033[0;32m" +YELLOW="\033[1;33m" +BLUE="\033[0;34m" +NC="\033[0m" + +ICON_OK="â
" +ICON_WARN="â ī¸" +ICON_ERR="â" +ICON_INFO="âšī¸" + +fail() { + printf "${RED}${ICON_ERR} %s${NC}\n" "$1" >&2 + exit 1 +} + +info() { + printf "${BLUE}${ICON_INFO} %s${NC}\n" "$1" +} + +warn() { + printf "${YELLOW}${ICON_WARN} %s${NC}\n" "$1" +} + +ok() { + printf "${GREEN}${ICON_OK} %s${NC}\n" "$1" +} + +trap 'fail "Script failed at line $LINENO."' ERR + +if [[ ! -t 0 ]]; then + fail "This script requires an interactive terminal. Run it directly in a terminal (e.g. ./build-awww.sh)." +fi + +info "Starting awww installer..." + +if command -v awww >/dev/null 2>&1; then + ok "awww is already installed. Nothing to do." + exit 0 +fi + +if ! command -v git >/dev/null 2>&1; then + fail "git is required but not installed." +fi + +detect_distro() { + if [[ -r /etc/os-release ]]; then + # shellcheck disable=SC1091 + . /etc/os-release + echo "${ID:-}" + return + fi + echo "" +} + +prompt_confirm_distro() { + local detected="$1" + local choice="" + if [[ -n "$detected" ]]; then + printf "${BLUE}${ICON_INFO} Detected distro: %s${NC}\n" "$detected" >/dev/tty + printf "Confirm? (Y/y to confirm, N/n to choose, Q/q to quit): " >/dev/tty + read -r choice </dev/tty + case "$choice" in + [Yy]) echo "$detected"; return ;; + [Qq]) exit 0 ;; + [Nn]) ;; + *) warn "Invalid choice, continuing to manual selection." ;; + esac + fi + echo "Supported distros:" + echo " 1) debian" + echo " 2) ubuntu" + echo " 3) arch" + echo " 4) opensuse" + echo " 5) fedora" + echo " 6) gentoo" + printf "Select your distro (1-6) or Q/q to quit: " >/dev/tty + read -r choice </dev/tty + read -r choice + case "$choice" in + 1) echo "debian" ;; + 2) echo "ubuntu" ;; + 3) echo "arch" ;; + 4) echo "opensuse" ;; + 5) echo "fedora" ;; + 6) echo "gentoo" ;; + [Qq]) exit 0 ;; + *) fail "Invalid selection." ;; + esac +} + +distro="$(prompt_confirm_distro "$(detect_distro)")" + +install_deps_debian_ubuntu() { + local missing=() + for pkg in pkg-config liblz4-dev; do + dpkg -s "$pkg" >/dev/null 2>&1 || missing+=("$pkg") + done + if (( ${#missing[@]} )); then + info "Installing deps: ${missing[*]}" + sudo apt update + sudo apt install -y "${missing[@]}" + else + ok "All required deps already installed." + fi +} + +install_deps_fedora() { + local missing=() + for pkg in wayland-protocols lz4-devel wayland-devel; do + rpm -q "$pkg" >/dev/null 2>&1 || missing+=("$pkg") + done + if (( ${#missing[@]} )); then + info "Installing deps: ${missing[*]}" + sudo dnf install -y "${missing[@]}" + else + ok "All required deps already installed." + fi +} + +install_deps_opensuse() { + local missing=() + for pkg in pkg-config liblz4-devel; do + rpm -q "$pkg" >/dev/null 2>&1 || missing+=("$pkg") + done + if (( ${#missing[@]} )); then + info "Installing deps: ${missing[*]}" + sudo zypper install -y "${missing[@]}" + else + ok "All required deps already installed." + fi +} + +install_deps_arch() { + local missing=() + for pkg in pkgconf lz4 wayland-protocols; do + pacman -Qi "$pkg" >/dev/null 2>&1 || missing+=("$pkg") + done + if (( ${#missing[@]} )); then + info "Installing deps: ${missing[*]}" + sudo pacman -S --needed --noconfirm "${missing[@]}" + else + ok "All required deps already installed." + fi +} + +ensure_cargo() { + if command -v cargo >/dev/null 2>&1; then + ok "cargo is available." + return + fi + case "$distro" in + debian|ubuntu|fedora|opensuse) + info "Installing Rust toolchain via rustup..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + # shellcheck disable=SC1091 + source "$HOME/.cargo/env" + ;; + arch) + info "Installing Rust toolchain..." + sudo pacman -S --needed --noconfirm rust + ;; + gentoo) + ;; + *) + fail "Unknown distro for cargo install." + ;; + esac + command -v cargo >/dev/null 2>&1 || fail "cargo is still not available." +} + +case "$distro" in + debian) install_deps_debian_ubuntu ;; + ubuntu) install_deps_debian_ubuntu ;; + fedora) install_deps_fedora ;; + opensuse) install_deps_opensuse ;; + arch) install_deps_arch ;; + gentoo) + info "Installing awww via Portage..." + sudo emerge gui-apps/awww + ok "awww installed successfully." + exit 0 + ;; + *) fail "Unsupported distro: $distro" ;; +esac + +ensure_cargo + +info "Cloning or updating awww..." +cd "$HOME" +if [[ -d awww/.git ]]; then + git -C awww pull --rebase +else + git clone https://codeberg.org/LGFae/awww.git +fi + +cd "$HOME/awww" +info "Building awww..." +cargo build --release + +info "Installing binaries..." +sudo install -vDm755 target/release/awww -t /usr/bin/ +sudo install -vDm755 target/release/awww-daemon -t /usr/bin/ +sudo install -vDm644 completions/_awww -t /usr/share/zsh/site-functions/ + +ok "awww installed successfully." diff --git a/config/hypr/scripts/disable.cpu.turbo.sh b/config/hypr/scripts/disable.cpu.turbo.sh new file mode 100755 index 00000000..dafee76b --- /dev/null +++ b/config/hypr/scripts/disable.cpu.turbo.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +require_root() { + if [[ ${EUID} -ne 0 ]]; then + exec sudo -- "$0" "$@" + fi +} + +write_sysfs() { + local path="$1" + local value="$2" + if [[ -w "$path" ]]; then + printf '%s' "$value" >"$path" + return 0 + fi + return 1 +} + +require_root "$@" + +changed=0 + +# Intel P-State turbo control +if [[ -e /sys/devices/system/cpu/intel_pstate/no_turbo ]]; then + if write_sysfs /sys/devices/system/cpu/intel_pstate/no_turbo 1; then + changed=1 + fi +fi + +# Generic cpufreq boost control (AMD/Intel) +if [[ -e /sys/devices/system/cpu/cpufreq/boost ]]; then + if write_sysfs /sys/devices/system/cpu/cpufreq/boost 0; then + changed=1 + fi +fi + +# Prefer a quieter governor if available +for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do + if [[ -w "$gov" ]]; then + current=$(cat "$gov") + if [[ "$current" != "powersave" ]] && grep -q powersave "${gov%/*}/scaling_available_governors"; then + printf '%s' powersave >"$gov" + changed=1 + fi + fi +done + +# Lower energy/performance preference if supported +for epp in /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference; do + if [[ -w "$epp" ]]; then + printf '%s' power >"$epp" 2>/dev/null || true + changed=1 + fi +done + +if [[ $changed -eq 1 ]]; then + echo "CPU turbo/boost disabled and power-saving preferences applied." + exit 0 +fi + +echo "No writable turbo/boost controls found. Check kernel driver support." +exit 1 diff --git a/config/hypr/scripts/fastfetch-wrapper.sh b/config/hypr/scripts/fastfetch-wrapper.sh new file mode 100755 index 00000000..ad5f7873 --- /dev/null +++ b/config/hypr/scripts/fastfetch-wrapper.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +# 1. Get the specific ID and the "ID_LIKE" family +source /etc/os-release +SPECIFIC_ID=$ID +FAMILY_ID=$ID_LIKE + +# 2. Define your asset directory +ASSET_DIR="$HOME/.config/fastfetch/images" + +# 3. Selection Logic +if [ -f "$ASSET_DIR/$SPECIFIC_ID.png" ]; then + # Use exact match if available (e.g., soplos.png) + SELECTED_LOGO="$ASSET_DIR/$SPECIFIC_ID.png" +elif [ -n "$FAMILY_ID" ] && [ -f "$ASSET_DIR/${FAMILY_ID%% *}.png" ]; then + # Fallback to family (e.g., debian.png) - takes the first word of ID_LIKE + SELECTED_LOGO="$ASSET_DIR/${FAMILY_ID%% *}.png" +else + # Let fastfetch handle it natively if no custom image found + fastfetch + exit 0 +fi + +fastfetch --kitty "$SELECTED_LOGO" diff --git a/config/hypr/scripts/hyprshot.sh b/config/hypr/scripts/hyprshot.sh index 0fb976fa..0e97d15b 100755 --- a/config/hypr/scripts/hyprshot.sh +++ b/config/hypr/scripts/hyprshot.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash - +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== set -e function Help() { diff --git a/config/hypr/scripts/install-uv.sh b/config/hypr/scripts/install-uv.sh index 3582a78e..da4b2d86 100755 --- a/config/hypr/scripts/install-uv.sh +++ b/config/hypr/scripts/install-uv.sh @@ -1,2 +1,8 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== curl -LsSf https://astral.sh/uv/install.sh | sh diff --git a/config/hypr/scripts/keybinds_parser.py b/config/hypr/scripts/keybinds_parser.py index d12e3854..5b75d81c 100755 --- a/config/hypr/scripts/keybinds_parser.py +++ b/config/hypr/scripts/keybinds_parser.py @@ -1,4 +1,10 @@ #!/usr/bin/env python3 +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== import sys import re import os diff --git a/config/hypr/scripts/rofi-emacs-keybinds b/config/hypr/scripts/rofi-emacs-keybinds new file mode 100755 index 00000000..bee1a54d --- /dev/null +++ b/config/hypr/scripts/rofi-emacs-keybinds @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -u +set -o pipefail + +ROFI_CONFIG="${HOME}/.config/rofi/config-emacs-keybinds.rasi" +CACHE_FILE="${HOME}/.cache/rofi-emacs-keybinds.txt" + +if [[ ! -s "${CACHE_FILE}" ]]; then + notify-send "Rofi Emacs Keybinds" "Keybind cache missing. In Emacs, run: M-x rofi-emacs-keybinds-refresh" + exit 1 +fi + +rofi -dmenu -i -p "Emacs Keybinds" -config "${ROFI_CONFIG}" < "${CACHE_FILE}" diff --git a/config/hypr/scripts/rofi-ssh-menu.sh b/config/hypr/scripts/rofi-ssh-menu.sh new file mode 100755 index 00000000..d1640c66 --- /dev/null +++ b/config/hypr/scripts/rofi-ssh-menu.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# Rofi SSH menu - list SSH hosts from ~/.ssh/config and connect. + +set -euo pipefail + +SSH_CONFIG="${HOME}/.ssh/config" +ROFI_CONFIG="${HOME}/.config/rofi/config.rasi" +MSG='Select a host to connect via SSH' + +notify() { + if command -v notify-send >/dev/null 2>&1; then + notify-send -u low "Rofi SSH" "$1" + else + printf '%s\n' "$1" >&2 + fi +} + +if [[ ! -f "${SSH_CONFIG}" ]]; then + notify "SSH config not found: ${SSH_CONFIG}" + exit 1 +fi + +# Build list: host|user|hostname +host_entries="$( + awk ' + function is_wildcard(h) { return (h ~ /[*?]/ || h ~ /^!/); } + function remember_hosts(list, i, n, h) { + delete current + n = split(list, parts, /[ \t]+/) + for (i = 1; i <= n; i++) { + h = parts[i] + if (h == "") continue + if (is_wildcard(h)) continue + current[h] = 1 + if (!(h in seen)) { + seen[h] = 1 + order[++count] = h + } + } + } + { + sub(/[ \t]*#.*/, "", $0) + if ($0 ~ /^[ \t]*$/) next + if ($1 == "Host") { + $1 = "" + sub(/^[ \t]+/, "", $0) + remember_hosts($0) + next + } + if ($1 == "HostName") { + for (h in current) hostname[h] = $2 + next + } + if ($1 == "User") { + for (h in current) user[h] = $2 + next + } + } + END { + for (i = 1; i <= count; i++) { + h = order[i] + print h "|" (h in user ? user[h] : "") "|" (h in hostname ? hostname[h] : "") + } + } + ' "${SSH_CONFIG}" +)" + +if [[ -z "${host_entries}" ]]; then + notify "No SSH hosts found in ${SSH_CONFIG}" + exit 1 +fi + +menu_entries="$( + while IFS='|' read -r host user hostname; do + [[ -n "${host}" ]] || continue + [[ -n "${user}" ]] || user="${USER}" + [[ -n "${hostname}" ]] || hostname="${host}" + printf '%s | %s@%s\n' "${host}" "${user}" "${hostname}" + done <<< "${host_entries}" +)" + +# Close any existing rofi before launching +if pgrep -x "rofi" >/dev/null 2>&1; then + pkill rofi +fi + +selection="$(printf '%s\n' "${menu_entries}" | rofi -dmenu -i -p "SSH" -mesg "${MSG}" -config "${ROFI_CONFIG}")" + +if [[ -z "${selection}" ]]; then + exit 0 +fi + +selected_host="${selection%% | *}" +if [[ -z "${selected_host}" ]]; then + exit 0 +fi + +if command -v kitty >/dev/null 2>&1; then + exec kitty --title "SSH ${selected_host}" sh -lc "ssh ${selected_host}" +fi + +if command -v ghostty >/dev/null 2>&1; then + exec ghostty -e sh -lc "ssh ${selected_host}" +fi + +if command -v alacritty >/dev/null 2>&1; then + exec alacritty -e sh -lc "ssh ${selected_host}" +fi + +notify "No supported terminal found (kitty, ghostty, alacritty). Unable to start SSH session." +exit 1 diff --git a/config/hypr/scripts/sddm_wallpaper.sh b/config/hypr/scripts/sddm_wallpaper.sh index 26f6c613..deee938c 100755 --- a/config/hypr/scripts/sddm_wallpaper.sh +++ b/config/hypr/scripts/sddm_wallpaper.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -# /* ---- đĢ https://github.com/LinuxBeginnings đĢ ---- */ +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # SDDM Wallpaper and Wallust Colors Setter # for the upcoming changes on the simple_sddm_theme diff --git a/config/hypr/scripts/set-default-thunar-terminal.sh b/config/hypr/scripts/set-default-thunar-terminal.sh new file mode 100755 index 00000000..fd50eb6c --- /dev/null +++ b/config/hypr/scripts/set-default-thunar-terminal.sh @@ -0,0 +1,148 @@ +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# +setup_default_terminal() { + echo "Setting kitty as the default terminal for Thunar and CLI apps..." + + # 1. Configure XFCE/Exo (Thunar's primary helper) + # This handles "Open Terminal Here" and "Open with [CLI App]" + HELPER_DIR="$HOME/.config/xfce4" + mkdir -p "$HELPER_DIR" + KITTY_PATH="$(command -v kitty 2>/dev/null || true)" + if [ -z "$KITTY_PATH" ]; then + echo "Warning: kitty not found in PATH. Thunar may report no terminal available." + fi + # Prefer exo-preferred-applications when available (XFCE/Thunar) + if command -v exo-preferred-applications >/dev/null 2>&1; then + exo-preferred-applications --set TerminalEmulator kitty >/dev/null 2>&1 || true + fi + + # Ensure helpers.rc exists and has a [Default] section + if [ ! -f "$HELPER_DIR/helpers.rc" ]; then + printf "[Default]\n" >"$HELPER_DIR/helpers.rc" + elif ! grep -q '^\[Default\]$' "$HELPER_DIR/helpers.rc"; then + printf "[Default]\n%s" "$(cat "$HELPER_DIR/helpers.rc")" >"$HELPER_DIR/helpers.rc" + fi + + # Update TerminalEmulator entry in [Default] section + if grep -q '^TerminalEmulator=' "$HELPER_DIR/helpers.rc"; then + sed -i 's|^TerminalEmulator=.*|TerminalEmulator=kitty|' "$HELPER_DIR/helpers.rc" + else + sed -i '/^\[Default\]$/a TerminalEmulator=kitty' "$HELPER_DIR/helpers.rc" + fi + # Set a full path if available (GUI PATH can differ) + if [ -n "$KITTY_PATH" ]; then + if grep -q '^TerminalEmulatorPath=' "$HELPER_DIR/helpers.rc"; then + sed -i "s|^TerminalEmulatorPath=.*|TerminalEmulatorPath=$KITTY_PATH|" "$HELPER_DIR/helpers.rc" + else + sed -i "/^\[Default\]$/a TerminalEmulatorPath=$KITTY_PATH" "$HELPER_DIR/helpers.rc" + fi + fi + + # 2. Create a User-Level "xterm" Shim + # Many older .desktop files and scripts have 'xterm' hardcoded. + # By placing this in ~/.local/bin, we intercept those calls. + BIN_DIR="$HOME/.local/bin" + mkdir -p "$BIN_DIR" + if ! printf "%s" "$PATH" | tr ':' '\n' | grep -qx "$BIN_DIR"; then + echo "Warning: $BIN_DIR is not in PATH for this session. GUI apps may still use /usr/bin/xterm." + fi + + cat <<EOF >"$BIN_DIR/xterm" +#!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== +# +# Shim to redirect xterm calls to kitty +# Resolves Open with (vim/neovim/etc) opening in xterm +args=() +pass_through=() +while [ \$# -gt 0 ]; do + case "\$1" in + -e) + shift + if [ \$# -gt 0 ]; then + pass_through+=("\$@") + fi + break + ;; + -T|-title|-geometry|-bg|-fg|-fs|-fa|-fn) + # Skip common xterm-only flags and their values + shift + [ \$# -gt 0 ] && shift + ;; + -class|-name) + shift + [ \$# -gt 0 ] && shift + ;; + -hold|-ls|-sb|-sk|-sr|-s) + # Ignore boolean flags that kitty doesn't understand + shift + ;; + *) + args+=("\$1") + shift + ;; + esac +done + +if [ \${#pass_through[@]} -gt 0 ]; then + exec kitty "\${args[@]}" -- "\${pass_through[@]}" +else + exec kitty "\${args[@]}" +fi +EOF + chmod +x "$BIN_DIR/xterm" + + # 3. Update GLib/GIO Default Terminal (for GNOME-based backends) + # Some distros use gsettings to define the terminal schema. + if command -v gsettings >/dev/null 2>&1; then + gsettings set org.gnome.desktop.default-applications.terminal exec 'kitty' 2>/dev/null || true + fi + + # 4. Refresh Mime Database + # Ensures Thunar sees the changes to terminal handling immediately. + if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database ~/.local/share/applications 2>/dev/null || true + fi + + # 5. Hide Kitty URL Handler from "Open With" + # Prevents Kitty URL handler from showing up for text files. + USER_APP_DIR="$HOME/.local/share/applications" + mkdir -p "$USER_APP_DIR" + KITTY_URL_HANDLER="" + for dir in $XDG_DATA_DIRS /usr/local/share /usr/share; do + [ -z "$dir" ] && continue + if [ -f "$dir/applications/kitty-url-handler.desktop" ]; then + KITTY_URL_HANDLER="$dir/applications/kitty-url-handler.desktop" + break + fi + done + + if [ -n "$KITTY_URL_HANDLER" ]; then + cp "$KITTY_URL_HANDLER" "$USER_APP_DIR/kitty-url-handler.desktop" + if grep -q '^NoDisplay=' "$USER_APP_DIR/kitty-url-handler.desktop"; then + sed -i 's|^NoDisplay=.*|NoDisplay=true|' "$USER_APP_DIR/kitty-url-handler.desktop" + else + printf "\nNoDisplay=true\n" >>"$USER_APP_DIR/kitty-url-handler.desktop" + fi + if grep -q '^Hidden=' "$USER_APP_DIR/kitty-url-handler.desktop"; then + sed -i 's|^Hidden=.*|Hidden=true|' "$USER_APP_DIR/kitty-url-handler.desktop" + else + printf "Hidden=true\n" >>"$USER_APP_DIR/kitty-url-handler.desktop" + fi + fi + + echo "Default terminal set to kitty successfully." +} + +setup_default_terminal diff --git a/config/hypr/scripts/update_WindowRules.sh b/config/hypr/scripts/update_WindowRules.sh index 8b4262ba..c8d236c4 100755 --- a/config/hypr/scripts/update_WindowRules.sh +++ b/config/hypr/scripts/update_WindowRules.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash +# ================================================== +# KoolDots (2026) +# Project URL: https://github.com/LinuxBeginnings +# License: GNU GPLv3 +# SPDX-License-Identifier: GPL-3.0-or-later +# ================================================== # Script to update WindowRules config if Hyprland version is >= 0.53 CONFIGS_DIR="$HOME/.config/hypr/configs" |
