Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions bin/omarchy-dynamic-bg-fullscreen-watcher
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/bin/bash

# omarchy:summary=Watch fullscreen state to pause dynamic background rotation
# omarchy:group=theme
# omarchy:name=dynamic-bg-fullscreen-watcher

OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}
CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"

socat -u UNIX-CONNECT:"$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" - | while read -r line; do
[[ -f $CONF ]] && source "$CONF"
[[ $DYNAMIC_BG_ENABLED == "true" && $DYNAMIC_BG_STOP_ON_FULLSCREEN == "true" ]] || continue

case "$line" in
fullscreen\>\>1*)
systemctl --user stop omarchy-dynamic-bg.timer
;;
fullscreen\>\>0*)
systemctl --user start omarchy-dynamic-bg.timer
;;
esac
done
71 changes: 71 additions & 0 deletions bin/omarchy-dynamic-bg-rotate
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/bin/bash

# omarchy:summary=Rotate backgrounds dynamically with awww transitions
# omarchy:group=theme
# omarchy:name=dynamic-bg-rotate

OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}
CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"

if [[ ! -f $CONF ]]; then
echo "Dynamic background config not found: $CONF" >&2
exit 1
fi

source "$CONF"

if ! omarchy-cmd-present awww; then
echo "awww is not installed. Install it to use dynamic backgrounds." >&2
exit 1
fi

# Skip rotation if any window is fullscreen and the setting is enabled
if [[ $DYNAMIC_BG_STOP_ON_FULLSCREEN == "true" ]]; then
fullscreen_count=$(hyprctl clients -j 2>/dev/null | jq -r '[.[] | select(.fullscreen != 0)] | length')
if [[ $fullscreen_count -gt 0 ]]; then
exit 0
fi
fi

# Collect backgrounds from theme and user directories
theme_name=$(cat "$HOME/.config/omarchy/current/theme.name" 2>/dev/null)
dirs=(
"$HOME/.config/omarchy/current/theme/backgrounds"
)

if [[ -n $theme_name ]]; then
dirs+=("$HOME/.config/omarchy/backgrounds/$theme_name")
dirs+=("$HOME/.local/share/omarchy/themes/$theme_name/backgrounds")
fi

