Compare commits

..

1 Commits

Author SHA1 Message Date
David Heinemeier Hansson
afa9860afd Revert "Add Vim-style j/k navigation to walker config" 2025-08-03 09:41:00 +02:00
385 changed files with 2062 additions and 4128 deletions

View File

@@ -1,23 +0,0 @@
name: Bug
description: Report a problem
labels: [bug]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: input
id: system-details
attributes:
label: System details
placeholder: e.g. AMD 9950X, NVIDIA 5090, Omarchy 2.1.0
validations:
required: true
- type: textarea
id: steps
attributes:
label: What's wrong?
validations:
required: true

View File

@@ -1 +0,0 @@
blank_issues_enabled: false

View File

@@ -1,15 +0,0 @@
name: Documentation
description: New pages or changes to existing
labels: [documentation]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: textarea
id: steps
attributes:
label: What correction or addition do we need?
validations:
required: true

View File

@@ -1,15 +0,0 @@
name: Enhancement
description: Feature or change
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: textarea
id: steps
attributes:
label: What do you need?
validations:
required: true

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=About
Comment=System information from Fastfetch
Exec=alacritty --class=About --title=About -e bash -c 'fastfetch; read -n 1 -s'
Terminal=false
Type=Application
Icon=Arch
Categories=GTK;
StartupNotify=false

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=Activity
Comment=System activity from btop
Exec=alacritty --class=Activity --title=Activity -e btop
Terminal=false
Type=Application
Icon=Activity
Categories=GTK;
StartupNotify=false

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=Docker
Comment=Manage Docker containers with LazyDocker
Exec=alacritty --class=Docker --title=Docker -e lazydocker
Terminal=false
Type=Application
Icon=Docker
Categories=GTK;
StartupNotify=false

View File

@@ -0,0 +1,221 @@
[Desktop Entry]
Version=1.0
Name=Chromium
# Only KDE 4 seems to use GenericName, so we reuse the KDE strings.
# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413.
GenericName=Web Browser
GenericName[ar]=متصفح الشبكة
GenericName[bg]=Уеб браузър
GenericName[ca]=Navegador web
GenericName[cs]=WWW prohlížeč
GenericName[da]=Browser
GenericName[de]=Web-Browser
GenericName[el]=Περιηγητής ιστού
GenericName[en_GB]=Web Browser
GenericName[es]=Navegador web
GenericName[et]=Veebibrauser
GenericName[fi]=WWW-selain
GenericName[fr]=Navigateur Web
GenericName[gu]=વેબ બ્રાઉઝર
GenericName[he]=דפדפן אינטרנט
GenericName[hi]=वेब ब्राउज़र
GenericName[hu]=Webböngésző
GenericName[it]=Browser Web
GenericName[ja]=ウェブブラウザ
GenericName[kn]=ಜಾಲ ವೀಕ್ಷಕ
GenericName[ko]=웹 브라우저
GenericName[lt]=Žiniatinklio naršyklė
GenericName[lv]=Tīmekļa pārlūks
GenericName[ml]=വെബ് ബ്രൌസര്‍
GenericName[mr]=वेब ब्राऊजर
GenericName[nb]=Nettleser
GenericName[nl]=Webbrowser
GenericName[pl]=Przeglądarka WWW
GenericName[pt]=Navegador Web
GenericName[pt_BR]=Navegador da Internet
GenericName[ro]=Navigator de Internet
GenericName[ru]=Веб-браузер
GenericName[sl]=Spletni brskalnik
GenericName[sv]=Webbläsare
GenericName[ta]=இணைய உலாவி
GenericName[th]=เว็บเบราว์เซอร์
GenericName[tr]=Web Tarayıcı
GenericName[uk]=Навігатор Тенет
GenericName[zh_CN]=网页浏览器
GenericName[zh_HK]=網頁瀏覽器
GenericName[zh_TW]=網頁瀏覽器
# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1.
GenericName[bn]=ওয়েব ব্রাউজার
GenericName[fil]=Web Browser
GenericName[hr]=Web preglednik
GenericName[id]=Browser Web
GenericName[or]=ଓ୍ବେବ ବ୍ରାଉଜର
GenericName[sk]=WWW prehliadač
GenericName[sr]=Интернет прегледник
GenericName[te]=మహాతల అన్వేషి
GenericName[vi]=Bộ duyệt Web
# Gnome and KDE 3 uses Comment.
Comment=Access the Internet
Comment[ar]=الدخول إلى الإنترنت
Comment[bg]=Достъп до интернет
Comment[bn]=ইন্টারনেটটি অ্যাক্সেস করুন
Comment[ca]=Accedeix a Internet
Comment[cs]=Přístup k internetu
Comment[da]=Få adgang til internettet
Comment[de]=Internetzugriff
Comment[el]=Πρόσβαση στο Διαδίκτυο
Comment[en_GB]=Access the Internet
Comment[es]=Accede a Internet.
Comment[et]=Pääs Internetti
Comment[fi]=Käytä internetiä
Comment[fil]=I-access ang Internet
Comment[fr]=Accéder à Internet
Comment[gu]=ઇંટરનેટ ઍક્સેસ કરો
Comment[he]=גישה אל האינטרנט
Comment[hi]=इंटरनेट तक पहुंच स्थापित करें
Comment[hr]=Pristup Internetu
Comment[hu]=Internetelérés
Comment[id]=Akses Internet
Comment[it]=Accesso a Internet
Comment[ja]=インターネットにアクセス
Comment[kn]=ಇಂಟರ್ನೆಟ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ
Comment[ko]=인터넷 연결
Comment[lt]=Interneto prieiga
Comment[lv]=Piekļūt internetam
Comment[ml]=ഇന്റര്‍‌നെറ്റ് ആക്‌സസ് ചെയ്യുക
Comment[mr]=इंटरनेटमध्ये प्रवेश करा
Comment[nb]=Gå til Internett
Comment[nl]=Verbinding maken met internet
Comment[or]=ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ
Comment[pl]=Skorzystaj z internetu
Comment[pt]=Aceder à Internet
Comment[pt_BR]=Acessar a internet
Comment[ro]=Accesaţi Internetul
Comment[ru]=Доступ в Интернет
Comment[sk]=Prístup do siete Internet
Comment[sl]=Dostop do interneta
Comment[sr]=Приступите Интернету
Comment[sv]=Gå ut på Internet
Comment[ta]=இணையத்தை அணுகுதல்
Comment[te]=ఇంటర్నెట్‌ను ఆక్సెస్ చెయ్యండి
Comment[th]=เข้าถึงอินเทอร์เน็ต
Comment[tr]=İnternet'e erişin
Comment[uk]=Доступ до Інтернету
Comment[vi]=Truy cập Internet
Comment[zh_CN]=访问互联网
Comment[zh_HK]=連線到網際網路
Comment[zh_TW]=連線到網際網路
Exec=/usr/bin/chromium --ozone-platform=wayland %U
StartupNotify=true
Terminal=false
Icon=chromium
Type=Application
Categories=Network;WebBrowser;
MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;
Actions=new-window;new-private-window;
[Desktop Action new-window]
Name=New Window
Name[am]=አዲስ መስኮት
Name[ar]=نافذة جديدة
Name[bg]=Нов прозорец
Name[bn]=নতুন উইন্ডো
Name[ca]=Finestra nova
Name[cs]=Nové okno
Name[da]=Nyt vindue
Name[de]=Neues Fenster
Name[el]=Νέο Παράθυρο
Name[en_GB]=New Window
Name[es]=Nueva ventana
Name[et]=Uus aken
Name[fa]=پنجره جدید
Name[fi]=Uusi ikkuna
Name[fil]=New Window
Name[fr]=Nouvelle fenêtre
Name[gu]=નવી વિંડો
Name[hi]=नई विंडो
Name[hr]=Novi prozor
Name[hu]=Új ablak
Name[id]=Jendela Baru
Name[it]=Nuova finestra
Name[iw]=חלון חדש
Name[ja]=新規ウインドウ
Name[kn]=ಹೊಸ ವಿಂಡೊ
Name[ko]=새 창
Name[lt]=Naujas langas
Name[lv]=Jauns logs
Name[ml]=പുതിയ വിന്‍ഡോ
Name[mr]=नवीन विंडो
Name[nl]=Nieuw venster
Name[no]=Nytt vindu
Name[pl]=Nowe okno
Name[pt]=Nova janela
Name[pt_BR]=Nova janela
Name[ro]=Fereastră nouă
Name[ru]=Новое окно
Name[sk]=Nové okno
Name[sl]=Novo okno
Name[sr]=Нови прозор
Name[sv]=Nytt fönster
Name[sw]=Dirisha Jipya
Name[ta]=புதிய சாளரம்
Name[te]=క్రొత్త విండో
Name[th]=หน้าต่างใหม่
Name[tr]=Yeni Pencere
Name[uk]=Нове вікно
Name[vi]=Cửa sổ Mới
Name[zh_CN]=新建窗口
Name[zh_TW]=開新視窗
Exec=/usr/bin/chromium --ozone-platform=wayland --new-window
[Desktop Action new-private-window]
Name=New Incognito Window
Name[ar]=نافذة جديدة للتصفح المتخفي
Name[bg]=Нов прозорец „инкогнито“
Name[bn]=নতুন ছদ্মবেশী উইন্ডো
Name[ca]=Finestra d'incògnit nova
Name[cs]=Nové anonymní okno
Name[da]=Nyt inkognitovindue
Name[de]=Neues Inkognito-Fenster
Name[el]=Νέο παράθυρο για ανώνυμη περιήγηση
Name[en_GB]=New Incognito window
Name[es]=Nueva ventana de incógnito
Name[et]=Uus inkognito aken
Name[fa]=پنجره جدید حالت ناشناس
Name[fi]=Uusi incognito-ikkuna
Name[fil]=Bagong Incognito window
Name[fr]=Nouvelle fenêtre de navigation privée
Name[gu]=નવી છુપી વિંડો
Name[hi]=नई गुप्त विंडो
Name[hr]=Novi anoniman prozor
Name[hu]=Új Inkognitóablak
Name[id]=Jendela Penyamaran baru
Name[it]=Nuova finestra di navigazione in incognito
Name[iw]=חלון חדש לגלישה בסתר
Name[ja]=新しいシークレット ウィンドウ
Name[kn]=ಹೊಸ ಅಜ್ಞಾತ ವಿಂಡೋ
Name[ko]=새 시크릿 창
Name[lt]=Naujas inkognito langas
Name[lv]=Jauns inkognito režīma logs
Name[ml]=പുതിയ വേഷ പ്രച്ഛന്ന വിന്‍ഡോ
Name[mr]=नवीन गुप्त विंडो
Name[nl]=Nieuw incognitovenster
Name[no]=Nytt inkognitovindu
Name[pl]=Nowe okno incognito
Name[pt]=Nova janela de navegação anónima
Name[pt_BR]=Nova janela anônima
Name[ro]=Fereastră nouă incognito
Name[ru]=Новое окно в режиме инкогнито
Name[sk]=Nové okno inkognito
Name[sl]=Novo okno brez beleženja zgodovine
Name[sr]=Нови прозор за прегледање без архивирања
Name[sv]=Nytt inkognitofönster
Name[ta]=புதிய மறைநிலைச் சாளரம்
Name[te]=క్రొత్త అజ్ఞాత విండో
Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน
Name[tr]=Yeni Gizli pencere
Name[uk]=Нове вікно в режимі анонімного перегляду
Name[vi]=Cửa sổ ẩn danh mới
Name[zh_CN]=新建隐身窗口
Name[zh_TW]=新增無痕式視窗
Exec=/usr/bin/chromium --ozone-platform=wayland --new-window --incognito

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
applications/icons/Arch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Version=1.0
Type=Application
Name=Omarchy
Comment=Omarchy TUI
Exec=alacritty --class=Omarchy --title=Omarchy -e bash -c '$HOME/.local/share/omarchy/bin/omarchy'
Icon=Arch
Terminal=false
Categories=System;Utility;
StartupNotify=false

