diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..625c576e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +charset = utf-8 diff --git a/applications/hidden/electron36.desktop b/applications/hidden/electron36.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/electron36.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/electron37.desktop b/applications/hidden/electron37.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/electron37.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/fcitx5-wayland-launcher.desktop b/applications/hidden/fcitx5-wayland-launcher.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/fcitx5-wayland-launcher.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/java-java-openjdk.desktop b/applications/hidden/java-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/java-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/jconsole-java-openjdk.desktop b/applications/hidden/jconsole-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/jconsole-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/jshell-java-openjdk.desktop b/applications/hidden/jshell-java-openjdk.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/jshell-java-openjdk.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/icons/ChatGPT.png b/applications/icons/ChatGPT.png index cc68d786..9907eaf8 100644 Binary files a/applications/icons/ChatGPT.png and b/applications/icons/ChatGPT.png differ diff --git a/applications/icons/GitHub.png b/applications/icons/GitHub.png index f3248e4f..5a4295c2 100644 Binary files a/applications/icons/GitHub.png and b/applications/icons/GitHub.png differ diff --git a/applications/icons/X.png b/applications/icons/X.png index 99131def..22fe6987 100644 Binary files a/applications/icons/X.png and b/applications/icons/X.png differ diff --git a/applications/icons/windows.png b/applications/icons/windows.png new file mode 100644 index 00000000..ce7b366d Binary files /dev/null and b/applications/icons/windows.png differ diff --git a/applications/nvim.desktop b/applications/nvim.desktop index ed118590..23fab41f 100644 --- a/applications/nvim.desktop +++ b/applications/nvim.desktop @@ -2,7 +2,7 @@ Name=Neovim GenericName=Text Editor Comment=Edit text files -Exec=$TERMINAL --class=nvim --title=nvim -e nvim -- %F +Exec=omarchy-launch-editor %F Terminal=false Type=Application Keywords=Text;editor; diff --git a/bin/omarchy-cmd-apple-display-brightness b/bin/omarchy-cmd-apple-display-brightness index e611e8b7..7ba3d20a 100755 --- a/bin/omarchy-cmd-apple-display-brightness +++ b/bin/omarchy-cmd-apple-display-brightness @@ -3,5 +3,12 @@ if [[ $# -eq 0 ]]; then echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)" else - sudo asdcontrol $(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1) -- "$1" + DEVICE="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)" + sudo asdcontrol "$DEVICE" -- "$1" >/dev/null + VALUE="$(sudo asdcontrol "$DEVICE" | awk -F= '/BRIGHTNESS=/{print $2+0}')" + swayosd-client \ + --monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \ + --custom-icon display-brightness \ + --custom-progress "$(awk -v v="$VALUE" 'BEGIN{printf "%.2f", v/60000}')" \ + --custom-progress-text "$(( VALUE * 100 / 60000 ))%" fi diff --git a/bin/omarchy-cmd-audio-switch b/bin/omarchy-cmd-audio-switch index 63ce7a1e..d73205c3 100755 --- a/bin/omarchy-cmd-audio-switch +++ b/bin/omarchy-cmd-audio-switch @@ -23,7 +23,13 @@ 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') +if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then + sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"') + next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//') +fi + 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') diff --git a/bin/omarchy-cmd-first-run b/bin/omarchy-cmd-first-run index f9b9d578..1031185f 100755 --- a/bin/omarchy-cmd-first-run +++ b/bin/omarchy-cmd-first-run @@ -8,7 +8,9 @@ if [[ -f "$FIRST_RUN_MODE" ]]; then rm -f "$FIRST_RUN_MODE" bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh" + bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh" bash "$OMARCHY_PATH/install/first-run/firewall.sh" + bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh" bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" sudo rm -f /etc/sudoers.d/first-run diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord index ee4622f2..0ea1e513 100755 --- a/bin/omarchy-cmd-screenrecord +++ b/bin/omarchy-cmd-screenrecord @@ -8,31 +8,82 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then exit 1 fi -# Selects region or output -SCOPE="$1" +SCOPE="" +AUDIO="false" +WEBCAM="false" -# Selects audio inclusion or not -AUDIO=$([[ $2 == "audio" ]] && echo "--audio") +for arg in "$@"; do + case "$arg" in + --with-audio) AUDIO="true" ;; + --with-webcam) WEBCAM="true" ;; + output|region) SCOPE="$arg" ;; + esac +done + +cleanup_webcam() { + pkill -f "WebcamOverlay" 2>/dev/null +} + +start_webcam_overlay() { + cleanup_webcam + + # Get monitor scale + local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale') + + # Target width (base 360px, scaled to monitor) + local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}") + + # Try preferred 16:9 resolutions in order, use first available + local preferred_resolutions=("640x360" "1280x720" "1920x1080") + local video_size_arg="" + local available_formats=$(v4l2-ctl --list-formats-ext -d /dev/video0 2>/dev/null) + + for resolution in "${preferred_resolutions[@]}"; do + if echo "$available_formats" | grep -q "$resolution"; then + video_size_arg="-video_size $resolution" + break + fi + done + + ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \ + -vf "scale=${target_width}:-1" \ + -window_title "WebcamOverlay" \ + -noborder \ + -fflags nobuffer -flags low_delay \ + -probesize 32 -analyzeduration 0 \ + -loglevel quiet & + sleep 1 +} start_screenrecording() { local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" + local audio_args="" - if lspci | grep -qi 'nvidia'; then - wf-recorder $AUDIO -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@" & - else - wl-screenrec $AUDIO -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@" & - fi + # Merge audio tracks into one - separate tracks only play one at a time in most players + [[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input" + gpu-screen-recorder -w "$@" -f 60 -c mp4 -o "$filename" $audio_args & toggle_screenrecording_indicator } stop_screenrecording() { - pkill -x wl-screenrec - pkill -x wf-recorder + pkill -SIGINT -f "gpu-screen-recorder" # SIGINT required to save video properly - notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000 + # Wait a maximum of 5 seconds to finish before hard killing + local count=0 + while pgrep -f "gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do + sleep 0.1 + count=$((count + 1)) + done - sleep 0.2 # ensures the process is actually dead before we check + if pgrep -f "gpu-screen-recorder" >/dev/null; then + pkill -9 -f "gpu-screen-recorder" + cleanup_webcam + notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000 + else + cleanup_webcam + notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000 + fi toggle_screenrecording_indicator } @@ -41,15 +92,51 @@ toggle_screenrecording_indicator() { } screenrecording_active() { - pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null + pgrep -f "gpu-screen-recorder" >/dev/null || pgrep -x slurp >/dev/null || pgrep -f "WebcamOverlay" >/dev/null } if screenrecording_active; then - stop_screenrecording + if pgrep -x slurp >/dev/null; then + pkill -x slurp 2>/dev/null + elif pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "gpu-screen-recorder" >/dev/null; then + cleanup_webcam + else + stop_screenrecording + fi elif [[ "$SCOPE" == "output" ]]; then - output=$(slurp -o) || exit 1 - start_screenrecording -g "$output" + [[ "$WEBCAM" == "true" ]] && start_webcam_overlay + + if ! output=$(slurp -o -f "%o"); then + [[ "$WEBCAM" == "true" ]] && cleanup_webcam + exit 1 + fi + + if [[ -z "$output" ]]; then + notify-send "Error" "Could not detect monitor" -u critical + [[ "$WEBCAM" == "true" ]] && cleanup_webcam + exit 1 + fi + + start_screenrecording "$output" else - region=$(slurp) || exit 1 - start_screenrecording -g "$region" + [[ "$WEBCAM" == "true" ]] && start_webcam_overlay + + scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale') + + if ! region=$(slurp -f "%wx%h+%x+%y"); then + [[ "$WEBCAM" == "true" ]] && cleanup_webcam + exit 1 + fi + + if [[ "$region" =~ ^([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)$ ]]; then + w=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * $scale}") + h=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[2]} * $scale}") + x=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[3]} * $scale}") + y=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[4]} * $scale}") + scaled_region="${w}x${h}+${x}+${y}" + else + scaled_region="$region" + fi + + start_screenrecording region -region "$scaled_region" fi diff --git a/bin/omarchy-cmd-screensaver b/bin/omarchy-cmd-screensaver index e336c8b0..a53a27ff 100755 --- a/bin/omarchy-cmd-screensaver +++ b/bin/omarchy-cmd-screensaver @@ -13,7 +13,7 @@ exit_screensaver() { trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT -hyprctl keyword cursor:invisible true +hyprctl keyword cursor:invisible true &>/dev/null while true; do effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1) diff --git a/bin/omarchy-cmd-screenshot b/bin/omarchy-cmd-screenshot index 330dde3b..f4450f89 100755 --- a/bin/omarchy-cmd-screenshot +++ b/bin/omarchy-cmd-screenshot @@ -8,10 +8,76 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then exit 1 fi -pkill slurp || hyprshot -m ${1:-region} --raw | +pkill slurp && exit 0 + +MODE="${1:-smart}" +PROCESSING="${2:-slurp}" + +get_rectangles() { + local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id') + hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"' + hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' +} + +# Select based on mode +case "$MODE" in + region) + wayfreeze & PID=$! + sleep .1 + SELECTION=$(slurp 2>/dev/null) + kill $PID 2>/dev/null + ;; + windows) + wayfreeze & PID=$! + sleep .1 + SELECTION=$(get_rectangles | slurp -r 2>/dev/null) + kill $PID 2>/dev/null + ;; + fullscreen) + SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"') + ;; + smart|*) + RECTS=$(get_rectangles) + wayfreeze & PID=$! + sleep .1 + SELECTION=$(echo "$RECTS" | slurp 2>/dev/null) + kill $PID 2>/dev/null + + # If the selction area is L * W < 20, we'll assume you were trying to select whichever + # window or output it was inside of to prevent accidental 2px snapshots + if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then + if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then + click_x="${BASH_REMATCH[1]}" + click_y="${BASH_REMATCH[2]}" + + while IFS= read -r rect; do + if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then + rect_x="${BASH_REMATCH[1]}" + rect_y="${BASH_REMATCH[2]}" + rect_width="${BASH_REMATCH[3]}" + rect_height="${BASH_REMATCH[4]}" + + if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then + SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}" + break + fi + fi + done <<< "$RECTS" + fi + fi + ;; +esac + +[ -z "$SELECTION" ] && exit 0 + +if [[ $PROCESSING == "slurp" ]]; then +grim -g "$SELECTION" - | satty --filename - \ --output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \ --early-exit \ --actions-on-enter save-to-clipboard \ --save-after-copy \ --copy-command 'wl-copy' +else + grim -g "$SELECTION" - | wl-copy +fi diff --git a/bin/omarchy-cmd-terminal-cwd b/bin/omarchy-cmd-terminal-cwd index 2d3cd0ce..062c35fa 100755 --- a/bin/omarchy-cmd-terminal-cwd +++ b/bin/omarchy-cmd-terminal-cwd @@ -2,10 +2,16 @@ # 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) +shell_pid=$(pgrep -P "$terminal_pid" | tail -n1) if [[ -n $shell_pid ]]; then - readlink -f "/proc/$shell_pid/cwd" 2>/dev/null || echo "$HOME" + cwd=$(readlink -f "/proc/$shell_pid/cwd" 2>/dev/null) + + if [[ -d $cwd ]]; then + echo "$cwd" + else + echo "$HOME" + fi else echo "$HOME" fi diff --git a/bin/omarchy-cmd-tzupdate b/bin/omarchy-cmd-tzupdate deleted file mode 100755 index eb39bf0a..00000000 --- a/bin/omarchy-cmd-tzupdate +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -notify-send " Updating time and timezone..." -sudo systemctl restart systemd-timesyncd -sudo tzupdate -new_timezone=$(timedatectl show -p Timezone --value) -omarchy-restart-waybar -notify-send " Time updated and timezone set to $new_timezone" diff --git a/bin/omarchy-font-set b/bin/omarchy-font-set index 5ac0ef4b..6cc312d0 100755 --- a/bin/omarchy-font-set +++ b/bin/omarchy-font-set @@ -28,6 +28,8 @@ if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then omarchy-restart-waybar omarchy-restart-swayosd omarchy-restart-walker + + omarchy-hook font-set "$font_name" else echo "Font '$font_name' not found." exit 1 diff --git a/bin/omarchy-hook b/bin/omarchy-hook new file mode 100755 index 00000000..caa83988 --- /dev/null +++ b/bin/omarchy-hook @@ -0,0 +1,14 @@ +#!/bin/bash + +if [[ $# -lt 1 ]]; then + echo "Usage: omarchy-hook [name] [args...]" + exit 1 +fi + +HOOK=$1 +HOOK_PATH="$HOME/.config/omarchy/hooks/$1" +shift + +if [[ -f $HOOK_PATH ]]; then + bash "$HOOK_PATH" "$@" +fi diff --git a/bin/omarchy-install-docker-dbs b/bin/omarchy-install-docker-dbs index f7b624ad..658a2b08 100755 --- a/bin/omarchy-install-docker-dbs +++ b/bin/omarchy-install-docker-dbs @@ -1,9 +1,9 @@ #!/bin/bash -options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB") +options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL") if [[ "$#" -eq 0 ]]; then - choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select databases (space to select, return to install, esc to cancel)") || main_menu + choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select database (return to install, esc to cancel)") || main_menu else choices="$@" fi @@ -16,6 +16,7 @@ if [[ -n "$choices" ]]; then 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 ;; + MSSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:1433:1433" --name mssql -e MSSQL_PID=Developer -e ACCEPT_EULA=Y -e "MSSQL_SA_PASSWORD=@dmin123" mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 ;; esac done else diff --git a/bin/omarchy-install-dropbox b/bin/omarchy-install-dropbox index ac5710c8..b4c59298 100755 --- a/bin/omarchy-install-dropbox +++ b/bin/omarchy-install-dropbox @@ -4,5 +4,5 @@ echo "Installing all dependencies..." omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox echo "Starting Dropbox..." -uwsm app -- dropbox-cli start &>/dev/null & +uwsm-app -- dropbox-cli start &>/dev/null & echo "See Dropbox icon behind  hover tray in top right and right-click for setup." diff --git a/bin/omarchy-install-terminal b/bin/omarchy-install-terminal index 68285068..fbb0c0b3 100755 --- a/bin/omarchy-install-terminal +++ b/bin/omarchy-install-terminal @@ -14,6 +14,6 @@ omarchy-pkg-add $package echo "Setting $package as new default terminal..." sed -i "/export TERMINAL=/ c\export TERMINAL=$package" ~/.config/uwsm/default -# Relaunch is needed for new default to take effect +# Restart is needed for new default to take effect echo -gum confirm "Relaunch Hyprland to use new terminal?" && uwsm stop +gum confirm "Restart to use new terminal?" && systemctl reboot --no-wall diff --git a/bin/omarchy-install-vscode b/bin/omarchy-install-vscode new file mode 100755 index 00000000..644a8eb7 --- /dev/null +++ b/bin/omarchy-install-vscode @@ -0,0 +1,24 @@ +#!/bin/bash + +echo "Installing VSCode..." +omarchy-pkg-add visual-studio-code-bin + +mkdir -p ~/.vscode + +cat > ~/.vscode/argv.json << 'EOF' +// This configuration file allows you to pass permanent command line arguments to VS Code. +// Only a subset of arguments is currently supported to reduce the likelihood of breaking +// the installation. +// +// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT +// +// NOTE: Changing this file requires a restart of VS Code. +{ + "password-store":"gnome-libsecret" +} +EOF + +# Ensure VSC's own auto-update feature is turned off +printf '{\n "update.mode": "none"\n}\n' > ~/.config/Code/User/settings.json + +setsid gtk-launch code diff --git a/bin/omarchy-launch-about b/bin/omarchy-launch-about index 00722221..797e340f 100755 --- a/bin/omarchy-launch-about +++ b/bin/omarchy-launch-about @@ -1,3 +1,3 @@ #!/bin/bash -exec setsid uwsm app -- alacritty --class=Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s' +exec setsid uwsm-app -- alacritty --class=Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s' diff --git a/bin/omarchy-launch-browser b/bin/omarchy-launch-browser index 536e212c..d6ae00cb 100755 --- a/bin/omarchy-launch-browser +++ b/bin/omarchy-launch-browser @@ -9,4 +9,4 @@ else private_flag="--incognito" fi -exec setsid uwsm app -- "$browser_exec" "${@/--private/$private_flag}" +exec setsid uwsm-app -- "$browser_exec" "${@/--private/$private_flag}" diff --git a/bin/omarchy-launch-editor b/bin/omarchy-launch-editor index 157168a8..dbe84cfd 100755 --- a/bin/omarchy-launch-editor +++ b/bin/omarchy-launch-editor @@ -1,10 +1,10 @@ #!/bin/bash case "${EDITOR:-nvim}" in -nvim | vim | nano | micro | hx) - exec setsid uwsm app -- "$TERMINAL" -e "$EDITOR" "$@" +nvim | vim | nano | micro | hx | helix) + exec setsid uwsm-app -- "$TERMINAL" -e "$EDITOR" "$@" ;; *) - exec setsid uwsm app -- "$EDITOR" "$@" + exec setsid uwsm-app -- "$EDITOR" "$@" ;; esac diff --git a/bin/omarchy-launch-floating-terminal-with-presentation b/bin/omarchy-launch-floating-terminal-with-presentation index 0529f2ae..b6121705 100755 --- a/bin/omarchy-launch-floating-terminal-with-presentation +++ b/bin/omarchy-launch-floating-terminal-with-presentation @@ -1,4 +1,4 @@ #!/bin/bash cmd="$*" -exec setsid uwsm app -- alacritty --class=Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done" +exec setsid uwsm-app -- alacritty -o font.size=9 --class=Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done" \ No newline at end of file diff --git a/bin/omarchy-launch-or-focus b/bin/omarchy-launch-or-focus index a0075632..270b0251 100755 --- a/bin/omarchy-launch-or-focus +++ b/bin/omarchy-launch-or-focus @@ -6,7 +6,7 @@ if (($# == 0)); then fi WINDOW_PATTERN="$1" -LAUNCH_COMMAND="${2:-"uwsm app -- $WINDOW_PATTERN"}" +LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}" WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1) if [[ -n $WINDOW_ADDRESS ]]; then diff --git a/bin/omarchy-launch-or-focus-webapp b/bin/omarchy-launch-or-focus-webapp index c54159f5..aa56db73 100755 --- a/bin/omarchy-launch-or-focus-webapp +++ b/bin/omarchy-launch-or-focus-webapp @@ -1,8 +1,12 @@ #!/bin/bash if (($# == 0)); then - echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url]" + echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]" exit 1 fi -exec omarchy-launch-or-focus "$1" "omarchy-launch-webapp '$2'" +WINDOW_PATTERN="$1" +shift +LAUNCH_COMMAND="omarchy-launch-webapp $@" + +exec omarchy-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_COMMAND" \ No newline at end of file diff --git a/bin/omarchy-launch-walker b/bin/omarchy-launch-walker new file mode 100755 index 00000000..805da5c1 --- /dev/null +++ b/bin/omarchy-launch-walker @@ -0,0 +1,13 @@ +#!/bin/bash + +# Ensure elephant is running before launching walker +if ! pgrep -x elephant > /dev/null; then + setsid uwsm-app -- elephant & +fi + +# Ensure walker service is running +if ! pgrep -f "walker --gapplication-service" > /dev/null; then + setsid uwsm-app -- walker --gapplication-service & +fi + +exec walker --width 644 --maxheight 300 --minheight 300 "$@" diff --git a/bin/omarchy-launch-webapp b/bin/omarchy-launch-webapp index 441748ea..1de31278 100755 --- a/bin/omarchy-launch-webapp +++ b/bin/omarchy-launch-webapp @@ -7,4 +7,4 @@ google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium-b *) 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}" +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}" diff --git a/bin/omarchy-launch-wifi b/bin/omarchy-launch-wifi index fe04f846..c9a9b18b 100755 --- a/bin/omarchy-launch-wifi +++ b/bin/omarchy-launch-wifi @@ -1,3 +1,3 @@ #!/bin/bash -exec setsid uwsm app -- "$TERMINAL" --class=Impala -e impala "$@" +exec setsid uwsm-app -- "$TERMINAL" --class=Impala -e impala "$@" diff --git a/bin/omarchy-lock-screen b/bin/omarchy-lock-screen index cad6f814..d3f6276d 100755 --- a/bin/omarchy-lock-screen +++ b/bin/omarchy-lock-screen @@ -9,4 +9,4 @@ if pgrep -x "1password" >/dev/null; then fi # Avoid running screensaver when locked -pkill -f "$TERMINAL --class Screensaver" +pkill -f "alacritty --class Screensaver" diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 0dd68ec1..e9c4a692 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -29,11 +29,11 @@ menu() { local index index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1) if [[ -n "$index" ]]; then - args+=("-a" "$index") + args+=("-c" "$index") fi fi - echo -e "$options" | walker --dmenu --theme dmenu_250 -p "$prompt…" "${args[@]}" + echo -e "$options" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 600 -p "$prompt…" "${args[@]}" 2>/dev/null } terminal() { @@ -104,21 +104,21 @@ show_capture_menu() { } 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 ;; + case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in + *Editing*) omarchy-cmd-screenshot smart ;; + *Clipboard*) omarchy-cmd-screenshot smart clipboard ;; *) 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 ;; + case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in + *"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;; *Region*) omarchy-cmd-screenrecord ;; - *"Display + Audio"*) omarchy-cmd-screenrecord output audio ;; + *"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;; + *"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;; *Display*) omarchy-cmd-screenrecord output ;; - *) show_capture_menu ;; + *) back_to show_capture_menu ;; esac } @@ -163,7 +163,7 @@ show_theme_menu() { } show_font_menu() { - theme=$(menu "Font" "$(omarchy-font-list)" "-w 350" "$(omarchy-font-current)") + theme=$(menu "Font" "$(omarchy-font-list)" "--width 350" "$(omarchy-font-current)") if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then back_to show_style_menu else @@ -232,7 +232,7 @@ show_setup_security_menu() { } show_install_menu() { - case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n Gaming") in + case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n󰍲 Windows\n Gaming") in *Package*) terminal omarchy-pkg-install ;; *AUR*) terminal omarchy-pkg-aur-install ;; *Web*) present_terminal omarchy-webapp-install ;; @@ -243,6 +243,7 @@ show_install_menu() { *Editor*) show_install_editor_menu ;; *Terminal*) show_install_terminal_menu ;; *AI*) show_install_ai_menu ;; + *Windows*) present_terminal "omarchy-windows-vm install" ;; *Gaming*) show_install_gaming_menu ;; *) show_main_menu ;; esac @@ -260,7 +261,7 @@ show_install_service_menu() { 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" ;; + *VSCode*) present_terminal omarchy-install-vscode ;; *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" ;; @@ -286,8 +287,9 @@ show_install_ai_menu() { echo ollama ) - case $(menu "Install" "󱚤 Claude Code\n󱚤 Gemini [AUR]\n󱚤 OpenAI Codex [AUR]\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in + case $(menu "Install" "󱚤 Claude Code\n󱚤 Cursor CLI [AUR]\n󱚤 Gemini [AUR]\n󱚤 OpenAI Codex [AUR]\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in *Claude*) install "Claude Code" "claude-code" ;; + *Cursor*) aur_install "Cursor CLI" "cursor-cli" ;; *OpenAI*) aur_install "OpenAI Codex" "openai-codex-bin" ;; *Gemini*) aur_install "Gemini" "gemini-cli" ;; *Studio*) install "LM Studio" "lmstudio" ;; @@ -317,7 +319,7 @@ show_install_style_menu() { } show_install_font_menu() { - case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "-w 350") in + case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "--width 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" ;; @@ -372,11 +374,12 @@ show_install_elixir_menu() { } show_remove_menu() { - case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰈷 Fingerprint\n Fido2") in + case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰍲 Windows\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 ;; + *Windows*) present_terminal "omarchy-windows-vm remove" ;; *Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;; *Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;; *) show_main_menu ;; @@ -384,14 +387,15 @@ show_remove_menu() { } show_update_menu() { - case $(menu "Update" " Omarchy\n Branch\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Password\n Timezone") in + case $(menu "Update" " Omarchy\n Branch\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone") in *Omarchy*) present_terminal omarchy-update ;; *Branch*) show_update_branch_menu ;; *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 ;; + *Firmware*) present_terminal omarchy-update-firmware ;; + *Timezone*) present_terminal omarchy-tz-select ;; *Password*) show_update_password_menu ;; *) show_main_menu ;; esac @@ -447,13 +451,12 @@ show_update_password_menu() { } show_system_menu() { - case $(menu "System" " Lock\n󱄄 Screensaver\n󰤄 Suspend\n Relaunch\n󰜉 Restart\n󰐥 Shutdown") in + case $(menu "System" " Lock\n󱄄 Screensaver\n󰤄 Suspend\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 ;; + *Restart*) omarchy-state clear re*-required && systemctl reboot --no-wall ;; + *Shutdown*) omarchy-state clear re*-required && systemctl poweroff --no-wall ;; *) back_to show_main_menu ;; esac } diff --git a/bin/omarchy-menu-keybindings b/bin/omarchy-menu-keybindings index 1d1b40ac..4547a6dc 100755 --- a/bin/omarchy-menu-keybindings +++ b/bin/omarchy-menu-keybindings @@ -3,6 +3,69 @@ # A script to display Hyprland keybindings defined in your configuration # using walker for an interactive search menu. +declare -A KEYCODE_SYM_MAP + +build_keymap_cache() { + local keymap + keymap="$(xkbcli compile-keymap)" || { + echo "Failed to compile keymap" >&2 + return 1 + } + + while IFS=, read -r code sym; do + [[ -z "$code" || -z "$sym" ]] && continue + KEYCODE_SYM_MAP["$code"]="$sym" + done < <( + awk ' + BEGIN { sec = "" } + /xkb_keycodes/ { sec = "codes"; next } + /xkb_symbols/ { sec = "syms"; next } + sec == "codes" { + if (match($0, /<([A-Za-z0-9_]+)>\s*=\s*([0-9]+)\s*;/, m)) code_by_name[m[1]] = m[2] + } + sec == "syms" { + if (match($0, /key\s*<([A-Za-z0-9_]+)>\s*\{\s*\[\s*([^, \]]+)/, m)) sym_by_name[m[1]] = m[2] + } + END { + for (k in code_by_name) { + c = code_by_name[k] + s = sym_by_name[k] + if (c != "" && s != "" && s != "NoSymbol") print c "," s + } + } + ' <<<"$keymap" + ) +} + +lookup_keycode_cached() { + printf '%s\n' "${KEYCODE_SYM_MAP[$1]}" +} + +parse_keycodes() { + local start end elapsed + [[ "${DEBUG:-0}" == "1" ]] && start=$(date +%s.%N) + while IFS= read -r line; do + if [[ "$line" =~ code:([0-9]+) ]]; then + code="${BASH_REMATCH[1]}" + symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE") + echo "${line/code:${code}/$symbol}" + else + echo "$line" + fi + done + + if [[ "$DEBUG" == "1" ]]; then + end=$(date +%s.%N) + # fall back to awk if bc is missing + if command -v bc >/dev/null 2>&1; then + elapsed=$(echo "$end - $start" | bc) + else + elapsed=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", (e - s)}') + fi + echo "[DEBUG] parse_keycodes elapsed: ${elapsed}s" >&2 + fi +} + # Fetch dynamic keybindings from Hyprland # # Also do some pre-processing: @@ -11,30 +74,31 @@ # - 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)"' | \ + 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,/' + -e 's/null//' \ + -e 's,~/.local/share/omarchy/bin/,,' \ + -e 's,uwsm app -- ,,' \ + -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 @@ -86,8 +150,10 @@ parse_bindings() { 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" +build_keymap_cache +dynamic_bindings | + sort -u | + parse_keycodes | + parse_bindings | + walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height" diff --git a/bin/omarchy-pkg-add b/bin/omarchy-pkg-add index 116435be..486a2f45 100755 --- a/bin/omarchy-pkg-add +++ b/bin/omarchy-pkg-add @@ -1,8 +1,14 @@ #!/bin/bash +if omarchy-pkg-missing "$@"; then + sudo pacman -S --noconfirm --needed "$@" || exit 1 +fi + for pkg in "$@"; do + # Secondary check to handle states where pacman doesn't actually register an error if ! pacman -Q "$pkg" &>/dev/null; then - sudo pacman -S --noconfirm "$pkg" || exit 1 + echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2 + exit 1 fi done diff --git a/bin/omarchy-pkg-aur-install b/bin/omarchy-pkg-aur-install index 41710e0e..da0d5884 100755 --- a/bin/omarchy-pkg-aur-install +++ b/bin/omarchy-pkg-aur-install @@ -3,7 +3,7 @@ fzf_args=( --multi --preview 'yay -Siia {1}' - --preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select, F11: maximize' + --preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select' --preview-label-pos='bottom' --preview-window 'down:65%:wrap' --bind 'alt-p:toggle-preview' diff --git a/bin/omarchy-pkg-install b/bin/omarchy-pkg-install index c654e17e..49f7b33b 100755 --- a/bin/omarchy-pkg-install +++ b/bin/omarchy-pkg-install @@ -3,7 +3,7 @@ fzf_args=( --multi --preview 'pacman -Sii {1}' - --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize' + --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select' --preview-label-pos='bottom' --preview-window 'down:65%:wrap' --bind 'alt-p:toggle-preview' diff --git a/bin/omarchy-pkg-remove b/bin/omarchy-pkg-remove index 63c6147e..1da761f9 100755 --- a/bin/omarchy-pkg-remove +++ b/bin/omarchy-pkg-remove @@ -3,7 +3,7 @@ fzf_args=( --multi --preview 'yay -Qi {1}' - --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize' + --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select' --preview-label-pos='bottom' --preview-window 'down:65%:wrap' --bind 'alt-p:toggle-preview' diff --git a/bin/omarchy-refresh-walker b/bin/omarchy-refresh-walker index aa7a0210..04112a4d 100755 --- a/bin/omarchy-refresh-walker +++ b/bin/omarchy-refresh-walker @@ -1,4 +1,6 @@ #!/bin/bash omarchy-refresh-config walker/config.toml +omarchy-refresh-config elephant/calc.toml +omarchy-refresh-config elephant/desktopapplications.toml omarchy-restart-walker diff --git a/bin/omarchy-restart-app b/bin/omarchy-restart-app index 8cf2a036..4cc474fa 100755 --- a/bin/omarchy-restart-app +++ b/bin/omarchy-restart-app @@ -1,4 +1,4 @@ #!/bin/bash pkill -x $1 -setsid uwsm app -- $1 >/dev/null 2>&1 & +setsid uwsm-app -- $1 >/dev/null 2>&1 & diff --git a/bin/omarchy-restart-walker b/bin/omarchy-restart-walker index b2dc9a45..4abcb88e 100755 --- a/bin/omarchy-restart-walker +++ b/bin/omarchy-restart-walker @@ -1,7 +1,21 @@ #!/bin/bash +pkill elephant pkill walker -# FIXME: Just deal with the memory leak for now. -# 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 + +# Detect if we're running as root (from pacman hook) +if [[ $EUID -eq 0 ]]; then + # Get the owner of this script to determine which user to run as + SCRIPT_OWNER=$(stat -c '%U' "$0") + USER_UID=$(id -u "$SCRIPT_OWNER") + + # Restart services as the script owner + systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \ + bash -c " + setsid uwsm-app -- elephant & + setsid uwsm-app -- walker --gapplication-service & + " +else + setsid uwsm-app -- elephant & + setsid uwsm-app -- walker --gapplication-service & +fi diff --git a/bin/omarchy-setup-fingerprint b/bin/omarchy-setup-fingerprint index 422fb1e4..93b70e6d 100755 --- a/bin/omarchy-setup-fingerprint +++ b/bin/omarchy-setup-fingerprint @@ -20,7 +20,7 @@ print_info() { } check_fingerprint_hardware() { - if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix|elan|validity'; then + if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix|elan|validity|FPC'; then print_error "\nNo fingerprint sensor detected." return 1 fi diff --git a/bin/omarchy-theme-bg-next b/bin/omarchy-theme-bg-next index 21cddf98..52c1355e 100755 --- a/bin/omarchy-theme-bg-next +++ b/bin/omarchy-theme-bg-next @@ -5,13 +5,13 @@ BACKGROUNDS_DIR="$HOME/.config/omarchy/current/theme/backgrounds/" CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background" -mapfile -d '' -t BACKGROUNDS < <(find "$BACKGROUNDS_DIR" -type f -print0 | sort -z) +mapfile -d '' -t BACKGROUNDS < <(find -L "$BACKGROUNDS_DIR" -type f -print0 | sort -z) TOTAL=${#BACKGROUNDS[@]} if [[ $TOTAL -eq 0 ]]; then notify-send "No background was found for theme" -t 2000 pkill -x swaybg - setsid uwsm app -- swaybg --color '#000000' >/dev/null 2>&1 & + setsid uwsm-app -- swaybg --color '#000000' >/dev/null 2>&1 & else # Get current background from symlink if [[ -L "$CURRENT_BACKGROUND_LINK" ]]; then @@ -44,5 +44,5 @@ else # Relaunch swaybg pkill -x swaybg - setsid uwsm app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 & + setsid uwsm-app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 & fi diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index 73059712..c90d11eb 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -24,15 +24,21 @@ ln -nsf "$THEME_PATH" "$CURRENT_THEME_DIR" omarchy-theme-bg-next # Restart components to apply new theme -omarchy-restart-waybar +if pgrep -x waybar >/dev/null; then + omarchy-restart-waybar +fi omarchy-restart-swayosd hyprctl reload pkill -SIGUSR2 btop makoctl reload -# Change gnome, browser, vscode themes +# Change gnome, browser, vscode, cursor themes omarchy-theme-set-terminal omarchy-theme-set-gnome -omarchy-theme-set-eza omarchy-theme-set-browser omarchy-theme-set-vscode +omarchy-theme-set-cursor +omarchy-theme-set-obsidian + +# Call hook on theme set +omarchy-hook theme-set "$THEME_NAME" diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index 759d2c4e..81443091 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -2,18 +2,30 @@ CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme -if omarchy-cmd-present chromium || omarchy-cmd-present brave; then +if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy-cmd-present brave; then if [[ -f $CHROMIUM_THEME ]]; then - rgb=$(<$CHROMIUM_THEME) - THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${rgb//,/ }) + THEME_RGB_COLOR=$(<$CHROMIUM_THEME) + THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) else # Use a default, neutral grey if theme doesn't have a color + THEME_RGB_COLOR="28,32,39" THEME_HEX_COLOR="#1c2027" fi if omarchy-cmd-present chromium; then + rm -f /etc/chromium/policies/managed/color.json + chromium --no-startup-window --set-theme-color="$THEME_RGB_COLOR" + + 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 + fi + + if omarchy-cmd-present helium-browser; then echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null - chromium --refresh-platform-policy --no-startup-window + helium-browser --no-startup-window --refresh-platform-policy fi if omarchy-cmd-present brave; then diff --git a/bin/omarchy-theme-set-cursor b/bin/omarchy-theme-set-cursor new file mode 100755 index 00000000..2db672e1 --- /dev/null +++ b/bin/omarchy-theme-set-cursor @@ -0,0 +1,4 @@ +#!/bin/bash + +# Call the VSCode theme setter with Cursor-specific parameters +omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes" Cursor diff --git a/bin/omarchy-theme-set-eza b/bin/omarchy-theme-set-eza deleted file mode 100755 index cde362cc..00000000 --- a/bin/omarchy-theme-set-eza +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -if [ -f ~/.config/omarchy/current/theme/eza.yml ]; then - ln -snf ~/.config/omarchy/current/theme/eza.yml ~/.config/eza/theme.yml -else - rm -f ~/.config/eza/theme.yml -fi diff --git a/bin/omarchy-theme-set-obsidian b/bin/omarchy-theme-set-obsidian new file mode 100755 index 00000000..e67f0b62 --- /dev/null +++ b/bin/omarchy-theme-set-obsidian @@ -0,0 +1,659 @@ +#!/bin/bash + +# omarchy-theme-set-obsidian: Bootstrap and update Omarchy theme for Obsidian +# +# - Ensures registry at ~/.local/state/omarchy/obsidian-vaults +# - If missing/empty, bootstraps by scanning ~/Documents/*/.obsidian and ~/Dropbox/*/.obsidian +# - For each valid vault: +# - Ensures .obsidian/themes/Omarchy/{manifest.json, theme.css} +# - Updates theme.css (uses current theme’s obsidian.css if present; otherwise generates -- see below) + +# Theme automagic generation logic: +# +# - Background/foreground: read from ~/.config/omarchy/current/theme/alacritty.toml [colors.primary] +# (background/foreground). Fallbacks: bg=#1a1b26, fg=#a9b1d6. Compute bg brightness for light/dark handling. +# - Palette extraction: collect colors from Alacritty (primary/normal/bright/dim/selection), Waybar (@define-color), +# and Hyprland (col.*_border; rgba->hex). Normalize, dedupe, and count frequencies. +# - Slot ordering: remove bg/fg, sort remaining colors by frequency, then fill 13 slots by cycling. Map slots to: +# h1–h6, links, inline code, marks, interactive accent, blockquote border; muted/faint use border color. +# - Code colors: code background = closest color to bg (Euclidean RGB); if none, make a subtle bg variant (+/− RGB). +# code foreground = closest color to fg; fallback #e0e0e0. +# - Border color: from btop.theme theme[div_line]; else blended mix biased toward bg (≈ (bg+fg)/3). +# - Selection: from Alacritty [colors.selection] (background/text), honoring CellForeground/Background. +# If missing, background = 75% bg + 25% fg; text chosen for contrast vs selection background. +# - Fonts: monospace from Alacritty [font] or fontconfig monospace; UI font from fontconfig sans-serif. + +VAULTS_FILE="$HOME/.local/state/omarchy/obsidian-vaults" +CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" + +# Ensure the vaults registry exists, or bootstrap from known locations +ensure_vaults_file() { + mkdir -p "$(dirname "$VAULTS_FILE")" + # If file exists (even empty), do not scan; treat as authoritative + if [ -f "$VAULTS_FILE" ]; then + return + fi + local tmpfile + tmpfile="$(mktemp)" + # Scan a couple of common locations for //.obsidian + for base in "$HOME/Documents" "$HOME/Dropbox"; do + [ -d "$base" ] || continue + for d in "$base"/*/.obsidian; do + [ -d "$d" ] || continue + vault_dir="${d%/.obsidian}" + printf "%s\n" "$vault_dir" >>"$tmpfile" + done + done + if [ -s "$tmpfile" ]; then + sort -u "$tmpfile" >"$VAULTS_FILE" + else + : >"$VAULTS_FILE" + fi + rm -f "$tmpfile" +} + +# Ensure theme directory and minimal manifest exist in a vault +ensure_theme_scaffold() { + local vault_path="$1" + local theme_dir="$vault_path/.obsidian/themes/Omarchy" + mkdir -p "$theme_dir" + if [ ! -f "$theme_dir/manifest.json" ]; then + cat >"$theme_dir/manifest.json" <<'EOF' +{ + "name": "Omarchy", + "version": "1.0.0", + "minAppVersion": "0.16.0", + "description": "Automatically syncs with your current Omarchy system theme colors and fonts", + "author": "Omarchy", + "authorUrl": "https://omarchy.org" +} +EOF + fi + [ -f "$theme_dir/theme.css" ] || : >"$theme_dir/theme.css" +} + +# Function to extract hex color from string +extract_hex_color() { + echo "$1" | grep -oE '#[0-9a-fA-F]{6}' | head -1 +} + +# Function to convert RGB/RGBA to hex +rgb_to_hex() { + local rgb_string="$1" + if [[ $rgb_string =~ rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+) ]]; then + printf "#%02x%02x%02x\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" + fi +} + +# Convert hex to RGB components +hex_to_rgb() { + local hex="${1#\#}" + printf "%d %d %d\n" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}" +} + +# Calculate perceived brightness (0-255) +calculate_brightness() { + local hex="$1" + read -r r g b <<<"$(hex_to_rgb "$hex")" + # Use perceived brightness formula + echo $(((r * 299 + g * 587 + b * 114) / 1000)) +} + +# Calculate color distance (euclidean in RGB space) +color_distance() { + local hex1="$1" + local hex2="$2" + read -r r1 g1 b1 <<<"$(hex_to_rgb "$hex1")" + read -r r2 g2 b2 <<<"$(hex_to_rgb "$hex2")" + echo $(((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2))) +} + +# Extract all colors with frequency count +extract_all_colors_with_count() { + local -A color_counts + local color + + # Extract from Alacritty config + if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then + # Primary colors + while IFS= read -r color; do + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [ -n "$color" ] && ((color_counts["$color"]++)) + done < <(grep -E "(background|foreground|cursor|text)" "$CURRENT_THEME_DIR/alacritty.toml" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") + + # Normal colors + while IFS= read -r color; do + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [ -n "$color" ] && ((color_counts["$color"]++)) + done < <(grep -A 20 "\[colors.normal\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") + + # Bright colors + while IFS= read -r color; do + # Add # if missing + [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color" + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++)) + done < <(grep -A 20 "\[colors.bright\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//") + + # Dim colors if present + while IFS= read -r color; do + # Add # if missing + [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color" + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++)) + done < <(grep -A 20 "\[colors.dim\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//") + + # Selection colors + while IFS= read -r color; do + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [ -n "$color" ] && ((color_counts["$color"]++)) + done < <(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(background|text)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#") + fi + + # Extract from Waybar CSS + if [ -f "$CURRENT_THEME_DIR/waybar.css" ]; then + while IFS= read -r color; do + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [ -n "$color" ] && ((color_counts["$color"]++)) + done < <(grep -oE '@define-color [a-z_-]+ #[0-9a-fA-F]{6}' "$CURRENT_THEME_DIR/waybar.css" | grep -oE '#[0-9a-fA-F]{6}') + fi + + # Extract from Hyprland config + if [ -f "$CURRENT_THEME_DIR/hyprland.conf" ]; then + while IFS= read -r color; do + if [[ $color == rgba* ]] || [[ $color == rgb* ]]; then + color=$(rgb_to_hex "$color") + fi + color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency + [ -n "$color" ] && ((color_counts["$color"]++)) + done < <(grep -E "col\.(active|inactive)_border" "$CURRENT_THEME_DIR/hyprland.conf" | grep -oE 'rgba?\([^)]+\)|#[0-9a-fA-F]{6,8}' | sed 's/ff$//') + fi + + # Output colors with their counts + for color in "${!color_counts[@]}"; do + echo "${color_counts[$color]} $color" + done +} + +# Sort colors by frequency +sort_colors_by_frequency() { + # Input is already "count color" format + sort -rn | cut -d' ' -f2 +} + +# Fill color slots with cycling if needed +fill_color_slots() { + local -a colors=("$@") + local -a slots + local num_colors=${#colors[@]} + + # Need 13 slots total (code colors are handled separately) + local slots_needed=13 + + if [ $num_colors -eq 0 ]; then + # No colors available, use defaults + colors=("#3d3d3d" "#5d5d5d" "#7d7d7d" "#9d9d9d" "#bd93f9" "#50fa7b") + num_colors=6 + fi + + # Fill slots, cycling if necessary + for ((i = 0; i < slots_needed; i++)); do + slots[$i]="${colors[$((i % num_colors))]}" + done + + echo "${slots[@]}" +} + +# Main color extraction and theme generation +extract_theme_data() { + # Get primary colors from Alacritty + local bg_color="#1a1b26" + local fg_color="#a9b1d6" + + if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then + local extracted_bg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') + local extracted_fg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^foreground = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') + [ -n "$extracted_bg" ] && bg_color="$extracted_bg" + [ -n "$extracted_fg" ] && fg_color="$extracted_fg" + fi + + # Determine if light or dark theme + local bg_brightness=$(calculate_brightness "$bg_color") + local is_light_theme=false + [ $bg_brightness -gt 127 ] && is_light_theme=true + + # Extract all colors with counts + local color_data=$(extract_all_colors_with_count) + + # Filter out background and foreground colors for the main array + local filtered_data=$(echo "$color_data" | grep -v "$bg_color" | grep -v "$fg_color") + + # Get all unique colors (including bg/fg) for distance calculations + local -a all_unique_colors + readarray -t all_unique_colors < <(echo "$color_data" | cut -d' ' -f2 | sort -u) + + # Find the 3 closest colors to background for background variations + local -a bg_distances + for color in "${all_unique_colors[@]}"; do + if [ "$color" != "$bg_color" ]; then + distance=$(color_distance "$color" "$bg_color") + bg_distances+=("$distance:$color") + fi + done + + # Sort by distance and get the closest color for code background + local -a closest_to_bg + readarray -t closest_to_bg < <(printf '%s\n' "${bg_distances[@]}" | sort -n | head -1 | cut -d: -f2) + + # All background variations use the same as primary background + local bg_primary_alt="$bg_color" + local bg_secondary="$bg_color" + local bg_secondary_alt="$bg_color" + + # Code block background uses the closest different color + local code_bg="${closest_to_bg[0]}" + + # If no different color available, create a subtle variant for code blocks + if [ -z "$code_bg" ]; then + read -r r g b <<<"$(hex_to_rgb "$bg_color")" + if [ $bg_brightness -gt 127 ]; then + r=$((r - 10)) + g=$((g - 10)) + b=$((b - 10)) + else + r=$((r + 15)) + g=$((g + 15)) + b=$((b + 15)) + fi + [ $r -lt 0 ] && r=0 + [ $r -gt 255 ] && r=255 + [ $g -lt 0 ] && g=0 + [ $g -gt 255 ] && g=255 + [ $b -lt 0 ] && b=0 + [ $b -gt 255 ] && b=255 + code_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b") + fi + + # Find closest color to foreground for code block text + local code_fg="" + min_distance=999999999 + for color in "${all_unique_colors[@]}"; do + if [ "$color" != "$fg_color" ]; then + distance=$(color_distance "$color" "$fg_color") + if [ $distance -lt $min_distance ]; then + min_distance=$distance + code_fg="$color" + fi + fi + done + [ -z "$code_fg" ] && code_fg="#e0e0e0" # Fallback + + # Extract text selection colors from Alacritty + local selection_bg="" + local selection_fg="" + if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then + selection_bg=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') + local selection_text=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]') + + # If text is set to CellForeground/CellBackground, use the appropriate color + if [ -z "$selection_text" ] || [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellForeground"* ]]; then + selection_fg="$fg_color" + elif [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellBackground"* ]]; then + selection_fg="$bg_color" + else + selection_fg="$selection_text" + fi + fi + + # Fallback if no selection colors found + if [ -z "$selection_bg" ]; then + read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")" + read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")" + local r=$(((r1 * 3 + r2) / 4)) # 75% background, 25% foreground + local g=$(((g1 * 3 + g2) / 4)) + local b=$(((b1 * 3 + b2) / 4)) + selection_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b") + fi + + # Use contrasting color for selection text if not defined + if [ -z "$selection_fg" ]; then + # Calculate brightness of selection background + local sel_brightness=$(calculate_brightness "$selection_bg") + if [ $sel_brightness -gt 127 ]; then + selection_fg="$bg_color" # Dark text on light selection + else + selection_fg="$fg_color" # Light text on dark selection + fi + fi + + # Extract border color from btop theme + local border_color="" + if [ -f "$CURRENT_THEME_DIR/btop.theme" ]; then + # Look for theme[div_line] in btop theme + local btop_divline=$(grep 'theme\[div_line\]' "$CURRENT_THEME_DIR/btop.theme" | head -1) + + if [ -n "$btop_divline" ]; then + # Extract the color value after the = sign + local extracted=$(echo "$btop_divline" | sed 's/.*=//' | xargs) + + # Check if it's a hex color and lowercase it + if [[ $extracted =~ ^#[0-9a-fA-F]{6}$ ]]; then + border_color=$(echo "$extracted" | tr '[:upper:]' '[:lower:]') + elif [[ $extracted =~ ^[0-9a-fA-F]{6}$ ]]; then + # Add # if missing and lowercase + border_color=$(echo "#$extracted" | tr '[:upper:]' '[:lower:]') + fi + fi + fi + + # Fallback if no border color found + if [ -z "$border_color" ]; then + # Use a color between bg and fg + read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")" + read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")" + local r=$(((r1 + r2) / 3)) # Closer to background + local g=$(((g1 + g2) / 3)) + local b=$(((b1 + b2) / 3)) + border_color=$(printf "#%02x%02x%02x" "$r" "$g" "$b") + fi + + # Get unique colors array (without bg/fg) sorted by frequency + local -a unique_colors + readarray -t unique_colors < <(echo "$filtered_data" | sort_colors_by_frequency) + + # Fill the 13 color slots (code colors handled separately) + local -a color_slots + readarray -t color_slots < <(fill_color_slots "${unique_colors[@]}" | tr ' ' '\n') + + # Extract fonts + local monospace_font="CaskaydiaMono Nerd Font" + local ui_font="Liberation Sans" + + if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then + local alacritty_font=$(grep -A 5 "\[font\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep 'family = ' | head -1 | cut -d'"' -f2) + [ -n "$alacritty_font" ] && monospace_font="$alacritty_font" + fi + + if [ -f "$HOME/.config/fontconfig/fonts.conf" ]; then + local fontconfig_mono=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true) + [ -n "$fontconfig_mono" ] && monospace_font="$fontconfig_mono" + + local fontconfig_sans=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="sans-serif"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true) + [ -n "$fontconfig_sans" ] && ui_font="$fontconfig_sans" + fi + + # Generate CSS with 14-slot system + cat </dev/null || echo "unknown")") */ +/* Colors sorted by frequency, backgrounds by distance */ + +.theme-dark, .theme-light { + /* Core colors */ + --background-primary: $bg_color; + --text-normal: $fg_color; + + /* Background variations (always distance-based) */ + --background-primary-alt: $bg_primary_alt; + --background-secondary: $bg_secondary; + --background-secondary-alt: $bg_secondary_alt; + + /* Code block colors (always distance-based) */ + --code-background: $code_bg; + --code-foreground: $code_fg; + + /* Border color from btop theme */ + --border-color: $border_color; + + /* Selection colors from Alacritty */ + --text-selection: $selection_bg; + --text-selection-fg: $selection_fg; + + /* 13-slot color system for remaining elements */ + --text-title-h1: ${color_slots[0]}; + --text-title-h2: ${color_slots[1]}; + --text-title-h3: ${color_slots[2]}; + --text-title-h4: ${color_slots[3]}; + --text-title-h5: ${color_slots[4]}; + --text-title-h6: ${color_slots[4]}; /* Same as h5 */ + --text-link: ${color_slots[5]}; + --markup-code: ${color_slots[6]}; + --text-mark: ${color_slots[7]}; + --interactive-accent: ${color_slots[8]}; + --blockquote-border: ${color_slots[9]}; + --text-muted: $border_color; /* Use border color for muted text */ + --text-faint: $border_color; /* Use border color for faint text */ + + /* Additional mappings */ + --text-accent: var(--interactive-accent); + --text-accent-hover: var(--interactive-accent); + --text-error: var(--text-title-h1); + --text-error-hover: var(--text-title-h1); + --text-highlight-bg: $fg_color; /* Use text color as highlight background */ + --text-on-accent: $bg_color; + + --interactive-normal: var(--code-background); + --interactive-hover: var(--interactive-accent); + --interactive-accent-hover: var(--interactive-accent); + --interactive-success: var(--text-title-h2); + + --scrollbar-bg: var(--background-primary); + --scrollbar-thumb-bg: var(--code-background); + --scrollbar-active-thumb-bg: var(--interactive-accent); + + --background-modifier-border: var(--border-color); + --background-modifier-form-field: var(--code-background); + --background-modifier-form-field-highlighted: var(--code-background); + --background-modifier-box-shadow: rgba(0, 0, 0, 0.3); + --background-modifier-success: var(--interactive-success); + --background-modifier-error: var(--text-error); + --background-modifier-error-hover: var(--text-error); + --background-modifier-cover: rgba(0, 0, 0, 0.8); + + --link-color: var(--text-link); + --link-color-hover: var(--text-link); + --link-unresolved-color: var(--text-muted); + --link-unresolved-opacity: 0.7; + + --tag-color: var(--text-title-h3); + --tag-background: var(--code-background); + + --graph-line: var(--text-muted); + --graph-node: var(--interactive-accent); + --graph-node-unresolved: var(--text-muted); + --graph-node-focused: var(--text-link); + --graph-node-tag: var(--text-title-h3); + --graph-node-attachment: var(--text-title-h2); + + /* Fonts */ + --font-interface-theme: "$ui_font"; + --font-text-theme: "$ui_font"; + --font-monospace-theme: "$monospace_font"; +} + +/* Headers */ +.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); } +.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); } +.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); } +.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); } +.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); } +.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); } + +/* Code blocks */ +.markdown-rendered code { + font-family: var(--font-monospace-theme); + background-color: var(--code-background); + color: var(--markup-code); + padding: 2px 4px; + border-radius: 3px; +} + +.markdown-rendered pre { + background-color: var(--code-background); + border: 1px solid var(--background-modifier-border); + border-radius: 5px; +} + +.markdown-rendered pre code { + background-color: transparent; + color: var(--code-foreground); +} + +/* Syntax highlighting */ +.cm-s-obsidian span.cm-keyword { color: var(--text-title-h1); } +.cm-s-obsidian span.cm-string { color: var(--text-title-h2); } +.cm-s-obsidian span.cm-number { color: var(--text-title-h3); } +.cm-s-obsidian span.cm-comment { color: var(--text-muted); } +.cm-s-obsidian span.cm-operator { color: var(--text-link); } +.cm-s-obsidian span.cm-variable { color: var(--text-normal); } +.cm-s-obsidian span.cm-def { color: var(--text-link); } + +/* Highlighted text */ +.markdown-rendered mark, +.cm-s-obsidian span.cm-highlight, +mark { + background-color: var(--text-highlight-bg) !important; + color: var(--code-background) !important; +} + +/* Links */ +.markdown-rendered a { + color: var(--text-link); +} + +/* Blockquotes */ +.markdown-rendered blockquote { + border-left: 4px solid var(--blockquote-border); + padding-left: 1em; +} + +/* Status bar */ +.status-bar { + background-color: var(--code-background); + border-top: 1px solid var(--background-modifier-border); +} + +/* Active file */ +.workspace-leaf.mod-active .workspace-leaf-header-title { + color: var(--interactive-accent); +} + +.nav-file-title.is-active { + background-color: var(--code-background); + color: var(--interactive-accent); +} + +/* Text selection */ +::selection { + background-color: var(--text-selection); + color: var(--text-selection-fg); +} + +/* Search results */ +.search-result-file-title { + color: var(--interactive-accent); +} + +.search-result-file-match { + background-color: var(--code-background); + color: var(--text-normal); + border-left: 3px solid var(--interactive-accent); +} + +.search-result-file-matched-text { + color: var(--code-background); +} + +/* Tables */ +.markdown-rendered table { + border: 1px solid var(--background-modifier-border); +} + +.markdown-rendered th { + background-color: var(--code-background); + color: var(--text-accent); +} + +.markdown-rendered td { + border: 1px solid var(--background-modifier-border); +} + +/* Callouts */ +.callout { + border-left: 4px solid var(--interactive-accent); + background-color: var(--code-background); +} +.callout * { + color: var(--text-normal); +} + +/* Modal dialogs */ +.modal { + background-color: var(--background-primary); + border: 2px solid var(--background-modifier-border); +} + +/* Settings */ +.vertical-tab-header-group-title { + color: var(--interactive-accent); +} + +.vertical-tab-nav-item.is-active { + background-color: var(--code-background); + color: var(--interactive-accent); +} +EOF +} + +# Option handling +if [ "${1:-}" = "--reset" ]; then + echo "♻️ Resetting Omarchy themes and registry..." + if [ -f "$VAULTS_FILE" ] && [ -s "$VAULTS_FILE" ]; then + while IFS= read -r vault_path || [ -n "$vault_path" ]; do + case "$vault_path" in ""|\#*) continue ;; esac + vault_path="${vault_path%/}" + vault_name=$(basename "$vault_path") + theme_dir="$vault_path/.obsidian/themes/Omarchy" + if [ -d "$theme_dir" ]; then + rm -rf "$theme_dir" + echo " ✅ $vault_name (theme removed)" + else + echo " ℹ️ $vault_name (no theme present)" + fi + done <"$VAULTS_FILE" + fi + rm -f "$VAULTS_FILE" + echo "✅ Registry removed" + exit 0 +fi + +# Main update logic +echo "🔄 Updating Obsidian vaults..." + +# Step 1: ensure registry exists (bootstrap if needed) +ensure_vaults_file + +while IFS= read -r vault_path || [ -n "$vault_path" ]; do + case "$vault_path" in "" | \#*) continue ;; esac + vault_path="${vault_path%/}" + vault_name=$(basename "$vault_path") + + # Step 2: verify path exists; log/skip gracefully if invalid + if [ ! -d "$vault_path" ] || [ ! -d "$vault_path/.obsidian" ]; then + echo " ❌ $vault_name (invalid entry: missing directory or .obsidian)" + continue + fi + + # Ensure theme files exist for this vault + ensure_theme_scaffold "$vault_path" + THEME_DIR="$vault_path/.obsidian/themes/Omarchy" + + # Step 3: update theme.css + if [ -f "$CURRENT_THEME_DIR/obsidian.css" ]; then + cp "$CURRENT_THEME_DIR/obsidian.css" "$THEME_DIR/theme.css" + echo " ✅ $vault_name (custom theme)" + else + extract_theme_data >"$THEME_DIR/theme.css" + echo " ✅ $vault_name (generated theme)" + fi +done <"$VAULTS_FILE" diff --git a/bin/omarchy-theme-set-terminal b/bin/omarchy-theme-set-terminal index 8a6bdbdd..9e2f7ad0 100755 --- a/bin/omarchy-theme-set-terminal +++ b/bin/omarchy-theme-set-terminal @@ -1,7 +1,8 @@ #!/bin/bash -case "$TERMINAL" in -"alacritty") touch ~/.config/alacritty/alacritty.toml ;; -"kitty") killall -SIGUSR1 kitty ;; -"ghostty") killall -SIGUSR2 ghostty ;; -esac +if [[ -f ~/.config/alacritty/alacritty.toml ]]; then + touch ~/.config/alacritty/alacritty.toml +fi + +killall -SIGUSR1 kitty +killall -SIGUSR2 ghostty diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index 1fa975d1..c04010ca 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -3,44 +3,45 @@ # Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments), # which jq doesn’t support. -VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" -VS_CODE_SETTINGS="$HOME/.config/Code/User/settings.json" -VS_CODE_SKIP_FLAG="$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes" +# Parameters: EDITOR_CMD SETTINGS_PATH SKIP_FLAG EDITOR_NAME +EDITOR_CMD="${1:-code}" +SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}" +SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}" +EDITOR_NAME="${4:-VS Code}" -if omarchy-cmd-present code && [[ ! -f "$VS_CODE_SKIP_FLAG" ]]; then +VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" + +if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then if [[ -f "$VS_CODE_THEME" ]]; then theme_name=$(jq -r '.name' "$VS_CODE_THEME") extension=$(jq -r '.extension' "$VS_CODE_THEME") - # Install VS Code theme extension - if [[ -n "$extension" ]] && ! code --list-extensions | grep -Fxq "$extension"; then - notify-send " Installing VS Code theme for $theme_name" - code --install-extension "$extension" >/dev/null + # Install $EDITOR_NAME theme extension + if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then + "$EDITOR_CMD" --install-extension "$extension" >/dev/null fi # Create config file if there isn't already one - mkdir -p "$(dirname "$VS_CODE_SETTINGS")" - if [[ ! -f "$VS_CODE_SETTINGS" ]]; then - printf '{\n}\n' > "$VS_CODE_SETTINGS" + mkdir -p "$(dirname "$SETTINGS_PATH")" + if [[ ! -f "$SETTINGS_PATH" ]]; then + printf '{\n}\n' >"$SETTINGS_PATH" fi - # Create a `workbench.colorTheme` entry in settings. - if ! grep -q '"workbench.colorTheme"' "$VS_CODE_SETTINGS"; then + # Create a `workbench.colorTheme` entry in settings. + if ! grep -q '"workbench.colorTheme"' "$SETTINGS_PATH"; then # Insert `"workbench.colorTheme": "",` immediately after the first `{` # Use sed's first-match range (0,/{/) to only replace the first `{` - sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ - "workbench.colorTheme": "",/}' "$VS_CODE_SETTINGS" + sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$SETTINGS_PATH" fi # Update theme sed -i --follow-symlinks -E \ "s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \ - "$VS_CODE_SETTINGS" + "$SETTINGS_PATH" else - # Remove theme from settings.json when the theme doesn't have vscode support - if [[ -f "$VS_CODE_SETTINGS" ]]; then - sed -i --follow-symlinks -E '/"workbench\.colorTheme"[[:space:]]*:[^,}]*,?/d' "$VS_CODE_SETTINGS" - + # Remove theme from settings.json when the theme doesn't have $EDITOR_NAME support + if [[ -f "$SETTINGS_PATH" ]]; then + sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH" fi fi fi diff --git a/bin/omarchy-toggle-idle b/bin/omarchy-toggle-idle index a1954614..aa69cf50 100755 --- a/bin/omarchy-toggle-idle +++ b/bin/omarchy-toggle-idle @@ -4,6 +4,6 @@ if pgrep -x hypridle >/dev/null; then pkill -x hypridle notify-send "Stop locking computer when idle" else - uwsm app -- hypridle >/dev/null 2>&1 & + uwsm-app -- hypridle >/dev/null 2>&1 & notify-send "Now locking computer when idle" fi diff --git a/bin/omarchy-toggle-nightlight b/bin/omarchy-toggle-nightlight index 2ab2deb6..99b0286b 100755 --- a/bin/omarchy-toggle-nightlight +++ b/bin/omarchy-toggle-nightlight @@ -6,7 +6,7 @@ OFF_TEMP=6000 # Ensure hyprsunset is running if ! pgrep -x hyprsunset; then - setsid uwsm app -- hyprsunset & + setsid uwsm-app -- hyprsunset & sleep 1 # Give it time to register fi diff --git a/bin/omarchy-toggle-waybar b/bin/omarchy-toggle-waybar index 9714185f..71387827 100755 --- a/bin/omarchy-toggle-waybar +++ b/bin/omarchy-toggle-waybar @@ -3,5 +3,5 @@ if pgrep -x waybar >/dev/null; then pkill -x waybar else - uwsm app -- waybar >/dev/null 2>&1 & + uwsm-app -- waybar >/dev/null 2>&1 & fi diff --git a/bin/omarchy-tz-select b/bin/omarchy-tz-select new file mode 100755 index 00000000..24003228 --- /dev/null +++ b/bin/omarchy-tz-select @@ -0,0 +1,6 @@ +#!/bin/bash + +timezone=$(timedatectl list-timezones | gum filter --height 20 --header "Set timezone") || exit 1 +sudo timedatectl set-timezone "$timezone" +echo "Timezone is now set to $timezone" +omarchy-restart-waybar diff --git a/bin/omarchy-update-branch b/bin/omarchy-update-branch index 929e1bb4..91bd797e 100755 --- a/bin/omarchy-update-branch +++ b/bin/omarchy-update-branch @@ -3,7 +3,7 @@ set -e if (($# == 0)); then - echo "Usage: omarchy-verion-branch-set [master|dev]" + echo "Usage: omarchy-update-branch [master|dev]" exit 1 fi diff --git a/bin/omarchy-update-firmware b/bin/omarchy-update-firmware new file mode 100755 index 00000000..10e490f4 --- /dev/null +++ b/bin/omarchy-update-firmware @@ -0,0 +1,11 @@ +#!/bin/bash + +set -e +echo -e "\e[32mUpdate Firmware\e[0m" + +if omarchy-cmd-missing fwupdmgr; then + omarchy-pkg-add fwupd +fi + +fwupdmgr refresh +sudo fwupdmgr update diff --git a/bin/omarchy-update-perform b/bin/omarchy-update-perform index f31e3c88..9e68a67b 100755 --- a/bin/omarchy-update-perform +++ b/bin/omarchy-update-perform @@ -5,4 +5,5 @@ set -e omarchy-update-available-reset omarchy-update-system-pkgs omarchy-migrate +omarchy-hook post-update omarchy-update-restart diff --git a/bin/omarchy-update-restart b/bin/omarchy-update-restart index 513cf80b..2811e937 100755 --- a/bin/omarchy-update-restart +++ b/bin/omarchy-update-restart @@ -5,9 +5,6 @@ if [ "$(uname -r | sed 's/-arch/\.arch/')" != "$(pacman -Q linux | awk '{print $ elif [ -f "$HOME/.local/state/omarchy/reboot-required" ]; then gum confirm "Updates require reboot. Ready?" && omarchy-state clear re*-required && sudo reboot now - -elif [ -f "$HOME/.local/state/omarchy/relaunch-required" ]; then - gum confirm "Updates require Hyprland relaunch. Ready?" && omarchy-state clear re*-required && uwsm stop fi for file in "$HOME"/.local/state/omarchy/restart-*-required; do diff --git a/bin/omarchy-version b/bin/omarchy-version index 4ac84815..5ddc823f 100755 --- a/bin/omarchy-version +++ b/bin/omarchy-version @@ -1,3 +1,2 @@ #!/bin/bash - -git -C "$OMARCHY_PATH" describe --tags $(git -C "$OMARCHY_PATH" rev-list --tags --max-count=1) +cat $OMARCHY_PATH/version diff --git a/bin/omarchy-webapp-handler-hey b/bin/omarchy-webapp-handler-hey new file mode 100755 index 00000000..37f4cf2d --- /dev/null +++ b/bin/omarchy-webapp-handler-hey @@ -0,0 +1,11 @@ +#!/bin/bash +url="$1" +web_url="https://app.hey.com" + +# Handle mailto: URLs +if [[ $url =~ ^mailto: ]]; then + email=$(echo "$url" | sed 's/mailto://') + web_url="https://app.hey.com/messages/new?to=$email" +fi + +exec omarchy-launch-webapp "$web_url" diff --git a/bin/omarchy-webapp-remove b/bin/omarchy-webapp-remove index 833e8989..ca4daefc 100755 --- a/bin/omarchy-webapp-remove +++ b/bin/omarchy-webapp-remove @@ -6,7 +6,7 @@ DESKTOP_DIR="$HOME/.local/share/applications/" if [ "$#" -eq 0 ]; then # Find all web apps while IFS= read -r -d '' file; do - if grep -q '^Exec=.*omarchy-launch-webapp.*' "$file"; then + if grep -q '^Exec=.*\(omarchy-launch-webapp\|omarchy-webapp-handler\).*' "$file"; then WEB_APPS+=("$(basename "${file%.desktop}")") fi done < <(find "$DESKTOP_DIR" -name '*.desktop' -print0) diff --git a/bin/omarchy-windows-vm b/bin/omarchy-windows-vm new file mode 100755 index 00000000..47e90247 --- /dev/null +++ b/bin/omarchy-windows-vm @@ -0,0 +1,445 @@ +#!/bin/bash +COMPOSE_FILE="$HOME/.config/windows/docker-compose.yml" + +check_prerequisites() { + local DISK_SIZE_GB=${1:-64} + local REQUIRED_SPACE=$((DISK_SIZE_GB + 10)) # Add 10GB for Windows ISO and overhead + + # Check for KVM support + if [ ! -e /dev/kvm ]; then + gum style \ + --border normal \ + --padding "1 2" \ + --margin "1" \ + "❌ KVM virtualization not available!" \ + "" \ + "Please enable virtualization in BIOS or run:" \ + " sudo modprobe kvm-intel # for Intel CPUs" \ + " sudo modprobe kvm-amd # for AMD CPUs" + exit 1 + fi + + # Check disk space + AVAILABLE_SPACE=$(df "$HOME" | awk 'NR==2 {print int($4/1024/1024)}') + if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then + echo "❌ Insufficient disk space!" + echo " Available: ${AVAILABLE_SPACE}GB" + echo " Required: ${REQUIRED_SPACE}GB (${DISK_SIZE_GB}GB disk + 10GB for Windows image)" + exit 1 + fi +} + +install_windows() { + # Set up trap to handle Ctrl+C + trap "echo ''; echo 'Installation cancelled by user'; exit 1" INT + + check_prerequisites + + omarchy-pkg-add freerdp openbsd-netcat gum + + mkdir -p "$HOME/.windows" + mkdir -p "$HOME/.config/windows" + mkdir -p "$HOME/.local/share/applications/icons" + + # Install Windows VM icon and desktop file + if [ -f "$OMARCHY_PATH/applications/icons/windows.png" ]; then + cp "$OMARCHY_PATH/applications/icons/windows.png" "$HOME/.local/share/applications/icons/windows.png" + fi + + cat << EOF | tee "$HOME/.local/share/applications/windows-vm.desktop" > /dev/null +[Desktop Entry] +Name=Windows +Comment=Start Windows VM via Docker and connect with RDP +Exec=uwsm app -- omarchy-windows-vm launch +Icon=$HOME/.local/share/applications/icons/windows.png +Terminal=false +Type=Application +Categories=System;Virtualization; +EOF + + # Get system resources + TOTAL_RAM=$(free -h | grep "^Mem:" | awk '{print $2}') + TOTAL_RAM_GB=$(free -g | grep "^Mem:" | awk '{print $2}') + TOTAL_CORES=$(nproc) + + echo "" + echo "System Resources Detected:" + echo " Total RAM: $TOTAL_RAM" + echo " Total CPU Cores: $TOTAL_CORES" + echo "" + + RAM_OPTIONS="" + for size in 2 4 8 16 32 64; do + if [ $size -le $TOTAL_RAM_GB ]; then + RAM_OPTIONS="$RAM_OPTIONS ${size}G" + fi + done + + SELECTED_RAM=$(echo $RAM_OPTIONS | tr ' ' '\n' | gum choose --selected="4G" --header="How much RAM would you like to allocate to Windows VM?") + + # Check if user cancelled + if [ -z "$SELECTED_RAM" ]; then + echo "Installation cancelled by user" + exit 1 + fi + + SELECTED_CORES=$(gum input --placeholder="Number of CPU cores (1-$TOTAL_CORES)" --value="2" --header="How many CPU cores would you like to allocate to Windows VM?" --char-limit=2) + + # Check if user cancelled (Ctrl+C in gum input returns empty string) + if [ -z "$SELECTED_CORES" ]; then + echo "Installation cancelled by user" + exit 1 + fi + + if ! [[ "$SELECTED_CORES" =~ ^[0-9]+$ ]] || [ "$SELECTED_CORES" -lt 1 ] || [ "$SELECTED_CORES" -gt "$TOTAL_CORES" ]; then + echo "Invalid input. Using default: 2 cores" + SELECTED_CORES=2 + fi + + AVAILABLE_SPACE=$(df "$HOME" | awk 'NR==2 {print int($4/1024/1024)}') + MAX_DISK_GB=$((AVAILABLE_SPACE - 10)) # Leave 10GB for Windows image + + # Check if we have enough space for minimum + if [ $MAX_DISK_GB -lt 32 ]; then + echo "❌ Insufficient disk space for Windows VM!" + echo " Available: ${AVAILABLE_SPACE}GB" + echo " Minimum required: 42GB (32GB disk + 10GB for Windows image)" + exit 1 + fi + + DISK_OPTIONS="" + for size in 32 64 128 256 512; do + if [ $size -le $MAX_DISK_GB ]; then + DISK_OPTIONS="$DISK_OPTIONS ${size}G" + fi + done + + # Default to 64G if available, otherwise 32G + DEFAULT_DISK="64G" + if ! echo "$DISK_OPTIONS" | grep -q "64G"; then + DEFAULT_DISK="32G" + fi + + SELECTED_DISK=$(echo $DISK_OPTIONS | tr ' ' '\n' | gum choose --selected="$DEFAULT_DISK" --header="How much disk space would you like to give Windows VM? (64GB+ recommended)") + + # Check if user cancelled + if [ -z "$SELECTED_DISK" ]; then + echo "Installation cancelled by user" + exit 1 + fi + + # Extract just the number for prerequisite check + DISK_SIZE_NUM=$(echo "$SELECTED_DISK" | sed 's/G//') + + # Re-check prerequisites with selected disk size + check_prerequisites "$DISK_SIZE_NUM" + + # Prompt for username and password + USERNAME=$(gum input --placeholder="Username (Press enter to use default: docker)" --header="Enter Windows username:") + if [ -z "$USERNAME" ]; then + USERNAME="docker" + fi + + PASSWORD=$(gum input --placeholder="Password (Press enter to use default: admin)" --password --header="Enter Windows password:") + if [ -z "$PASSWORD" ]; then + PASSWORD="admin" + PASSWORD_DISPLAY="(default)" + else + PASSWORD_DISPLAY="(user-defined)" + fi + + # Display configuration summary + gum style \ + --border normal \ + --padding "1 2" \ + --margin "1" \ + --align left \ + --bold \ + "Windows VM Configuration" \ + "" \ + "RAM: $SELECTED_RAM" \ + "CPU: $SELECTED_CORES cores" \ + "Disk: $SELECTED_DISK" \ + "Username: $USERNAME" \ + "Password: $PASSWORD_DISPLAY" + + # Ask for confirmation + echo "" + if ! gum confirm "Proceed with this configuration?"; then + echo "Installation cancelled by user" + exit 1 + fi + + mkdir -p $HOME/Windows + + # Create docker-compose.yml in user config directory + cat << EOF | tee "$COMPOSE_FILE" > /dev/null +services: + windows: + image: dockurr/windows + container_name: omarchy-windows + environment: + VERSION: "11" + RAM_SIZE: "$SELECTED_RAM" + CPU_CORES: "$SELECTED_CORES" + DISK_SIZE: "$SELECTED_DISK" + USERNAME: "$USERNAME" + PASSWORD: "$PASSWORD" + devices: + - /dev/kvm + - /dev/net/tun + cap_add: + - NET_ADMIN + ports: + - 8006:8006 + - 3389:3389/tcp + - 3389:3389/udp + volumes: + - $HOME/.windows:/storage + - $HOME/Windows:/shared + restart: always + stop_grace_period: 2m +EOF + + echo "" + echo "Starting Windows VM installation..." + echo "This will download a Windows 11 image (may take 10-15 minutes)." + echo "" + echo "Monitor installation progress at: http://127.0.0.1:8006" + echo "" + + # Start docker-compose with user's config + echo "Starting Windows VM with docker-compose..." + if ! docker-compose -f "$COMPOSE_FILE" up -d 2>&1; then + echo "❌ Failed to start Windows VM!" + echo " Common issues:" + echo " - Docker daemon not running: sudo systemctl start docker" + echo " - Port already in use: check if another VM is running" + echo " - Permission issues: make sure you're in the docker group" + exit 1 + fi + + echo "" + echo "Windows VM is starting up!" + echo "" + echo "Opening browser to monitor installation..." + + # Open browser to monitor installation + sleep 3 + xdg-open "http://127.0.0.1:8006" + + echo "" + echo "Installation is running in the background." + echo "You can monitor progress at: http://127.0.0.1:8006" + echo "" + echo "Once finished, launch 'Windows' via Super + Space" + echo "" + echo "To stop the VM: omarchy-windows-vm stop" + echo "To change resources: ~/.config/windows/docker-compose.yml" + echo "" +} + +remove_windows() { + echo "Removing Windows VM..." + + docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true + + docker rmi dockurr/windows 2>/dev/null || echo "Image already removed or not found" + + rm "$HOME/.local/share/applications/windows-vm.desktop" + rm -rf "$HOME/.config/windows" + rm -rf "$HOME/.windows" + + echo "" + echo "Windows VM removal completed!" +} + +launch_windows() { + KEEP_ALIVE=false + if [ "$1" = "--keep-alive" ] || [ "$1" = "-k" ]; then + KEEP_ALIVE=true + fi + + # Check if config exists + if [ ! -f "$COMPOSE_FILE" ]; then + echo "Windows VM not configured. Please run: omarchy-windows-vm install" + exit 1 + fi + + # Check if container is already running + CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null) + + if [ "$CONTAINER_STATUS" != "running" ]; then + echo "Starting Windows VM..." + + # Send desktop notification + notify-send "Windows VM" "Starting Windows VM, this may take a moment..." + + if ! docker-compose -f "$COMPOSE_FILE" up -d 2>&1; then + echo "❌ Failed to start Windows VM!" + echo " Try checking: omarchy-windows-vm status" + echo " View logs: docker logs omarchy-windows" + notify-send -u critical "Windows VM" "Failed to start Windows VM" + exit 1 + fi + + # Wait for RDP to be ready + echo "Waiting for Windows VM to be ready..." + WAIT_COUNT=0 + while ! nc -z 127.0.0.1 3389 2>/dev/null; do + sleep 2 + WAIT_COUNT=$((WAIT_COUNT + 1)) + if [ $WAIT_COUNT -gt 60 ]; then # 2 minutes timeout + echo "❌ Timeout waiting for RDP!" + echo " The VM might still be installing Windows." + echo " Check progress at: http://127.0.0.1:8006" + exit 1 + fi + done + + # Give it a moment more to fully initialize + sleep 3 + fi + + # Extract credentials from compose file + WIN_USER=$(grep "USERNAME:" "$COMPOSE_FILE" | sed 's/.*USERNAME: "\(.*\)"/\1/') + WIN_PASS=$(grep "PASSWORD:" "$COMPOSE_FILE" | sed 's/.*PASSWORD: "\(.*\)"/\1/') + + # Use defaults if not found + [ -z "$WIN_USER" ] && WIN_USER="docker" + [ -z "$WIN_PASS" ] && WIN_PASS="admin" + + # Build the connection info + if [ "$KEEP_ALIVE" = true ]; then + LIFECYCLE="VM will keep running after RDP closes +To stop: omarchy-windows-vm stop" + else + LIFECYCLE="VM will auto-stop when RDP closes" + fi + + gum style \ + --border normal \ + --padding "1 2" \ + --margin "1" \ + --align center \ + "Connecting to Windows VM" \ + "" \ + "$LIFECYCLE" + + # Detect display scale from Hyprland + HYPR_SCALE=$(hyprctl monitors -j | jq -r '.[0].scale') + SCALE_PERCENT=$(echo "$HYPR_SCALE" | awk '{print int($1 * 100)}') + + RDP_SCALE="" + if [ "$SCALE_PERCENT" -ge 170 ]; then + RDP_SCALE="/scale:180" + elif [ "$SCALE_PERCENT" -ge 130 ]; then + RDP_SCALE="/scale:140" + fi + # If scale is less than 130%, don't set any scale (use default 100) + + # Connect with RDP in fullscreen (auto-detects resolution) + xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 +f -grab-keyboard /cert:ignore /title:"Windows VM - Omarchy" /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE + + # After RDP closes, stop the container unless --keep-alive was specified + if [ "$KEEP_ALIVE" = false ]; then + echo "" + echo "RDP session closed. Stopping Windows VM..." + docker-compose -f "$COMPOSE_FILE" down + echo "Windows VM stopped." + else + echo "" + echo "RDP session closed. Windows VM is still running." + echo "To stop it: omarchy-windows-vm stop" + fi +} + +stop_windows() { + if [ ! -f "$COMPOSE_FILE" ]; then + echo "Windows VM not configured." + exit 1 + fi + + echo "Stopping Windows VM..." + docker-compose -f "$COMPOSE_FILE" down + echo "Windows VM stopped." +} + +status_windows() { + if [ ! -f "$COMPOSE_FILE" ]; then + echo "Windows VM not configured." + echo "To set up: omarchy-windows-vm install" + exit 1 + fi + + CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null) + + if [ -z "$CONTAINER_STATUS" ]; then + echo "Windows VM container not found." + echo "To start: omarchy-windows-vm launch" + elif [ "$CONTAINER_STATUS" = "running" ]; then + gum style \ + --border normal \ + --padding "1 2" \ + --margin "1" \ + --align left \ + "Windows VM Status: RUNNING" \ + "" \ + "Web interface: http://127.0.0.1:8006" \ + "RDP available: port 3389" \ + "" \ + "To connect: omarchy-windows-vm launch" \ + "To stop: omarchy-windows-vm stop" + else + echo "Windows VM is stopped (status: $CONTAINER_STATUS)" + echo "To start: omarchy-windows-vm launch" + fi +} + +show_usage() { + echo "Usage: omarchy-windows-vm [command] [options]" + echo "" + echo "Commands:" + echo " install Install and configure Windows VM" + echo " remove Remove Windows VM and optionally its data" + echo " launch [options] Start Windows VM (if needed) and connect via RDP" + echo " Options:" + echo " --keep-alive, -k Keep VM running after RDP closes" + echo " stop Stop the running Windows VM" + echo " status Show current VM status" + echo " help Show this help message" + echo "" + echo "Examples:" + echo " omarchy-windows-vm install # Set up Windows VM for first time" + echo " omarchy-windows-vm launch # Connect to VM (auto-stop on exit)" + echo " omarchy-windows-vm launch -k # Connect to VM (keep running)" + echo " omarchy-windows-vm stop # Shut down the VM" +} + +# Main command dispatcher +case "$1" in + install) + install_windows + ;; + remove) + remove_windows + ;; + launch|start) + launch_windows "$2" + ;; + stop|down) + stop_windows + ;; + status) + status_windows + ;; + help|--help|-h|"") + show_usage + ;; + *) + echo "Unknown command: $1" >&2 + echo "" >&2 + show_usage >&2 + exit 1 + ;; +esac diff --git a/config/alacritty/alacritty.toml b/config/alacritty/alacritty.toml index 63fb85b7..ee1fb6fc 100644 --- a/config/alacritty/alacritty.toml +++ b/config/alacritty/alacritty.toml @@ -16,5 +16,6 @@ decorations = "None" [keyboard] bindings = [ -{ key = "F11", action = "ToggleFullscreen" } +{ key = "Insert", mods = "Shift", action = "Paste" }, +{ key = "Insert", mods = "Control", action = "Copy" } ] diff --git a/config/brave-flags.conf b/config/brave-flags.conf index d6d120e6..3510e03d 100644 --- a/config/brave-flags.conf +++ b/config/brave-flags.conf @@ -1,3 +1,5 @@ --ozone-platform=wayland --ozone-platform-hint=wayland --enable-features=TouchpadOverscrollHistoryNavigation +# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957 +--disable-features=WaylandWpColorManagerV1 diff --git a/config/btop/btop.conf b/config/btop/btop.conf index c510f3e7..c150ea0a 100644 --- a/config/btop/btop.conf +++ b/config/btop/btop.conf @@ -22,7 +22,7 @@ presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:defaul #* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. #* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. -vim_keys = False +vim_keys = True #* Rounded corners on boxes, is ignored if TTY mode is ON. rounded_corners = True diff --git a/config/chromium-flags.conf b/config/chromium-flags.conf index 88c8082b..bce00d52 100644 --- a/config/chromium-flags.conf +++ b/config/chromium-flags.conf @@ -2,3 +2,5 @@ --ozone-platform-hint=wayland --enable-features=TouchpadOverscrollHistoryNavigation --load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url +# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957 +--disable-features=WaylandWpColorManagerV1 diff --git a/config/elephant/calc.toml b/config/elephant/calc.toml new file mode 100644 index 00000000..95d00d12 --- /dev/null +++ b/config/elephant/calc.toml @@ -0,0 +1 @@ +async = false diff --git a/config/elephant/desktopapplications.toml b/config/elephant/desktopapplications.toml new file mode 100644 index 00000000..de17325b --- /dev/null +++ b/config/elephant/desktopapplications.toml @@ -0,0 +1,3 @@ +show_actions = false +only_search_title = true +history = false diff --git a/config/ghostty/config b/config/ghostty/config index e8420d1b..f714edb3 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -7,10 +7,12 @@ font-style = Regular font-size = 9 # Window +window-theme = ghostty window-padding-x = 14 window-padding-y = 14 confirm-close-surface=false resize-overlay = never +gtk-toolbar-style = flat # Cursor styling cursor-style = "block" @@ -18,4 +20,8 @@ cursor-style-blink = false shell-integration-features = no-cursor # Keyboard bindings -keybind = f11=toggle_fullscreen +keybind = shift+insert=paste_from_clipboard +keybind = control+insert=copy_to_clipboard + +# SSH session terminfo +shell-integration-features = ssh-env diff --git a/config/hypr/autostart.conf b/config/hypr/autostart.conf index 3b7c62d2..708b3a29 100644 --- a/config/hypr/autostart.conf +++ b/config/hypr/autostart.conf @@ -1,2 +1,2 @@ # Extra autostart processes -# exec-once = uwsm app -- my-service +# exec-once = uwsm-app -- my-service diff --git a/config/hypr/bindings.conf b/config/hypr/bindings.conf index 6076049b..954929ed 100644 --- a/config/hypr/bindings.conf +++ b/config/hypr/bindings.conf @@ -1,29 +1,29 @@ # Application bindings -$terminal = uwsm app -- $TERMINAL +$terminal = uwsm-app -- $TERMINAL $browser = omarchy-launch-browser -bindd = SUPER, return, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)" -bindd = SUPER, F, File manager, exec, uwsm app -- nautilus --new-window -bindd = SUPER, B, Browser, exec, $browser -bindd = SUPER SHIFT, B, Browser (private), exec, $browser --private -bindd = SUPER, M, Music, exec, omarchy-launch-or-focus spotify -bindd = SUPER, N, Editor, exec, omarchy-launch-editor -bindd = SUPER, T, Activity, exec, $terminal -e btop -bindd = SUPER, D, Docker, exec, $terminal -e lazydocker -bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm app -- signal-desktop" -bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm app -- obsidian -disable-gpu --enable-wayland-ime" -bindd = SUPER, slash, Passwords, exec, uwsm app -- 1password +bindd = SUPER, RETURN, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)" +bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window +bindd = SUPER SHIFT, B, Browser, exec, $browser +bindd = SUPER SHIFT ALT, B, Browser (private), exec, $browser --private +bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify +bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor +bindd = SUPER SHIFT, T, Activity, exec, $terminal -e btop +bindd = SUPER SHIFT, D, Docker, exec, $terminal -e lazydocker +bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus signal "uwsm-app -- signal-desktop" +bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus "^obsidian$" "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime" +bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password # If your web app url contains #, type it as ## to prevent hyperland treat it as comments -bindd = SUPER, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" -bindd = SUPER SHIFT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" -bindd = SUPER, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" -bindd = SUPER, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" -bindd = SUPER, Y, YouTube, exec, omarchy-launch-or-focus-webapp YouTube "https://youtube.com/" -bindd = SUPER SHIFT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/" -bindd = SUPER ALT, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations" -bindd = SUPER, X, X, exec, omarchy-launch-webapp "https://x.com/" -bindd = SUPER SHIFT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post" +bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" +bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" +bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" +bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" +bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/" +bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/" +bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations" +bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/" +bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post" # Overwrite existing bindings, like putting Omarchy Menu on Super + Space # unbind = SUPER, SPACE diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf index 3a91c979..f513cd08 100644 --- a/config/hypr/hyprland.conf +++ b/config/hypr/hyprland.conf @@ -3,7 +3,8 @@ # Use defaults Omarchy defaults (but don't edit these directly!) source = ~/.local/share/omarchy/default/hypr/autostart.conf source = ~/.local/share/omarchy/default/hypr/bindings/media.conf -source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf +source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf +source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf source = ~/.local/share/omarchy/default/hypr/envs.conf source = ~/.local/share/omarchy/default/hypr/looknfeel.conf @@ -18,3 +19,6 @@ source = ~/.config/hypr/bindings.conf source = ~/.config/hypr/envs.conf source = ~/.config/hypr/looknfeel.conf source = ~/.config/hypr/autostart.conf + +# Add any other personal Hyprland configuration below +# windowrule = workspace 5, class:qemu diff --git a/config/hypr/hyprlock.conf b/config/hypr/hyprlock.conf index d2df6965..063d793b 100644 --- a/config/hypr/hyprlock.conf +++ b/config/hypr/hyprlock.conf @@ -13,7 +13,7 @@ animations { input-field { monitor = - size = 600, 100 + size = 650, 100 position = 0, 0 halign = center valign = center @@ -22,12 +22,12 @@ input-field { outer_color = $outer_color outline_thickness = 4 - font_family = CaskaydiaMono Nerd Font + font_family = CaskaydiaMono Nerd Font Propo font_color = $font_color - placeholder_text =   Enter Password 󰈷  + placeholder_text = Enter Password 󰈷 check_color = $check_color - fail_text = $PAMFAIL ($ATTEMPTS) + fail_text = $FAIL ($ATTEMPTS) rounding = 0 shadow_passes = 0 diff --git a/config/hypr/hyprsunset.conf b/config/hypr/hyprsunset.conf index 78bba7d0..f51ff746 100644 --- a/config/hypr/hyprsunset.conf +++ b/config/hypr/hyprsunset.conf @@ -3,4 +3,10 @@ profile { time = 07:00 identity = true -} \ No newline at end of file +} + +# Enable auto switch to nightlight: +# profile { +# time = 20:00 +# temperature = 4000 +# } diff --git a/config/hypr/input.conf b/config/hypr/input.conf index ca5f1f5e..6bbee49b 100644 --- a/config/hypr/input.conf +++ b/config/hypr/input.conf @@ -3,7 +3,7 @@ input { # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt # kb_layout = us,dk,eu - kb_options = compose:caps # ,grp:alts_toggle + kb_options = compose:caps # ,grp:shifts_toggle # Change speed of keyboard repeat repeat_rate = 40 @@ -12,7 +12,7 @@ input { # Start with numlock on by default numlock_by_default = true - # Increase sensitity for mouse/trackpack (default: 0) + # Increase sensitivity for mouse/trackpad (default: 0) # sensitivity = 0.35 touchpad { diff --git a/config/hypr/monitors.conf b/config/hypr/monitors.conf index 6fc13876..2f1f0db8 100644 --- a/config/hypr/monitors.conf +++ b/config/hypr/monitors.conf @@ -1,7 +1,6 @@ # See https://wiki.hyprland.org/Configuring/Monitors/ # List current monitors and resolutions possible: hyprctl monitors # Format: monitor = [port], resolution, position, scale -# You must relaunch Hyprland after changing any envs (use Super+Esc, then Relaunch) # Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K. env = GDK_SCALE,2 diff --git a/config/kitty/kitty.conf b/config/kitty/kitty.conf index 5e2faf17..88413ad7 100644 --- a/config/kitty/kitty.conf +++ b/config/kitty/kitty.conf @@ -13,7 +13,8 @@ show_window_resize_notification no confirm_os_window_close 0 # Keybindings -map F11 toggle_fullscreen +map ctrl+insert copy_to_clipboard +map shift+insert paste_from_clipboard # Allow remote access single_instance yes @@ -23,7 +24,7 @@ allow_remote_control yes cursor_shape block enable_audio_bell no -# Minimal Tab bar styling +# Minimal Tab bar styling tab_bar_edge bottom tab_bar_style powerline tab_powerline_style slanted diff --git a/config/nvim/lazyvim.json b/config/nvim/lazyvim.json deleted file mode 100644 index 71fc8325..00000000 --- a/config/nvim/lazyvim.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extras": [ - "lazyvim.plugins.extras.editor.neo-tree" - ], - "install_version": 8, - "news": { - "NEWS.md": "10960" - }, - "version": 8 -} \ No newline at end of file diff --git a/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua b/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua deleted file mode 100644 index cbb0a58e..00000000 --- a/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua +++ /dev/null @@ -1,8 +0,0 @@ -return { - "folke/snacks.nvim", - opts = { - scroll = { - enabled = false, -- Disable scrolling animations - }, - }, -} diff --git a/config/nvim/lua/plugins/theme.lua b/config/nvim/lua/plugins/theme.lua deleted file mode 100644 index dad2d30b..00000000 --- a/config/nvim/lua/plugins/theme.lua +++ /dev/null @@ -1,8 +0,0 @@ -return { - { - "LazyVim/LazyVim", - opts = { - colorscheme = "tokyonight", - }, - }, -} diff --git a/config/nvim/plugin/after/transparency.lua b/config/nvim/plugin/after/transparency.lua deleted file mode 100644 index d0090f07..00000000 --- a/config/nvim/plugin/after/transparency.lua +++ /dev/null @@ -1,45 +0,0 @@ --- transparent background -vim.api.nvim_set_hl(0, "Normal", { bg = "none" }) -vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" }) -vim.api.nvim_set_hl(0, "FloatBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "Pmenu", { bg = "none" }) -vim.api.nvim_set_hl(0, "Terminal", { bg = "none" }) -vim.api.nvim_set_hl(0, "EndOfBuffer", { bg = "none" }) -vim.api.nvim_set_hl(0, "FoldColumn", { bg = "none" }) -vim.api.nvim_set_hl(0, "Folded", { bg = "none" }) -vim.api.nvim_set_hl(0, "SignColumn", { bg = "none" }) -vim.api.nvim_set_hl(0, "NormalNC", { bg = "none" }) -vim.api.nvim_set_hl(0, "WhichKeyFloat", { bg = "none" }) -vim.api.nvim_set_hl(0, "TelescopeBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "TelescopeNormal", { bg = "none" }) -vim.api.nvim_set_hl(0, "TelescopePromptBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "TelescopePromptTitle", { bg = "none" }) - --- transparent background for neotree -vim.api.nvim_set_hl(0, "NeoTreeNormal", { bg = "none" }) -vim.api.nvim_set_hl(0, "NeoTreeNormalNC", { bg = "none" }) -vim.api.nvim_set_hl(0, "NeoTreeVertSplit", { bg = "none" }) -vim.api.nvim_set_hl(0, "NeoTreeWinSeparator", { bg = "none" }) -vim.api.nvim_set_hl(0, "NeoTreeEndOfBuffer", { bg = "none" }) - --- transparent background for nvim-tree -vim.api.nvim_set_hl(0, "NvimTreeNormal", { bg = "none" }) -vim.api.nvim_set_hl(0, "NvimTreeVertSplit", { bg = "none" }) -vim.api.nvim_set_hl(0, "NvimTreeEndOfBuffer", { bg = "none" }) - --- transparent notify background -vim.api.nvim_set_hl(0, "NotifyINFOBody", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyERRORBody", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyWARNBody", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyTRACEBody", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyDEBUGBody", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyINFOTitle", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyERRORTitle", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyWARNTitle", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyTRACETitle", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyDEBUGTitle", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyINFOBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyERRORBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyWARNBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyTRACEBorder", { bg = "none" }) -vim.api.nvim_set_hl(0, "NotifyDEBUGBorder", { bg = "none" }) diff --git a/config/omarchy/hooks/font-set.sample b/config/omarchy/hooks/font-set.sample new file mode 100644 index 00000000..36d8c3ec --- /dev/null +++ b/config/omarchy/hooks/font-set.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called with the snake-cased name of the font that has just been set. +# To put it into use, remove .sample from the name. + +# Example: Show the name of the theme that was just set. +# notify-send "New font" "Your new font is $1" diff --git a/config/omarchy/hooks/post-update.sample b/config/omarchy/hooks/post-update.sample new file mode 100644 index 00000000..486352e5 --- /dev/null +++ b/config/omarchy/hooks/post-update.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called after an Omarchy system update has been performed. +# To put it into use, remove .sample from the name. + +# Example: Show notification after the system has been updated. +# notify-send "Update Performed" "Your system is now up to date" diff --git a/config/omarchy/hooks/theme-set.sample b/config/omarchy/hooks/theme-set.sample new file mode 100644 index 00000000..b2a5fe1d --- /dev/null +++ b/config/omarchy/hooks/theme-set.sample @@ -0,0 +1,7 @@ +#!/bin/bash + +# This hook is called with the snake-cased name of the theme that has just been set. +# To put it into use, remove .sample from the name. + +# Example: Show the name of the theme that was just set. +# notify-send "New theme" "Your new theme is $1" diff --git a/config/systemd/user/omarchy-battery-monitor.service b/config/systemd/user/omarchy-battery-monitor.service index 3c47283b..6e2e8e99 100644 --- a/config/systemd/user/omarchy-battery-monitor.service +++ b/config/systemd/user/omarchy-battery-monitor.service @@ -5,4 +5,5 @@ After=graphical-session.target [Service] Type=oneshot ExecStart=%h/.local/share/omarchy/bin/omarchy-battery-monitor -Environment=DISPLAY=:0 \ No newline at end of file +Environment=DISPLAY=:0 +LogLevelMax=warning diff --git a/config/uwsm/default b/config/uwsm/default index c072e320..fa7f656d 100644 --- a/config/uwsm/default +++ b/config/uwsm/default @@ -1,4 +1,4 @@ -# Changes require a relaunch of Hyprland to take effect. +# Changes require a restart to take effect. export TERMINAL=alacritty export EDITOR=nvim diff --git a/config/uwsm/env b/config/uwsm/env index 4fbfa76c..065fcdac 100644 --- a/config/uwsm/env +++ b/config/uwsm/env @@ -1,4 +1,4 @@ -# Changes require a relaunch of Hyprland to take effect. +# Changes require a restart to take effect. # Ensure Omarchy bins are in the path export OMARCHY_PATH=$HOME/.local/share/omarchy diff --git a/config/walker/config.toml b/config/walker/config.toml index cfd79aab..85a86a12 100644 --- a/config/walker/config.toml +++ b/config/walker/config.toml @@ -1,100 +1,145 @@ -close_when_open = true -theme = "omarchy-default" -theme_base = [] -theme_location = ["~/.local/share/omarchy/default/walker/themes/"] -hotreload_theme = true -force_keyboard_focus = true -timeout = 60 +force_keyboard_focus = true # forces keyboard forcus to stay in Walker +close_when_open = true # close walker when invoking while already opened +selection_wrap = true # wrap list if at bottom or top +click_to_close = true # closes walker if clicking outside of the main content area +global_argument_delimiter = "#" # query: firefox#https://benz.dev => part after delimiter will be ignored when querying. this should be the same as in the elephant config +exact_search_prefix = "'" # disable fuzzy searching +theme = "omarchy-default" # theme to use +disable_mouse = false # disable mouse (on input and list only) +additional_theme_location = "~/.local/share/omarchy/default/walker/themes/" -[keys.ai] -run_last_response = ["ctrl e"] +[shell] +anchor_top = true +anchor_bottom = true +anchor_left = true +anchor_right = true -[list] -max_entries = 200 -cycle = true +[placeholders] +"default" = { input = " Search...", list = "No Results" } # placeholders for input and empty list, key is the providers name, so f.e. "desktopapplications" or "menus:other" -[search] -placeholder = " Search..." +[keybinds] +close = ["Escape"] +next = ["Down"] +previous = ["Up"] +toggle_exact = ["ctrl e"] +resume_last_query = ["ctrl r"] +quick_activate = [] -[builtins.hyprland_keybinds] -path = "~/.config/hypr/hyprland.conf" -hidden = true +[providers] +default = [ + "desktopapplications", + "menus", + "websearch", +] # providers to be queried by default +empty = ["desktopapplications"] # providers to be queried when query is empty +max_results = 50 # global max results -[builtins.applications] -launch_prefix = "uwsm app -- " -placeholder = " Search..." -prioritize_new = false -context_aware = false -show_sub_when_single = false -history = false -icon = "" -hidden = true +[providers.sets] # define your own defaults/empty sets of providers +[providers.max_results_provider] # define max results per provider in here -[builtins.applications.actions] -enabled = false -hide_category = true +[[providers.prefixes]] +prefix = "/" +provider = "providerlist" -[builtins.bookmarks] -hidden = true - -[[builtins.bookmarks.entries]] -label = "Omarchy - Github" -url = "https://github.com/basecamp/omarchy" -keywords = ["omarchy", "github"] - -[[builtins.bookmarks.entries]] -label = "Omarchy Manual" -url = "https://manuals.omamix.org/2/the-omarchy-manual" -keywords = ["omarchy"] - -[builtins.calc] -name = "Calculator" -icon = "" -min_chars = 3 -prefix = "=" - -[builtins.windows] -switcher_only = true -hidden = true - -[builtins.clipboard] -hidden = true - -[builtins.commands] -hidden = true - -[builtins.custom_commands] -hidden = true - -[builtins.emojis] -name = "Emojis" -icon = "" -prefix = ":" - -[builtins.symbols] -after_copy = "" -hidden = true - -[builtins.finder] -use_fd = true -cmd_alt = "xdg-open $(dirname ~/%RESULT%)" -icon = "file" -name = "Finder" -preview_images = true -hidden = false +[[providers.prefixes]] prefix = "." +provider = "files" -[builtins.runner] -shell_config = "" -switcher_only = true -hidden = true +[[providers.prefixes]] +prefix = ":" +provider = "symbols" -[builtins.ssh] -hidden = true +[[providers.prefixes]] +prefix = "=" +provider = "calc" -[builtins.websearch] -switcher_only = true -hidden = true +[[providers.prefixes]] +prefix = "@" +provider = "websearch" -[builtins.translation] -hidden = true +[[providers.prefixes]] +prefix = "$" +provider = "clipboard" + +[providers.actions] # This will be MERGED/OVEWRITTEN with what the user specifies +dmenu = [{ action = "select", default = true, bind = "Return" }] + +providerlist = [ + { action = "activate", default = true, bind = "Return", after = "ClearReload" }, +] + +bluetooth = [ + { action = "find", global = true, bind = "ctrl f", after = "AsyncClearReload" }, + { action = "trust", bind = "ctrl t", after = "AsyncReload" }, + { action = "untrust", bind = "ctrl t", after = "AsyncReload" }, + { action = "pair", bind = "Return", after = "AsyncReload" }, + { action = "remove", bind = "ctrl d", after = "AsyncReload" }, + { action = "connect", bind = "Return", after = "AsyncReload" }, + { action = "disconnect", bind = "Return", after = "AsyncReload" }, +] + +archlinuxpkgs = [ + { action = "install", bind = "Return", default = true }, + { action = "remove", bind = "Return" }, +] + +calc = [ + { action = "copy", default = true, bind = "Return" }, + { action = "delete", bind = "ctrl d", after = "AsyncReload" }, + { action = "save", bind = "ctrl s", after = "AsyncClearReload" }, +] + +websearch = [ + { action = "search", default = true, bind = "Return" }, + { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" }, +] + +desktopapplications = [ + { action = "start", default = true, bind = "Return" }, + { action = "start:keep", label = "open+next", bind = "shift Return", after = "KeepOpen" }, + { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "AsyncReload" }, + { action = "pin", bind = "ctrl p", after = "AsyncReload" }, + { action = "unpin", bind = "ctrl p", after = "AsyncReload" }, + { action = "pinup", bind = "ctrl n", after = "AsyncReload" }, + { action = "pindown", bind = "ctrl m", after = "AsyncReload" }, +] + +files = [ + { action = "open", default = true, bind = "Return" }, + { action = "opendir", label = "open dir", bind = "ctrl Return" }, + { action = "copypath", label = "copy path", bind = "ctrl shift c" }, + { action = "copyfile", label = "copy file", bind = "ctrl c" }, +] + +todo = [ + { action = "save", default = true, bind = "Return", after = "ClearReload" }, + { action = "delete", bind = "ctrl d", after = "ClearReload" }, + { action = "active", bind = "Return", after = "ClearReload" }, + { action = "inactive", bind = "Return", after = "ClearReload" }, + { action = "done", bind = "ctrl f", after = "ClearReload" }, + { action = "clear", bind = "ctrl x", after = "ClearReload", global = true }, +] + +runner = [ + { action = "run", default = true, bind = "Return" }, + { action = "runterminal", label = "run in terminal", bind = "shift Return" }, + { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" }, +] + +symbols = [ + { action = "run_cmd", label = "select", default = true, bind = "Return" }, + { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" }, +] + +unicode = [ + { action = "run_cmd", label = "select", default = true, bind = "Return" }, + { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" }, +] + +clipboard = [ + { action = "copy", default = true, bind = "Return" }, + { action = "remove", bind = "ctrl d", after = "ClearReload" }, + { action = "remove_all", global = true, label = "clear", bind = "ctrl shift d", after = "ClearReload" }, + { action = "toggle_images", global = true, label = "toggle images", bind = "ctrl i", after = "ClearReload" }, + { action = "edit", bind = "ctrl o" }, +] diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index adb981ae..8fe19a3c 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -61,7 +61,7 @@ "format": "{:L%A %H:%M}", "format-alt": "{:L%d %B W%V %Y}", "tooltip": false, - "on-click-right": "omarchy-cmd-tzupdate" + "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select" }, "network": { "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], @@ -122,7 +122,7 @@ "modules": ["custom/expand-icon", "tray"] }, "custom/expand-icon": { - "format": " ", + "format": "", "tooltip": false }, "custom/screenrecording-indicator": { @@ -133,6 +133,6 @@ }, "tray": { "icon-size": 12, - "spacing": 12 + "spacing": 17 } } diff --git a/config/waybar/style.css b/config/waybar/style.css index 2cf371b3..f2b1e9fe 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -7,7 +7,7 @@ border: none; border-radius: 0; min-height: 0; - font-family: CaskaydiaMono Nerd Font; + font-family: 'CaskaydiaMono Nerd Font'; font-size: 12px; } @@ -30,11 +30,8 @@ opacity: 0.5; } -#tray, #cpu, #battery, -#network, -#bluetooth, #pulseaudio, #custom-omarchy, #custom-screenrecording-indicator, @@ -43,8 +40,20 @@ margin: 0 7.5px; } +#tray { + margin-right: 16px; +} + +#bluetooth { + margin-right: 17px; +} + +#network { + margin-right: 13px; +} + #custom-expand-icon { - margin-right: 7px; + margin-right: 20px; } tooltip { diff --git a/default/hypr/apps.conf b/default/hypr/apps.conf index 6b4ebbbd..354339de 100644 --- a/default/hypr/apps.conf +++ b/default/hypr/apps.conf @@ -12,3 +12,4 @@ source = ~/.local/share/omarchy/default/hypr/apps/steam.conf source = ~/.local/share/omarchy/default/hypr/apps/system.conf source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf source = ~/.local/share/omarchy/default/hypr/apps/walker.conf +source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf diff --git a/default/hypr/apps/browser.conf b/default/hypr/apps/browser.conf index 1ff18150..cf9ae193 100644 --- a/default/hypr/apps/browser.conf +++ b/default/hypr/apps/browser.conf @@ -1,5 +1,5 @@ # Browser types -windowrule = tag +chromium-based-browser, class:([cC]hrom(e|ium)|[bB]rave-browser|Microsoft-edge|Vivaldi-stable) +windowrule = tag +chromium-based-browser, class:((google-)?[cC]hrom(e|ium)|[bB]rave-browser|Microsoft-edge|Vivaldi-stable|helium) windowrule = tag +firefox-based-browser, class:([fF]irefox|zen|librewolf) # Force chromium-based browsers into a tile to deal with --app bug diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf index cfbfe5ee..fbddc65c 100644 --- a/default/hypr/apps/system.conf +++ b/default/hypr/apps/system.conf @@ -5,6 +5,7 @@ windowrule = size 800 600, tag:floating-window windowrule = tag +floating-window, class:(blueberry.py|Impala|Wiremix|org.gnome.NautilusPreviewer|com.gabm.satty|Omarchy|About|TUI.float) windowrule = tag +floating-window, class:(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), title:^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files) +windowrule = float, class:org.gnome.Calculator # Fullscreen screensaver windowrule = fullscreen, class:Screensaver diff --git a/default/hypr/apps/webcam-overlay.conf b/default/hypr/apps/webcam-overlay.conf new file mode 100644 index 00000000..eca1c751 --- /dev/null +++ b/default/hypr/apps/webcam-overlay.conf @@ -0,0 +1,6 @@ +# Webcam overlay for screen recording +windowrule = float, title:WebcamOverlay +windowrule = pin, title:WebcamOverlay +windowrule = noinitialfocus, title:WebcamOverlay +windowrule = nodim, title:WebcamOverlay +windowrule = move 100%-w-40 100%-w-40, title:WebcamOverlay # There's a typo in the hyprland rule so 100%-w on the height param is actually correct here diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index 5c2f60b1..43cd3000 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -1,10 +1,10 @@ -exec-once = uwsm app -- hypridle -exec-once = uwsm app -- mako -exec-once = uwsm app -- waybar -exec-once = uwsm app -- fcitx5 -exec-once = uwsm app -- swaybg -i ~/.config/omarchy/current/background -m fill -exec-once = uwsm app -- swayosd-server -exec-once = uwsm app -- walker --gapplication-service & +exec-once = uwsm-app -- hypridle +exec-once = uwsm-app -- mako +exec-once = uwsm-app -- waybar +exec-once = uwsm-app -- fcitx5 +exec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill +exec-once = uwsm-app -- swayosd-server exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 -exec-once = wl-clip-persist --clipboard regular --all-mime-type-regex '^(?!x-kde-passwordManagerHint).+' exec-once = omarchy-cmd-first-run +exec-once = uwsm-app -- elephant +exec-once = uwsm-app -- walker --gapplication-service diff --git a/default/hypr/bindings.conf b/default/hypr/bindings.conf index 2927eb34..20fee804 100644 --- a/default/hypr/bindings.conf +++ b/default/hypr/bindings.conf @@ -1,6 +1,6 @@ # Deprecated bindings file. New installations include everything directly. -bindd = SUPER, return, Terminal, exec, $terminal +bindd = SUPER, RETURN, Terminal, exec, $terminal bindd = SUPER, F, File manager, exec, $fileManager bindd = SUPER, B, Web browser, exec, $browser bindd = SUPER, M, Music player, exec, $music @@ -9,7 +9,7 @@ bindd = SUPER, T, Top, exec, $terminal -e btop bindd = SUPER, D, Lazy Docker, exec, $terminal -e lazydocker bindd = SUPER, G, Messenger, exec, $messenger bindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu -bindd = SUPER, slash, Password manager, exec, $passwordManager +bindd = SUPER, SLASH, Password manager, exec, $passwordManager source = ~/.local/share/omarchy/default/hypr/bindings/media.conf source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf diff --git a/default/hypr/bindings/clipboard.conf b/default/hypr/bindings/clipboard.conf new file mode 100644 index 00000000..7d08d920 --- /dev/null +++ b/default/hypr/bindings/clipboard.conf @@ -0,0 +1,5 @@ +# Copy / Paste +bind = SUPER, C, sendshortcut, CTRL, Insert, +bind = SUPER, V, sendshortcut, SHIFT, Insert, +bind = SUPER, X, sendshortcut, CTRL, X, +bindd = SUPER CTRL, V, Clipboard, exec, omarchy-launch-walker -m clipboard diff --git a/default/hypr/bindings/tiling-v2.conf b/default/hypr/bindings/tiling-v2.conf new file mode 100644 index 00000000..85f60216 --- /dev/null +++ b/default/hypr/bindings/tiling-v2.conf @@ -0,0 +1,92 @@ +# Close windows +bindd = SUPER, W, Close active window, killactive, +bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows + +# Control tiling +bindd = SUPER, J, Toggle split, togglesplit, # dwindle +bindd = SUPER, P, Pseudo window, pseudo, # dwindle +bindd = SUPER, T, Toggle floating, togglefloating, +bindd = SUPER, F, Force full screen, fullscreen, 0 +bindd = SUPER ALT, F, Full width, fullscreen, 1 + +# Move focus with SUPER + arrow keys +bindd = SUPER, LEFT, Move focus left, movefocus, l +bindd = SUPER, RIGHT, Move focus right, movefocus, r +bindd = SUPER, UP, Move focus up, movefocus, u +bindd = SUPER, DOWN, Move focus down, movefocus, d + +# Switch workspaces with SUPER + [0-9] +bindd = SUPER, code:10, Switch to workspace 1, workspace, 1 +bindd = SUPER, code:11, Switch to workspace 2, workspace, 2 +bindd = SUPER, code:12, Switch to workspace 3, workspace, 3 +bindd = SUPER, code:13, Switch to workspace 4, workspace, 4 +bindd = SUPER, code:14, Switch to workspace 5, workspace, 5 +bindd = SUPER, code:15, Switch to workspace 6, workspace, 6 +bindd = SUPER, code:16, Switch to workspace 7, workspace, 7 +bindd = SUPER, code:17, Switch to workspace 8, workspace, 8 +bindd = SUPER, code:18, Switch to workspace 9, workspace, 9 +bindd = SUPER, code:19, Switch to workspace 10, workspace, 10 + +# Move active window to a workspace with SUPER + SHIFT + [0-9] +bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1 +bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2 +bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3 +bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4 +bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5 +bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6 +bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7 +bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8 +bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9 +bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10 + +# TAB between workspaces +bindd = SUPER, TAB, Next workspace, workspace, e+1 +bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1 +bindd = SUPER CTRL, TAB, Former workspace, workspace, previous + +# Swap active window with the one next to it with SUPER + SHIFT + arrow keys +bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l +bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r +bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u +bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d + +# Cycle through applications on active workspace +bindd = ALT, TAB, Cycle to next window, cyclenext +bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev +bindd = ALT, TAB, Reveal active window on top, bringactivetotop +bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop + +# Resize active window +bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key +bindd = SUPER, code:21, Shrink window left, resizeactive, 100 0 # = key +bindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100 +bindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100 + +# Scroll through existing workspaces with SUPER + scroll +bindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1 +bindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindmd = SUPER, mouse:272, Move window, movewindow +bindmd = SUPER, mouse:273, Resize window, resizewindow + +# Toggle groups +bindd = SUPER, G, Toggle window grouping, togglegroup +bindd = SUPER ALT, G, Move active window out of group, moveoutofgroup + +# Join groups +bindd = SUPER ALT, LEFT, Move window to group on left, moveintogroup, l +bindd = SUPER ALT, RIGHT, Move window to group on right, moveintogroup, r +bindd = SUPER ALT, UP, Move window to group on top, moveintogroup, u +bindd = SUPER ALT, DOWN, Move window to group on bottom, moveintogroup, d + +# Navigate a single set of grouped windows +bindd = SUPER ALT, TAB, Next window in group, changegroupactive, f +bindd = SUPER ALT SHIFT, TAB, Previous window in group, changegroupactive, b + +# Activate window in a group by number +bindd = SUPER ALT, 1, Switch to group window 1, changegroupactive, 1 +bindd = SUPER ALT, 2, Switch to group window 2, changegroupactive, 2 +bindd = SUPER ALT, 3, Switch to group window 3, changegroupactive, 3 +bindd = SUPER ALT, 4, Switch to group window 4, changegroupactive, 4 +bindd = SUPER ALT, 5, Switch to group window 5, changegroupactive, 5 diff --git a/default/hypr/bindings/tiling.conf b/default/hypr/bindings/tiling.conf index ff2437b9..f0c0190b 100644 --- a/default/hypr/bindings/tiling.conf +++ b/default/hypr/bindings/tiling.conf @@ -1,3 +1,6 @@ +# This is now a deprecated file meant for those who did not wish to learn the latest Omarchy hotkeys. +# Do not make changes here, but bring them to tiling-v2.conf instead. + # Close windows bindd = SUPER, W, Close active window, killactive, bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows @@ -5,15 +8,15 @@ bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows # Control tiling bindd = SUPER, J, Toggle split, togglesplit, # dwindle bindd = SUPER, P, Pseudo window, pseudo, # dwindle -bindd = SUPER, V, Toggle floating, togglefloating, +bindd = SUPER SHIFT, V, Toggle floating, togglefloating, bindd = SHIFT, F11, Force full screen, fullscreen, 0 bindd = ALT, F11, Full width, fullscreen, 1 # Move focus with SUPER + arrow keys -bindd = SUPER, left, Move focus left, movefocus, l -bindd = SUPER, right, Move focus right, movefocus, r -bindd = SUPER, up, Move focus up, movefocus, u -bindd = SUPER, down, Move focus down, movefocus, d +bindd = SUPER, LEFT, Move focus left, movefocus, l +bindd = SUPER, RIGHT, Move focus right, movefocus, r +bindd = SUPER, UP, Move focus up, movefocus, u +bindd = SUPER, DOWN, Move focus down, movefocus, d # Switch workspaces with SUPER + [0-9] bindd = SUPER, code:10, Switch to workspace 1, workspace, 1 @@ -39,22 +42,22 @@ bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8 bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9 bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10 -# Tab between workspaces +# TAB between workspaces bindd = SUPER, TAB, Next workspace, workspace, e+1 bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1 bindd = SUPER CTRL, TAB, Former workspace, workspace, previous # Swap active window with the one next to it with SUPER + SHIFT + arrow keys -bindd = SUPER SHIFT, left, Swap window to the left, swapwindow, l -bindd = SUPER SHIFT, right, Swap window to the right, swapwindow, r -bindd = SUPER SHIFT, up, Swap window up, swapwindow, u -bindd = SUPER SHIFT, down, Swap window down, swapwindow, d +bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l +bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r +bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u +bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d # Cycle through applications on active workspace -bindd = ALT, Tab, Cycle to next window, cyclenext -bindd = ALT SHIFT, Tab, Cycle to prev window, cyclenext, prev -bindd = ALT, Tab, Reveal active window on top, bringactivetotop -bindd = ALT SHIFT, Tab, Reveal active window on top, bringactivetotop +bindd = ALT, TAB, Cycle to next window, cyclenext +bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev +bindd = ALT, TAB, Reveal active window on top, bringactivetotop +bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop # Resize active window bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key @@ -63,8 +66,8 @@ bindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100 bindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100 # Scroll through existing workspaces with SUPER + scroll -bindd = SUPER, mouse_down, Scroll active workspace forward, workspace, e+1 -bindd = SUPER, mouse_up, Scroll active workspace backward, workspace, e-1 +bindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1 +bindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1 # Move/resize windows with mainMod + LMB/RMB and dragging bindmd = SUPER, mouse:272, Move window, movewindow diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index c8b3efdb..ed44654e 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -1,6 +1,6 @@ # Menus -bindd = SUPER, SPACE, Launch apps, exec, walker -p "Start…" -bindd = SUPER CTRL, E, Emoji picker, exec, walker -m Emojis +bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker +bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu bindd = SUPER, ESCAPE, Power menu, exec, omarchy-menu system bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system @@ -29,19 +29,11 @@ bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-cmd-apple-display bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-cmd-apple-display-brightness +5000 bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-cmd-apple-display-brightness +60000 -# Screenshots -bindd = , PRINT, Screenshot of region, exec, omarchy-cmd-screenshot -bindd = SHIFT, PRINT, Screenshot of window, exec, omarchy-cmd-screenshot window -bindd = CTRL, PRINT, Screenshot of display, exec, omarchy-cmd-screenshot output - -# Screen recordings -bindd = ALT, PRINT, Screen record a region, exec, omarchy-cmd-screenrecord region -bindd = ALT SHIFT, PRINT, Screen record a region with audio, exec, omarchy-cmd-screenrecord region audio -bindd = CTRL ALT, PRINT, Screen record display, exec, omarchy-cmd-screenrecord output -bindd = CTRL ALT SHIFT, PRINT, Screen record display with audio, exec, omarchy-cmd-screenrecord output audio - -# Color picker -bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a +# Captures +bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot +bindd = SHIFT, PRINT, Screenshot, exec, omarchy-cmd-screenshot smart clipboard +bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord +bindd = SUPER, PRINT, Color picking, exec, pkill hyprpicker || hyprpicker -a # File sharing bindd = CTRL SUPER, S, Share, exec, omarchy-menu share diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index 9b8f3077..823a1121 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -1,5 +1,9 @@ # Refer to https://wiki.hyprland.org/Configuring/Variables/ +# Variables +$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg +$inactiveBorderColor = rgba(595959aa) + # https://wiki.hyprland.org/Configuring/Variables/#general general { gaps_in = 5 @@ -8,8 +12,8 @@ general { border_size = 2 # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors - col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg - col.inactive_border = rgba(595959aa) + col.active_border = $activeBorderColor + col.inactive_border = $inactiveBorderColor # Set to true enable resizing windows by clicking and dragging on borders and gaps resize_on_border = false @@ -35,12 +39,41 @@ decoration { blur { enabled = true size = 3 - passes = 1 - - vibrancy = 0.1696 + passes = 3 } } +# https://wiki.hypr.land/Configuring/Variables/#group +group { + col.border_active = $activeBorderColor + col.border_inactive = $inactiveBorderColor + col.border_locked_active = -1 + col.border_locked_inactive = -1 + + groupbar { + font_size = 12 + font_family = monospace + font_weight_active = ultraheavy + font_weight_inactive = normal + + indicator_height = 0 + indicator_gap = 5 + height = 22 + gaps_in = 5 + gaps_out = 0 + + text_color = rgb(ffffff) + text_color_inactive = rgba(ffffff90) + col.active = rgba(00000040) + col.inactive = rgba(00000020) + + gradients = true + gradient_rounding = 0 + gradient_round_only_edges = false + } +} + + # https://wiki.hyprland.org/Configuring/Variables/#animations animations { enabled = yes, please :) @@ -86,6 +119,7 @@ misc { disable_hyprland_logo = true disable_splash_rendering = true focus_on_activate = true + anr_missed_pings = 3 } # https://wiki.hypr.land/Configuring/Variables/#cursor diff --git a/default/mako/core.ini b/default/mako/core.ini index 05f60534..927d8d40 100644 --- a/default/mako/core.ini +++ b/default/mako/core.ini @@ -1,7 +1,11 @@ anchor=top-right default-timeout=5000 width=420 -height=110 +outer-margin=20 +padding=10,15 +border-size=2 +max-icon-size=32 +font=sans-serif 14px [app-name=Spotify] invisible=1 @@ -20,3 +24,6 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Setup Wi-Fi"; omarchy-l [summary~="Update System"] on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy-launch-floating-terminal-with-presentation omarchy-update' + +[summary~="Learn Keybindings"] +on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings' diff --git a/default/walker/themes/dmenu_150.css b/default/walker/themes/dmenu_150.css deleted file mode 100644 index 14bafe7a..00000000 --- a/default/walker/themes/dmenu_150.css +++ /dev/null @@ -1,2 +0,0 @@ -@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css"); -@import url("file://~/.config/omarchy/current/theme/walker.css"); diff --git a/default/walker/themes/dmenu_150.toml b/default/walker/themes/dmenu_150.toml deleted file mode 100644 index 3c139976..00000000 --- a/default/walker/themes/dmenu_150.toml +++ /dev/null @@ -1,10 +0,0 @@ -[ui.window.box] -width = 150 - -[ui.window.box.scroll.list] -max_width = 150 -min_width = 150 -width = 150 - -[ui.window.box.search] -hide = false diff --git a/default/walker/themes/dmenu_250.css b/default/walker/themes/dmenu_250.css deleted file mode 100644 index 14bafe7a..00000000 --- a/default/walker/themes/dmenu_250.css +++ /dev/null @@ -1,2 +0,0 @@ -@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css"); -@import url("file://~/.config/omarchy/current/theme/walker.css"); diff --git a/default/walker/themes/dmenu_250.toml b/default/walker/themes/dmenu_250.toml deleted file mode 100644 index b9ffc1e7..00000000 --- a/default/walker/themes/dmenu_250.toml +++ /dev/null @@ -1,11 +0,0 @@ -[ui.window.box] -width = 250 - -[ui.window.box.scroll.list] -max_width = 250 -min_width = 250 -width = 250 -max_height = 600 - -[ui.window.box.search] -hide = false diff --git a/default/walker/themes/keybindings.css b/default/walker/themes/keybindings.css deleted file mode 100644 index 14bafe7a..00000000 --- a/default/walker/themes/keybindings.css +++ /dev/null @@ -1,2 +0,0 @@ -@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css"); -@import url("file://~/.config/omarchy/current/theme/walker.css"); diff --git a/default/walker/themes/keybindings.toml b/default/walker/themes/keybindings.toml deleted file mode 100644 index c5d1b78d..00000000 --- a/default/walker/themes/keybindings.toml +++ /dev/null @@ -1,48 +0,0 @@ -[ui.window.box] -width = 964 -min_width = 964 -max_width = 964 - -height = 664 -min_height = 664 -max_height = 664 - -[ui.window.box.search] -hide = false - -[ui.window.box.scroll] -v_align = "fill" -h_align = "fill" -min_width = 964 -width = 964 -max_width = 964 -min_height = 664 -height = 664 -max_height = 664 - -[ui.window.box.scroll.list] -v_align = "fill" -h_align = "fill" -min_width = 900 -width = 900 -max_width = 900 -min_height = 600 -height = 600 -max_height = 600 - -[ui.window.box.scroll.list.item] -h_align = "fill" -min_width = 900 -width = 900 -max_width = 900 - -[ui.window.box.scroll.list.item.activation_label] -hide = true - -[ui.window.box.scroll.list.placeholder] -v_align = "start" -h_align = "fill" -hide = false -min_width = 900 -width = 900 -max_width = 900 diff --git a/default/walker/themes/omarchy-default.css b/default/walker/themes/omarchy-default.css deleted file mode 100644 index 6e453b6e..00000000 --- a/default/walker/themes/omarchy-default.css +++ /dev/null @@ -1,169 +0,0 @@ -/* Reset all elements */ -#window, -#box, -#search, -#password, -#input, -#prompt, -#clear, -#typeahead, -#list, -child, -scrollbar, -slider, -#item, -#text, -#label, -#sub, -#activationlabel { - all: unset; -} - -* { - font-family: monospace; - font-size: 18px; -} - -/* Window */ -#window { - background: transparent; - color: @text; -} - -/* Main box container */ -#box { - background: alpha(@base, 0.95); - padding: 20px; - border: 2px solid @border; - border-radius: 0px; -} - -/* Search container */ -#search { - background: @base; - padding: 10px; - margin-bottom: 0; -} - -/* Hide prompt icon */ -#prompt { - opacity: 0; - min-width: 0; - margin: 0; -} - -/* Hide clear button */ -#clear { - opacity: 0; - min-width: 0; -} - -/* Input field */ -#input { - background: none; - color: @text; - padding: 0; -} - -#input placeholder { - opacity: 0.5; - color: @text; -} - -/* Hide typeahead */ -#typeahead { - opacity: 0; -} - -/* List */ -#list { - background: transparent; -} - -/* List items */ -child { - padding: 0px 12px; - background: transparent; - border-radius: 0; -} - -child:selected, -child:hover { - background: transparent; -} - -/* Item layout */ -#item { - padding: 0; -} - -#item.active { - font-style: italic; -} - -/* Icon */ -#icon { - margin-right: 10px; - -gtk-icon-transform: scale(0.7); -} - -/* Text */ -#text { - color: @text; - padding: 14px 0; -} - -#label { - font-weight: normal; -} - -/* Selected state */ -child:selected #text, -child:selected #label, -child:hover #text, -child:hover #label { - color: @selected-text; -} - -/* Hide sub text */ -#sub { - opacity: 0; - font-size: 0; - min-height: 0; -} - -/* Hide activation label */ -#activationlabel { - opacity: 0; - min-width: 0; -} - -/* Scrollbar styling */ -scrollbar { - opacity: 0; -} - -/* Hide spinner */ -#spinner { - opacity: 0; -} - -/* Hide AI elements */ -#aiScroll, -#aiList, -.aiItem { - opacity: 0; - min-height: 0; -} - -/* Bar entry (switcher) */ -#bar { - opacity: 0; - min-height: 0; -} - -.barentry { - opacity: 0; -} - -@import url("file://~/.config/omarchy/current/theme/walker.css"); diff --git a/default/walker/themes/omarchy-default.toml b/default/walker/themes/omarchy-default.toml deleted file mode 100644 index 9abc5d8f..00000000 --- a/default/walker/themes/omarchy-default.toml +++ /dev/null @@ -1,16 +0,0 @@ -[ui.window.box] -width = 664 -min_width = 664 -max_width = 664 -height = 396 -min_height = 396 -max_height = 396 - -# List constraints are critical - without these, the window shrinks when empty -[ui.window.box.scroll.list] -height = 300 -min_height = 300 -max_height = 300 - -[ui.window.box.scroll.list.item.icon] -pixel_size = 40 diff --git a/default/walker/themes/omarchy-default/layout.xml b/default/walker/themes/omarchy-default/layout.xml new file mode 100644 index 00000000..a79de744 --- /dev/null +++ b/default/walker/themes/omarchy-default/layout.xml @@ -0,0 +1,129 @@ + + + + + + true + Walker + + + + 644 + hidden + horizontal + center + center + + + + vertical + true + true + 10 + + + + hidden + horizontal + fill + true + true + + + + fill + true + true + + + + + + + + horizontal + 10 + true + true + + + + true + 100 + Waiting for elephant... + + + + + + No Results + 0.0 + true + + + + + + true + false + true + 600 + 300 + 0 + true + true + automatic + automatic + + + + 1 + false + + + + + + + + + + + + + + + 0 + false + + + + + + + + diff --git a/default/walker/themes/omarchy-default/style.css b/default/walker/themes/omarchy-default/style.css new file mode 100644 index 00000000..f4bbd082 --- /dev/null +++ b/default/walker/themes/omarchy-default/style.css @@ -0,0 +1,117 @@ +@import "../../../../../../../.config/omarchy/current/theme/walker.css"; + +* { + all: unset; +} + +* { + font-family: monospace; + font-size: 18px; + color: @text; +} + +scrollbar { + opacity: 0; +} + +.normal-icons { + -gtk-icon-size: 16px; +} + +.large-icons { + -gtk-icon-size: 32px; +} + +.box-wrapper { + background: alpha(@base, 0.95); + padding: 20px; + border: 2px solid @border; +} + +.preview-box { +} + +.box { +} + +.search-container { + background: @base; + padding: 10px; +} + +.input placeholder { + opacity: 0.5; +} + +.input { +} + +.input:focus, +.input:active { + box-shadow: none; + outline: none; +} + +.content-container { +} + +.placeholder { +} + +.scroll { +} + +.list { +} + +child, +child > * { +} + +child:hover .item-box { +} + +child:selected .item-box { +} + +child:selected .item-box * { + color: @selected-text; +} + +.item-box { + padding-left: 14px; +} + +.item-text-box { + all: unset; + padding: 14px 0; +} + +.item-text { +} + +.item-subtext { + font-size: 0px; + min-height: 0px; + margin: 0px; + padding: 0px; +} + +.item-image { + margin-right: 14px; + -gtk-icon-transform: scale(0.9); +} + +.current { + font-style: italic; +} + +.keybind-hints { + background: @background; + padding: 10px; + margin-top: 10px; +} + +.preview { + background: @background; +} diff --git a/default/waybar/indicators/screen-recording.sh b/default/waybar/indicators/screen-recording.sh index d0d00822..bb6cf93c 100755 --- a/default/waybar/indicators/screen-recording.sh +++ b/default/waybar/indicators/screen-recording.sh @@ -1,6 +1,6 @@ #!/bin/bash -if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then +if pgrep -f "gpu-screen-recorder" >/dev/null; then echo '{"text": "󰻂", "tooltip": "Stop recording", "class": "active"}' else echo '{"text": ""}' diff --git a/install/config/all.sh b/install/config/all.sh index a9affb79..2304d8e9 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -14,6 +14,8 @@ run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh run_logged $OMARCHY_INSTALL/config/docker.sh run_logged $OMARCHY_INSTALL/config/mimetypes.sh run_logged $OMARCHY_INSTALL/config/localdb.sh +run_logged $OMARCHY_INSTALL/config/walker-elephant.sh +run_logged $OMARCHY_INSTALL/config/fast-shutdown.sh run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh run_logged $OMARCHY_INSTALL/config/hardware/network.sh run_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh @@ -24,6 +26,7 @@ run_logged $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh run_logged $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh run_logged $OMARCHY_INSTALL/config/hardware/nvidia.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh -run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-bcm43xx.sh +run_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-spi-keyboard.sh +run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-suspend-nvme.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh diff --git a/install/config/fast-shutdown.sh b/install/config/fast-shutdown.sh new file mode 100644 index 00000000..bbbfafdc --- /dev/null +++ b/install/config/fast-shutdown.sh @@ -0,0 +1,7 @@ +sudo mkdir -p /etc/systemd/system.conf.d + +cat </dev/null || true) + +if [[ "$MACBOOK_MODEL" =~ MacBook(8,1|9,1|10,1)|MacBookPro13,[123]|MacBookPro14,[123] ]]; then + echo "Detected MacBook model: $MACBOOK_MODEL" + + NVME_DEVICE="/sys/bus/pci/devices/0000:01:00.0/d3cold_allowed" + + if [[ -f "$NVME_DEVICE" ]]; then + echo "Applying NVMe suspend fix..." + + cat </dev/null +[Unit] +Description=Omarchy NVMe Suspend Fix for MacBook + +[Service] +ExecStart=/bin/bash -c 'echo 0 > /sys/bus/pci/devices/0000\:01\:00.0/d3cold_allowed' + +[Install] +WantedBy=multi-user.target +EOF + + chrootable_systemctl_enable omarchy-nvme-suspend-fix.service + sudo systemctl daemon-reload + else + echo "Warning: NVMe device not found at expected PCI address (0000:01:00.0)" + echo "This fix may not be needed for this MacBook model" + fi +fi diff --git a/install/config/hardware/fix-bcm43xx.sh b/install/config/hardware/fix-bcm43xx.sh new file mode 100644 index 00000000..5078f69e --- /dev/null +++ b/install/config/hardware/fix-bcm43xx.sh @@ -0,0 +1,10 @@ +# Install Wi-Fi drivers for Broadcom chips found in some MacBooks, as well as other systems: +# - BCM4360 (2013–2015 MacBooks) +# - BCM4331 (2012, early 2013 MacBooks) + +pci_info=$(lspci -nnv) + +if (echo "$pci_info" | grep -q "14e4:43a0" || echo "$pci_info" | grep -q "14e4:4331"); then + echo "BCM4360 / BCM4331 detected" + sudo pacman -S --noconfirm --needed broadcom-wl dkms linux-headers +fi diff --git a/install/config/hardware/printer.sh b/install/config/hardware/printer.sh index 781a9871..244368e6 100644 --- a/install/config/hardware/printer.sh +++ b/install/config/hardware/printer.sh @@ -6,7 +6,7 @@ echo -e "[Resolve]\nMulticastDNS=no" | sudo tee /etc/systemd/resolved.conf.d/10- chrootable_systemctl_enable avahi-daemon.service # Enable mDNS resolution for .local domains -sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns/' /etc/nsswitch.conf +sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf # Enable automatically adding remote printers if ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then diff --git a/install/config/lazyvim.sh b/install/config/lazyvim.sh deleted file mode 100644 index 325f6310..00000000 --- a/install/config/lazyvim.sh +++ /dev/null @@ -1 +0,0 @@ -omarchy-lazyvim-setup diff --git a/install/config/mimetypes.sh b/install/config/mimetypes.sh index 48bb8cfa..ee662f55 100644 --- a/install/config/mimetypes.sh +++ b/install/config/mimetypes.sh @@ -33,3 +33,6 @@ xdg-mime default mpv.desktop video/x-ms-asf xdg-mime default mpv.desktop video/x-ogm+ogg xdg-mime default mpv.desktop video/x-theora+ogg xdg-mime default mpv.desktop application/ogg + +# Use Hey for mailto: links +xdg-mime default HEY.desktop x-scheme-handler/mailto diff --git a/install/config/mise-work.sh b/install/config/mise-work.sh index 15d71923..64ba12d0 100644 --- a/install/config/mise-work.sh +++ b/install/config/mise-work.sh @@ -7,3 +7,19 @@ _.path = "{{ cwd }}/bin" EOF mise trust ~/Work/.mise.toml + +if [[ -n "${OMARCHY_CHROOT_INSTALL:-}" ]]; then + NODE_TARBALL=$(find /opt/packages -name "node-v*-linux-x64.tar.gz" -type f 2>/dev/null | head -n1) + + NODE_VERSION=$(basename "$NODE_TARBALL" | sed 's/node-v\(.*\)-linux-x64.tar.gz/\1/') + NODE_INSTALL_DIR="$HOME/.local/share/mise/installs/node/$NODE_VERSION" + + mkdir -p "$NODE_INSTALL_DIR" + tar -xzf "$NODE_TARBALL" \ + --strip-components=1 \ + -C "$NODE_INSTALL_DIR" + + mise use -g node@"$NODE_VERSION" +else + mise use -g node@latest +fi diff --git a/install/config/sudoless-asdcontrol.sh b/install/config/sudoless-asdcontrol.sh index 120c6fc2..5ae03563 100644 --- a/install/config/sudoless-asdcontrol.sh +++ b/install/config/sudoless-asdcontrol.sh @@ -1,3 +1,3 @@ # Setup sudo-less controls for controlling brightness on Apple Displays -echo "$USER ALL=(ALL) NOPASSWD: /usr/local/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol +echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol sudo chmod 440 /etc/sudoers.d/asdcontrol diff --git a/install/config/theme.sh b/install/config/theme.sh index a0a6a694..e88cc748 100644 --- a/install/config/theme.sh +++ b/install/config/theme.sh @@ -12,7 +12,7 @@ ln -snf ~/.config/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme ln -snf ~/.config/omarchy/current/theme/backgrounds/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png ~/.config/omarchy/current/background # Set specific app links for current theme -ln -snf ~/.config/omarchy/current/theme/neovim.lua ~/.config/nvim/lua/plugins/theme.lua +# ~/.config/omarchy/current/theme/neovim.lua -> ~/.config/nvim/lua/plugins/theme.lua is handled via omarchy-setup-nvim mkdir -p ~/.config/btop/themes ln -snf ~/.config/omarchy/current/theme/btop.theme ~/.config/btop/themes/current.theme diff --git a/install/config/walker-elephant.sh b/install/config/walker-elephant.sh new file mode 100644 index 00000000..e8e3330f --- /dev/null +++ b/install/config/walker-elephant.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Create pacman hook to restart walker after updates +sudo mkdir -p /etc/pacman.d/hooks +sudo tee /etc/pacman.d/hooks/walker-restart.hook > /dev/null << EOF +[Trigger] +Type = Package +Operation = Upgrade +Target = walker +Target = walker-debug +Target = elephant* + +[Action] +Description = Restarting Walker services after system update +When = PostTransaction +Exec = $OMARCHY_PATH/bin/omarchy-restart-walker +EOF diff --git a/install/first-run/cleanup-reboot-sudoers.sh b/install/first-run/cleanup-reboot-sudoers.sh new file mode 100644 index 00000000..ccc9966b --- /dev/null +++ b/install/first-run/cleanup-reboot-sudoers.sh @@ -0,0 +1,3 @@ +if sudo test -f /etc/sudoers.d/99-omarchy-installer-reboot; then + sudo rm -f /etc/sudoers.d/99-omarchy-installer-reboot +fi diff --git a/install/first-run/dns-resolver.sh b/install/first-run/dns-resolver.sh new file mode 100644 index 00000000..bf46388a --- /dev/null +++ b/install/first-run/dns-resolver.sh @@ -0,0 +1,4 @@ +# https://wiki.archlinux.org/title/Systemd-resolved +echo "Symlink resolved stub-resolv to /etc/resolv.conf" + +sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf diff --git a/install/first-run/welcome.sh b/install/first-run/welcome.sh index 3b846610..2da4be2e 100644 --- a/install/first-run/welcome.sh +++ b/install/first-run/welcome.sh @@ -1,2 +1,2 @@ notify-send " Update System" "When you have internet, click to update the system." -u critical -notify-send "👋 Welcome to Omarchy" "You're in for a great computing adventure. Have fun!" -t 30000 +notify-send " Learn Keybindings" "Super + K for cheatsheet.\nSuper + Space for application launcher.\nSuper + Alt + Space for Omarchy Menu." -u critical diff --git a/install/first-run/wifi.sh b/install/first-run/wifi.sh index 9d391f1e..d645a5c3 100644 --- a/install/first-run/wifi.sh +++ b/install/first-run/wifi.sh @@ -1,3 +1,3 @@ if ! ping -c3 -W1 1.1.1.1 >/dev/null 2>&1; then - notify-send "󰖩 Click to Setup Wi-Fi" "Tab between sections, space selects, ? for help." -u critical -t 30000 + notify-send "󰖩 Click to Setup Wi-Fi" "Tab to navigate, Space to select, ? for help." -u critical -t 30000 fi diff --git a/install/login/all.sh b/install/login/all.sh index e4be282f..2c03df32 100644 --- a/install/login/all.sh +++ b/install/login/all.sh @@ -1,4 +1,4 @@ run_logged $OMARCHY_INSTALL/login/plymouth.sh +run_logged $OMARCHY_INSTALL/login/default-keyring.sh +run_logged $OMARCHY_INSTALL/login/sddm.sh run_logged $OMARCHY_INSTALL/login/limine-snapper.sh -run_logged $OMARCHY_INSTALL/login/enable-mkinitcpio.sh -run_logged $OMARCHY_INSTALL/login/alt-bootloaders.sh diff --git a/install/login/alt-bootloaders.sh b/install/login/alt-bootloaders.sh deleted file mode 100644 index bb35d9b0..00000000 --- a/install/login/alt-bootloaders.sh +++ /dev/null @@ -1,115 +0,0 @@ -if ! command -v limine &>/dev/null; then - # Add kernel hooks - if ! grep -Eq '^HOOKS=.*plymouth' /etc/mkinitcpio.conf; then - # Backup original mkinitcpio.conf just in case - backup_timestamp=$(date +"%Y%m%d%H%M%S") - sudo cp /etc/mkinitcpio.conf "/etc/mkinitcpio.conf.bak.${backup_timestamp}" - - # Add plymouth to HOOKS array after 'base udev' or 'base systemd' - if grep "^HOOKS=" /etc/mkinitcpio.conf | grep -q "base systemd"; then - sudo sed -i '/^HOOKS=/s/base systemd/base systemd plymouth/' /etc/mkinitcpio.conf - elif grep "^HOOKS=" /etc/mkinitcpio.conf | grep -q "base udev"; then - sudo sed -i '/^HOOKS=/s/base udev/base udev plymouth/' /etc/mkinitcpio.conf - else - echo "Couldn't add the Plymouth hook" - fi - - # Regenerate initramfs - sudo mkinitcpio -P - fi - - # Add kernel parameters for Plymouth - if [ -d "/boot/loader/entries" ]; then # systemd-boot - echo "Detected systemd-boot" - - for entry in /boot/loader/entries/*.conf; do - if [ -f "$entry" ]; then - # Skip fallback entries - if [[ "$(basename "$entry")" == *"fallback"* ]]; then - echo "Skipped: $(basename "$entry") (fallback entry)" - continue - fi - - # Skip if splash it already present for some reason - if ! grep -q "splash" "$entry"; then - sudo sed -i '/^options/ s/$/ splash quiet/' "$entry" - else - echo "Skipped: $(basename "$entry") (splash already present)" - fi - fi - done - elif [ -f "/etc/default/grub" ]; then # Grub - echo "Detected grub" - - # Backup GRUB config before modifying - backup_timestamp=$(date +"%Y%m%d%H%M%S") - sudo cp /etc/default/grub "/etc/default/grub.bak.${backup_timestamp}" - - # Check if splash is already in GRUB_CMDLINE_LINUX_DEFAULT - if ! grep -q "GRUB_CMDLINE_LINUX_DEFAULT.*splash" /etc/default/grub; then - # Get current GRUB_CMDLINE_LINUX_DEFAULT value - current_cmdline=$(grep "^GRUB_CMDLINE_LINUX_DEFAULT=" /etc/default/grub | cut -d'"' -f2) - - # Add splash and quiet if not present - new_cmdline="$current_cmdline" - if [[ ! "$current_cmdline" =~ splash ]]; then - new_cmdline="$new_cmdline splash" - fi - if [[ ! "$current_cmdline" =~ quiet ]]; then - new_cmdline="$new_cmdline quiet" - fi - - # Trim any leading/trailing spaces - new_cmdline=$(echo "$new_cmdline" | xargs) - - sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=\".*\"/GRUB_CMDLINE_LINUX_DEFAULT=\"$new_cmdline\"/" /etc/default/grub - - # Regenerate grub config - sudo grub-mkconfig -o /boot/grub/grub.cfg - else - echo "GRUB already configured with splash kernel parameters" - fi - elif [ -d "/etc/cmdline.d" ]; then # UKI - echo "Detected a UKI setup" - # Relying on mkinitcpio to assemble a UKI - # https://wiki.archlinux.org/title/Unified_kernel_image - if ! grep -q splash /etc/cmdline.d/*.conf; then - # Need splash, create the omarchy file - echo "splash" | sudo tee -a /etc/cmdline.d/omarchy.conf - fi - if ! grep -q quiet /etc/cmdline.d/*.conf; then - # Need quiet, create or append the omarchy file - echo "quiet" | sudo tee -a /etc/cmdline.d/omarchy.conf - fi - elif [ -f "/etc/kernel/cmdline" ]; then # UKI Alternate - # Alternate UKI kernel cmdline location - echo "Detected a UKI setup" - - # Backup kernel cmdline config before modifying - backup_timestamp=$(date +"%Y%m%d%H%M%S") - sudo cp /etc/kernel/cmdline "/etc/kernel/cmdline.bak.${backup_timestamp}" - - current_cmdline=$(cat /etc/kernel/cmdline) - - # Add splash and quiet if not present - new_cmdline="$current_cmdline" - if [[ ! "$current_cmdline" =~ splash ]]; then - new_cmdline="$new_cmdline splash" - fi - if [[ ! "$current_cmdline" =~ quiet ]]; then - new_cmdline="$new_cmdline quiet" - fi - - # Trim any leading/trailing spaces - new_cmdline=$(echo "$new_cmdline" | xargs) - - # Write new file - echo $new_cmdline | sudo tee /etc/kernel/cmdline - else - echo "" - echo " None of systemd-boot, GRUB, or UKI detected. Please manually add these kernel parameters:" - echo " - splash (to see the graphical splash screen)" - echo " - quiet (for silent boot)" - echo "" - fi -fi diff --git a/install/login/default-keyring.sh b/install/login/default-keyring.sh new file mode 100644 index 00000000..134fefb6 --- /dev/null +++ b/install/login/default-keyring.sh @@ -0,0 +1,22 @@ +KEYRING_DIR="$HOME/.local/share/keyrings" +KEYRING_FILE="$KEYRING_DIR/Default_keyring.keyring" +DEFAULT_FILE="$KEYRING_DIR/default" + +mkdir -p $KEYRING_DIR + +cat << EOF | tee "$KEYRING_FILE" +[keyring] +display-name=Default keyring +ctime=$(date +%s) +mtime=0 +lock-on-idle=false +lock-after=false +EOF + +cat << EOF | tee "$DEFAULT_FILE" +Default_keyring +EOF + +chmod 700 "$KEYRING_DIR" +chmod 600 "$KEYRING_FILE" +chmod 644 "$DEFAULT_FILE" diff --git a/install/login/enable-mkinitcpio.sh b/install/login/enable-mkinitcpio.sh deleted file mode 100644 index 7422d8db..00000000 --- a/install/login/enable-mkinitcpio.sh +++ /dev/null @@ -1,18 +0,0 @@ -echo "Re-enabling mkinitcpio hooks..." - -# Restore the specific mkinitcpio pacman hooks -if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then - sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook -fi - -if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then - sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook -fi - -echo "mkinitcpio hooks re-enabled" - -if command -v limine &>/dev/null; then - sudo limine-update -else - sudo mkinitcpio -P -fi diff --git a/install/login/limine-snapper.sh b/install/login/limine-snapper.sh index 2d9dc292..6a037207 100644 --- a/install/login/limine-snapper.sh +++ b/install/login/limine-snapper.sh @@ -1,4 +1,6 @@ if command -v limine &>/dev/null; then + sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook + sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf </dev/null HOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs) EOF @@ -34,6 +36,7 @@ KERNEL_CMDLINE[default]="$CMDLINE" KERNEL_CMDLINE[default]+="quiet splash" ENABLE_UKI=yes +CUSTOM_UKI_NAME="omarchy" ENABLE_LIMINE_FALLBACK=yes @@ -75,7 +78,6 @@ term_background_bright: 24283b EOF - sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook # Match Snapper configs if not installing from the ISO if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then @@ -96,13 +98,39 @@ EOF chrootable_systemctl_enable limine-snapper-sync.service fi -# Add UKI entry to UEFI machines to skip bootloader showing on normal boot -if [[ -n $EFI ]] && efibootmgr &>/dev/null && ! efibootmgr | grep -q Omarchy && +echo "Re-enabling mkinitcpio hooks..." + +# Restore the specific mkinitcpio pacman hooks +if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then + sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook +fi + +if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then + sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook +fi + +echo "mkinitcpio hooks re-enabled" + +sudo limine-update + +if [[ -n $EFI ]] && efibootmgr &>/dev/null; then + # Remove the archinstall-created Limine entry + while IFS= read -r bootnum; do + sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1 + done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Arch Linux Limine" | sed 's/^Boot\([0-9]\{4\}\).*/\1/') +fi + +if [[ -n $EFI ]] && efibootmgr &>/dev/null && ! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "American Megatrends" && ! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then - sudo efibootmgr --create \ - --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \ - --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \ - --label "Omarchy" \ - --loader "\\EFI\\Linux\\$(cat /etc/machine-id)_linux.efi" + + uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1) + + if [[ -n "$uki_file" ]]; then + sudo efibootmgr --create \ + --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \ + --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \ + --label "Omarchy" \ + --loader "\\EFI\\Linux\\$uki_file" + fi fi diff --git a/install/login/plymouth.sh b/install/login/plymouth.sh index 72102f27..fad64fe2 100644 --- a/install/login/plymouth.sh +++ b/install/login/plymouth.sh @@ -1,151 +1,4 @@ -# Hyprland launched via UWSM and login directly as user, rely on disk encryption + hyprlock for security - -# ============================================================================== -# PLYMOUTH SETUP -# ============================================================================== - if [ "$(plymouth-set-default-theme)" != "omarchy" ]; then sudo cp -r "$HOME/.local/share/omarchy/default/plymouth" /usr/share/plymouth/themes/omarchy/ sudo plymouth-set-default-theme omarchy fi - -# ============================================================================== -# SEAMLESS LOGIN -# ============================================================================== - -if [ ! -x /usr/local/bin/seamless-login ]; then - # Compile the seamless login helper -- needed to prevent seeing terminal between loader and desktop - cat <<'CCODE' >/tmp/seamless-login.c -/* -* Seamless Login - Minimal SDDM-style Plymouth transition -* Replicates SDDM's VT management for seamless auto-login -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - int vt_fd; - int vt_num = 1; // TTY1 - char vt_path[32]; - - if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - return 1; - } - - // Open the VT (simple approach like SDDM) - snprintf(vt_path, sizeof(vt_path), "/dev/tty%d", vt_num); - vt_fd = open(vt_path, O_RDWR); - if (vt_fd < 0) { - perror("Failed to open VT"); - return 1; - } - - // Activate the VT - if (ioctl(vt_fd, VT_ACTIVATE, vt_num) < 0) { - perror("VT_ACTIVATE failed"); - close(vt_fd); - return 1; - } - - // Wait for VT to be active - if (ioctl(vt_fd, VT_WAITACTIVE, vt_num) < 0) { - perror("VT_WAITACTIVE failed"); - close(vt_fd); - return 1; - } - - // Critical: Set graphics mode to prevent console text - if (ioctl(vt_fd, KDSETMODE, KD_GRAPHICS) < 0) { - perror("KDSETMODE KD_GRAPHICS failed"); - close(vt_fd); - return 1; - } - - // Clear VT and close (like SDDM does) - const char *clear_seq = "\33[H\33[2J"; - if (write(vt_fd, clear_seq, strlen(clear_seq)) < 0) { - perror("Failed to clear VT"); - } - - close(vt_fd); - - // Set working directory to user's home - const char *home = getenv("HOME"); - if (home) chdir(home); - - // Now execute the session command - execvp(argv[1], &argv[1]); - perror("Failed to exec session"); - return 1; -} -CCODE - - gcc -o /tmp/seamless-login /tmp/seamless-login.c - sudo mv /tmp/seamless-login /usr/local/bin/seamless-login - sudo chmod +x /usr/local/bin/seamless-login - rm /tmp/seamless-login.c -fi - -if [ ! -f /etc/systemd/system/omarchy-seamless-login.service ]; then - cat </dev/null </dev/null; then - systemctl reboot --no-wall 2>/dev/null + if [[ -n "${OMARCHY_CHROOT_INSTALL:-}" ]]; then + touch /var/tmp/omarchy-install-completed + exit 0 else - reboot 2>/dev/null + sudo reboot 2>/dev/null fi fi diff --git a/install/preflight/first-run-mode.sh b/install/preflight/first-run-mode.sh index 44649496..536058cc 100644 --- a/install/preflight/first-run-mode.sh +++ b/install/preflight/first-run-mode.sh @@ -5,9 +5,12 @@ touch ~/.local/state/omarchy/first-run.mode # Setup sudo-less access for first-run sudo tee /etc/sudoers.d/first-run >/dev/null </dev/null | grep -q 'Secure Boot: enabled'; then + abort "Secure Boot disabled" +fi # Must not have Gnome or KDE already install -pacman -Qe gnome-shell &>/dev/null && abort "Fresh + Vanilla Arch" -pacman -Qe plasma-desktop &>/dev/null && abort "Fresh + Vanilla Arch" +if pacman -Qe gnome-shell &>/dev/null || pacman -Qe plasma-desktop &>/dev/null; then + abort "Fresh + Vanilla Arch" +fi + +# Must have limine installed +command -v limine &>/dev/null || abort "Limine bootloader" + +# Must have btrfs root filesystem +[ "$(findmnt -n -o FSTYPE /)" = "btrfs" ] || abort "Btrfs root filesystem" # Cleared all guards echo "Guards: OK" diff --git a/migrations/1751134560.sh b/migrations/1751134560.sh index d34a2b60..f4267951 100644 --- a/migrations/1751134560.sh +++ b/migrations/1751134560.sh @@ -4,12 +4,13 @@ export OMARCHY_PATH="$HOME/.local/share/omarchy" export PATH="$OMARCHY_PATH/bin:$PATH" mkdir -p "$HOME/.config/uwsm/" -omarchy-refresh-config uwsm/env - -echo -e "\n\e[31mOmarchy bins have been added to PATH (and OMARCHY_PATH is now system-wide).\nYou must immediately relaunch Hyprland or most Omarchy cmds won't work.\nPlease run Omarchy > Update again after the quick relaunch is complete.\e[0m" -echo +cat </dev/null & + setsid uwsm-app -- swayosd-server &>/dev/null & fi diff --git a/migrations/1753176520.sh b/migrations/1753176520.sh deleted file mode 100644 index 186b8a76..00000000 --- a/migrations/1753176520.sh +++ /dev/null @@ -1,3 +0,0 @@ -echo "Install wf-recorder for screen recording for nvidia" - -omarchy-pkg-add wf-recorder diff --git a/migrations/1753224615.sh b/migrations/1753224615.sh index cd6c7978..6f9dcfb5 100644 --- a/migrations/1753224615.sh +++ b/migrations/1753224615.sh @@ -5,5 +5,5 @@ if [[ ! -d ~/.config/swayosd ]]; then cp -r ~/.local/share/omarchy/config/swayosd/* ~/.config/swayosd/ pkill swayosd-server - setsid uwsm app -- swayosd-server &>/dev/null & + setsid uwsm-app -- swayosd-server &>/dev/null & fi diff --git a/migrations/1755548643.sh b/migrations/1755548643.sh deleted file mode 100644 index f98b730b..00000000 --- a/migrations/1755548643.sh +++ /dev/null @@ -1,3 +0,0 @@ -echo "Install wf-recorder for intel based device" - -omarchy-pkg-add wf-recorder diff --git a/migrations/1755870033.sh b/migrations/1755870033.sh index fde865be..d7b6e8f9 100644 --- a/migrations/1755870033.sh +++ b/migrations/1755870033.sh @@ -1,5 +1,5 @@ echo "Use current terminal shell cwd for new terminal working directories" if ! grep -q "working-directory" ~/.config/hypr/bindings.conf; then - sed -i '/bindd = SUPER, return, Terminal, exec, \$terminal/ s|$| --working-directory=$(omarchy-cmd-terminal-cwd)|' ~/.config/hypr/bindings.conf + sed -i '/bindd = SUPER, RETURN, Terminal, exec, \$terminal/ s|$| --working-directory=$(omarchy-cmd-terminal-cwd)|' ~/.config/hypr/bindings.conf fi diff --git a/migrations/1756060611.sh b/migrations/1756060611.sh index b1bc95da..67d819b6 100644 --- a/migrations/1756060611.sh +++ b/migrations/1756060611.sh @@ -14,7 +14,6 @@ reinstall_package_opr obsidian-bin obsidian reinstall_package_opr localsend-bin localsend reinstall_package_opr omarchy-chromium-bin omarchy-chromium reinstall_package_opr walker-bin -reinstall_package_opr wl-screenrec reinstall_package_opr python-terminaltexteffects reinstall_package_opr tzupdate reinstall_package_opr typora diff --git a/migrations/1757361128.sh b/migrations/1757361128.sh index b6c8413e..0bd0b407 100644 --- a/migrations/1757361128.sh +++ b/migrations/1757361128.sh @@ -2,6 +2,6 @@ echo "Enable mDNS resolution for existing Avahi installations" if systemctl is-enabled avahi-daemon.service >/dev/null 2>&1; then if ! grep -q "mdns_minimal" /etc/nsswitch.conf; then - sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns/' /etc/nsswitch.conf + sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf fi fi \ No newline at end of file diff --git a/migrations/1757535736.sh b/migrations/1757535736.sh new file mode 100644 index 00000000..25fcd190 --- /dev/null +++ b/migrations/1757535736.sh @@ -0,0 +1,9 @@ +echo "Enabling vim keys in btop" + +CONFIG_FILE=~/.config/btop/btop.conf + +if [[ -f $CONFIG_FILE ]]; then + if grep -q "^vim_keys = " "$CONFIG_FILE"; then + sed -i 's/^vim_keys = False/vim_keys = True/' "$CONFIG_FILE" + fi +fi diff --git a/migrations/1757877852.sh b/migrations/1757877852.sh index a0b88bdd..51ecd105 100644 --- a/migrations/1757877852.sh +++ b/migrations/1757877852.sh @@ -2,9 +2,9 @@ echo "Switch select bindings to launch or focus mode" if [[ -f ~/.config/hypr/bindings.conf ]]; then sed -i '/SUPER, M, Music, exec/ c\bindd = SUPER, M, Music, exec, omarchy-launch-or-focus spotify' ~/.config/hypr/bindings.conf - sed -i '/SUPER, O, Obsidian, exec/ c\bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm app -- obsidian -disable-gpu --enable-wayland-ime"' ~/.config/hypr/bindings.conf + sed -i '/SUPER, O, Obsidian, exec/ c\bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"' ~/.config/hypr/bindings.conf - sed -i '/SUPER, G, Signal, exec/ c\bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm app -- signal-desktop"' ~/.config/hypr/bindings.conf + sed -i '/SUPER, G, Signal, exec/ c\bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm-app -- signal-desktop"' ~/.config/hypr/bindings.conf sed -i '/SUPER SHIFT, G, WhatsApp, exec/ c\bindd = SUPER SHIFT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"' ~/.config/hypr/bindings.conf sed -i '/SUPER ALT, G, Google Messages, exec/ c\bindd = SUPER ALT, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"' ~/.config/hypr/bindings.conf fi diff --git a/migrations/1758019332.sh b/migrations/1758019332.sh index 003acd56..defe97ab 100644 --- a/migrations/1758019332.sh +++ b/migrations/1758019332.sh @@ -3,7 +3,7 @@ echo "Set \$TERMINAL and \$EDITOR in ~/.config/uwsm/default so entire system can # Set terminal and editor default in uwsm omarchy-refresh-config uwsm/default omarchy-refresh-config uwsm/env -omarchy-state set relaunch-required +omarchy-state set reboot-required # Ensure scrolltouchpad setting applies to all terminals if grep -q "scrolltouchpad 1.5, class:Alacritty" ~/.config/hypr/input.conf; then @@ -17,5 +17,5 @@ fi # Use default terminal for keybinding if grep -q "terminal = uwsm app" ~/.config/hypr/bindings.conf; then - sed -i '/terminal = uwsm app -- alacritty/ c\$terminal = uwsm app -- $TERMINAL' ~/.config/hypr/bindings.conf + sed -i '/terminal = uwsm-app -- alacritty/ c\$terminal = uwsm-app -- $TERMINAL' ~/.config/hypr/bindings.conf fi diff --git a/migrations/1758107878.sh b/migrations/1758107878.sh new file mode 100644 index 00000000..52fe818d --- /dev/null +++ b/migrations/1758107878.sh @@ -0,0 +1,26 @@ +echo "Migrate to Walker 2.0.0" + +# Ensure we kill walker even if there's a restarting service running +kill -9 $(pgrep -x walker) + +omarchy-pkg-drop walker-bin walker-bin-debug + +omarchy-pkg-add elephant \ + elephant-calc \ + elephant-clipboard \ + elephant-bluetooth \ + elephant-desktopapplications \ + elephant-files \ + elephant-menus \ + elephant-providerlist \ + elephant-runner \ + elephant-symbols \ + elephant-unicode \ + elephant-websearch \ + elephant-todo \ + walker + +source $OMARCHY_PATH/install/config/walker-elephant.sh + +rm -rf ~/.config/walker/themes +omarchy-refresh-walker diff --git a/migrations/1758142943.sh b/migrations/1758142943.sh new file mode 100644 index 00000000..ef800abc --- /dev/null +++ b/migrations/1758142943.sh @@ -0,0 +1,21 @@ +echo "Turn off VSCode's own auto-update feature (we rely on pacman)" + +# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments), +# which jq doesn’t support. + +VS_CODE_SETTINGS="$HOME/.config/Code/User/settings.json" + +# If VSCode is installed, ensure that the "update.mode" setting is set to "none" +if omarchy-cmd-present code; then + mkdir -p "$(dirname "$VS_CODE_SETTINGS")" + + if [[ ! -f "$VS_CODE_SETTINGS" ]]; then + # If settings.json doesn't exist, create it with just the update.mode setting + printf '{\n "update.mode": "none"\n}\n' > "$VS_CODE_SETTINGS" + elif ! grep -q '"update.mode"' "$VS_CODE_SETTINGS"; then + # Insert "update.mode": "none", immediately after the first "{" + # Use sed's first-match range (0,/{/) to only replace the first "{ + sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ + "update.mode": "none",/}' "$VS_CODE_SETTINGS" + fi +fi diff --git a/migrations/1758487660_change_dm_to_sddm.sh b/migrations/1758487660_change_dm_to_sddm.sh new file mode 100644 index 00000000..3c10c840 --- /dev/null +++ b/migrations/1758487660_change_dm_to_sddm.sh @@ -0,0 +1,55 @@ +#!/bin/bash +set -e + +error_exit() { + echo -e "\033[31mERROR: Migration failed! Manual intervention required.\033[0m" >&2 + echo -e "\033[31mDO NOT REBOOT - System may be in inconsistent state until the error is fixed.\033[0m" >&2 + exit 1 +} + +trap error_exit ERR + +echo "Change display manager to SDDM" + +omarchy-pkg-add sddm libsecret gnome-keyring || error_exit + +sudo mkdir -p /etc/sddm.conf.d + +cat </dev/null 2>&1; then + echo -e "\033[31mError: omarchy-seamless-login.service is still enabled\033[0m" >&2 + error_exit +fi + +if systemctl is-masked plymouth-quit-wait.service >/dev/null 2>&1; then + echo -e "\033[31mError: plymouth-quit-wait.service is still masked\033[0m" >&2 + error_exit +fi + +if ! systemctl is-enabled getty@tty1.service >/dev/null 2>&1; then + echo -e "\033[31mError: getty@tty1.service is not enabled\033[0m" >&2 + error_exit +fi + +if ! systemctl is-enabled sddm.service >/dev/null 2>&1; then + echo -e "\033[31mError: sddm.service is not enabled\033[0m" >&2 + error_exit +fi + +sudo rm -f /usr/local/bin/seamless-login +sudo rm -f /etc/systemd/system/plymouth-quit.service.d/wait-for-graphical.conf +sudo rm -f /etc/systemd/system/omarchy-seamless-login.service diff --git a/migrations/1758487662_move_to_custom_uki.sh b/migrations/1758487662_move_to_custom_uki.sh new file mode 100644 index 00000000..731bba2a --- /dev/null +++ b/migrations/1758487662_move_to_custom_uki.sh @@ -0,0 +1,38 @@ +echo "Update UKI to custom named entry" + +if command -v limine &>/dev/null && [[ -f /etc/default/limine ]]; then + if grep -q "^ENABLE_UKI=yes" /etc/default/limine; then + if ! grep -q "^CUSTOM_UKI_NAME=" /etc/default/limine; then + sudo sed -i '/^ENABLE_UKI=yes/a CUSTOM_UKI_NAME="omarchy"' /etc/default/limine + fi + + # Remove the archinstall-created Limine entry + while IFS= read -r bootnum; do + sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1 + done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Arch Linux Limine" | sed 's/^Boot\([0-9]\{4\}\).*/\1/') + + sudo limine-update + + uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1) + + if [[ -n "$uki_file" ]]; then + while IFS= read -r bootnum; do + sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1 + done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Omarchy" | sed 's/^Boot\([0-9]\{4\}\).*/\1/') + + # Skip EFI entry creation on Apple hardware + if ! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then + sudo efibootmgr --create \ + --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \ + --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \ + --label "Omarchy" \ + --loader "\\EFI\\Linux\\$uki_file" + fi + fi + else + echo "Not using UKI. Not making any changes." + fi +else + echo "Boot config is non-standard. Not making any changes." +fi + diff --git a/migrations/1758562032.sh b/migrations/1758562032.sh new file mode 100644 index 00000000..5c4c357e --- /dev/null +++ b/migrations/1758562032.sh @@ -0,0 +1,5 @@ +echo "Fix Tailscale split DNS compatibility by removing [!UNAVAIL=return] from nsswitch.conf" + +if grep -q '\[!UNAVAIL=return\]' /etc/nsswitch.conf; then + sudo sed -i 's/resolve \[!UNAVAIL=return\]/resolve/g' /etc/nsswitch.conf +fi \ No newline at end of file diff --git a/migrations/1758564460.sh b/migrations/1758564460.sh new file mode 100644 index 00000000..f0b10693 --- /dev/null +++ b/migrations/1758564460.sh @@ -0,0 +1,2 @@ +echo "Enable fast shutdown" +source $OMARCHY_PATH/install/config/fast-shutdown.sh diff --git a/migrations/1759093827.sh b/migrations/1759093827.sh new file mode 100644 index 00000000..69cf8963 --- /dev/null +++ b/migrations/1759093827.sh @@ -0,0 +1,3 @@ +echo "Adding hidden entries for electron apps" + +cp $OMARCHY_PATH/applications/hidden/electron*.desktop ~/.local/share/applications/ diff --git a/migrations/1759270604.sh b/migrations/1759270604.sh new file mode 100644 index 00000000..dce79803 --- /dev/null +++ b/migrations/1759270604.sh @@ -0,0 +1,3 @@ +echo "Update Hyprlock with better placeholder position and show all fail text" + +omarchy-refresh-hyprlock diff --git a/migrations/1759355846.sh b/migrations/1759355846.sh new file mode 100644 index 00000000..40d0098d --- /dev/null +++ b/migrations/1759355846.sh @@ -0,0 +1,21 @@ +echo "Symlink systemd-resolved to /etc/resolv.conf" + +# Backup if /etc/resolv.conf was modified after system birth +system_birth=$(stat -c %W /) +resolvconf_modified=$(stat -c %Y /etc/resolv.conf) + +# Run a backup if resolv.conf isn't a symlink and was modified after install +if [[ -s /etc/resolv.conf ]] && [[ ! -L /etc/resolv.conf ]] && [[ $resolvconf_modified > $system_birth ]]; then + # Backup the destination file (with timestamp) to avoid clobbering (Ex: resolv.conf.bak.1753817951) + backup_file="/etc/resolv.conf.bak.$(date +%s)" + + # Create backup + sudo cp -f /etc/resolv.conf "$backup_file" 2>/dev/null + + # Inform users + echo -e "\e[31mReplaced /etc/resolv.conf with symlink to systemd-resolved. \nSaved backup as ${backup_file}.\e[0m" + echo -e "\e[31mSee https://wiki.archlinux.org/title/Systemd-resolved.\e[0m" +fi + +# Write the symlink +sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf diff --git a/migrations/1759691413.sh b/migrations/1759691413.sh new file mode 100644 index 00000000..37fefa7c --- /dev/null +++ b/migrations/1759691413.sh @@ -0,0 +1,5 @@ +echo "Correct path for sudoless asdcontrol for working Apple Display hotkeys" + +if [[ $(command -v asdcontrol) == "/usr/bin/asdcontrol" ]]; then + echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol +fi diff --git a/migrations/1759694076.sh b/migrations/1759694076.sh new file mode 100644 index 00000000..084d8e2b --- /dev/null +++ b/migrations/1759694076.sh @@ -0,0 +1,4 @@ +echo "Hide OpenJDK applications from app launcher" + +cp $OMARCHY_PATH/applications/hidden/*openjdk.desktop ~/.local/share/applications/ + diff --git a/migrations/1759782459.sh b/migrations/1759782459.sh new file mode 100644 index 00000000..015fd8e0 --- /dev/null +++ b/migrations/1759782459.sh @@ -0,0 +1,3 @@ +echo "Fix opening in nvim from files manager" + +cp -f $OMARCHY_PATH/applications/nvim.desktop ~/.local/share/applications/nvim.desktop diff --git a/migrations/1759895423.sh b/migrations/1759895423.sh new file mode 100644 index 00000000..fcaeb417 --- /dev/null +++ b/migrations/1759895423.sh @@ -0,0 +1,10 @@ +echo "Make shift+insert paste and ctrl+insert copy from clipboard in terminal" + +# Add keybindings to Alacritty +sed -i 's/{ key = "F11", action = "ToggleFullscreen" }/{ key = "F11", action = "ToggleFullscreen" },\n{ key = "Insert", mods = "Shift", action = "Paste" },\n{ key = "Insert", mods = "Control", action = "Copy" }/' ~/.config/alacritty/alacritty.toml + +# Add keybindings to Ghostty +sed -i '/keybind = f11=toggle_fullscreen/a keybind = shift+insert=paste_from_clipboard\nkeybind = control+insert=copy_to_clipboard' ~/.config/ghostty/config + +# Add keybindings to Kitty +sed -i '/map F11 toggle_fullscreen/a map ctrl+insert copy_to_clipboard' ~/.config/kitty/kitty.conf diff --git a/migrations/1759913695.sh b/migrations/1759913695.sh new file mode 100644 index 00000000..8ce4ad13 --- /dev/null +++ b/migrations/1759913695.sh @@ -0,0 +1,3 @@ +echo "Fix NVMe suspend issues on MacBook models" + +bash $OMARCHY_PATH/install/config/hardware/fix-apple-suspend-nvme.sh diff --git a/migrations/1760144906.sh b/migrations/1760144906.sh new file mode 100644 index 00000000..4745b187 --- /dev/null +++ b/migrations/1760144906.sh @@ -0,0 +1,5 @@ +echo "Change omarchy-screenrecord to use gpu-screen-recorder" +omarchy-pkg-drop wf-recorder wl-screenrec + +# Add slurp in case it hadn't been picked up from an old migration +omarchy-pkg-add slurp gpu-screen-recorder diff --git a/migrations/1760301290.sh b/migrations/1760301290.sh new file mode 100644 index 00000000..b383b6fb --- /dev/null +++ b/migrations/1760301290.sh @@ -0,0 +1,5 @@ +echo "Add the new Flexoki Light theme" + +if [[ ! -L ~/.config/omarchy/themes/flexoki-light ]]; then + ln -nfs ~/.local/share/omarchy/themes/flexoki-light ~/.config/omarchy/themes/ +fi diff --git a/migrations/1760304963.sh b/migrations/1760304963.sh new file mode 100644 index 00000000..e1c519c6 --- /dev/null +++ b/migrations/1760304963.sh @@ -0,0 +1,9 @@ +echo "Add a default keyring for gnome-keyring that unlocks on login" + +if [ -f "$HOME/.local/share/keyrings/Default_keyring.keyring" ] || [ -f "$HOME/.local/share/keyrings/default" ]; then + if gum confirm "Do you want to replace existing keyring with one that's auto-unlocked on login?"; then + bash "$OMARCHY_PATH/install/login/default-keyring.sh" + fi +else + bash "$OMARCHY_PATH/install/login/default-keyring.sh" +fi diff --git a/migrations/1760401344.sh b/migrations/1760401344.sh new file mode 100644 index 00000000..5e5ca300 --- /dev/null +++ b/migrations/1760401344.sh @@ -0,0 +1,15 @@ +echo "Add Chromium crash workaround flag for Hyprland to existing configs" + +# Add flag to chromium-flags.conf if it exists and doesn't already have it +if [[ -f ~/.config/chromium-flags.conf ]]; then + if ! grep -qF -- "--disable-features=WaylandWpColorManagerV1" ~/.config/chromium-flags.conf; then + sed -i '$a # Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957\n--disable-features=WaylandWpColorManagerV1' ~/.config/chromium-flags.conf + fi +fi + +# Add flag to brave-flags.conf if it exists and doesn't already have it +if [[ -f ~/.config/brave-flags.conf ]]; then + if ! grep -qF -- "--disable-features=WaylandWpColorManagerV1" ~/.config/brave-flags.conf; then + sed -i '$a # Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957\n--disable-features=WaylandWpColorManagerV1' ~/.config/brave-flags.conf + fi +fi diff --git a/migrations/1760434895.sh b/migrations/1760434895.sh new file mode 100644 index 00000000..e08649f4 --- /dev/null +++ b/migrations/1760434895.sh @@ -0,0 +1,6 @@ +echo "Change to omarchy-nvim package" +omarchy-pkg-drop omarchy-lazyvim +omarchy-pkg-add omarchy-nvim + +# Will trigger to overwrite configs or not to pickup new hot-reload themes +omarchy-nvim-setup diff --git a/migrations/1760441237.sh b/migrations/1760441237.sh new file mode 100644 index 00000000..1c2d89d3 --- /dev/null +++ b/migrations/1760441237.sh @@ -0,0 +1,3 @@ +echo "Install Omarchy theme on Obsidian vaults" + +omarchy-theme-set-obsidian diff --git a/migrations/1760462260.sh b/migrations/1760462260.sh new file mode 100644 index 00000000..fec87d8c --- /dev/null +++ b/migrations/1760462260.sh @@ -0,0 +1,26 @@ +echo -e "Offer new Omarchy hotkeys\n" + +cat <