images=()
for dir in "${dirs[@]}"; do
if [[ -d $dir ]]; then
while IFS= read -r -d '' img; do
images+=("$img")
done < <(find -L "$dir" -maxdepth 1 -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.webp' \) -print0 2>/dev/null)
fi
done

if (( ${#images[@]} == 0 )); then
echo "No background images found." >&2
exit 1
fi

# Kill static wallpaper engine
pkill -x swaybg

# Ensure awww daemon is running
if ! pgrep -x awww-daemon &>/dev/null; then
setsid uwsm-app -- awww-daemon &>/dev/null &
sleep 0.5
fi

# Apply random background to each monitor
while IFS= read -r monitor; do
img=${images[RANDOM % ${#images[@]}]}
awww img "$img" -o "$monitor" \
--transition-type "$DYNAMIC_BG_TRANSITION_TYPE" \
--transition-duration "$DYNAMIC_BG_TRANSITION_DURATION" \
--transition-fps "$DYNAMIC_BG_TRANSITION_FPS"
done < <(hyprctl monitors -j | jq -r '.[] | .name')
30 changes: 30 additions & 0 deletions bin/omarchy-dynamic-bg-set-interval
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash

# omarchy:summary=Set dynamic background rotation interval
# omarchy:group=theme
# omarchy:name=dynamic-bg-set-interval
# omarchy:args=<interval>

CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
TIMER="$HOME/.config/systemd/user/omarchy-dynamic-bg.timer"
INTERVAL=$1

if [[ -z $INTERVAL ]]; then
echo "Usage: omarchy-dynamic-bg-set-interval <interval>" >&2
echo "Examples: 15sec, 30sec, 1min, 5min, 10min, 30min, 1h" >&2
exit 1
fi

if [[ ! -f $CONF ]]; then
echo "Dynamic background config not found: $CONF" >&2
exit 1
fi

sed -i "s/^DYNAMIC_BG_INTERVAL=.*/DYNAMIC_BG_INTERVAL=$INTERVAL/" "$CONF"

if [[ -f $TIMER ]]; then
sed -i "s/^OnUnitActiveSec=.*/OnUnitActiveSec=$INTERVAL/" "$TIMER"
fi

systemctl --user daemon-reload
systemctl --user restart omarchy-dynamic-bg.timer 2>/dev/null || true
25 changes: 25 additions & 0 deletions bin/omarchy-dynamic-bg-set-transition
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash

# omarchy:summary=Set dynamic background transition type and duration
# omarchy:group=theme
# omarchy:name=dynamic-bg-set-transition
# omarchy:args=<type> <duration>

CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
TYPE=$1
DURATION=$2

if [[ -z $TYPE || -z $DURATION ]]; then
echo "Usage: omarchy-dynamic-bg-set-transition <type> <duration>" >&2
echo "Types: random, fade, wipe, grow, wave, outer" >&2
echo "Duration: 0.5, 1, 2, 3, 5 (seconds)" >&2
exit 1
fi

if [[ ! -f $CONF ]]; then
echo "Dynamic background config not found: $CONF" >&2
exit 1
fi

sed -i "s/^DYNAMIC_BG_TRANSITION_TYPE=.*/DYNAMIC_BG_TRANSITION_TYPE=$TYPE/" "$CONF"
sed -i "s/^DYNAMIC_BG_TRANSITION_DURATION=.*/DYNAMIC_BG_TRANSITION_DURATION=$DURATION/" "$CONF"
42 changes: 42 additions & 0 deletions bin/omarchy-dynamic-bg-toggle
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/bin/bash

# omarchy:summary=Toggle dynamic background rotation on/off
# omarchy:group=theme
# omarchy:name=dynamic-bg-toggle

CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"

if [[ ! -f $CONF ]]; then
echo "Dynamic background config not found: $CONF" >&2
exit 1
fi

source "$CONF"

if [[ $DYNAMIC_BG_ENABLED == "true" ]]; then
sed -i "s/^DYNAMIC_BG_ENABLED=.*/DYNAMIC_BG_ENABLED=false/" "$CONF"
systemctl --user disable --now omarchy-dynamic-bg.timer
else
omarchy-cmd-present awww || {
echo "awww is required for dynamic backgrounds." >&2
exit 1
}

# Ensure systemd units exist for existing installs
OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}
for unit in omarchy-dynamic-bg.service omarchy-dynamic-bg.timer; do
if [[ ! -f $HOME/.config/systemd/user/$unit ]]; then
cp "$OMARCHY_PATH/config/systemd/user/$unit" "$HOME/.config/systemd/user/$unit"
fi
done

# Ensure config file exists for existing installs
if [[ ! -f $CONF ]]; then
mkdir -p "$(dirname "$CONF")"
cp "$OMARCHY_PATH/config/omarchy/dynamic-bg/dynamic-bg.conf" "$CONF"
fi

systemctl --user daemon-reload
sed -i "s/^DYNAMIC_BG_ENABLED=.*/DYNAMIC_BG_ENABLED=true/" "$CONF"
systemctl --user enable --now omarchy-dynamic-bg.timer
fi
20 changes: 20 additions & 0 deletions bin/omarchy-dynamic-bg-toggle-fullscreen
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/bash

# omarchy:summary=Toggle dynamic background stop-on-fullscreen behavior
# omarchy:group=theme
# omarchy:name=dynamic-bg-toggle-fullscreen

CONF="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"

if [[ ! -f $CONF ]]; then
echo "Dynamic background config not found: $CONF" >&2
exit 1
fi

source "$CONF"

if [[ $DYNAMIC_BG_STOP_ON_FULLSCREEN == "true" ]]; then
sed -i "s/^DYNAMIC_BG_STOP_ON_FULLSCREEN=.*/DYNAMIC_BG_STOP_ON_FULLSCREEN=false/" "$CONF"
else
sed -i "s/^DYNAMIC_BG_STOP_ON_FULLSCREEN=.*/DYNAMIC_BG_STOP_ON_FULLSCREEN=true/" "$CONF"
fi
93 changes: 91 additions & 2 deletions bin/omarchy-menu
Original file line number Diff line number Diff line change
Expand Up @@ -328,8 +328,97 @@ show_theme_menu() {
}

show_background_menu() {
background=$(omarchy-theme-bg-switcher)
[[ -n $background ]] && omarchy-theme-bg-set "$background"
case $(menu "Background" "󰐃 Static\n󰑓 Dynamic") in
*Static*)
background=$(omarchy-theme-bg-switcher)
[[ -n $background ]] && omarchy-theme-bg-set "$background"
;;
*Dynamic*) show_dynamic_bg_menu ;;
*) back_to show_style_menu ;;
esac
}

show_dynamic_bg_menu() {
if ! command -v awww &>/dev/null; then
omarchy-notification-send "awww is required for dynamic backgrounds" -u critical
back_to show_style_menu
return
fi

local conf="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
[[ -f $conf ]] && source "$conf"

local status="Disabled"
[[ $DYNAMIC_BG_ENABLED == "true" ]] && status="Enabled"

local fullscreen="Off"
[[ $DYNAMIC_BG_STOP_ON_FULLSCREEN == "true" ]] && fullscreen="On"

local display_interval="$DYNAMIC_BG_INTERVAL"
display_interval="${display_interval/sec/s}"
display_interval="${display_interval/min/m}"

case $(menu "Dynamic Background" "󰐾 Status: $status\n󱦟 Interval: $display_interval\n󰸌 Transition Effect: ${DYNAMIC_BG_TRANSITION_TYPE^}\n󰓅 Transition Speed: ${DYNAMIC_BG_TRANSITION_DURATION}s\n󰍺 Stop on Fullscreen: $fullscreen") in
*Status*) omarchy-dynamic-bg-toggle ; show_dynamic_bg_menu ;;
*Interval*) show_dynamic_bg_interval_menu ;;
*Effect*) show_dynamic_bg_effect_menu ;;
*Speed*) show_dynamic_bg_speed_menu ;;
*Fullscreen*) omarchy-dynamic-bg-toggle-fullscreen ; show_dynamic_bg_menu ;;
*) back_to show_style_menu ;;
esac
}