View File

@@ -0,0 +1,7 @@
[Desktop Entry]
Name=Audio Settings
Comment=Using Wiremix
Exec=alacritty --class=Wiremix --title=Wiremix -e wiremix
Icon=audio-card
Type=Application
Terminal=false

View File

@@ -0,0 +1,12 @@
[Desktop Entry]
Name=Zoom
Comment=Zoom Video Conference
Exec=env QT_SCALE_FACTOR=2 /usr/bin/zoom %U
Icon=Zoom
Terminal=false
Type=Application
Encoding=UTF-8
Categories=Network;Application;
StartupWMClass=zoom
MimeType=x-scheme-handler/zoommtg;x-scheme-handler/zoomus;x-scheme-handler/tel;x-scheme-handler/callto;x-scheme-handler/zoomphonecall;x-scheme-handler/zoomphonesms;x-scheme-handler/zoomcontactcentercall;application/x-zoom
X-KDE-Protocols=zoommtg;zoomus;tel;callto;zoomphonecall;zoomphonesms;zoomcontactcentercall;

157
bin/omarchy Executable file
View File

@@ -0,0 +1,157 @@
#!/bin/bash
OMARCHY_VERSION=$(git -C ~/.local/share/omarchy describe --tags --abbrev=0 2>/dev/null)
PATH="$PATH:$HOME/.local/share/omarchy/bin"
show_ascii_art() {
clear
tte -i ~/.local/share/omarchy/logo.txt --frame-rate 640 --no-color expand
echo " $OMARCHY_VERSION"
}
main_menu() {
show_ascii_art
local options=("Theme" "Font" "Setup" "Update" "Manual" "Exit")
choice=$(printf "%s\n" "${options[@]}" | gum choose --header "") || exit 0
case "$choice" in
Theme) theme_menu ;;
Font)
omarchy-font-menu
ack_command
main_menu
;;
Update) update_menu ;;
Setup) setup_menu ;;
Manual) open_manual ;;
Exit) clear && exit 0 ;;
esac
}
update_menu() {
show_ascii_art
local menu=("Omarchy" "Waybar" "Walker" "Plymouth" "SwayOSD" "Desktop apps" "Back")
local commands=(
"omarchy-update"
"omarchy-refresh-waybar"
"omarchy-refresh-walker"
"omarchy-refresh-plymouth"
"omarchy-refresh-swayosd"
"omarchy-refresh-applications"
"main_menu"
)
local choice
choice=$(printf "%s\n" "${menu[@]}" | gum choose --header="Update") || main_menu
for i in "${!menu[@]}"; do
if [[ "${menu[$i]}" == "$choice" ]]; then
if [[ "$choice" == "Back" ]]; then
main_menu
else
eval "${commands[$i]}"
ack_command
main_menu
fi
break
fi
done
}
theme_menu() {
show_ascii_art
local menu=("Pick" "Install" "Update" "Remove" "Back")
local commands=(
"omarchy-theme-menu"
"install_theme_prompt"
"omarchy-theme-update"
"remove_theme_prompt"
"main_menu"
)
local choice
choice=$(printf "%s\n" "${menu[@]}" | gum choose --header="Theme") || main_menu
for i in "${!menu[@]}"; do
if [[ "${menu[$i]}" == "$choice" ]]; then
if [[ "$choice" == "Back" ]]; then
main_menu
else
eval "${commands[$i]}"
ack_command
main_menu
fi
break
fi
done
}
install_theme_prompt() {
local url
url=$(gum input --placeholder="Git repo URL for theme" --header="")
if [[ -n "$url" ]]; then
omarchy-theme-install "$url"
fi
theme_menu
}
remove_theme_prompt() {
local theme
theme=$(gum input --placeholder="Theme name" --header="")
if [[ -n "$theme" ]]; then
omarchy-theme-remove "$theme"
fi
theme_menu
}
setup_menu() {
show_ascii_art
local menu=("Dropbox" "Steam" "Docker DBs" "Fingerprint sensor" "Fido2 device" "Back")
local commands=(
"omarchy-setup-dropbox"
"omarchy-setup-steam"
"setup_docker_dbs"
"omarchy-setup-fingerprint"
"omarchy-setup-fido2"
"main_menu"
)
local choice
choice=$(printf "%s\n" "${menu[@]}" | gum choose --header="Setup") || main_menu
for i in "${!menu[@]}"; do
if [[ "${menu[$i]}" == "$choice" ]]; then
if [[ "$choice" == "Back" ]]; then
main_menu
else
eval "${commands[$i]}"
ack_command
main_menu
fi
break
fi
done
}
setup_docker_dbs() {
options=("MariaDB" "MySQL" "Redis" "PostgreSQL")
choices=$(printf "%s\n" "${options[@]}" | gum choose --no-limit --header "Select databases (space to select, return to install, esc to cancel)") || main_menu
if [[ -n "$choices" ]]; then
for db in $choices; do
case $db in
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres16 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:16 ;;
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
esac
done
fi
main_menu
}
open_manual() {
setsid chromium --new-window --ozone-platform=wayland --app="https://manuals.omamix.org/2/the-omarchy-manual" >/dev/null 2>&1 &
clear
}
ack_command() {
gum spin --spinner "globe" --title "Done!" -- sleep 1
}
main_menu

View File