show_dynamic_bg_interval_menu() {
case $(menu "Interval" "󱦟 15 seconds\n󱦟 30 seconds\n󱦟 1 minute\n󱦟 5 minutes\n󱦟 10 minutes\n󱦟 30 minutes\n󱦟 1 hour") in
*"15 seconds"*) omarchy-dynamic-bg-set-interval 15sec ;;
*"30 seconds"*) omarchy-dynamic-bg-set-interval 30sec ;;
*"1 minute"*) omarchy-dynamic-bg-set-interval 1min ;;
*"5 minutes"*) omarchy-dynamic-bg-set-interval 5min ;;
*"10 minutes"*) omarchy-dynamic-bg-set-interval 10min ;;
*"30 minutes"*) omarchy-dynamic-bg-set-interval 30min ;;
*"1 hour"*) omarchy-dynamic-bg-set-interval 1h ;;
*) show_dynamic_bg_menu ; return ;;
esac
show_dynamic_bg_menu
}

show_dynamic_bg_effect_menu() {
local conf="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
[[ -f $conf ]] && source "$conf"

local choice
choice=$(menu "Transition Effect" "󰸌 Random\n󰸌 Fade\n󰸌 Wipe\n󰸌 Grow\n󰸌 Wave\n󰸌 Outer")
local text="${choice##* }"

case "$text" in
Random) omarchy-dynamic-bg-set-transition random "$DYNAMIC_BG_TRANSITION_DURATION" ;;
Fade) omarchy-dynamic-bg-set-transition fade "$DYNAMIC_BG_TRANSITION_DURATION" ;;
Wipe) omarchy-dynamic-bg-set-transition wipe "$DYNAMIC_BG_TRANSITION_DURATION" ;;
Grow) omarchy-dynamic-bg-set-transition grow "$DYNAMIC_BG_TRANSITION_DURATION" ;;
Wave) omarchy-dynamic-bg-set-transition wave "$DYNAMIC_BG_TRANSITION_DURATION" ;;
Outer) omarchy-dynamic-bg-set-transition outer "$DYNAMIC_BG_TRANSITION_DURATION" ;;
*) show_dynamic_bg_menu ; return ;;
esac
show_dynamic_bg_menu
}

show_dynamic_bg_speed_menu() {
local conf="$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
[[ -f $conf ]] && source "$conf"

local choice
choice=$(menu "Transition Speed" "󰓅 0.5s\n󰓅 1s\n󰓅 2s\n󰓅 3s\n󰓅 5s")
local text="${choice##* }"

case "$text" in
0.5s) omarchy-dynamic-bg-set-transition "$DYNAMIC_BG_TRANSITION_TYPE" 0.5 ;;
1s) omarchy-dynamic-bg-set-transition "$DYNAMIC_BG_TRANSITION_TYPE" 1 ;;
2s) omarchy-dynamic-bg-set-transition "$DYNAMIC_BG_TRANSITION_TYPE" 2 ;;
3s) omarchy-dynamic-bg-set-transition "$DYNAMIC_BG_TRANSITION_TYPE" 3 ;;
5s) omarchy-dynamic-bg-set-transition "$DYNAMIC_BG_TRANSITION_TYPE" 5 ;;
*) show_dynamic_bg_menu ; return ;;
esac
show_dynamic_bg_menu
}

show_font_menu() {
Expand Down
6 changes: 6 additions & 0 deletions config/omarchy/dynamic-bg/dynamic-bg.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
DYNAMIC_BG_ENABLED=false
DYNAMIC_BG_INTERVAL=10min
DYNAMIC_BG_TRANSITION_TYPE=random
DYNAMIC_BG_TRANSITION_DURATION=3
DYNAMIC_BG_TRANSITION_FPS=120
DYNAMIC_BG_STOP_ON_FULLSCREEN=true
13 changes: 13 additions & 0 deletions config/systemd/user/omarchy-dynamic-bg-fullscreen-watcher.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[Unit]
Description=Pause dynamic background rotation and daemon during fullscreen
After=graphical-session.target

[Service]
Type=simple
ExecStartPre=/bin/sleep 5
ExecStart=%h/.local/share/omarchy/bin/omarchy-dynamic-bg-fullscreen-watcher
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target
7 changes: 7 additions & 0 deletions config/systemd/user/omarchy-dynamic-bg.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[Unit]
Description=Dynamic background rotation with awww
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=%h/.local/share/omarchy/bin/omarchy-dynamic-bg-rotate
11 changes: 11 additions & 0 deletions config/systemd/user/omarchy-dynamic-bg.timer
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[Unit]
Description=Timer for dynamic background rotation
Requires=omarchy-dynamic-bg.service

[Timer]
OnBootSec=2min
OnUnitActiveSec=10min
AccuracySec=1s

[Install]
WantedBy=timers.target
1 change: 1 addition & 0 deletions install/omarchy-base.packages
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
1password-beta
1password-cli
aether
awww
alsa-utils
asdcontrol
avahi
Expand Down
16 changes: 16 additions & 0 deletions migrations/1780929365.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
echo "Install dynamic background config and systemd units"

if [[ ! -f $HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf ]]; then
mkdir -p "$HOME/.config/omarchy/dynamic-bg"
cp "$OMARCHY_PATH/config/omarchy/dynamic-bg/dynamic-bg.conf" "$HOME/.config/omarchy/dynamic-bg/dynamic-bg.conf"
fi

mkdir -p "$HOME/.config/systemd/user"

for unit in omarchy-dynamic-bg.service omarchy-dynamic-bg.timer; do
if [[ ! -f $HOME/.config/systemd/user/$unit ]]; then
cp "$OMARCHY_PATH/config/systemd/user/$unit" "$HOME/.config/systemd/user/$unit"
fi
done

systemctl --user daemon-reload