@@ -6,13 +6,7 @@ BATTERY_THRESHOLD=10
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified" NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
get_battery_percentage() { get_battery_percentage() {
upower -i "$(upower -e | grep 'BAT')" \ upower -i $(upower -e | grep 'BAT') | grep -E "percentage" | grep -o '[0-9]\+%' | sed 's/%//'
| awk -F: '/percentage/ {
gsub(/[%[:space:]]/, "", $2);
val=$2;
printf("%d\n", (val+0.5))
exit
}'
} }
get_battery_state() { get_battery_state() {
@@ -20,7 +14,7 @@ get_battery_state() {
} }
send_notification() { send_notification() {
notify-send -u critical "󱐋 Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000 notify-send -u critical "Battery Low" "Time to recharge! (battery is at ${1}%)" -i battery-caution
} }
BATTERY_LEVEL=$(get_battery_percentage) BATTERY_LEVEL=$(get_battery_percentage)

View File

@@ -1,50 +0,0 @@
#!/bin/bash
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
sinks=$(pactl -f json list sinks)
sinks_count=$(echo "$sinks" | jq '. | length')
if [ "$sinks_count" -eq 0 ]; then
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "No audio devices found"
exit 1
fi
current_sink_name=$(pactl get-default-sink)
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')
if [ "$current_sink_index" != "null" ]; then
next_sink_index=$(((current_sink_index + 1) % sinks_count))
else
next_sink_index=0
fi
next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
next_sink_name=$(echo "$next_sink" | jq -r '.name')
next_sink_description=$(echo "$next_sink" | jq -r '.description')
next_sink_volume=$(echo "$next_sink" | jq -r \
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
icon_state="muted"
elif [ "$next_sink_volume" -le 33 ]; then
icon_state="low"
elif [ "$next_sink_volume" -le 66 ]; then
icon_state="medium"
else
icon_state="high"
fi
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
if [ "$next_sink_name" != "$current_sink_name" ]; then
pactl set-default-sink "$next_sink_name"
fi
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "$next_sink_description" \
--custom-icon "$next_sink_volume_icon"

View File

@@ -1,9 +0,0 @@
#!/bin/bash
# Close all open windows
hyprctl clients -j | \
jq -r ".[].address" | \
xargs -I{} hyprctl dispatch closewindow address:{}
# Move to first workspace
hyprctl dispatch workspace 1

View File

@@ -1,12 +0,0 @@
#!/bin/bash
set -e
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
if [[ -f "$FIRST_RUN_MODE" ]]; then
rm -f "$FIRST_RUN_MODE"
$OMARCHY_PATH/install/first-run/battery-monitor.sh
$OMARCHY_PATH/install/first-run/firewall.sh
sudo rm -f /etc/sudoers.d/first-run
fi

View File

@@ -1,9 +0,0 @@
#!/bin/bash
for cmd in "$@"; do
if ! command -v "$cmd" &>/dev/null; then
exit 0
fi
done
exit 1

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for cmd in "$@"; do
command -v "$cmd" &>/dev/null || exit 1
done
exit 0

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
# Set recorder based on GPU
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs [[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}" OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
@@ -8,21 +10,15 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1 exit 1
fi fi
if [[ $2 == "audio" ]]; then
AUDIO="--audio"
else
AUDIO=""
fi
screenrecording() { screenrecording() {
filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
notify-send "Screen recording starting..." -t 1000 notify-send "Screen recording starting..." -t 1000
sleep 1 sleep 1
if lspci | grep -Eqi 'nvidia|intel.*graphics'; then if lspci | grep -qi 'nvidia'; then
wf-recorder $AUDIO -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@" wf-recorder -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@"
else else
wl-screenrec $AUDIO -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@" wl-screenrec -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@"
fi fi
} }

View File

@@ -1,7 +0,0 @@
#!/bin/bash
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
pkill -x wl-screenrec
pkill -x wf-recorder
notify-send "Screen recording stopped" -t 2000
fi

View File

@@ -1,22 +1,20 @@
#!/bin/bash #!/bin/bash
function exit_screensaver { if command -v tte &>/dev/null; then
pkill -x tte 2>/dev/null while true; do
pkill -f "alacritty --class Screensaver" 2>/dev/null effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
exit 0 tte -i ~/.local/share/omarchy/logo.txt \
} --frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
"$effect" &
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT while pgrep tte >/dev/null; do
if read -n 1 -t 0.01; then
while true; do pkill tte 2>/dev/null
effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1) exit 0
tte -i ~/.config/omarchy/branding/screensaver.txt \ fi
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \ done
"$effect" &
while pgrep -x tte >/dev/null; do
if read -n 1 -t 3; then
exit_screensaver
fi
done done
done else
gum spin --title "Can't find tte. Try: pip install terminaltexteffects" -- sleep 2
fi

View File

@@ -8,7 +8,7 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1 exit 1
fi fi
pkill slurp || hyprshot -m ${1:-region} --raw --freeze | pkill slurp || hyprshot -m ${1:-region} --raw |
satty --filename - \ satty --filename - \
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \ --output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
--early-exit \ --early-exit \

View File

@@ -1,11 +0,0 @@
#!/bin/bash
# Go from current active terminal to its child shell process and run cwd there
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
shell_pid=$(pgrep -P "$terminal_pid" | head -n1)
if [[ -n $shell_pid ]]; then
readlink -f "/proc/$shell_pid/cwd" 2>/dev/null || echo "$HOME"
else
echo "$HOME"
fi

View File

@@ -1,7 +1,5 @@
#!/bin/bash #!/bin/bash
sudo systemctl restart systemd-timesyncd
sudo tzupdate sudo tzupdate
new_timezone=$(timedatectl show -p Timezone --value) new_timezone=$(timedatectl show -p Timezone --value)
omarchy-restart-waybar notify-send "Timezone has been set to $new_timezone"
notify-send "Time synced and timezone set to $new_timezone"

View File

@@ -4,3 +4,4 @@ cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh" migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
touch $migration_file touch $migration_file
nvim $migration_file nvim $migration_file
echo -e "Run with:\nsource $migration_file"

View File

@@ -1,28 +0,0 @@
#!/bin/bash
# Drive, like /dev/nvme0, to display information about
if (($# == 0)); then
echo "Usage: omarchy-drive-info [/dev/drive]"
exit 1
else
drive="$1"
fi
# Find the root drive in case we are looking at partitions
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
if [[ -n "$root_drive" ]]; then
root_drive="/dev/$root_drive"
else
root_drive="$drive"
fi
# Get basic disk information
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null)
# Format display string
display="$drive"
[[ -n "$size" ]] && display="$display ($size)"
[[ -n "$model" ]] && display="$display - $model"
echo "$display"

View File

@@ -1,18 +0,0 @@
#!/bin/bash
# Select a drive from a list with info that includes space and brand
if (($# == 0)); then
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
else
drives="$@"
fi
drives_with_info=""
while IFS= read -r drive; do
[[ -n "$drive" ]] || continue
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
done <<<"$drives"
selected_drive="$(printf "%s" "$drives_with_info" | gum choose --header "Select drive")" || exit 1
printf "%s\n" "$selected_drive" | awk '{print $1}'

View File

@@ -1,21 +0,0 @@
#!/bin/bash
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
if [[ -n $encrypted_drives ]]; then
if [[ $(wc -l <<<"$encrypted_drives") -eq 1 ]]; then
drive_to_change="$encrypted_drives"
else
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
fi
if [[ -n $drive_to_change ]]; then
echo "Changing full-disk encryption password for $drive_to_change"
sudo cryptsetup luksChangeKey --pbkdf argon2id --iter-time 2000 "$drive_to_change"
else
echo "No drive selected."
fi
else
echo "No encrypted drives available."
exit 1
fi

View File

@@ -1,3 +0,0 @@
#!/bin/bash
grep -oP 'family\s*=\s*"\K[^"]+' ~/.config/alacritty/alacritty.toml | head -n1

View File

@@ -1,3 +0,0 @@
#!/bin/bash
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u

12
bin/omarchy-font-menu Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
font=$(
fc-list :spacing=100 -f "%{family[0]}\n" |
grep -v -i -E 'emoji|signwriting' |
sort -u |
gum choose --header "Choose terminal font"
)
if [[ -n "$font" ]]; then
sed -i "s/family = \".*\"/family = \"$font\"/g" ~/.config/alacritty/alacritty.toml
fi

View File

@@ -1,24 +0,0 @@
#!/bin/bash
font_name="$1"
if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
if fc-list | grep -iq "$font_name"; then
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
xmlstarlet ed -L \
-u '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' \
-v "$font_name" \
~/.config/fontconfig/fonts.conf
omarchy-restart-waybar
omarchy-restart-swayosd
omarchy-restart-walker
else
echo "Font '$font_name' not found."
exit 1
fi
else
echo "Usage: omarchy-font-set <font-name>"
fi

View File

@@ -1,139 +0,0 @@
#!/bin/bash
if [[ -z "$1" ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet|clojure>" >&2
exit 1
fi
install_php() {
sudo pacman -S php composer php-sqlite xdebug --noconfirm
# Install Path for Composer
if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then
echo 'export PATH="$HOME/.config/composer/vendor/bin:$PATH"' >>"$HOME/.bashrc"
source "$HOME/.bashrc"
echo "Added Composer global bin directory to PATH."
else
echo "Composer global bin directory already in PATH."
fi
# Enable some extensions
local php_ini_path="/etc/php/php.ini"
local extensions_to_enable=(
"bcmath"
"intl"
"iconv"
"openssl"
"pdo_sqlite"
"pdo_mysql"
)
# Enable Xdebug
sudo sed -i \
-e 's/^;zend_extension=xdebug.so/zend_extension=xdebug.so/' \
-e 's/^;xdebug.mode=debug/xdebug.mode=debug/' \
/etc/php/conf.d/xdebug.ini
for ext in "${extensions_to_enable[@]}"; do
sudo sed -i "s/^;extension=${ext}/extension=${ext}/" "$php_ini_path"
done
}
install_node() {
echo -e "Installing Node.js...\n"
mise use --global node@lts
}
case "$1" in
ruby)
echo -e "Installing Ruby on Rails...\n"
mise use --global ruby@latest
mise settings add idiomatic_version_file_enable_tools ruby
mise x ruby -- gem install rails --no-document
echo -e "\nYou can now run: rails new myproject"
;;
node)
install_node
;;
bun)
echo -e "Installing Bun...\n"
mise use -g bun@latest
;;
deno)
echo -e "Installing Deno...\n"
mise use -g deno@latest
;;
go)
echo -e "Installing Go...\n"
mise use --global go@latest
;;
php)
echo -e "Installing PHP...\n"
install_php
;;
laravel)
echo -e "Installing PHP and Laravel...\n"
install_php
install_node
composer global require laravel/installer
echo -e "\nYou can now run: laravel new myproject"
;;
symfony)
echo -e "Installing PHP and Symfony...\n"
install_php
omarchy-pkg-add symfony-cli
echo -e "\nYou can now run: symfony new --webapp myproject"
;;
python)
echo -e "Installing Python...\n"
mise use --global python@latest
echo -e "\nInstalling uv...\n"
curl -fsSL https://astral.sh/uv/install.sh | sh
;;
elixir)
echo -e "Installing Elixir...\n"
mise use --global erlang@latest
mise use --global elixir@latest
mise x elixir -- mix local.hex --force
;;
phoenix)
echo -e "Installing Phoenix Framework...\n"
# Ensure Erlang/Elixir first
mise use --global erlang@latest
mise use --global elixir@latest
# Hex & Rebar
mise x elixir -- mix local.hex --force
mise x elixir -- mix local.rebar --force
# Phoenix project (phx_new)
mise x elixir -- mix archive.install hex phx_new --force
echo -e "\nYou can now run: mix phx.new my_app"
;;
rust)
echo -e "Installing Rust...\n"
bash -c "$(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs)" -- -y
;;
java)
echo -e "Installing Java...\n"
mise use --global java@latest
;;
zig)
echo -e "Installing Zig...\n"
mise use --global zig@latest
;;
ocaml)
echo -e "Installing OCaml...\n"
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)"
opam init --yes
eval "$(opam env)"
opam install ocaml-lsp-server odoc ocamlformat utop --yes
;;
dotnet)
echo -e "Installing .NET...\n"
mise use --global dotnet@latest
;;
clojure)
echo -e "Installing Clojure...\n"
omarchy-pkg-add rlwrap
mise use --global clojure@latest
;;
esac

View File

@@ -1,23 +0,0 @@
#!/bin/bash
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB")
if [[ "$#" -eq 0 ]]; then
choices=$(printf "%s\n" "${options[@]}" | gum choose --no-limit --header "Select databases (space to select, return to install, esc to cancel)") || main_menu
else
choices="$@"
fi
if [[ -n "$choices" ]]; then
for db in $choices; do
case $db in
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres17 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 ;;
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;
esac
done
else
echo "No databases selected for installation."
fi

View File

@@ -1,8 +0,0 @@
#!/bin/bash
echo "Adding multilib repository for 32-bit compatibility"
sudo sed -i '/^#\s*\[multilib\]/,/^#\s*Include/ s/^#\s*//' /etc/pacman.conf
echo "Now pick dependencies matching your graphics card"
sudo pacman -Syu --noconfirm steam
setsid gtk-launch steam >/dev/null 2>&1 &

View File

@@ -1,13 +0,0 @@
#!/bin/bash
curl -fsSL https://tailscale.com/install.sh | sh
curl -fsSL https://neuralink.com/tsui/install.sh | bash
echo -e "\nStarting Tailscale..."
sudo tailscale up --accept-routes
echo -e "\nAdd tsui to sudoers..."
echo "$USER ALL=(ALL) NOPASSWD: $(which tsui)" | sudo tee /etc/sudoers.d/tsui
omarchy-tui-install "Tailscale" "sudo tsui" float https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
omarchy-webapp-install "Tailscale Admin Console" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png

View File

@@ -1,3 +0,0 @@
#!/bin/bash
exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$(xdg-settings get default-web-browser) 2>/dev/null | head -1) ${args[@]} $@

View File

@@ -1,4 +0,0 @@
#!/bin/bash
cmd="$*"
setsid alacritty --class Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"

View File

@@ -1,26 +1,5 @@
#!/bin/bash #!/bin/bash
# Exit early if we don't have the tte show pgrep -f "alacritty --class Screensaver" ||
if ! command -v tte &>/dev/null; then alacritty --class Screensaver --title Screensaver -o 'colors.primary.background="#000000"' \
exit 1 -o 'colors.cursor.cursor="#000000"' -e ~/.local/share/omarchy/bin/omarchy-cmd-screensaver
fi
# Exit early if screensave is already running
pgrep -f "alacritty --class Screensaver" && exit 0
# Allow screensaver to be turned off but also force started
if [[ -f ~/.local/state/omarchy/toggles/screensaver-off ]] && [[ $1 != "force" ]]; then
exit 1
fi
focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
hyprctl dispatch focusmonitor $m
hyprctl dispatch exec -- \
alacritty --class Screensaver \
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
-e omarchy-cmd-screensaver
done
hyprctl dispatch focusmonitor $focused

View File

@@ -1,10 +0,0 @@
#!/bin/bash
browser=$(xdg-settings get default-web-browser)
case $browser in
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi*) ;;
*) browser="chromium.desktop" ;;
esac
exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"

View File

@@ -1,12 +0,0 @@
#!/bin/bash
# Lock the screen
pidof hyprlock || hyprlock &
# Ensure 1password is locked
if pgrep -x "1password" >/dev/null; then
1password --lock &
fi
# Avoid running screensaver when locked
pkill -f "alacritty --class Screensaver"

View File

@@ -1,439 +0,0 @@
#!/bin/bash
export PATH="$HOME/.local/share/omarchy/bin:$PATH"
# Set to true when going directly to a submenu, so we can exit directly
BACK_TO_EXIT=false
back_to() {
local parent_menu="$1"
if [[ "$DIRECT_ACCESS" == "true" ]]; then
exit 0
elif [[ -n "$parent_menu" ]]; then
"$parent_menu"
else
show_main_menu
fi
}
menu() {
local prompt="$1"
local options="$2"
local extra="$3"
local preselect="$4"
read -r -a args <<<"$extra"
if [[ -n "$preselect" ]]; then
local index
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
if [[ -n "$index" ]]; then
args+=("-a" "$index")
fi
fi
echo -e "$options" | walker --dmenu --theme dmenu_250 -p "$prompt…" "${args[@]}"
}
terminal() {
alacritty --class Omarchy -e "$@"
}
present_terminal() {
omarchy-launch-floating-terminal-with-presentation $1
}
edit_in_nvim() {
notify-send "Editing config file" "$1"
alacritty -e nvim "$1"
}
install() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2"
}
install_and_launch() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2 && setsid gtk-launch $3"
}
install_font() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'"
}
aur_install() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2"
}
aur_install_and_launch() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2 && setsid gtk-launch $3"
}
show_learn_menu() {
case $(menu "Learn" " Keybindings\n Omarchy\n Hyprland\n󰣇 Arch\n Neovim\n󱆃 Bash") in
*Keybindings*) omarchy-menu-keybindings ;;
*Omarchy*) omarchy-launch-webapp "https://learn.omacom.io/2/the-omarchy-manual" ;;
*Hyprland*) omarchy-launch-webapp "https://wiki.hypr.land/" ;;
*Arch*) omarchy-launch-webapp "https://wiki.archlinux.org/title/Main_page" ;;
*Bash*) omarchy-launch-webapp "https://devhints.io/bash" ;;
*Neovim*) omarchy-launch-webapp "https://www.lazyvim.org/keymaps" ;;
*) show_main_menu ;;
esac
}
show_style_menu() {
case $(menu "Style" "󰸌 Theme\n Font\n Background\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;;
*Font*) show_font_menu ;;
*Background*) omarchy-theme-bg-next ;;
*Screensaver*) edit_in_nvim ~/.config/omarchy/branding/screensaver.txt ;;
*About*) edit_in_nvim ~/.config/omarchy/branding/about.txt ;;
*) show_main_menu ;;
esac
}
show_theme_menu() {
theme=$(menu "Theme" "$(omarchy-theme-list)" "" "$(omarchy-theme-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
back_to show_style_menu
else
omarchy-theme-set "$theme"
fi
}
show_font_menu() {
theme=$(menu "Font" "$(omarchy-font-list)" "-w 350" "$(omarchy-font-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
back_to show_style_menu
else
omarchy-font-set "$theme"
fi
}
show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in
*Screenshot*) show_screenshot_menu ;;
*Screenrecord*) show_screenrecord_menu ;;
*Color*) pkill hyprpicker || hyprpicker -a ;;
*) show_main_menu ;;
esac
}
show_screenshot_menu() {
case $(menu "Screenshot" " Region\n Window\n Display") in
*Region*) omarchy-cmd-screenshot ;;
*Window*) omarchy-cmd-screenshot window ;;
*Display*) omarchy-cmd-screenshot output ;;
*) show_capture_menu ;;
esac
}
show_screenrecord_menu() {
case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio") in
*"Region + Audio"*) omarchy-cmd-screenrecord region audio ;;
*Region*) omarchy-cmd-screenrecord ;;
*"Display + Audio"*) omarchy-cmd-screenrecord output audio ;;
*Display*) omarchy-cmd-screenrecord output ;;
*) show_capture_menu ;;
esac
}
show_toggle_menu() {
case $(menu "Toggle" "󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar") in
*Screensaver*) omarchy-toggle-screensaver ;;
*Nightlight*) omarchy-toggle-nightlight ;;
*Idle*) omarchy-toggle-idle ;;
*Bar*) omarchy-toggle-waybar ;;
*) show_main_menu ;;
esac
}
show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n󰍹 Monitors"
[ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings"
[ -f ~/.config/hypr/input.conf ] && options="$options\n Input"
options="$options\n󰱔 DNS\n Config\n󰈷 Fingerprint\n Fido2"
case $(menu "Setup" "$options") in
*Audio*) alacritty --class=Wiremix -e wiremix ;;
*Wifi*)
rfkill unblock wifi
alacritty --class=Impala -e impala
;;
*Bluetooth*)
rfkill unblock bluetooth
blueberry
;;
*Power*) show_setup_power_menu ;;
*Monitors*) edit_in_nvim ~/.config/hypr/monitors.conf ;;
*Keybindings*) edit_in_nvim ~/.config/hypr/bindings.conf ;;
*Input*) edit_in_nvim ~/.config/hypr/input.conf ;;
*DNS*) present_terminal omarchy-setup-dns ;;
*Config*) show_setup_config_menu ;;
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-fido2 ;;
*) show_main_menu ;;
esac
}
show_setup_power_menu() {
profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)")
if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then
back_to show_setup_menu
else
powerprofilesctl set "$profile"
fi
}
show_setup_config_menu() {
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Hyprland*) edit_in_nvim ~/.config/hypr/hyprland.conf ;;
*Hypridle*) edit_in_nvim ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
*Hyprlock*) edit_in_nvim ~/.config/hypr/hyprlock.conf ;;
*Hyprsunset*) edit_in_nvim ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
*Swayosd*) edit_in_nvim ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;;
*Walker*) edit_in_nvim ~/.config/walker/config.toml && omarchy-restart-walker ;;
*Waybar*) edit_in_nvim ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;;
*XCompose*) edit_in_nvim ~/.XCompose && omarchy-restart-xcompose ;;
*) show_main_menu ;;
esac
}
show_install_menu() {
case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n󱚤 AI\n Gaming") in
*Package*) terminal omarchy-pkg-install ;;
*AUR*) terminal omarchy-pkg-aur-install ;;
*Web*) present_terminal omarchy-webapp-install ;;
*TUI*) present_terminal omarchy-tui-install ;;
*Service*) show_install_service_menu ;;
*Style*) show_install_style_menu ;;
*Development*) show_install_development_menu ;;
*Editor*) show_install_editor_menu ;;
*AI*) show_install_ai_menu ;;
*Gaming*) show_install_gaming_menu ;;
*) show_main_menu ;;
esac
}
show_install_service_menu() {
case $(menu "Install" " Dropbox\n Tailscale\n󰟵 Bitwarden") in
*Dropbox*) present_terminal omarchy-install-dropbox ;;
*Tailscale*) present_terminal omarchy-install-tailscale ;;
*Bitwarden*) install_and_launch "Bitwarden" "bitwarden bitwarden-cli" "bitwarden" ;;
*) show_install_menu ;;
esac
}
show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
*VSCode*) install_and_launch "VSCode" "visual-studio-code-bin" "code" ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) aur_install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) install "Helix" "helix" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;;
esac
}
show_install_ai_menu() {
ollama_pkg=$(
(command -v nvidia-smi &>/dev/null && echo ollama-cuda) ||
(command -v rocminfo &>/dev/null && echo ollama-rocm) ||
echo ollama
)
case $(menu "Install" "󱚤 Claude Code\n󱚤 Gemini [AUR]\n󱚤 OpenAI Codex [AUR]\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in
*Claude*) install "Claude Code" "claude-code" ;;
*OpenAI*) aur_install "OpenAI Codex" "openai-codex-bin" ;;
*Gemini*) aur_install "Gemini" "gemini-cli" ;;
*Studio*) install "LM Studio" "lmstudio" ;;
*Ollama*) install "Ollama" $ollama_pkg ;;
*Crush*) install "Crush" "crush-bin" ;;
*opencode*) install "opencode" "opencode" ;;
*) show_install_menu ;;
esac
}
show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch [AUR]\n󰍳 Minecraft") in
*Steam*) present_terminal omarchy-install-steam ;;
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
*Minecraft*) aur_install_and_launch "Minecraft [AUR]" "minecraft-launcher" "minecraft-launcher" ;;
*) show_install_menu ;;
esac
}
show_install_style_menu() {
case $(menu "Install" "󰸌 Theme\n Background\n Font") in
*Theme*) present_terminal omarchy-theme-install ;;
*Background*) nautilus ~/.config/omarchy/current/theme/backgrounds ;;
*Font*) show_install_font_menu ;;
*) show_install_menu ;;
esac
}
show_install_font_menu() {
case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "-w 350") in
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
*Bistream*) install_font "Bistream Vera Code" "ttf-bitstream-vera-mono-nerd" "BitstromWera Nerd Font" ;;
*) show_install_menu ;;
esac
}
show_install_development_menu() {
case $(menu "Install" "󰫏 Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
*Rails*) present_terminal "omarchy-install-dev-env ruby" ;;
*Docker*) present_terminal omarchy-install-docker-dbs ;;
*JavaScript*) show_install_javascript_menu ;;
*Go*) present_terminal "omarchy-install-dev-env go" ;;
*PHP*) show_install_php_menu ;;
*Python*) present_terminal "omarchy-install-dev-env python" ;;
*Elixir*) show_install_elixir_menu ;;
*Zig*) present_terminal "omarchy-install-dev-env zig" ;;
*Rust*) present_terminal "omarchy-install-dev-env rust" ;;
*Java*) present_terminal "omarchy-install-dev-env java" ;;
*NET*) present_terminal "omarchy-install-dev-env dotnet" ;;
*OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;;
*Clojure*) present_terminal "omarchy-install-dev-env clojure" ;;
*) show_install_menu ;;
esac
}
show_install_javascript_menu() {
case $(menu "Install" " Node.js\n Bun\n Deno") in
*Node*) present_terminal "omarchy-install-dev-env node" ;;
*Bun*) present_terminal "omarchy-install-dev-env bun" ;;
*Deno*) present_terminal "omarchy-install-dev-env deno" ;;
*) show_install_development_menu ;;
esac
}
show_install_php_menu() {
case $(menu "Install" " PHP\n Laravel\n Symfony") in
*PHP*) present_terminal "omarchy-install-dev-env php" ;;
*Laravel*) present_terminal "omarchy-install-dev-env laravel" ;;
*Symfony*) present_terminal "omarchy-install-dev-env symfony" ;;
*) show_install_development_menu ;;
esac
}
show_install_elixir_menu() {
case $(menu "Install" " Elixir\n Phoenix") in
*Elixir*) present_terminal "omarchy-install-dev-env elixir" ;;
*Phoenix*) present_terminal "omarchy-install-dev-env phoenix" ;;
*) show_install_development_menu ;;
esac
}
show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰈷 Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
*) show_main_menu ;;
esac
}
show_update_menu() {
case $(menu "Update" " Omarchy\n Config\n󰸌 Themes\n Process\n󰇅 Hardware\n Password\n Timezone") in
*Omarchy*) present_terminal omarchy-update ;;
*Config*) show_update_config_menu ;;
*Themes*) present_terminal omarchy-theme-update ;;
*Process*) show_update_process_menu ;;
*Hardware*) show_update_hardware_menu ;;
*Timezone*) omarchy-cmd-tzupdate ;;
*Password*) show_update_password_menu ;;
*) show_main_menu ;;
esac
}
show_update_process_menu() {
case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in
*Hypridle*) omarchy-restart-hypridle ;;
*Hyprsunset*) omarchy-restart-hyprsunset ;;
*Swayosd*) omarchy-restart-swayosd ;;
*Walker*) omarchy-restart-walker ;;
*Waybar*) omarchy-restart-waybar ;;
*) show_update_menu ;;
esac
}
show_update_config_menu() {
case $(menu "Use default config" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n󱣴 Plymouth\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in
*Hyprland*) present_terminal omarchy-refresh-hyprland ;;
*Hypridle*) present_terminal omarchy-refresh-hypridle ;;
*Hyprlock*) present_terminal omarchy-refresh-hyprlock ;;
*Hyprsunset*) present_terminal omarchy-refresh-hyprsunset ;;
*Plymouth*) present_terminal omarchy-refresh-plymouth ;;
*Swayosd*) present_terminal omarchy-refresh-swayosd ;;
*Walker*) present_terminal omarchy-refresh-walker ;;
*Waybar*) present_terminal omarchy-refresh-waybar ;;
*) show_update_menu ;;
esac
}
show_update_hardware_menu() {
case $(menu "Restart" "󱚾 Wi-Fi\n󰂯 Bluetooth") in
*Wi-Fi*) present_terminal omarchy-restart-wifi ;;
*Bluetooth*) present_terminal omarchy-restart-bluetooth ;;
*) show_update_menu ;;
esac
}
show_update_password_menu() {
case $(menu "Update Password" " Drive Encryption\n User") in
*Drive*) present_terminal omarchy-drive-set-password ;;
*User*) present_terminal passwd ;;
*) show_update_menu ;;
esac
}
show_system_menu() {
case $(menu "System" " Lock\n󱄄 Screensaver\n󰤄 Suspend\n Relaunch\n󰜉 Restart\n󰐥 Shutdown") in
*Lock*) omarchy-lock-screen ;;
*Screensaver*) omarchy-launch-screensaver force ;;
*Suspend*) systemctl suspend ;;
*Relaunch*) uwsm stop ;;
*Restart*) systemctl reboot ;;
*Shutdown*) systemctl poweroff ;;
*) back_to show_main_menu ;;
esac
}
show_main_menu() {
go_to_menu "$(menu "Go" "󰀻 Apps\n󰧑 Learn\n Capture\n󰔎 Toggle\n Style\n Setup\n󰉉 Install\n󰭌 Remove\n Update\n About\n System")"
}
go_to_menu() {
case "${1,,}" in
*apps*) walker -p "Launch…" ;;
*learn*) show_learn_menu ;;
*style*) show_style_menu ;;
*theme*) show_theme_menu ;;
*capture*) show_capture_menu ;;
*screenshot*) show_screenshot_menu ;;
*screenrecord*) show_screenrecord_menu ;;
*toggle*) show_toggle_menu ;;
*setup*) show_setup_menu ;;
*power*) show_setup_power_menu ;;
*install*) show_install_menu ;;
*remove*) show_remove_menu ;;
*update*) show_update_menu ;;
*about*) alacritty --class Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s' ;;
*system*) show_system_menu ;;
esac
}
if [[ -n "$1" ]]; then
BACK_TO_EXIT=true
go_to_menu "$1"
else
show_main_menu
fi

View File

@@ -3,50 +3,34 @@
# A script to display Hyprland keybindings defined in your configuration # A script to display Hyprland keybindings defined in your configuration
# using walker for an interactive search menu. # using walker for an interactive search menu.
# Fetch dynamic keybindings from Hyprland USER_HYPRLAND_CONF="$HOME/.config/hypr/hyprland.conf"
# OMARCHY_BINDINGS_CONF="$HOME/.local/share/omarchy/default/hypr/bindings.conf \
# Also do some pre-processing: $HOME/.local/share/omarchy/default/hypr/bindings/tiling.conf \
# - Remove standard Omarchy bin path prefix $HOME/.local/share/omarchy/default/hypr/bindings/utilities.conf \
# - Remove uwsm prefix $HOME/.local/share/omarchy/default/hypr/bindings/media.conf"
# - Map numeric modifier key mask to a textual rendition
# - Output comma-separated values that the parser can understand
dynamic_bindings() {
hyprctl -j binds | \
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | \
sed -r \
-e 's/null//' \
-e 's,~/.local/share/omarchy/bin/,,' \
-e 's,uwsm app -- ,,' \
-e 's/@0//' \
-e 's/,@/,code:/' \
-e 's/^0,/,/' \
-e 's/^1,/SHIFT,/' \
-e 's/^4,/CTRL,/' \
-e 's/^5,/SHIFT CTRL,/' \
-e 's/^8,/ALT,/' \
-e 's/^9,/SHIFT ALT,/' \
-e 's/^12,/CTRL ALT,/' \
-e 's/^13,/SHIFT CTRL ALT,/' \
-e 's/^64,/SUPER,/' \
-e 's/^65,/SUPER SHIFT,/' \
-e 's/^68,/SUPER CTRL,/' \
-e 's/^69,/SUPER SHIFT CTRL,/' \
-e 's/^72,/SUPER ALT,/' \
-e 's/^73,/SUPER SHIFT ALT,/' \
-e 's/^76,/SUPER CTRL ALT,/' \
-e 's/^77,/SUPER SHIFT CTRL ALT,/'
}
# Parse and format keybindings # Process the configuration file to extract and format keybindings
# # 1. `grep` finds all lines starting with 'bind' (allowing for leading spaces).
# `awk` does the heavy lifting: # 2. The first `sed` removes comments (anything after a '#').
# - Set the field separator to a comma ','. # 3. `awk` does the heavy lifting of formatting the output.
# - Joins the key combination (e.g., "SUPER + Q"). # - It sets the field separator to a comma ','.
# - Joins the command that the key executes. # - It removes the 'bind... =' part from the beginning of the line.
# - Prints everything in a nicely aligned format. # - It joins the key combination (e.g., "SUPER + Q").
parse_bindings() { # - It joins the command that the key executes.
# - It prints everything in a nicely aligned format.
# 4. The final `sed` cleans up any leftover commas from the end of lines.
grep -h '^[[:space:]]*bind' $USER_HYPRLAND_CONF $OMARCHY_BINDINGS_CONF |
sed 's/#.*//' |
sed '/^[[:space:]]*$/d' |
sort -u |
awk -F, ' awk -F, '
{ {
# Strip trailing comments
sub(/#.*/, "");
# Remove the "bind... =" part and surrounding whitespace
sub(/^[[:space:]]*bind[^=]*=(\+[[:space:]])?(exec, )?[[:space:]]*/, "", $1);
# Combine the modifier and key (first two fields) # Combine the modifier and key (first two fields)
key_combo = $1 " + " $2; key_combo = $1 " + " $2;
@@ -54,40 +38,27 @@ parse_bindings() {
gsub(/^[ \t]*\+?[ \t]*/, "", key_combo); gsub(/^[ \t]*\+?[ \t]*/, "", key_combo);
gsub(/[ \t]+$/, "", key_combo); gsub(/[ \t]+$/, "", key_combo);
# Use description, if set # Reconstruct the command from the remaining fields
action = $3; action = "";
for (i = 3; i <= NF; i++) {
action = action $i (i < NF ? "," : "");
}
if (action == "") { # Clean up trailing commas, remove leading "exec, ", and trim
# Reconstruct the command from the remaining fields sub(/,$/, "", action);
for (i = 4; i <= NF; i++) { gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action);
action = action $i (i < NF ? "," : ""); gsub(/^[ \t]+|[ \t]+$/, "", action);
} gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one
# Clean up trailing commas, remove leading "exec, ", and trim
sub(/,$/, "", action);
gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action);
gsub(/^[ \t]+|[ \t]+$/, "", action);
gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one
if (action != "") {
# Escape XML entities # Escape XML entities
gsub(/&/, "\\&amp;", action); gsub(/&/, "\\&amp;", action);
gsub(/</, "\\&lt;", action); gsub(/</, "\\&lt;", action);
gsub(/>/, "\\&gt;", action); gsub(/>/, "\\&gt;", action);
gsub(/"/, "\\&quot;", action); gsub(/"/, "\\&quot;", action);
gsub(/'"'"'/, "\\&apos;", action); gsub(/'"'"'/, "\\&apos;", action);
}
if (action != "") {
printf "%-35s → %s\n", key_combo, action; printf "%-35s → %s\n", key_combo, action;
} }
}' }' |
} walker --dmenu --theme keybindings -p 'Keybindings'
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
menu_height=$((monitor_height * 40 / 100))
dynamic_bindings | \
sort -u | \
parse_bindings | \
walker --dmenu --theme keybindings -p 'Keybindings' -w 800 -h "$menu_height"

23
bin/omarchy-menu-power Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/bash
show_power_menu() {
# The first characters are invisible sort keys.
local menu_options=" Lock
󱄄 Save
󰤄 Suspend
 Relaunch
󰜉 Restart
󰐥 Shutdown"
local selection=$(echo -e "$menu_options" | walker --dmenu --theme dmenu_150)
case "$selection" in
*Lock*) hyprlock ;;
*Save*) ~/.local/share/omarchy/bin/omarchy-launch-screensaver ;;
*Suspend*) systemctl suspend ;;
*Relaunch*) uwsm stop ;;
*Restart*) systemctl reboot ;;
*Shutdown*) systemctl poweroff ;;
esac
}
show_power_menu

View File

@@ -1,27 +1,26 @@
#!/bin/bash #!/bin/bash
# Where we store an empty file for each migration that has already been performed. # Exit immediately if a command exits with a non-zero status
set -e
# Create the migrations state directory, we will store an empty file for each migration that has already been performed.
STATE_DIR="$HOME/.local/state/omarchy/migrations" STATE_DIR="$HOME/.local/state/omarchy/migrations"
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
# Skipped migrations are tracked separately
mkdir -p "$STATE_DIR/skipped"
# Run any pending migrations # Run any pending migrations
for file in ~/.local/share/omarchy/migrations/*.sh; do cd ~/.local/share/omarchy
for file in migrations/*.sh; do
filename=$(basename "$file") filename=$(basename "$file")
migrate_at="${filename%.sh}"
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then # Migration already applied, to re-run it simply delete the state file and try again
echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m" [ -e "${STATE_DIR}/$filename" ] && continue
if bash $file; then echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m"
touch "$STATE_DIR/$filename" source $file
else touch "${STATE_DIR}/$filename"
if gum confirm "Migration ${filename%.sh} failed. Skip and continue?"; then
touch "$STATE_DIR/skipped/$filename"
else
exit 1
fi
fi
fi
done done
# Back to where we came from
cd - >/dev/null

View File

@@ -1,9 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
if ! pacman -Q "$pkg" &>/dev/null; then
sudo pacman -S --noconfirm "$pkg" || exit 1
fi
done
exit 0

View File

@@ -1,4 +0,0 @@
#!/bin/bash
curl -sf --connect-timeout 30 --retry 3 --retry-delay 3 -A "omarchy-update" \
"https://aur.archlinux.org/rpc/?v=5&type=info&arg=base" >/dev/null

View File

@@ -1,22 +0,0 @@
#!/bin/bash
fzf_args=(
--multi
--preview 'yay -Sii {1}'
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
--bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'
--bind 'alt-k:preview-up,alt-j:preview-down'
--color 'pointer:green,marker:green'
)
pkg_names=$(yay -Slqa | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs yay -S --noconfirm
sudo updatedb
omarchy-show-done
fi

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
if pacman -Q "$pkg" &>/dev/null; then
sudo pacman -Rns --noconfirm "$pkg"
fi
done

View File

@@ -1,7 +0,0 @@
#!/bin/bash
IGNORED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.ignored"
if [[ -f $IGNORED_PACKAGES_FILE ]]; then
tr '\r\n' ',' <"$IGNORED_PACKAGES_FILE" | sed 's/,$//'
fi

View File

@@ -1,21 +0,0 @@
#!/bin/bash
fzf_args=(
--multi
--preview 'pacman -Sii {1}'
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
--bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'
--bind 'alt-k:preview-up,alt-j:preview-down'
--color 'pointer:green,marker:green'
)
pkg_names=$(pacman -Slq | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -S --noconfirm
omarchy-show-done
fi

View File

@@ -1,9 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
if ! pacman -Q "$pkg" &>/dev/null; then
exit 0
fi
done
exit 1

View File

@@ -1,7 +0,0 @@
#!/bin/bash
PINNED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.pinned"
if [[ -f $PINNED_PACKAGES_FILE ]]; then
tr '\r\n' ',' <"$PINNED_PACKAGES_FILE" | sed 's/,$//'
fi

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
pacman -Q "$pkg" &>/dev/null || exit 1
done
exit 0

View File

@@ -1,21 +0,0 @@
#!/bin/bash
fzf_args=(
--multi
--preview 'yay -Qi {1}'
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
--bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'
--bind 'alt-k:preview-up,alt-j:preview-down'
--color 'pointer:red,marker:red'
)
pkg_names=$(yay -Qqe | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -Rns --noconfirm
omarchy-show-done
fi

View File

@@ -1,5 +0,0 @@
#!/bin/bash
powerprofilesctl list |
awk '/^\s*[* ]\s*[a-zA-Z0-9\-]+:$/ { gsub(/^[*[:space:]]+|:$/,""); print }' |
tac

View File

@@ -10,4 +10,9 @@ mkdir -p ~/.local/share/applications
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
# Only copy xtras if user is not in bare mode
if [[ ! -f ~/.local/state/omarchy/bare.mode ]] && [ -z "$OMARCHY_BARE" ]; then
cp ~/.local/share/omarchy/applications/xtras/*.desktop ~/.local/share/applications/
fi
update-desktop-database ~/.local/share/applications update-desktop-database ~/.local/share/applications

View File

@@ -20,21 +20,16 @@ user_config_file="${HOME}/.config/$config_file"
default_config_file="${HOME}/.local/share/omarchy/config/$config_file" default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
backup_config_file="$user_config_file.bak.$(date +%s)" backup_config_file="$user_config_file.bak.$(date +%s)"
if [[ -f "$user_config_file" ]]; then # Create preliminary backup
# Create preliminary backup cp -f "$user_config_file" "$backup_config_file" 2>/dev/null
cp -f "$user_config_file" "$backup_config_file" 2>/dev/null
# Replace config with new default # Replace config with new default
cp -f "$default_config_file" "$user_config_file" 2>/dev/null cp -f "$default_config_file" "$user_config_file" 2>/dev/null
# Compare and delete/inform accordingly # Compare and delete/inform accordingly
if cmp -s "$user_config_file" "$backup_config_file"; then if cmp -s "$user_config_file" "$backup_config_file"; then
rm "$backup_config_file" rm "$backup_config_file"
else
echo -e "\e[31mReplaced $user_config_file with new Omarchy default.\nSaved backup as ${backup_config_file}.\n\n\e[32mChanges:\e[0m"
diff "$user_config_file" "$backup_config_file" || true
fi
else else
# Config file did not exist already echo -e "\e[31mReplaced $user_config_file with new Omarchy default.\nSaved backup as ${backup_config_file}.\n\n\e[32mChanges:\e[0m"
cp -f "$default_config_file" "$user_config_file" 2>/dev/null diff "$user_config_file" "$backup_config_file"
fi fi

View File

@@ -1,3 +0,0 @@
#!/bin/bash
omarchy-refresh-config fastfetch/config.jsonc

View File

@@ -1,7 +0,0 @@
#!/bin/bash
omarchy-refresh-config hypr/autostart.conf
omarchy-refresh-config hypr/bindings.conf
omarchy-refresh-config hypr/envs.conf
omarchy-refresh-config hypr/input.conf
omarchy-refresh-config hypr/hyprland.conf

View File

@@ -1,3 +1,4 @@
#!/bin/bash #!/bin/bash
omarchy-refresh-config hypr/hyprlock.conf omarchy-refresh-config hypr/hyprlock.conf

View File

@@ -1,4 +0,0 @@
#!/bin/bash
omarchy-refresh-config hypr/hyprsunset.conf
omarchy-restart-hyprsunset

View File

@@ -1,3 +0,0 @@
#!/bin/bash
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
if [[ "$1" == "-y" ]]; then if [[ "$1" == "-y" ]] || gum confirm "Refresh Plymouth theme? This will replace your current startup screen with Omarchy defaults."; then
sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/ sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme -R omarchy sudo plymouth-set-default-theme -R omarchy
fi fi

View File

@@ -2,4 +2,6 @@
omarchy-refresh-config swayosd/config.toml omarchy-refresh-config swayosd/config.toml
omarchy-refresh-config swayosd/style.css omarchy-refresh-config swayosd/style.css
omarchy-restart-swayosd
pkill swayosd-server
setsid uwsm app -- swayosd-server &>/dev/null &

View File

@@ -1,4 +0,0 @@
#!/bin/bash
# Resetting sudo lockout for user
su -c "faillock --reset --user $USER"

View File

@@ -1,4 +0,0 @@
#!/bin/bash
pkill -x $1
setsid uwsm app -- $1 >/dev/null 2>&1 &

View File

@@ -1,4 +0,0 @@
#!/bin/bash
rfkill unblock bluetooth
rfkill list bluetooth

View File

@@ -1,3 +1,4 @@
#!/bin/bash #!/bin/bash
omarchy-restart-app hypridle pkill -x hypridle
uwsm app -- hypridle >/dev/null 2>&1 &

View File

@@ -1,3 +0,0 @@
#!/bin/bash
omarchy-restart-app hyprsunset

View File

@@ -1,3 +0,0 @@
#!/bin/bash
omarchy-restart-app swayosd-server

View File

@@ -1,7 +1,4 @@
#!/bin/bash #!/bin/bash
pkill walker pkill walker
# FIXME: Reenable the walker service once the memory leak has been fixed setsid uwsm app -- walker --gapplication-service &
# See https://github.com/basecamp/omarchy/issues/698
# setsid uwsm app -- walker --gapplication-service &
echo # Always end in success so we don't terminate further running

View File

@@ -1,3 +1,4 @@
#!/bin/bash #!/bin/bash
omarchy-restart-app waybar killall waybar || true
setsid uwsm app -- waybar &>/dev/null &

View File

@@ -1,4 +0,0 @@
#!/bin/bash
rfkill unblock wifi
rfkill list wifi

View File

@@ -1,3 +1,4 @@
#!/bin/bash #!/bin/bash
omarchy-restart-app fcitx5 pkill fcitx5
uwsm app -- fcitx5 >/dev/null 2>&1 &

View File

@@ -1,87 +0,0 @@
#!/bin/bash
if [[ -z $1 ]]; then
dns=$(gum choose --height 5 --header "Select DNS provider" Cloudflare DHCP Custom)
else
dns=$1
fi
case "$dns" in
Cloudflare)
sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com
FallbackDNS=9.9.9.9 149.112.112.112
DNSOverTLS=opportunistic
EOF
# Ensure network interfaces don't override our DNS settings
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
# Add UseDNS=no to DHCPv4 section if not present
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
;;
DHCP)
sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'
[Resolve]
DNSOverTLS=no
EOF
# Allow network interfaces to use DHCP DNS
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
sudo sed -i '/^UseDNS=no/d' "$file"
done
sudo systemctl restart systemd-networkd systemd-resolved
;;
Custom)
echo "Enter your DNS servers (space-separated, e.g. '192.168.1.1 1.1.1.1'):"
read -r dns_servers
if [[ -z "$dns_servers" ]]; then
echo "Error: No DNS servers provided."
exit 1
fi
sudo tee /etc/systemd/resolved.conf >/dev/null <<EOF
[Resolve]
DNS=$dns_servers
FallbackDNS=9.9.9.9 149.112.112.112
EOF
# Ensure network interfaces don't override our DNS settings
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
# Add UseDNS=no to DHCPv4 section if not present
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
;;
esac

View File

@@ -1,7 +1,8 @@
#!/bin/bash #!/bin/bash
echo "Installing all dependencies..." echo "Installing all dependencies..."
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox yay -S --noconfirm --needed \
dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
echo "Starting Dropbox..." echo "Starting Dropbox..."
uwsm app -- dropbox-cli start &>/dev/null & uwsm app -- dropbox-cli start &>/dev/null &

View File

@@ -1,127 +1,33 @@
#!/bin/bash #!/bin/bash
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [ -z "$tokens" ]; then
print_error "\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well)."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Configuring sudo for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Configure polkit
if [ -f /etc/pam.d/polkit-1 ] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [ ! -f /etc/pam.d/polkit-1 ]; then
print_info "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Removing FIDO2 authentication from sudo..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [ -f /etc/pam.d/polkit-1 ] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == "$1" ]]; then if [[ "--remove" == "$1" ]]; then
print_success "Removing FIDO2 device from authentication.\n" yay -Rns --noconfirm libfido2 pam-u2f
sudo rm -rf /etc/fido2
# Remove PAM configuration sudo sed -i '\|^auth[[:space:]]\+sufficient[[:space:]]\+pam_u2f\.so[[:space:]]\+cue[[:space:]]\+authfile=/etc/fido2/fido2$|d' /etc/pam.d/sudo
remove_pam_config echo -e "\e[32m\nYou've successfully removed the fido2 device setup.\e[0m"
# Remove FIDO2 configuration
if [ -d /etc/fido2 ]; then
print_info "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
# Uninstall packages
print_info "Removing FIDO2 packages..."
sudo pacman -Rns --noconfirm libfido2 pam-u2f
print_success "FIDO2 authentication has been completely removed."
else else
print_success "Setting up FIDO2 device for authentication.\n" yay -S --noconfirm --needed libfido2 pam-u2f
# Install required packages tokens=$(fido2-token -L)
print_info "Installing required packages..."
sudo pacman -S --noconfirm --needed libfido2 pam-u2f
if ! check_fido2_hardware; then if [ -z "$tokens" ]; then
exit 1 echo -e "\e[31m\nNo fido2 device detected. Plug it in, you may have to unlock it as well\e[0m"
fi else
# Create the pamu2fcfg file
# Create the pamu2fcfg file if [ ! -f /etc/fido2/fido2 ]; then
if [ ! -f /etc/fido2/fido2 ]; then sudo mkdir -p /etc/fido2
sudo mkdir -p /etc/fido2 echo -e "\e[32m\nLet's setup your device by confirming on the device now.\e[0m"
print_success "\nLet's setup your device by confirming on the device now." pamu2fcfg >/tmp/fido2 # This needs to run as the user
print_info "Touch your FIDO2 key when it lights up...\n"
if pamu2fcfg >/tmp/fido2; then
sudo mv /tmp/fido2 /etc/fido2/fido2 sudo mv /tmp/fido2 /etc/fido2/fido2
print_success "FIDO2 device registered successfully!"
else
print_error "\nFIDO2 registration failed. Please try again."
exit 1
fi fi
else
print_info "FIDO2 device already registered."
fi
# Configure PAM # Add fido2 auth as an option for sudo
setup_pam_config if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Test with sudo if ! sudo echo -e "\e[32m\nPerfect! Now you can use your fido2 device for sudo.\e[0m"; then
print_info "\nTesting FIDO2 authentication with sudo..." echo -e "\e[31m\nSomething went wrong. Maybe try again?\e[0m"
print_info "Touch your FIDO2 key when prompted.\n" fi
if sudo echo "FIDO2 authentication test successful"; then
print_success "\nPerfect! FIDO2 authentication is now configured."
print_info "You can use your FIDO2 key for sudo and polkit authentication."
else
print_error "\nVerification failed. You may want to check your configuration."
fi fi
fi fi

View File

@@ -1,112 +1,43 @@
#!/bin/bash #!/bin/bash
set -e if [[ "--remove" == "$1" ]]; then
yay -Rns --noconfirm fprintd
sudo rm -rf /etc/pam.d/polkit-1
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
echo -e "\e[32mYou've successfully removed the fingerprint setup.\e[0m"
else
yay -S --noconfirm --needed fprintd usbutils
GREEN='\033[0;32m' if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix'; then
RED='\033[0;31m' echo -e "\e[31m\nNo fingerprint sensor detected.\e[0m"
YELLOW='\033[1;33m' else
NC='\033[0m' # No Color # Add fingerprint authentication as an option for sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
print_success() { # Add fingerprint authentication as an option for hyprpolkitagent
echo -e "${GREEN}$1${NC}" if [ ! -f /etc/pam.d/polkit-1 ] || ! grep -q pam_fprintd.so /etc/pam.d/polkit-1; then
} sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fingerprint_hardware() {
if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix|elan|validity'; then
print_error "\nNo fingerprint sensor detected."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Configuring sudo for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
# Configure polkit
if [ -f /etc/pam.d/polkit-1 ] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [ ! -f /etc/pam.d/polkit-1 ]; then
print_info "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
auth required pam_unix.so auth required pam_unix.so
auth optional pam_fprintd.so
account required pam_unix.so account required pam_unix.so
password required pam_unix.so password required pam_unix.so
session required pam_unix.so session required pam_unix.so
EOF EOF
fi
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Removing fingerprint authentication from sudo..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [ -f /etc/pam.d/polkit-1 ] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == "$1" ]]; then
print_success "Removing fingerprint scanner from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Uninstall packages
print_info "Removing fingerprint packages..."
sudo pacman -Rns --noconfirm fprintd
print_success "Fingerprint authentication has been completely removed."
else
print_success "Setting up fingerprint scanner for authentication.\n"
# Install required packages
print_info "Installing required packages..."
sudo pacman -S --noconfirm --needed fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
fi
# Configure PAM
setup_pam_config
# Enroll first fingerprint
print_success "\nLet's setup your right index finger as the first fingerprint."
print_info "Keep moving the finger around on sensor until the process completes.\n"
if sudo fprintd-enroll "$USER"; then
print_success "\nFingerprint enrolled successfully!"
# Verify
print_info "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then
print_success "\nPerfect! Fingerprint authentication is now configured."
print_info "You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape)."
else
print_error "\nVerification failed. You may want to try enrolling again."
fi fi
else
print_error "\nEnrollment failed. Please try again." # Enroll the first finger
exit 1 echo -e "\e[32m\nLet's setup your right index finger as the first fingerprint.\nKeep moving the finger around on sensor until the process completes.\n\e[0m"
sudo fprintd-enroll $USER
echo -e "\e[32m\nNow let's verify that it's working correctly.\e[0m\n"
if fprintd-verify; then
echo -e "\e[32m\nPerfect! Now you can use your fingerprint on the lock screen (Super + Escape).\e[0m"
else
echo -e "\e[31m\nSomething went wrong. Maybe try again?\e[0m"
fi
fi fi
fi fi

9
bin/omarchy-setup-steam Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
echo "Adding multilib repository for 32-bit compatibility"
sudo sed -i '/^\s*#\[multilib\]/,/^$/{s/^\s*#//}' /etc/pacman.conf
sudo pacman -Sy
echo "Now pick dependencies matching your graphics card"
yay -S steam
gtk-launch steam >/dev/null 2>&1 &

View File

@@ -1,4 +0,0 @@
#!/bin/bash
echo
gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s'

View File

@@ -1,7 +0,0 @@
#!/bin/bash
clear
echo -e "\033[32m"
cat <~/.local/share/omarchy/logo.txt
echo -e "\033[0m"
echo

View File

@@ -1,32 +0,0 @@
#!/bin/bash
COMMAND="$1"
OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}
if [[ -z $COMMAND ]]; then
echo "Usage: omarchy-snapshot <create|restore>" >&2
exit 1
fi
if ! command -v snapper &>/dev/null; then
exit 127 # omarchy-update can use this to just ignore if snapper is not available
fi
case "$COMMAND" in
create)
DESC="$(omarchy-version)"
echo -e "\e[32mCreate system snapshot\e[0m"
# Get existing snapper config names from CSV output
mapfile -t CONFIGS < <(sudo snapper --csvout list-configs | awk -F, 'NR>1 {print $1}')
for config in "${CONFIGS[@]}"; do
sudo snapper -c "$config" create -c number -d "$DESC"
done
echo
;;
restore)
sudo limine-snapper-restore
;;
esac

View File

@@ -1,22 +0,0 @@
#!/bin/bash
STATE_DIR="$HOME/.local/state/omarchy"
mkdir -p "$STATE_DIR"
COMMAND="$1"
STATE_NAME="$2"
if [[ -z "$COMMAND" ]]; then
echo "Usage: omarchy-state <set|clear> <state-name-or-pattern>"
exit 1
fi
if [[ -z "$STATE_NAME" ]]; then
echo "Usage: omarchy-state $COMMAND <state-name>"
exit 1
fi
case "$COMMAND" in
set) touch "$STATE_DIR/$STATE_NAME" ;;
clear) find "$STATE_DIR" -maxdepth 1 -type f -name "$STATE_NAME" -delete ;;
esac

View File

@@ -1,3 +0,0 @@
#!/bin/bash
basename "$(realpath "$HOME/.config/omarchy/current/theme")" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g'

View File

@@ -4,16 +4,11 @@
# Usage: omarchy-theme-install <git-repo-url> # Usage: omarchy-theme-install <git-repo-url>
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo -e "\e[32mSee https://manuals.omamix.org/2/the-omarchy-manual/90/extra-themes\n\e[0m" echo "Usage: omarchy-theme-install <git-repo-url>"
REPO_URL=$(gum input --placeholder="Git repo URL for theme" --header="")
else
REPO_URL="$1"
fi
if [ -z "$REPO_URL" ]; then
exit 1 exit 1
fi fi
REPO_URL="$1"
THEMES_DIR="$HOME/.config/omarchy/themes" THEMES_DIR="$HOME/.config/omarchy/themes"
THEME_NAME=$(basename "$REPO_URL" .git | sed -E 's/^omarchy-//; s/-theme$//') THEME_NAME=$(basename "$REPO_URL" .git | sed -E 's/^omarchy-//; s/-theme$//')
THEME_PATH="$THEMES_DIR/$THEME_NAME" THEME_PATH="$THEMES_DIR/$THEME_NAME"

View File

@@ -1,5 +0,0 @@
#!/bin/bash
find ~/.config/omarchy/themes/ -mindepth 1 -maxdepth 1 \( -type d -o -type l \) | sort | while read -r path; do
echo "$(basename "$path" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g')"
done

31
bin/omarchy-theme-menu Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
THEMES_DIR="$HOME/.config/omarchy/themes/"
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
CURRENT_THEME_NAME=$(basename "$(realpath "$CURRENT_THEME_DIR")")
# Build themes list with pretty display names
mapfile -t themes < <(
find "$THEMES_DIR" -mindepth 1 -maxdepth 1 \( -type d -o -type l \) | sort | while read -r path; do
filename=$(basename "$path")
display_name=$(echo "$filename" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g')
if [[ "$filename" == "$CURRENT_THEME_NAME" ]]; then
echo "<i>$display_name</i>"
else
echo "$display_name"
fi
done
)
# Show Walker menu
selection=$(printf '%s\n' "${themes[@]}" | walker --dmenu --theme dmenu_250 2>/dev/null)
# Remove any Pango markup before converting back to filename
clean_selection=$(echo "$selection" | sed -E 's/<[^>]+>//g')
# Convert to lowercase and dash-separated: "Tokyo Night" -> "tokyo-night"
selected_theme=$(echo "$clean_selection" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
# Apply the selected theme
"$HOME/.local/share/omarchy/bin/omarchy-theme-set" "$selected_theme"

View File

@@ -30,5 +30,5 @@ NEXT_INDEX=$(((INDEX + 1) % TOTAL))
NEW_THEME=${THEMES[$NEXT_INDEX]} NEW_THEME=${THEMES[$NEXT_INDEX]}
NEW_THEME_NAME=$(basename "$NEW_THEME") NEW_THEME_NAME=$(basename "$NEW_THEME")
omarchy-theme-set $NEW_THEME_NAME "$HOME/.local/share/omarchy/bin/omarchy-theme-set" $NEW_THEME_NAME
notify-send "Theme changed to $NEW_THEME_NAME" -t 2000 notify-send "Theme changed to $NEW_THEME_NAME" -t 2000

View File

@@ -4,37 +4,30 @@
# Usage: omarchy-theme-remove <theme-name> # Usage: omarchy-theme-remove <theme-name>
if [ -z "$1" ]; then if [ -z "$1" ]; then
mapfile -t extra_themes < <(find ~/.config/omarchy/themes -mindepth 1 -maxdepth 1 -type d ! -xtype l -printf '%f\n') echo "Usage: omarchy-theme-remove <theme-name>"
if [[ ${#extra_themes[@]} -gt 0 ]]; then
THEME_NAME=$(gum choose --header="Remove extra theme" "${extra_themes[@]}")
else
echo "No extra themes installed."
exit 1
fi
else
THEME_NAME="$1"
fi
THEMES_DIR="$HOME/.config/omarchy/themes"
CURRENT_DIR="$HOME/.config/omarchy/current"
THEME_PATH="$THEMES_DIR/$THEME_NAME"
# Ensure a theme was set
if [ -z "$THEME_NAME" ]; then
exit 1 exit 1
fi fi
THEME_NAME="$1"
THEMES_DIR="$HOME/.config/omarchy/themes"
BACKGROUND_DIR="$HOME/.config/omarchy/backgrounds"
CURRENT_DIR="$HOME/.config/omarchy/current"
THEME_PATH="$THEMES_DIR/$THEME_NAME"
BACKGROUND_PATH="$BACKGROUND_DIR/$THEME_NAME"
# Check if theme exists before attempting removal # Check if theme exists before attempting removal
if [ ! -d "$THEME_PATH" ]; then if [ ! -d "$THEME_PATH" ]; then
echo "Error: Theme '$THEME_NAME' not found." echo "Error: Theme '$THEME_NAME' not found."
exit 1 exit 1
fi fi
# Move to the next theme if the current theme is the one being removed # Use readlink -f to resolve symlinks and get the absolute path
if [ "$(readlink -f "$CURRENT_DIR/theme")" = "$(readlink -f "$THEME_PATH")" ]; then if [ "$(readlink -f "$CURRENT_DIR/theme")" = "$(readlink -f "$THEME_PATH")" ]; then
omarchy-theme-next "$HOME/.local/share/omarchy/bin/omarchy-theme-next"
fi fi
# Now remove the theme directory for THEME_NAME # Now remove the theme directory and backgrounds for THEME_NAME
rm -rf "$THEME_PATH" rm -rf "$THEME_PATH"
rm -rf "$BACKGROUND_PATH"

View File

@@ -3,7 +3,7 @@
# omarchy-theme-set: Set a theme, specified by its name. # omarchy-theme-set: Set a theme, specified by its name.
# Usage: omarchy-theme-set <theme-name> # Usage: omarchy-theme-set <theme-name>
if [[ -z "$1" && "$1" != "CNCLD" ]]; then if [[ -z "$1" ]]; then
echo "Usage: omarchy-theme-set <theme-name>" >&2 echo "Usage: omarchy-theme-set <theme-name>" >&2
exit 1 exit 1
fi fi
@@ -11,7 +11,7 @@ fi
THEMES_DIR="$HOME/.config/omarchy/themes/" THEMES_DIR="$HOME/.config/omarchy/themes/"
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
THEME_NAME=$(echo "$1" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-') THEME_NAME="$1"
THEME_PATH="$THEMES_DIR/$THEME_NAME" THEME_PATH="$THEMES_DIR/$THEME_NAME"
# Check if the theme entered exists # Check if the theme entered exists
@@ -39,31 +39,16 @@ else
gsettings set org.gnome.desktop.interface icon-theme "Yaru-blue" gsettings set org.gnome.desktop.interface icon-theme "Yaru-blue"
fi fi
# Change Chromium colors
if command -v chromium &>/dev/null; then
if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then
chromium --no-startup-window --set-color-scheme="light"
else
chromium --no-startup-window --set-color-scheme="dark"
fi
if [[ -f ~/.config/omarchy/current/theme/chromium.theme ]]; then
chromium --no-startup-window --set-theme-color="$(<~/.config/omarchy/current/theme/chromium.theme)"
else
# Use a default, neutral grey if theme doesn't have a color
chromium --no-startup-window --set-theme-color="28,32,39"
fi
fi
# Trigger alacritty config reload # Trigger alacritty config reload
touch "$HOME/.config/alacritty/alacritty.toml" touch "$HOME/.config/alacritty/alacritty.toml"
# Restart components to apply new theme # Restart components to apply new theme
pkill -SIGUSR2 btop pkill -SIGUSR2 btop
omarchy-restart-waybar "$HOME/.local/share/omarchy/bin/omarchy-restart-waybar"
omarchy-restart-swayosd pkill swayosd-server
setsid uwsm app -- swayosd-server &>/dev/null &
makoctl reload makoctl reload
hyprctl reload hyprctl reload
# Set new background # Set new background
omarchy-theme-bg-next "$HOME/.local/share/omarchy/bin/omarchy-theme-bg-next"

View File

@@ -1,5 +1,4 @@
#!/bin/bash #!/bin/bash
for dir in ~/.config/omarchy/themes/*/; do for dir in ~/.config/omarchy/themes/*/; do
[ -d "$dir" ] && [ ! -L "${dir%/}" ] && echo "Updating: $(basename "$dir")" && git -C "$dir" pull [ -d "$dir" ] && [ ! -L "${dir%/}" ] && echo "Updating: $(basename "$dir")" && git -C "$dir" pull
done done

View File

@@ -1,30 +0,0 @@
#!/bin/bash
# Default temperature values
ON_TEMP=4000
OFF_TEMP=6000
# Ensure hyprsunset is running
if ! pgrep -x hyprsunset; then
setsid uwsm app -- hyprsunset &
sleep 1 # Give it time to register
fi
# Query the current temperature
CURRENT_TEMP=$(hyprctl hyprsunset temperature 2>/dev/null | grep -oE '[0-9]+')
restart_nightlighted_waybar() {
if grep -q "custom/nightlight" ~/.config/waybar/config.jsonc; then
omarchy-restart-waybar # restart waybar in case user has waybar module for hyprsunset
fi
}
if [[ "$CURRENT_TEMP" == "$OFF_TEMP" ]]; then
hyprctl hyprsunset temperature $ON_TEMP
notify-send " Nightlight screen temperature"
restart_nightlighted_waybar
else
hyprctl hyprsunset temperature $OFF_TEMP
notify-send " Daylight screen temperature"
restart_nightlighted_waybar
fi

View File

@@ -1,12 +0,0 @@
#!/bin/bash
STATE_FILE=~/.local/state/omarchy/toggles/screensaver-off
if [[ -f $STATE_FILE ]]; then
rm -f $STATE_FILE
notify-send "󱄄 Screensaver enabled"
else
mkdir -p "$(dirname $STATE_FILE)"
touch $STATE_FILE
notify-send "󱄄 Screensaver disabled"
fi

Some files were not shown because too many files have changed in this diff Show More