diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..be738a76 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,62 @@ +# Style + +- Two spaces for indentation, no tabs +- Use Bash syntax for conditionals: `[[ -f $file ]]`, not `[ -f "$file" ]` + +# Command Naming + +All commands start with `omarchy-`. Prefixes indicate purpose: + +- `cmd-` - check if commands exist, misc utility commands +- `pkg-` - package management helpers +- `hw-` - hardware detection (return exit codes for use in conditionals) +- `refresh-` - copy default config to user's `~/.config/` +- `restart-` - restart a component +- `launch-` - open applications +- `install-` - install optional software +- `setup-` - interactive setup wizards +- `toggle-` - toggle features on/off +- `theme-` - theme management +- `update-` - update components + +# Helper Commands + +Use these instead of raw shell commands: + +- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands +- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages +- `omarchy-pkg-add` - install packages (handles both pacman and AUR) +- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands) + +# Config Structure + +- `config/` - default configs copied to `~/.config/` +- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors +- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15) + +# Refresh Pattern + +To copy a default config to user config with automatic backup: + +```bash +omarchy-refresh-config hypr/hyprlock.conf +``` + +This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hypr/hyprlock.conf`. + +# Migrations + +To create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit. + +Migration format: +- No shebang line +- Start with an `echo` describing what the migration does + +Example: +```bash +echo "Disable fingerprint in hyprlock if fingerprint auth is not configured" + +if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then + sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf +fi +``` diff --git a/bin/omarchy-battery-present b/bin/omarchy-battery-present new file mode 100755 index 00000000..bcdab1eb --- /dev/null +++ b/bin/omarchy-battery-present @@ -0,0 +1,13 @@ +#!/bin/bash + +# Returns true if a battery is present on the system. +# Used by the battery monitor and other battery-related checks. + +for bat in /sys/class/power_supply/BAT*; do + [[ -r "$bat/present" ]] && + [[ "$(cat "$bat/present")" == "1" ]] && + [[ "$(cat "$bat/type")" == "Battery" ]] && + exit 0 +done + +exit 1 diff --git a/bin/omarchy-branch-set b/bin/omarchy-branch-set index f67d9174..bfe67c99 100755 --- a/bin/omarchy-branch-set +++ b/bin/omarchy-branch-set @@ -3,14 +3,15 @@ # Set the branch for Omarchy's git repository. if (($# == 0)); then - echo "Usage: omarchy-branch-set [master|dev]" + echo "Usage: omarchy-branch-set [master|rc|dev]" exit 1 else branch="$1" fi -case "$branch" in - "master") git -C $OMARCHY_PATH switch master ;; - "dev") git -C $OMARCHY_PATH switch dev ;; - *) echo "Unknown branch: $branch"; exit 1; ;; -esac +if [[ "$branch" != "master" && "$branch" != "rc" && "$branch" != "dev" ]]; then + echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev" + exit 1 +fi + +git -C $OMARCHY_PATH switch $branch diff --git a/bin/omarchy-channel-set b/bin/omarchy-channel-set index 342ee2e2..116539b2 100755 --- a/bin/omarchy-channel-set +++ b/bin/omarchy-channel-set @@ -14,7 +14,7 @@ # and people with a lot of experience managing Linux systems. if (($# == 0)); then - echo "Usage: omarchy-channel-set [stable|edge|dev]" + echo "Usage: omarchy-channel-set [stable|rc|edge|dev]" exit 1 else channel="$1" @@ -22,6 +22,7 @@ fi case "$channel" in "stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" && sudo pacman -Suu --noconfirm ;; +"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" && sudo pacman -Suu --noconfirm ;; "edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;; "dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;; *) echo "Unknown channel: $channel"; exit 1; ;; diff --git a/bin/omarchy-cmd-screenshot b/bin/omarchy-cmd-screenshot index b988a3b7..0a7b94ad 100755 --- a/bin/omarchy-cmd-screenshot +++ b/bin/omarchy-cmd-screenshot @@ -2,6 +2,7 @@ # Take a screenshot of the whole screen, a specific window, or a user-drawn region. # Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs. +# Editor defaults to Satty but can be changed via --editor= or OMARCHY_SCREENSHOT_EDITOR env [[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}" @@ -13,6 +14,32 @@ fi pkill slurp && exit 0 +SCREENSHOT_EDITOR="${OMARCHY_SCREENSHOT_EDITOR:-satty}" + +# Parse --editor flag from any position +ARGS=() +for arg in "$@"; do + if [[ "$arg" == --editor=* ]]; then + SCREENSHOT_EDITOR="${arg#--editor=}" + else + ARGS+=("$arg") + fi +done +set -- "${ARGS[@]}" + +open_editor() { + local filepath="$1" + if [[ "$SCREENSHOT_EDITOR" == "satty" ]]; then + satty --filename "$filepath" \ + --output-filename "$filepath" \ + --actions-on-enter save-to-clipboard \ + --save-after-copy \ + --copy-command 'wl-copy' + else + $SCREENSHOT_EDITOR "$filepath" + fi +} + MODE="${1:-smart}" PROCESSING="${2:-slurp}" @@ -24,63 +51,69 @@ get_rectangles() { # 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 +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]}" + # If the selection 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]}" + 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 + 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 - done <<< "$RECTS" - fi + fi + done <<<"$RECTS" fi - ;; + fi + ;; esac -[ -z "$SELECTION" ] && exit 0 +[[ -z $SELECTION ]] && exit 0 + +FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" +FILEPATH="$OUTPUT_DIR/$FILENAME" 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' + grim -g "$SELECTION" "$FILEPATH" || exit 1 + wl-copy <"$FILEPATH" + + ( + ACTION=$(notify-send "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 -i "$FILEPATH" -A "default=edit") + [[ "$ACTION" == "default" ]] && open_editor "$FILEPATH" + ) & else grim -g "$SELECTION" - | wl-copy fi diff --git a/bin/omarchy-hibernation-setup b/bin/omarchy-hibernation-setup index 8a423cbd..108e8ffa 100755 --- a/bin/omarchy-hibernation-setup +++ b/bin/omarchy-hibernation-setup @@ -17,9 +17,11 @@ if [ -f "$MKINITCPIO_CONF" ] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; exit 0 fi -MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}') -if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then - exit 0 +if [[ $1 != "--force" ]]; then + MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}') + if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then + exit 0 + fi fi SWAP_SUBVOLUME="/swap" @@ -57,14 +59,26 @@ sudo mkdir -p /etc/mkinitcpio.conf.d echo "Adding resume hook to $MKINITCPIO_CONF" echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null -# Configure suspend-then-hibernate -echo "Configuring suspend-then-hibernate" -sudo mkdir -p /etc/systemd/logind.conf.d /etc/systemd/sleep.conf.d -sudo cp "$OMARCHY_PATH/default/systemd/lid.conf" /etc/systemd/logind.conf.d/ -sudo cp "$OMARCHY_PATH/default/systemd/hibernate.conf" /etc/systemd/sleep.conf.d/ +# Ensure keyboard backlight doesn't prevent sleep +sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/ -# Regenerate initramfs +# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate) +if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then + LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf" + if [[ ! -f "$LIMINE_DROP_IN" ]]; then + echo "Enabling ACPI RTC alarm for s2idle suspend" + sudo mkdir -p /etc/limine-entry-tool.d + echo 'KERNEL_CMDLINE[default]+="rtc_cmos.use_acpi_alarm=1"' | sudo tee "$LIMINE_DROP_IN" >/dev/null + fi +fi + +# Regenerate initramfs and boot entry echo "Regenerating initramfs..." sudo limine-mkinitcpio +sudo limine-update -echo "Hibernation enabled" +echo + +if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then + omarchy-cmd-reboot +fi diff --git a/bin/omarchy-hw-asus-rog b/bin/omarchy-hw-asus-rog new file mode 100755 index 00000000..3a0e27af --- /dev/null +++ b/bin/omarchy-hw-asus-rog @@ -0,0 +1,6 @@ +#!/bin/bash + +# Detect whether the computer is an Asus ROG machine. + +[[ "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null)" == "ASUSTeK COMPUTER INC." ]] && + grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null diff --git a/bin/omarchy-install-geforce-now b/bin/omarchy-install-geforce-now new file mode 100755 index 00000000..4c941a9b --- /dev/null +++ b/bin/omarchy-install-geforce-now @@ -0,0 +1,17 @@ +#!/bin/bash + +# Install and launch Geforce Now. + +set -e + +omarchy-pkg-add flatpak +cd /tmp + +# Download and run GeForce NOW +curl -LO https://international.download.nvidia.com/GFNLinux/GeForceNOWSetup.bin +chmod +x GeForceNOWSetup.bin +./GeForceNOWSetup.bin + +# Ensure a separate browser process not started by GFN is available. +# If not, it seems like GFN has a tendency to hang on login. +setsid omarchy-launch-browser diff --git a/bin/omarchy-install-tailscale b/bin/omarchy-install-tailscale index b439744c..a4e9ed5b 100755 --- a/bin/omarchy-install-tailscale +++ b/bin/omarchy-install-tailscale @@ -1,15 +1,10 @@ #!/bin/bash -# Install the Tailscale mesh VPN service, the tsui TUI management app, and a web app for the Tailscale Admin Console. +# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console. curl -fsSL https://tailscale.com/install.sh | sh -curl -fsSL https://neuralink.com/tsui/install.sh | bash echo -e "\nStarting Tailscale..." sudo tailscale up --accept-routes -echo -e "\nAdd tsui to sudoers..." -echo "$USER ALL=(ALL) NOPASSWD: $(which tsui)" | sudo tee /etc/sudoers.d/tsui - -omarchy-tui-install "Tailscale" "sudo tsui" float https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png -omarchy-webapp-install "Tailscale Admin Console" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png +omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png diff --git a/bin/omarchy-launch-walker b/bin/omarchy-launch-walker index 3d92b6b0..8b239f10 100755 --- a/bin/omarchy-launch-walker +++ b/bin/omarchy-launch-walker @@ -1,6 +1,6 @@ #!/bin/bash -# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is runnig first. +# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is running first. # Ensure elephant is running before launching walker if ! pgrep -x elephant > /dev/null; then diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 941d9be9..ba60cef8 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -99,21 +99,13 @@ show_trigger_menu() { show_capture_menu() { case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in - *Screenshot*) show_screenshot_menu ;; + *Screenshot*) omarchy-cmd-screenshot ;; *Screenrecord*) show_screenrecord_menu ;; *Color*) pkill hyprpicker || hyprpicker -a ;; *) show_trigger_menu ;; esac } -show_screenshot_menu() { - 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 -} - get_webcam_list() { v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do if [[ "$line" != $'\t'* && -n "$line" ]]; then @@ -148,7 +140,10 @@ show_screenrecord_menu() { *"With desktop audio") omarchy-cmd-screenrecord --with-desktop-audio ;; *"With desktop + microphone audio") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;; *"With desktop + microphone audio + webcam") - local device=$(show_webcam_select_menu) || { back_to show_capture_menu; return; } + local device=$(show_webcam_select_menu) || { + back_to show_capture_menu + return + } omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device" ;; *"Without audio") omarchy-cmd-screenrecord ;; @@ -356,8 +351,9 @@ show_install_ai_menu() { } show_install_gaming_menu() { - case $(menu "Install" " Steam\n RetroArch [AUR]\n󰍳 Minecraft\n󰖺 Xbox Controller [AUR]") in + case $(menu "Install" " Steam\n󰢹 NVIDIA GeForce NOW\n RetroArch [AUR]\n󰍳 Minecraft\n󰖺 Xbox Controller [AUR]") in *Steam*) present_terminal omarchy-install-steam ;; + *GeForce*) present_terminal omarchy-install-geforce-now ;; *RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;; *Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;; *Xbox*) present_terminal omarchy-install-xbox-controllers ;; @@ -431,11 +427,12 @@ show_install_elixir_menu() { } show_remove_menu() { - case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in + case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n󰏓 Preinstalls\n Dictation\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 ;; *Development*) show_remove_development_menu ;; + *Preinstalls*) present_terminal omarchy-remove-all ;; *Dictation*) present_terminal omarchy-voxtype-remove ;; *Theme*) present_terminal omarchy-theme-remove ;; *Windows*) present_terminal "omarchy-windows-vm remove" ;; @@ -490,7 +487,7 @@ show_remove_elixir_menu() { } show_update_menu() { - case $(menu "Update" " Omarchy\n󰔫 Channel\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in + case $(menu "Update" "  Omarchy\n󰔫 Channel\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in *Omarchy*) present_terminal omarchy-update ;; *Channel*) show_update_channel_menu ;; *Config*) show_update_config_menu ;; @@ -506,8 +503,9 @@ show_update_menu() { } show_update_channel_menu() { - case $(menu "Update channel" "🟢 Stable\n🟡 Edge\n🔴 Dev") in + case $(menu "Update channel" "🟢 Stable\n🟡 RC\n🟠 Edge\n🔴 Dev") in *Stable*) present_terminal "omarchy-channel-set stable" ;; + *RC*) present_terminal "omarchy-channel-set rc" ;; *Edge*) present_terminal "omarchy-channel-set edge" ;; *Dev*) present_terminal "omarchy-channel-set dev" ;; *) show_update_menu ;; @@ -555,6 +553,10 @@ show_update_password_menu() { esac } +show_about() { + omarchy-launch-about +} + show_system_menu() { local options=" Lock\n󱄄 Screensaver" [ -f ~/.local/state/omarchy/toggles/suspend-on ] && options="$options\n󰒲 Suspend" @@ -592,7 +594,7 @@ go_to_menu() { *install*) show_install_menu ;; *remove*) show_remove_menu ;; *update*) show_update_menu ;; - *about*) omarchy-launch-about ;; + *about*) show_about ;; *system*) show_system_menu ;; esac } diff --git a/bin/omarchy-pkg-aur-install b/bin/omarchy-pkg-aur-install index 8fb849c0..8157209d 100755 --- a/bin/omarchy-pkg-aur-install +++ b/bin/omarchy-pkg-aur-install @@ -19,8 +19,8 @@ fzf_args=( pkg_names=$(yay -Slqa | fzf "${fzf_args[@]}") if [[ -n "$pkg_names" ]]; then - # Convert newline-separated selections to space-separated for yay - echo "$pkg_names" | tr '\n' ' ' | xargs yay -S --noconfirm + # Add aur/ prefix to each package name and convert to space-separated for yay + echo "$pkg_names" | sed 's/^/aur\//' | tr '\n' ' ' | xargs yay -S --noconfirm sudo updatedb omarchy-show-done fi diff --git a/bin/omarchy-refresh-pacman b/bin/omarchy-refresh-pacman index 3cffd226..49983ccd 100755 --- a/bin/omarchy-refresh-pacman +++ b/bin/omarchy-refresh-pacman @@ -7,17 +7,18 @@ sudo cp -f /etc/pacman.conf /etc/pacman.conf.bak sudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak -if [[ $1 == "edge" ]]; then - sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-edge.conf /etc/pacman.conf - sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-edge /etc/pacman.d/mirrorlist - echo "Setting channel to edge" -else - sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-stable.conf /etc/pacman.conf - sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-stable /etc/pacman.d/mirrorlist - echo "Setting channel to stable" +channel="${1:-stable}" + +if [[ "$channel" != "stable" && "$channel" != "rc" && "$channel" != "edge" ]]; then + echo "Error: Invalid channel '$channel'. Must be one of: stable, rc, edge" + exit 1 fi +echo "Setting channel to $channel" echo +sudo cp -f "$OMARCHY_PATH/default/pacman/pacman-$channel.conf" /etc/pacman.conf +sudo cp -f "$OMARCHY_PATH/default/pacman/mirrorlist-$channel" /etc/pacman.d/mirrorlist + # Reset all package DBs and then update sudo pacman -Syyu --noconfirm diff --git a/bin/omarchy-refresh-tmux b/bin/omarchy-refresh-tmux new file mode 100755 index 00000000..c0f675fb --- /dev/null +++ b/bin/omarchy-refresh-tmux @@ -0,0 +1,6 @@ +#!/bin/bash + +# Overwrite the user tmux config with the Omarchy default and reload tmux. + +omarchy-refresh-config tmux/tmux.conf +tmux source-file ~/.config/tmux/tmux.conf diff --git a/bin/omarchy-refresh-walker b/bin/omarchy-refresh-walker index a08a29cc..dd6900e1 100755 --- a/bin/omarchy-refresh-walker +++ b/bin/omarchy-refresh-walker @@ -5,9 +5,17 @@ # Ensure walker is set to autostart mkdir -p ~/.config/autostart/ cp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/ + +# And restarts if it crashes or is killed +mkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/ +cp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf + systemctl --user daemon-reload +# Refresh configs omarchy-refresh-config walker/config.toml omarchy-refresh-config elephant/calc.toml omarchy-refresh-config elephant/desktopapplications.toml + +# Restart service omarchy-restart-walker diff --git a/bin/omarchy-remove-all b/bin/omarchy-remove-all new file mode 100755 index 00000000..cd143231 --- /dev/null +++ b/bin/omarchy-remove-all @@ -0,0 +1,25 @@ +#!/bin/bash + +# Remove preinstalled Omarchy applications (web apps, TUIs, and selected packages). +# This removes all web apps, TUIs, plus specific desktop applications. + +if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI wrappers, and desktop applications?"; then + echo -e "Removing preinstalled Omarchy applications...\n" + + omarchy-webapp-remove-all + omarchy-tui-remove-all + + omarchy-pkg-drop \ + aether \ + typora \ + spotify \ + libreoffice-fresh \ + 1password-beta \ + 1password-cli \ + xournalpp \ + signal-desktop \ + pinta \ + obsidian \ + obs-studio \ + kdenlive +fi diff --git a/bin/omarchy-remove-dev-env b/bin/omarchy-remove-dev-env index d2320149..2431a09a 100755 --- a/bin/omarchy-remove-dev-env +++ b/bin/omarchy-remove-dev-env @@ -1,5 +1,8 @@ #!/bin/bash +# Remove a development environment that was previously installed via omarchy-install-dev-env. +# Usage: omarchy-remove-dev-env + if [[ -z "$1" ]]; then echo "Usage: omarchy-remove-dev-env " >&2 exit 1 diff --git a/bin/omarchy-reset-sudo b/bin/omarchy-reset-sudo index 94822623..2c568469 100755 --- a/bin/omarchy-reset-sudo +++ b/bin/omarchy-reset-sudo @@ -1,4 +1,7 @@ #!/bin/bash +# Reset the sudo lockout/faillock for the current user. +# This clears any failed authentication attempts that may have locked the user out. + # Resetting sudo lockout for user su -c "faillock --reset --user $USER" diff --git a/bin/omarchy-restart-app b/bin/omarchy-restart-app index 4cc474fa..6e0a46ad 100755 --- a/bin/omarchy-restart-app +++ b/bin/omarchy-restart-app @@ -1,4 +1,7 @@ #!/bin/bash +# Restart an application by killing it and relaunching via uwsm. +# Usage: omarchy-restart-app + pkill -x $1 setsid uwsm-app -- $1 >/dev/null 2>&1 & diff --git a/bin/omarchy-restart-bluetooth b/bin/omarchy-restart-bluetooth index 1d3c6c11..57530d10 100755 --- a/bin/omarchy-restart-bluetooth +++ b/bin/omarchy-restart-bluetooth @@ -1,5 +1,7 @@ #!/bin/bash +# Unblock and restart the bluetooth service. + echo -e "Unblocking bluetooth...\n" rfkill unblock bluetooth rfkill list bluetooth diff --git a/bin/omarchy-restart-hypridle b/bin/omarchy-restart-hypridle index 261f0aa3..02186267 100755 --- a/bin/omarchy-restart-hypridle +++ b/bin/omarchy-restart-hypridle @@ -1,3 +1,5 @@ #!/bin/bash +# Restart the hypridle service (used for idle detection and auto-lock). + omarchy-restart-app hypridle diff --git a/bin/omarchy-restart-hyprsunset b/bin/omarchy-restart-hyprsunset index 0e681bfd..c705ab53 100755 --- a/bin/omarchy-restart-hyprsunset +++ b/bin/omarchy-restart-hyprsunset @@ -1,3 +1,5 @@ #!/bin/bash +# Restart the hyprsunset service (used for blue light filtering/night light). + omarchy-restart-app hyprsunset diff --git a/bin/omarchy-restart-opencode b/bin/omarchy-restart-opencode index 2ff22d3e..086eba9f 100755 --- a/bin/omarchy-restart-opencode +++ b/bin/omarchy-restart-opencode @@ -2,4 +2,6 @@ # Reload opencode configuration (used by the Omarchy theme switching). -killall -SIGUSR2 opencode +if pgrep -x opencode >/dev/null; then + killall -SIGUSR2 opencode +fi diff --git a/bin/omarchy-restart-pipewire b/bin/omarchy-restart-pipewire index f26ee09e..a222ad1e 100755 --- a/bin/omarchy-restart-pipewire +++ b/bin/omarchy-restart-pipewire @@ -1,4 +1,6 @@ #!/bin/bash +# Restart the PipeWire audio service to fix audio issues or apply new configuration. + echo -e "Restarting pipewire audio service...\n" systemctl --user restart pipewire.service diff --git a/bin/omarchy-restart-wifi b/bin/omarchy-restart-wifi index b4d66a5a..5cf35dd3 100755 --- a/bin/omarchy-restart-wifi +++ b/bin/omarchy-restart-wifi @@ -1,5 +1,7 @@ #!/bin/bash +# Unblock and restart the Wi-Fi service. + echo -e "Unblocking wifi...\n" rfkill unblock wifi rfkill list wifi diff --git a/bin/omarchy-restart-xcompose b/bin/omarchy-restart-xcompose index 45f7d9a8..dcbd237f 100755 --- a/bin/omarchy-restart-xcompose +++ b/bin/omarchy-restart-xcompose @@ -1,3 +1,5 @@ #!/bin/bash +# Restart the XCompose input method service (fcitx5) to apply new compose key settings. + omarchy-restart-app fcitx5 diff --git a/bin/omarchy-setup-fingerprint b/bin/omarchy-setup-fingerprint index 105234ff..22a164ef 100755 --- a/bin/omarchy-setup-fingerprint +++ b/bin/omarchy-setup-fingerprint @@ -58,11 +58,13 @@ EOF add_hyprlock_fingerprint_icon() { print_info "Adding fingerprint icon to hyprlock placeholder text..." sed -i 's/placeholder_text = .*/placeholder_text = Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf + sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf } remove_hyprlock_fingerprint_icon() { print_info "Removing fingerprint icon from hyprlock placeholder text..." sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf + sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf } remove_pam_config() { diff --git a/bin/omarchy-show-done b/bin/omarchy-show-done index de5fe2ab..36f5aec2 100755 --- a/bin/omarchy-show-done +++ b/bin/omarchy-show-done @@ -1,4 +1,7 @@ #!/bin/bash +# Display a "Done!" message with a spinner and wait for user to press any key. +# Used by various install scripts to indicate completion. + echo gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s' diff --git a/bin/omarchy-show-logo b/bin/omarchy-show-logo index fbaf38df..a6137c58 100755 --- a/bin/omarchy-show-logo +++ b/bin/omarchy-show-logo @@ -1,5 +1,8 @@ #!/bin/bash +# Display the Omarchy logo in the terminal using green color. +# Used by various presentation scripts to show branding. + clear echo -e "\033[32m" cat <~/.local/share/omarchy/logo.txt diff --git a/bin/omarchy-snapshot b/bin/omarchy-snapshot index ee79512a..d9f4c2d3 100755 --- a/bin/omarchy-snapshot +++ b/bin/omarchy-snapshot @@ -31,4 +31,6 @@ create) restore) sudo limine-snapper-restore ;; +delete) + sudo snapper -c "$config" delete 0 esac diff --git a/bin/omarchy-state b/bin/omarchy-state index d55943b6..884b6d94 100755 --- a/bin/omarchy-state +++ b/bin/omarchy-state @@ -1,5 +1,9 @@ #!/bin/bash +# Manage persistent state files for Omarchy toggles and settings. +# Usage: omarchy-state +# Used to track whether features like suspend, idle lock, etc are enabled or disabled. + STATE_DIR="$HOME/.local/state/omarchy" mkdir -p "$STATE_DIR" diff --git a/bin/omarchy-theme-refresh b/bin/omarchy-theme-refresh new file mode 100755 index 00000000..e967f289 --- /dev/null +++ b/bin/omarchy-theme-refresh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Refresh the current theme from its templates. + +THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name" + +if [[ -f $THEME_NAME_PATH ]]; then + omarchy-theme-set "$(cat $THEME_NAME_PATH)" +fi diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index ba34a501..b58c7773 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -57,6 +57,7 @@ omarchy-theme-set-gnome omarchy-theme-set-browser omarchy-theme-set-vscode omarchy-theme-set-obsidian +omarchy-theme-set-asusctl # Call hook on theme set omarchy-hook theme-set "$THEME_NAME" diff --git a/bin/omarchy-theme-set-asusctl b/bin/omarchy-theme-set-asusctl new file mode 100755 index 00000000..d202e03d --- /dev/null +++ b/bin/omarchy-theme-set-asusctl @@ -0,0 +1,7 @@ +#!/bin/bash + +ASUSCTL_THEME=~/.config/omarchy/current/theme/asusctl.rgb + +if omarchy-cmd-present asusctl; then + asusctl aura effect static -c $(sed 's/^#//' $ASUSCTL_THEME) +fi diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index 0b4eff6a..0ff87091 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -2,7 +2,7 @@ CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme -if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy-cmd-present brave; then +if omarchy-cmd-present chromium || omarchy-cmd-present brave; then if [[ -f $CHROMIUM_THEME ]]; then THEME_RGB_COLOR=$(<$CHROMIUM_THEME) THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) @@ -13,14 +13,8 @@ if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy 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" >/dev/null - - if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then - chromium --no-startup-window --set-color-scheme="light" >/dev/null - else - chromium --no-startup-window --set-color-scheme="dark" >/dev/null - fi + echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null + chromium --refresh-platform-policy --no-startup-window >/dev/null fi if omarchy-cmd-present brave; then diff --git a/bin/omarchy-toggle-hybrid-gpu b/bin/omarchy-toggle-hybrid-gpu index 65ff3265..2667933a 100755 --- a/bin/omarchy-toggle-hybrid-gpu +++ b/bin/omarchy-toggle-hybrid-gpu @@ -7,7 +7,6 @@ if omarchy-cmd-missing supergfxctl; then omarchy-pkg-add supergfxctl sudo systemctl enable supergfxd - sudo systemctl start supergfxd # Needed to deal with restoring to sleep where going through VFIO first means we don't need to reboot. sudo sed -i "s/\"vfio_enable\": \".*\"/\"vfio_enable\": true/" /etc/supergfxd.conf diff --git a/bin/omarchy-tui-remove-all b/bin/omarchy-tui-remove-all new file mode 100755 index 00000000..8a696d84 --- /dev/null +++ b/bin/omarchy-tui-remove-all @@ -0,0 +1,36 @@ +#!/bin/bash + +# Remove all TUIs installed via omarchy-tui-install. +# Identifies TUIs by their Exec pattern (xdg-terminal-exec --app-id=TUI.). + +set -e + +APP_DIR="${1:-$HOME/.local/share/applications}" +ICON_DIR="$HOME/.local/share/applications/icons" + +echo "Scanning for TUIs in $APP_DIR..." + +tui_desktop_files=() +while IFS= read -r -d '' file; do + if grep -q "Exec=xdg-terminal-exec --app-id=TUI\." "$file" 2>/dev/null; then + tui_desktop_files+=("$file") + fi +done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null) + +if [[ ${#tui_desktop_files[@]} -eq 0 ]]; then + echo "No TUIs found." + exit 0 +fi + +for file in "${tui_desktop_files[@]}"; do + app_name=$(basename "$file" .desktop) + echo "Removing TUI: $app_name" + rm -f "$file" + rm -f "$ICON_DIR/$app_name.png" +done + +if command -v update-desktop-database &>/dev/null; then + update-desktop-database "$APP_DIR" &>/dev/null || true +fi + +echo "TUIs removed successfully." diff --git a/bin/omarchy-update b/bin/omarchy-update index 7b800005..a250166c 100755 --- a/bin/omarchy-update +++ b/bin/omarchy-update @@ -2,7 +2,7 @@ set -e -trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m"' ERR +trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m";omarchy-snapshot delete' ERR if [[ $1 == "-y" ]] || omarchy-update-confirm; then omarchy-snapshot create || [ $? -eq 127 ] diff --git a/bin/omarchy-update-aur-pkgs b/bin/omarchy-update-aur-pkgs index 0e5c9d53..0dee5edf 100755 --- a/bin/omarchy-update-aur-pkgs +++ b/bin/omarchy-update-aur-pkgs @@ -4,7 +4,7 @@ if pacman -Qem >/dev/null; then if omarchy-pkg-aur-accessible; then echo -e "\e[32m\nUpdate AUR packages\e[0m" - yay -Sua --noconfirm --ignore gcc14,gcc14-libs + yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs echo else echo -e "\e[31m\nAUR is unavailable (so skipping updates)\e[0m" diff --git a/bin/omarchy-update-firmware b/bin/omarchy-update-firmware index 10e490f4..6eb1a088 100755 --- a/bin/omarchy-update-firmware +++ b/bin/omarchy-update-firmware @@ -7,5 +7,5 @@ if omarchy-cmd-missing fwupdmgr; then omarchy-pkg-add fwupd fi -fwupdmgr refresh +fwupdmgr refresh --force sudo fwupdmgr update diff --git a/bin/omarchy-version-channel b/bin/omarchy-version-channel index 8affb87e..76233513 100755 --- a/bin/omarchy-version-channel +++ b/bin/omarchy-version-channel @@ -2,6 +2,8 @@ if grep -q "https://stable-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then mirror="stable" +elif grep -q "https://rc-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then + mirror="rc" elif grep -q "https://mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then mirror="edge" else @@ -12,6 +14,8 @@ if grep -q "https://pkgs.omarchy.org/stable/" /etc/pacman.conf; then pkgs="stable" elif grep -q "https://pkgs.omarchy.org/edge/" /etc/pacman.conf; then pkgs="edge" +elif grep -q "https://pkgs.omarchy.org/rc/" /etc/pacman.conf; then + pkgs="rc" else pkgs="unknown" fi diff --git a/bin/omarchy-webapp-remove-all b/bin/omarchy-webapp-remove-all new file mode 100755 index 00000000..9cb8f4e3 --- /dev/null +++ b/bin/omarchy-webapp-remove-all @@ -0,0 +1,36 @@ +#!/bin/bash + +# Remove all web apps installed via omarchy-webapp-install. +# Identifies web apps by their Exec pattern (omarchy-launch-webapp or omarchy-webapp-handler). + +set -e + +APP_DIR="${1:-$HOME/.local/share/applications}" +ICON_DIR="$HOME/.local/share/applications/icons" + +echo "Scanning for web apps in $APP_DIR..." + +webapp_desktop_files=() +while IFS= read -r -d '' file; do + if grep -q "Exec=omarchy-launch-webapp\|Exec=omarchy-webapp-handler" "$file" 2>/dev/null; then + webapp_desktop_files+=("$file") + fi +done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null) + +if [[ ${#webapp_desktop_files[@]} -eq 0 ]]; then + echo "No web apps found." + exit 0 +fi + +for file in "${webapp_desktop_files[@]}"; do + app_name=$(basename "$file" .desktop) + echo "Removing web app: $app_name" + rm -f "$file" + rm -f "$ICON_DIR/$app_name.png" +done + +if command -v update-desktop-database &>/dev/null; then + update-desktop-database "$APP_DIR" &>/dev/null || true +fi + +echo "Web apps removed successfully." diff --git a/bin/omarchy-wifi-powersave b/bin/omarchy-wifi-powersave new file mode 100755 index 00000000..9e1c5bbe --- /dev/null +++ b/bin/omarchy-wifi-powersave @@ -0,0 +1,5 @@ +#!/bin/bash +for iface in /sys/class/net/*/wireless; do + iface="$(basename "$(dirname "$iface")")" + iw dev "$iface" set power_save "$1" 2>/dev/null +done diff --git a/bin/omarchy-windows-vm b/bin/omarchy-windows-vm index 66cc296c..4fe877f3 100755 --- a/bin/omarchy-windows-vm +++ b/bin/omarchy-windows-vm @@ -185,6 +185,8 @@ services: DISK_SIZE: "$SELECTED_DISK" USERNAME: "$USERNAME" PASSWORD: "$PASSWORD" + TZ: "$(timedatectl show -p Timezone --value 2>/dev/null || echo UTC)" + ARGUMENTS: "-rtc base=localtime,clock=host,driftfix=slew" devices: - /dev/kvm - /dev/net/tun @@ -240,6 +242,11 @@ EOF } remove_windows() { + if ! gum confirm --default=false "Remove Windows VM and delete all associated data?"; then + echo "Removal cancelled by user" + exit 1 + fi + echo "Removing Windows VM..." docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true diff --git a/boot.sh b/boot.sh index c36b0893..0ab69d5b 100755 --- a/boot.sh +++ b/boot.sh @@ -28,12 +28,10 @@ git clone "https://github.com/${OMARCHY_REPO}.git" ~/.local/share/omarchy >/dev/ # Use custom branch if instructed, otherwise default to master OMARCHY_REF="${OMARCHY_REF:-master}" -if [[ $OMARCHY_REF != "master" ]]; then - echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m" - cd ~/.local/share/omarchy - git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}" - cd - -fi +echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m" +cd ~/.local/share/omarchy +git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}" +cd - # Set edge mirror for dev installs if [[ $OMARCHY_REF == "dev" ]]; then diff --git a/config/brave-flags.conf b/config/brave-flags.conf index bce00d52..88c8082b 100644 --- a/config/brave-flags.conf +++ b/config/brave-flags.conf @@ -2,5 +2,3 @@ --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/chromium-flags.conf b/config/chromium-flags.conf index bce00d52..88c8082b 100644 --- a/config/chromium-flags.conf +++ b/config/chromium-flags.conf @@ -2,5 +2,3 @@ --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/symbols.toml b/config/elephant/symbols.toml new file mode 100644 index 00000000..3144c152 --- /dev/null +++ b/config/elephant/symbols.toml @@ -0,0 +1 @@ +command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"' diff --git a/config/ghostty/config b/config/ghostty/config index 4360f279..d53f5c32 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -32,3 +32,6 @@ keybind = super+control+shift+alt+arrow_right=resize_split:right,100 # Slowdown mouse scrolling mouse-scroll-multiplier = 0.95 + +# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224) +async-backend = epoll diff --git a/config/hypr/bindings.conf b/config/hypr/bindings.conf index f7770dd8..9af5a3b2 100644 --- a/config/hypr/bindings.conf +++ b/config/hypr/bindings.conf @@ -1,6 +1,8 @@ # Application bindings bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" +bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window +bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)" bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify @@ -23,6 +25,9 @@ bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Goo 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" +# Add extra bindings +# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server + # Overwrite existing bindings, like putting Omarchy Menu on Super + Space # unbind = SUPER, SPACE # bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu diff --git a/config/hypr/hyprlock.conf b/config/hypr/hyprlock.conf index f7a939c0..9550b656 100644 --- a/config/hypr/hyprlock.conf +++ b/config/hypr/hyprlock.conf @@ -39,5 +39,5 @@ input-field { } auth { - fingerprint:enabled = true + fingerprint:enabled = false } diff --git a/config/hypr/input.conf b/config/hypr/input.conf index c536e618..951dc1de 100644 --- a/config/hypr/input.conf +++ b/config/hypr/input.conf @@ -3,6 +3,10 @@ input { # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt # kb_layout = us,dk,eu + + # Use a specific keyboard variant if needed (e.g. intl for international keyboards) + # kb_variant = intl + kb_options = compose:caps # ,grp:alts_toggle # Change speed of keyboard repeat diff --git a/config/omarchy/extensions/menu.sh b/config/omarchy/extensions/menu.sh index 743002ba..76857c15 100644 --- a/config/omarchy/extensions/menu.sh +++ b/config/omarchy/extensions/menu.sh @@ -12,3 +12,9 @@ # *) back_to show_main_menu ;; # esac # } +# +# Example of overriding just the about menu action: (Using zsh instead of bash (default)) +# +# show_about() { +# exec omarchy-launch-or-focus-tui "zsh -c 'fastfetch; read -k 1'" +# } diff --git a/config/opencode/opencode.json b/config/opencode/opencode.json index a03a5cb0..4fbe31f9 100644 --- a/config/opencode/opencode.json +++ b/config/opencode/opencode.json @@ -1,4 +1,5 @@ { "$schema": "https://opencode.ai/config.json", - "theme": "system" + "theme": "system", + "autoupdate": false } diff --git a/config/swayosd/config.toml b/config/swayosd/config.toml index 598c1f22..759cbe1f 100644 --- a/config/swayosd/config.toml +++ b/config/swayosd/config.toml @@ -1,4 +1,4 @@ [server] show_percentage = true max_volume = 100 -style = "./style.css" +style = "~/.config/swayosd/style.css" diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf new file mode 100644 index 00000000..79df1da5 --- /dev/null +++ b/config/tmux/tmux.conf @@ -0,0 +1,95 @@ +# Prefix +set -g prefix C-Space +set -g prefix2 C-b +bind C-Space send-prefix + +# Reload config +bind q source-file ~/.config/tmux/tmux.conf + +# Vi mode for copy +setw -g mode-keys vi +bind -T copy-mode-vi v send -X begin-selection +bind -T copy-mode-vi y send -X copy-selection-and-cancel + +# Pane Controls +bind h split-window -h -c "#{pane_current_path}" +bind v split-window -v -c "#{pane_current_path}" +bind -n C-M-PageUp split-window -h -c "#{pane_current_path}" +bind -n C-M-PageDown split-window -v -c "#{pane_current_path}" +bind -n C-M-Home split-window -h -c "#{pane_current_path}" +bind -n C-M-End kill-pane + +bind -n C-M-Left select-pane -L +bind -n C-M-Right select-pane -R +bind -n C-M-Up select-pane -U +bind -n C-M-Down select-pane -D + +bind -n C-M-S-Left resize-pane -L 5 +bind -n C-M-S-Down resize-pane -D 5 +bind -n C-M-S-Up resize-pane -U 5 +bind -n C-M-S-Right resize-pane -R 5 + +# Window navigation +bind r command-prompt -I "#W" "rename-window -- '%%'" +bind c new-window -c "#{pane_current_path}" +bind x kill-window +bind -n C-S-Home new-window -c "#{pane_current_path}" +bind -n C-S-End kill-window + +bind -n C-S-PageUp next-window +bind -n C-S-PageDown previous-window + +bind -n M-1 select-window -t 1 +bind -n M-2 select-window -t 2 +bind -n M-3 select-window -t 3 +bind -n M-4 select-window -t 4 +bind -n M-5 select-window -t 5 +bind -n M-6 select-window -t 6 +bind -n M-7 select-window -t 7 +bind -n M-8 select-window -t 8 +bind -n M-9 select-window -t 9 + +# Session controls +bind R command-prompt -I "#S" "rename-session -- '%%'" +bind C new-session +bind X kill-session +bind -n C-M-S-Home new-session -c "#{pane_current_path}" +bind -n C-M-S-End kill-session + +bind -n C-M-S-PageUp switch-client -p +bind -n C-M-S-PageDown switch-client -n + +# General +set -g default-terminal "tmux-256color" +set -ag terminal-overrides ",*:RGB" +set -g mouse on +set -g base-index 1 +setw -g pane-base-index 1 +set -g renumber-windows on +set -g history-limit 50000 +set -g escape-time 0 +set -g focus-events on +set -g set-clipboard on +set -g allow-passthrough on +setw -g aggressive-resize on +set -g detach-on-destroy off + +# Status bar +set -g status-position top +set -g status-interval 5 +set -g status-left-length 30 +set -g status-right-length 50 +set -g window-status-separator "" + +# Theme +set -g status-style "bg=default,fg=default" +set -g status-left "#[fg=black,bg=blue,bold] #S #[bg=default] " +set -g status-right "#[fg=blue]#{?client_prefix,PREFIX ,}#[fg=brightblack]#h " +set -g window-status-format "#[fg=brightblack] #I:#W " +set -g window-status-current-format "#[fg=blue,bold] #I:#W " +set -g pane-border-style "fg=brightblack" +set -g pane-active-border-style "fg=blue" +set -g message-style "bg=default,fg=blue" +set -g message-command-style "bg=default,fg=blue" +set -g mode-style "bg=blue,fg=black" +setw -g clock-mode-colour blue diff --git a/config/wiremix/wiremix.toml b/config/wiremix/wiremix.toml new file mode 100644 index 00000000..07f9747c --- /dev/null +++ b/config/wiremix/wiremix.toml @@ -0,0 +1,5 @@ +# overwrites default wiremix configuration +# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml + +[char_sets.default] +default_device = "⮞" diff --git a/default/bash/aliases b/default/bash/aliases index 8e485a35..5a6d086c 100644 --- a/default/bash/aliases +++ b/default/bash/aliases @@ -7,6 +7,7 @@ if command -v eza &> /dev/null; then fi alias ff="fzf --preview 'bat --style=numbers --color=always {}'" +alias eff='$EDITOR $(ff)' if command -v zoxide &> /dev/null; then alias cd="zd" @@ -21,9 +22,9 @@ if command -v zoxide &> /dev/null; then } fi -open() { +open() ( xdg-open "$@" >/dev/null 2>&1 & -} +) # Directories alias ..='cd ..' @@ -34,6 +35,7 @@ alias ....='cd ../../..' alias c='opencode' alias d='docker' alias r='rails' +alias t='tmux attach || tmux new -s Work' n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; } # Git diff --git a/default/bash/functions b/default/bash/functions index ee6b7a54..ec144b8e 100644 --- a/default/bash/functions +++ b/default/bash/functions @@ -4,15 +4,33 @@ alias decompress="tar -xzf" # Write iso file to sd card iso2sd() { - if [ $# -ne 2 ]; then - echo "Usage: iso2sd " + if [[ $# -lt 1 ]]; then + echo "Usage: iso2sd [output_device]" echo "Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda" - echo -e "\nAvailable SD cards:" - lsblk -d -o NAME | grep -E '^sd[a-z]' | awk '{print "/dev/"$1}' - else - sudo dd bs=4M status=progress oflag=sync if="$1" of="$2" - sudo eject $2 + return 1 fi + + local iso="$1" + local drive="$2" + + if [[ -z $drive ]]; then + local available_sds=$(lsblk -dpno NAME | grep -E '/dev/sd') + + if [[ -z $available_sds ]]; then + echo "No SD drives found and no drive specified" + return 1 + fi + + drive=$(omarchy-drive-select "$available_sds") + + if [[ -z $drive ]]; then + echo "No drive selected" + return 1 + fi + fi + + sudo dd bs=4M status=progress oflag=sync if="$iso" of="$drive" + sudo eject "$drive" } # Format an entire drive for a single partition using exFAT @@ -87,3 +105,62 @@ img2png() { -define png:exclude-chunk=all \ "${img%.*}-optimized.png" } + +# SSH Port Forwarding Functions +fip() { + [[ $# -lt 2 ]] && echo "Usage: fip [port2] ..." && return 1 + local host="$1" + shift + for port in "$@"; do + ssh -f -N -L "$port:localhost:$port" "$host" && echo "Forwarding localhost:$port -> $host:$port" + done +} + +dip() { + [[ $# -eq 0 ]] && echo "Usage: dip [port2] ..." && return 1 + for port in "$@"; do + pkill -f "ssh.*-L $port:localhost:$port" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port" + done +} + +lip() { + pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards" +} + +# Create a tmux layout for dev with editor, ai, and terminal +tml() { + local current_dir="${PWD}" + local editor_pane ai_pane + local ai="$1" + + # Get current pane ID (will become editor pane after splits) + editor_pane=$(tmux display-message -p '#{pane_id}') + + # Split window vertically - top 85%, bottom 15% + tmux split-window -v -p 15 -c "$current_dir" + + # Go back to top pane (editor_pane) and split it horizontally + tmux select-pane -t "$editor_pane" + tmux split-window -h -p 30 -c "$current_dir" + + # After horizontal split, cursor is in the right pane (new pane) + # Get its ID and run ai there + ai_pane=$(tmux display-message -p '#{pane_id}') + tmux send-keys -t "$ai_pane" "$ai" C-m + + # Run nvim in the left pane + tmux send-keys -t "$editor_pane" "$EDITOR ." C-m + + # Select the nvim pane for focus + tmux select-pane -t "$editor_pane" +} + +# Create a dev layout using tmux with editor, opencode, and terminal +nic() { + tml c +} + +# Create a dev layout using tmux with editor, claude, and terminal +nicx() { + tml cx +} diff --git a/default/bash/init b/default/bash/init index e9228edb..dba369e0 100644 --- a/default/bash/init +++ b/default/bash/init @@ -3,6 +3,9 @@ if command -v mise &> /dev/null; then fi if command -v starship &> /dev/null; then + # clear stale readline state before rendering prompt (prevents artifacts in prompt after abnormal exits like SIGQUIT) + __sanitize_prompt() { printf '\r\033[K'; } + PROMPT_COMMAND="__sanitize_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND}" eval "$(starship init bash)" fi diff --git a/default/bashrc b/default/bashrc index eaf13c66..77e8d27b 100644 --- a/default/bashrc +++ b/default/bashrc @@ -9,3 +9,4 @@ source ~/.local/share/omarchy/default/bash/rc # # Make an alias for invoking commands you use constantly # alias p='python' +# alias cx="claude --permission-mode=plan --allow-dangerously-skip-permissions" diff --git a/default/hypr/apps.conf b/default/hypr/apps.conf index 354339de..f6946ad1 100644 --- a/default/hypr/apps.conf +++ b/default/hypr/apps.conf @@ -9,7 +9,9 @@ source = ~/.local/share/omarchy/default/hypr/apps/pip.conf source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf source = ~/.local/share/omarchy/default/hypr/apps/steam.conf +source = ~/.local/share/omarchy/default/hypr/apps/geforce.conf source = ~/.local/share/omarchy/default/hypr/apps/system.conf +source = ~/.local/share/omarchy/default/hypr/apps/telegram.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/bitwarden.conf b/default/hypr/apps/bitwarden.conf index 974aa28c..4cf5e7d7 100644 --- a/default/hypr/apps/bitwarden.conf +++ b/default/hypr/apps/bitwarden.conf @@ -1,2 +1,6 @@ windowrule = no_screen_share on, match:class ^(Bitwarden)$ windowrule = tag +floating-window, match:class ^(Bitwarden)$ + +# Bitwarden Chrome Extension +windowrule = no_screen_share on, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default +windowrule = tag +floating-window, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default \ No newline at end of file diff --git a/default/hypr/apps/browser.conf b/default/hypr/apps/browser.conf index 2b44576b..7f30ba38 100644 --- a/default/hypr/apps/browser.conf +++ b/default/hypr/apps/browser.conf @@ -1,13 +1,16 @@ # Browser types windowrule = tag +chromium-based-browser, match:class ((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium) windowrule = tag +firefox-based-browser, match:class ([fF]irefox|zen|librewolf) +windowrule = tag -default-opacity, match:tag chromium-based-browser +windowrule = tag -default-opacity, match:tag firefox-based-browser + +# Video apps: remove chromium browser tag so they don't get opacity applied +windowrule = tag -chromium-based-browser, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default) +windowrule = tag -default-opacity, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default) # Force chromium-based browsers into a tile to deal with --app bug windowrule = tile on, match:tag chromium-based-browser # Only a subtle opacity change, but not for video sites -windowrule = opacity 1 0.97, match:tag chromium-based-browser -windowrule = opacity 1 0.97, match:tag firefox-based-browser - -# Some video sites should never have opacity applied to them -windowrule = opacity 1.0 1.0, match:initial_title ((?i)(?:[a-z0-9-]+\.)*youtube\.com_/|app\.zoom\.us_/wc/home) +windowrule = opacity 1.0 0.97, match:tag chromium-based-browser +windowrule = opacity 1.0 0.97, match:tag firefox-based-browser diff --git a/default/hypr/apps/geforce.conf b/default/hypr/apps/geforce.conf new file mode 100644 index 00000000..fb2e5a30 --- /dev/null +++ b/default/hypr/apps/geforce.conf @@ -0,0 +1,5 @@ +windowrule { + name = geforce + match:class = GeForceNOW + idle_inhibit = fullscreen +} diff --git a/default/hypr/apps/jetbrains.conf b/default/hypr/apps/jetbrains.conf index d045f823..5b73bce4 100644 --- a/default/hypr/apps/jetbrains.conf +++ b/default/hypr/apps/jetbrains.conf @@ -1,22 +1,41 @@ # Fix splash screen showing in weird places and prevent annoying focus takeovers -windowrule = tag +jetbrains-splash, match:class ^(jetbrains-.*)$, match:title ^(splash)$, match:float 1 -windowrule = center on, match:tag jetbrains-splash -windowrule = no_focus on, match:tag jetbrains-splash -windowrule = border_size 0, match:tag jetbrains-splash +windowrule { + name = jetbrains-splash + match:class = ^(jetbrains-.*)$ + match:title = ^(splash)$ + match:float = 1 + tag = +jetbrains-splash + center = on + no_focus = on + border_size = 0 +} # Center popups/find windows -windowrule = tag +jetbrains, match:class ^(jetbrains-.*), match:title ^()$, match:float 1 -windowrule = center on, match:tag jetbrains - -# Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.) -windowrule = stay_focused on, match:tag jetbrains -windowrule = border_size 0, match:tag jetbrains - -# For some reason tag:jetbrains does not work for size rule -windowrule = min_size (monitor_w*0.5) (monitor_h*0.5), match:class ^(jetbrains-.*), match:title ^()$, match:float 1 +windowrule { + name = jetbrains-popup + match:class = ^(jetbrains-.*) + match:title = ^()$ + match:float = 1 + tag = +jetbrains + center = on + # Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.) + stay_focused = on + border_size = 0 + min_size = (monitor_w*0.5) (monitor_h*0.5) + } # Disable window flicker when autocomplete or tooltips appear -windowrule = no_initial_focus on, match:class ^(jetbrains-.*)$, match:title ^(win.*)$, match:float 1 +windowrule { + name = jetbrains-tooltip + match:class = ^(jetbrains-.*)$ + match:title = ^(win.*)$ + match:float = 1 + no_initial_focus = on +} # Disable mouse focus -windowrule = no_follow_mouse on, match:class ^(jetbrains-.*)$ +windowrule { + name = jetbrains-focus + no_follow_mouse = on + match:class = ^(jetbrains-.*)$ +} diff --git a/default/hypr/apps/pip.conf b/default/hypr/apps/pip.conf index e5b45d56..417edc91 100644 --- a/default/hypr/apps/pip.conf +++ b/default/hypr/apps/pip.conf @@ -1,5 +1,6 @@ # Picture-in-picture overlays windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture) +windowrule = tag -default-opacity, match:tag pip windowrule = float on, match:tag pip windowrule = pin on, match:tag pip windowrule = size 600 338, match:tag pip diff --git a/default/hypr/apps/qemu.conf b/default/hypr/apps/qemu.conf index acc32a4a..6dcce0e0 100644 --- a/default/hypr/apps/qemu.conf +++ b/default/hypr/apps/qemu.conf @@ -1 +1,2 @@ +windowrule = tag -default-opacity, match:class qemu windowrule = opacity 1 1, match:class qemu diff --git a/default/hypr/apps/retroarch.conf b/default/hypr/apps/retroarch.conf index f3b046f9..556f0fd8 100644 --- a/default/hypr/apps/retroarch.conf +++ b/default/hypr/apps/retroarch.conf @@ -1,3 +1,4 @@ windowrule = fullscreen on, match:class com.libretro.RetroArch +windowrule = tag -default-opacity, match:class com.libretro.RetroArch windowrule = opacity 1 1, match:class com.libretro.RetroArch windowrule = idle_inhibit fullscreen, match:class com.libretro.RetroArch diff --git a/default/hypr/apps/steam.conf b/default/hypr/apps/steam.conf index ec4f754d..a42a6e68 100644 --- a/default/hypr/apps/steam.conf +++ b/default/hypr/apps/steam.conf @@ -1,7 +1,8 @@ # Float Steam windowrule = float on, match:class steam windowrule = center on, match:class steam, match:title Steam -windowrule = opacity 1 1, match:class steam +windowrule = tag -default-opacity, match:class steam.* +windowrule = opacity 1 1, match:class steam.* windowrule = size 1100 700, match:class steam, match:title Steam windowrule = size 460 800, match:class steam, match:title Friends List windowrule = idle_inhibit fullscreen, match:class steam diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf index ee6c6b86..702388f2 100644 --- a/default/hypr/apps/system.conf +++ b/default/hypr/apps/system.conf @@ -12,6 +12,7 @@ windowrule = fullscreen on, match:class org.omarchy.screensaver windowrule = float on, match:class org.omarchy.screensaver # No transparency on media windows +windowrule = tag -default-opacity, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$ windowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$ # Popped window rounding diff --git a/default/hypr/apps/telegram.conf b/default/hypr/apps/telegram.conf new file mode 100644 index 00000000..5a621fdb --- /dev/null +++ b/default/hypr/apps/telegram.conf @@ -0,0 +1,2 @@ +# Prevent Telegram from stealing focus on new messages +windowrule = focus_on_activate off, match:class org.telegram.desktop diff --git a/default/hypr/apps/terminals.conf b/default/hypr/apps/terminals.conf index 2bcf0eb6..ead08dde 100644 --- a/default/hypr/apps/terminals.conf +++ b/default/hypr/apps/terminals.conf @@ -1,2 +1,4 @@ # Define terminal tag to style them uniformly windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty) +windowrule = tag -default-opacity, match:tag terminal +windowrule = opacity 0.97 0.9, match:tag terminal diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index c6ab8fab..3c3629fe 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -34,8 +34,7 @@ bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-brightness-display- bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-brightness-display-apple +60000 # Captures -bindd = , PRINT, Screenshot with editing, exec, omarchy-cmd-screenshot -bindd = SHIFT, PRINT, Screenshot to clipboard, exec, omarchy-cmd-screenshot smart clipboard +bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a diff --git a/default/hypr/envs.conf b/default/hypr/envs.conf index 92d15446..85afc775 100644 --- a/default/hypr/envs.conf +++ b/default/hypr/envs.conf @@ -6,7 +6,7 @@ env = HYPRCURSOR_SIZE,24 env = GDK_BACKEND,wayland,x11,* env = QT_QPA_PLATFORM,wayland;xcb env = QT_STYLE_OVERRIDE,kvantum -env = SDL_VIDEODRIVER,wayland +env = SDL_VIDEODRIVER,wayland,x11 env = MOZ_ENABLE_WAYLAND,1 env = ELECTRON_OZONE_PLATFORM_HINT,wayland env = OZONE_PLATFORM,wayland diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index 0279074e..c4df1d51 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -131,9 +131,14 @@ cursor { hide_on_key_press = true } +# Auto toggle scratchpad on switching workspace from scratchpad +binds { + hide_special_on_workspace_change = true +} + # Style Gum confirm to match terminal theme env = GUM_CONFIRM_PROMPT_FOREGROUND,6 # Cyan env = GUM_CONFIRM_SELECTED_FOREGROUND,0 # Black env = GUM_CONFIRM_SELECTED_BACKGROUND,2 # Green -env = GUM_CONFIRM_UNSELECTED_FOREGROUND,0 # Black +env = GUM_CONFIRM_UNSELECTED_FOREGROUND,7 # White env = GUM_CONFIRM_UNSELECTED_BACKGROUND,8 # Dark grey diff --git a/default/hypr/windows.conf b/default/hypr/windows.conf index 5d1afb76..67a9a6a9 100644 --- a/default/hypr/windows.conf +++ b/default/hypr/windows.conf @@ -2,11 +2,14 @@ # Hyprland 0.53+ syntax windowrule = suppress_event maximize, match:class .* -# Just dash of opacity by default -windowrule = opacity 0.97 0.9, match:class .* +# Tag all windows for default opacity (apps can override with -default-opacity tag) +windowrule = tag +default-opacity, match:class .* # Fix some dragging issues with XWayland windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0 -# App-specific tweaks +# App-specific tweaks (may remove default-opacity tag) source = ~/.local/share/omarchy/default/hypr/apps.conf + +# Apply default opacity after apps have had a chance to opt out +windowrule = opacity 0.97 0.9, match:tag default-opacity diff --git a/default/mako/core.ini b/default/mako/core.ini index 0c9a46e8..203d4e8c 100644 --- a/default/mako/core.ini +++ b/default/mako/core.ini @@ -28,3 +28,7 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy [summary~="Learn Keybindings"] on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings' + +[summary~="Screenshot copied & saved"] +max-icon-size=80 +format=%s\n%b diff --git a/default/pacman/mirrorlist-rc b/default/pacman/mirrorlist-rc new file mode 100644 index 00000000..0692a0a1 --- /dev/null +++ b/default/pacman/mirrorlist-rc @@ -0,0 +1 @@ +Server = https://rc-mirror.omarchy.org/$repo/os/$arch diff --git a/default/pacman/pacman-rc.conf b/default/pacman/pacman-rc.conf new file mode 100644 index 00000000..50d2e498 --- /dev/null +++ b/default/pacman/pacman-rc.conf @@ -0,0 +1,30 @@ +# See the pacman.conf(5) manpage for option and repository directives + +[options] +Color +ILoveCandy +VerbosePkgLists +HoldPkg = pacman glibc +Architecture = auto +CheckSpace +ParallelDownloads = 5 +DownloadUser = alpm + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +SigLevel = Required DatabaseOptional +LocalFileSigLevel = Optional + +# pacman searches repositories in the order defined here +[core] +Include = /etc/pacman.d/mirrorlist + +[extra] +Include = /etc/pacman.d/mirrorlist + +[multilib] +Include = /etc/pacman.d/mirrorlist + +[omarchy] +SigLevel = Optional TrustAll +Server = https://pkgs.omarchy.org/edge/$arch diff --git a/default/systemd/faster-shutdown.conf b/default/systemd/faster-shutdown.conf new file mode 100644 index 00000000..90dce4f6 --- /dev/null +++ b/default/systemd/faster-shutdown.conf @@ -0,0 +1,2 @@ +[Manager] +DefaultTimeoutStopSec=5s diff --git a/default/systemd/hibernate.conf b/default/systemd/hibernate.conf deleted file mode 100644 index b146ae9b..00000000 --- a/default/systemd/hibernate.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Sleep] -HibernateDelaySec=30min -HibernateOnACPower=no diff --git a/default/systemd/lid.conf b/default/systemd/lid.conf deleted file mode 100644 index c6ecbcb7..00000000 --- a/default/systemd/lid.conf +++ /dev/null @@ -1,2 +0,0 @@ -[Login] -HandleLidSwitch=suspend-then-hibernate diff --git a/default/systemd/system-sleep/force-igpu b/default/systemd/system-sleep/force-igpu old mode 100755 new mode 100644 diff --git a/default/systemd/system-sleep/keyboard-backlight b/default/systemd/system-sleep/keyboard-backlight new file mode 100644 index 00000000..c6fbea1c --- /dev/null +++ b/default/systemd/system-sleep/keyboard-backlight @@ -0,0 +1,18 @@ +#!/bin/bash + +# Turn off keyboard backlight before hibernate to prevent hang on power-off. +# The ASUS keyboard controller can block S4 shutdown if LEDs are active. + +if [[ $1 == "pre" && $2 == "hibernate" ]]; then + device="" + for candidate in /sys/class/leds/*kbd_backlight*; do + if [[ -e "$candidate" ]]; then + device="$(basename "$candidate")" + break + fi + done + + if [[ -n "$device" ]]; then + brightnessctl -d "$device" set 0 >/dev/null 2>&1 + fi +fi diff --git a/default/themed/asusctl.rgb.tpl b/default/themed/asusctl.rgb.tpl new file mode 100644 index 00000000..bc9f35a2 --- /dev/null +++ b/default/themed/asusctl.rgb.tpl @@ -0,0 +1 @@ +{{ accent }} diff --git a/default/walker/restart.conf b/default/walker/restart.conf new file mode 100644 index 00000000..57940311 --- /dev/null +++ b/default/walker/restart.conf @@ -0,0 +1,3 @@ +[Service] +Restart=always +RestartSec=2 diff --git a/install/config/all.sh b/install/config/all.sh index f7a1097b..f62a4e61 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -19,6 +19,9 @@ run_logged $OMARCHY_INSTALL/config/fast-shutdown.sh run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh run_logged $OMARCHY_INSTALL/config/input-group.sh run_logged $OMARCHY_INSTALL/config/omarchy-ai-skill.sh +run_logged $OMARCHY_INSTALL/config/powerprofilesctl-rules.sh +run_logged $OMARCHY_INSTALL/config/wifi-powersave-rules.sh +run_logged $OMARCHY_INSTALL/config/hibernation.sh run_logged $OMARCHY_INSTALL/config/hardware/network.sh run_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-fkeys.sh @@ -36,3 +39,5 @@ run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-asus-rog-audio-mixer.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-asus-rog-mic.sh +run_logged $OMARCHY_INSTALL/config/hardware/fix-yt6801-ethernet-adapter.sh +run_logged $OMARCHY_INSTALL/config/hardware/fix-synaptic-touchpad.sh diff --git a/install/config/fast-shutdown.sh b/install/config/fast-shutdown.sh index bbbfafdc..627e02a5 100644 --- a/install/config/fast-shutdown.sh +++ b/install/config/fast-shutdown.sh @@ -1,7 +1,3 @@ sudo mkdir -p /etc/systemd/system.conf.d - -cat </dev/null)" == "ASUSTeK COMPUTER INC." ]] && - grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null; then - +if omarchy-hw-asus-rog; then mkdir -p ~/.config/wireplumber/wireplumber.conf.d/ cp $OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf ~/.config/wireplumber/wireplumber.conf.d/ rm -rf ~/.local/state/wireplumber/default-routes + + # Unmute the Master control on the ALC285 card (often muted by default) + card=$(aplay -l 2>/dev/null | grep -i "ALC285" | head -1 | sed 's/card \([0-9]*\).*/\1/') + if [[ -n "$card" ]]; then + amixer -c "$card" set Master 80% unmute 2>/dev/null + fi fi diff --git a/install/config/hardware/fix-asus-rog-mic.sh b/install/config/hardware/fix-asus-rog-mic.sh index b7391a2c..c50a63f1 100644 --- a/install/config/hardware/fix-asus-rog-mic.sh +++ b/install/config/hardware/fix-asus-rog-mic.sh @@ -2,9 +2,7 @@ # The mic boost is way too high by default, causing clipping. # Sets levels and stores ALSA state so it persists across reboots. -if [[ "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null)" == "ASUSTeK COMPUTER INC." ]] && - grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null; then - +if omarchy-hw-asus-rog; then for card in /proc/asound/card*/codec*; do if grep -q "ALC285" "$card" 2>/dev/null; then cardnum=$(echo "$card" | grep -oP 'card\K\d+') diff --git a/install/config/hardware/fix-synaptic-touchpad.sh b/install/config/hardware/fix-synaptic-touchpad.sh new file mode 100755 index 00000000..cc726520 --- /dev/null +++ b/install/config/hardware/fix-synaptic-touchpad.sh @@ -0,0 +1,6 @@ +# Enable Synaptics InterTouch for confirmed touchpads if not already loaded + +if grep -qi synaptics /proc/bus/input/devices \ + && ! lsmod | grep -q '^psmouse'; then + modprobe psmouse synaptics_intertouch=1 +fi \ No newline at end of file diff --git a/install/config/hardware/fix-yt6801-ethernet-adapter.sh b/install/config/hardware/fix-yt6801-ethernet-adapter.sh new file mode 100644 index 00000000..34331a0f --- /dev/null +++ b/install/config/hardware/fix-yt6801-ethernet-adapter.sh @@ -0,0 +1,4 @@ +# Install drivers for Motorcomm YT6801 ethernet adapter used by the Slimbook Executive +if lspci | grep -i "YT6801\|Motorcomm.*Ethernet"; then + omarchy-pkg-add linux-headers yt6801-dkms +fi diff --git a/install/config/hardware/nvidia.sh b/install/config/hardware/nvidia.sh index 125addf6..da2ba180 100644 --- a/install/config/hardware/nvidia.sh +++ b/install/config/hardware/nvidia.sh @@ -4,12 +4,14 @@ if [ -n "$NVIDIA" ]; then # Check which kernel is installed and set appropriate headers package KERNEL_HEADERS="$(pacman -Qqs '^linux(-zen|-lts|-hardened)?$' | head -1)-headers" - if echo "$NVIDIA" | grep -qE "RTX [2-9][0-9]|GTX 16"; then - # Turing (16xx, 20xx), Ampere (30xx), Ada (40xx), and newer recommend the open-source kernel modules + # Turing+ (GTX 16xx, RTX 20xx-50xx, Quadro RTX, datacenter A/H/T/L series) have GSP firmware + if echo "$NVIDIA" | grep -qE "GTX 16[0-9]{2}|RTX [2-5][0-9]{3}|Quadro RTX|RTX A[0-9]{4}|A[1-9][0-9]{2}|H[1-9][0-9]{2}|T4|L[0-9]+"; then PACKAGES=(nvidia-open-dkms nvidia-utils lib32-nvidia-utils libva-nvidia-driver) - elif echo "$NVIDIA" | grep -qE "GTX 9|GTX 10|Quadro P"; then - # Pascal (10xx or Quadro Pxxx) and Maxwell (9xx) use legacy branch that can only be installed from AUR + GPU_ARCH="turing_plus" + # Maxwell (GTX 9xx), Pascal (GT/GTX 10xx, Quadro P, MX series), Volta (Titan V, Tesla V100, Quadro GV100) lack GSP + elif echo "$NVIDIA" | grep -qE "GTX (9[0-9]{2}|10[0-9]{2})|GT 10[0-9]{2}|Quadro [PM][0-9]{3,4}|Quadro GV100|MX *[0-9]+|Titan (X|Xp|V)|Tesla V100"; then PACKAGES=(nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils) + GPU_ARCH="maxwell_pascal_volta" fi # Bail if no supported GPU if [ -z "${PACKAGES+x}" ]; then @@ -29,12 +31,23 @@ EOF MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) EOF - # Add NVIDIA environment variables - cat >>$HOME/.config/hypr/envs.conf <<'EOF' + # Add NVIDIA environment variables based on GPU architecture + if [ "$GPU_ARCH" = "turing_plus" ]; then + # Turing+ (RTX 20xx, GTX 16xx, and newer) with GSP firmware support + cat >>"$HOME/.config/hypr/envs.conf" <<'EOF' -# NVIDIA +# NVIDIA (Turing+ with GSP firmware) env = NVD_BACKEND,direct env = LIBVA_DRIVER_NAME,nvidia env = __GLX_VENDOR_LIBRARY_NAME,nvidia EOF + elif [ "$GPU_ARCH" = "maxwell_pascal_volta" ]; then + # Maxwell/Pascal/Volta (GTX 9xx/10xx, GT 10xx, Quadro P/M/GV, MX series, Titan X/Xp/V) lack GSP firmware + cat >>"$HOME/.config/hypr/envs.conf" <<'EOF' + +# NVIDIA (Maxwell/Pascal/Volta without GSP firmware) +env = NVD_BACKEND,egl +env = __GLX_VENDOR_LIBRARY_NAME,nvidia +EOF + fi fi diff --git a/install/config/hibernation.sh b/install/config/hibernation.sh new file mode 100644 index 00000000..17628ead --- /dev/null +++ b/install/config/hibernation.sh @@ -0,0 +1,2 @@ +# Enable hibernation +omarchy-hibernation-setup --force diff --git a/install/config/mimetypes.sh b/install/config/mimetypes.sh index ea8e1aff..4d7a32bf 100644 --- a/install/config/mimetypes.sh +++ b/install/config/mimetypes.sh @@ -1,6 +1,9 @@ omarchy-refresh-applications update-desktop-database ~/.local/share/applications +# Open directories in file manager +xdg-mime default org.gnome.Nautilus.desktop inode/directory + # Open all images with imv xdg-mime default imv.desktop image/png xdg-mime default imv.desktop image/jpeg diff --git a/install/config/powerprofilesctl-rules.sh b/install/config/powerprofilesctl-rules.sh new file mode 100644 index 00000000..da18f24d --- /dev/null +++ b/install/config/powerprofilesctl-rules.sh @@ -0,0 +1,22 @@ +if omarchy-battery-present; then + mapfile -t profiles < <(omarchy-powerprofiles-list) + + if [[ ${#profiles[@]} -gt 1 ]]; then + + # Default AC profile: + # 3 profiles → performance + # 2 profiles → balanced + ac_profile="${profiles[2]:-${profiles[1]}}" + + # Default Battery profile (balanced) + battery_profile="${profiles[1]}" + + cat < /dev/null << EOF diff --git a/install/config/wifi-powersave-rules.sh b/install/config/wifi-powersave-rules.sh new file mode 100644 index 00000000..08b8d49b --- /dev/null +++ b/install/config/wifi-powersave-rules.sh @@ -0,0 +1,9 @@ +if omarchy-battery-present; then + cat </dev/null; then - # This computer runs on a battery +if omarchy-battery-present; then powerprofilesctl set balanced || true # Enable battery monitoring timer for low battery notifications systemctl --user enable --now omarchy-battery-monitor.timer else - # This computer runs on power outlet powerprofilesctl set performance || true fi diff --git a/install/omarchy-base.packages b/install/omarchy-base.packages index d91ed9ad..5c5adda9 100644 --- a/install/omarchy-base.packages +++ b/install/omarchy-base.packages @@ -5,6 +5,7 @@ 1password-cli aether alacritty +alsa-utils asdcontrol avahi bash-completion @@ -13,6 +14,7 @@ bluetui bolt brightnessctl btop +chromium clang cups cups-browsed @@ -78,6 +80,7 @@ mariadb-libs mise mpv nautilus +nautilus-python gnome-disk-utility noto-fonts noto-fonts-cjk @@ -87,7 +90,6 @@ nss-mdns nvim obs-studio obsidian -omarchy-chromium omarchy-nvim omarchy-walker opencode @@ -118,6 +120,7 @@ swayosd system-config-printer tldr tree-sitter-cli +tmux tobi-try ttf-cascadia-mono-nerd ttf-ia-writer diff --git a/install/omarchy-other.packages b/install/omarchy-other.packages index e531d56e..f4590f5f 100644 --- a/install/omarchy-other.packages +++ b/install/omarchy-other.packages @@ -2,6 +2,7 @@ # Utilized by ISO builder to ensure package availability in the ISO autoconf-archive +asusctl base base-devel broadcom-wl @@ -44,6 +45,7 @@ snapper webp-pixbuf-loader wget yay-debug +yt6801-dkms zram-generator # T2 MacBook support packages diff --git a/install/packaging/all.sh b/install/packaging/all.sh index a28c3963..1bdc912f 100644 --- a/install/packaging/all.sh +++ b/install/packaging/all.sh @@ -4,3 +4,4 @@ run_logged $OMARCHY_INSTALL/packaging/nvim.sh run_logged $OMARCHY_INSTALL/packaging/icons.sh run_logged $OMARCHY_INSTALL/packaging/webapps.sh run_logged $OMARCHY_INSTALL/packaging/tuis.sh +run_logged $OMARCHY_INSTALL/packaging/asus-rog.sh diff --git a/install/packaging/asus-rog.sh b/install/packaging/asus-rog.sh new file mode 100644 index 00000000..6eab5853 --- /dev/null +++ b/install/packaging/asus-rog.sh @@ -0,0 +1,3 @@ +if omarchy-hw-asus-rog; then + omarchy-pkg-add asusctl +fi diff --git a/migrations/1768270644.sh b/migrations/1768270644.sh old mode 100755 new mode 100644 diff --git a/migrations/1768906440.sh b/migrations/1768906440.sh new file mode 100644 index 00000000..19c676cd --- /dev/null +++ b/migrations/1768906440.sh @@ -0,0 +1,19 @@ +echo "Migrate legacy mobile NVIDIA GPUs to nvidia-580xx driver (if needed)" + +# Only migrate MX1xx, 2xx or 3xx (Pascal/Maxwell) +NVIDIA="$(lspci | grep -i 'nvidia')" +if echo "$NVIDIA" | grep -qE "MX1|MX2|MX3"; then + if ! pacman -Qq | grep -qE '^linux(-[a-z0-9]+)?-headers$'; then + echo "Error: no linux headers package installed (required for DKMS drivers). Please install the appropriate headers and re-run this migration." + exit 1 + fi + + # Piping yes to override existing packages + yes | sudo pacman -S nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils + + # Verify packages were installed + if ! pacman -Qq nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils &>/dev/null; then + echo "Error: NVIDIA 580xx driver packages failed to install" + exit 1 + fi +fi diff --git a/migrations/1768916735.sh b/migrations/1768916735.sh index 6d65e125..0c5c6408 100644 --- a/migrations/1768916735.sh +++ b/migrations/1768916735.sh @@ -1,3 +1,8 @@ -echo "Fix microphone gain on Asus ROG laptops with ALC285 Realtek" +echo "Fix microphone gain and audio mixing on Asus ROG laptops" source "$OMARCHY_PATH/install/config/hardware/fix-asus-rog-mic.sh" +source "$OMARCHY_PATH/install/config/hardware/fix-asus-rog-audio-mixer.sh" + +if omarchy-hw-asus-rog; then + omarchy-restart-pipewire +fi diff --git a/migrations/1769182209.sh b/migrations/1769182209.sh new file mode 100644 index 00000000..ae4825de --- /dev/null +++ b/migrations/1769182209.sh @@ -0,0 +1,4 @@ +echo "Enable auto-pasting for the emoji picker" + +omarchy-refresh-config elephant/symbols.toml +omarchy-restart-walker diff --git a/migrations/1769183359.sh b/migrations/1769183359.sh new file mode 100644 index 00000000..dbdbedf2 --- /dev/null +++ b/migrations/1769183359.sh @@ -0,0 +1,3 @@ +echo "Add nautilus-python package for 'Open in Ghostty' shortcut in Nautilus" + +omarchy-pkg-add nautilus-python diff --git a/migrations/1769510847.sh b/migrations/1769510847.sh new file mode 100644 index 00000000..579a69df --- /dev/null +++ b/migrations/1769510847.sh @@ -0,0 +1,5 @@ +echo "Switch back to mainline chromium now that it supports full live themeing" + +omarchy-pkg-drop omarchy-chromium +omarchy-pkg-add chromium +omarchy-theme-set-browser diff --git a/migrations/1769543550.sh b/migrations/1769543550.sh new file mode 100644 index 00000000..44c657c7 --- /dev/null +++ b/migrations/1769543550.sh @@ -0,0 +1,6 @@ +echo "Add SUPER+ALT+SHIFT+F shortcut to open nautilus in cwd" + +# Add the new CWD binding if it doesn't exist +if ! grep -q "SUPER ALT SHIFT, F" ~/.config/hypr/bindings.conf; then + sed -i '/bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window/a bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"' ~/.config/hypr/bindings.conf +fi diff --git a/migrations/1769566732.sh b/migrations/1769566732.sh new file mode 100644 index 00000000..f2df93c0 --- /dev/null +++ b/migrations/1769566732.sh @@ -0,0 +1,3 @@ +echo "Set power profile based on source switching (AC or Battery)" + +source $OMARCHY_PATH/install/config/powerprofilesctl-rules.sh diff --git a/migrations/1769616857.sh b/migrations/1769616857.sh new file mode 100644 index 00000000..34e57bdf --- /dev/null +++ b/migrations/1769616857.sh @@ -0,0 +1,3 @@ +echo "Turn off opencode's own auto-update feature (we rely on pacman)" + +omarchy-refresh-config opencode/opencode.json diff --git a/migrations/1769619823.sh b/migrations/1769619823.sh new file mode 100644 index 00000000..47f1f482 --- /dev/null +++ b/migrations/1769619823.sh @@ -0,0 +1,3 @@ +echo "Open directories in file manager using the shell open command" + +xdg-mime default org.gnome.Nautilus.desktop inode/directory diff --git a/migrations/1769964367.sh b/migrations/1769964367.sh new file mode 100644 index 00000000..487f4d32 --- /dev/null +++ b/migrations/1769964367.sh @@ -0,0 +1,6 @@ +echo "Improve audio controls icon for default selection" + +if [[ ! -f ~/.config/wiremix/wiremix.toml ]]; then + mkdir -p ~/.config/wiremix + cp -f $OMARCHY_PATH/config/wiremix/wiremix.toml ~/.config/wiremix/ +fi diff --git a/migrations/1770159912.sh b/migrations/1770159912.sh new file mode 100644 index 00000000..5709cdb7 --- /dev/null +++ b/migrations/1770159912.sh @@ -0,0 +1,32 @@ +echo "Fix NVIDIA environment variables for Maxwell/Pascal/Volta GPUs" + +# Detect if user has Maxwell/Pascal/Volta GPU (pre-Turing cards without GSP firmware) +# Maxwell (GTX 9xx), Pascal (GT/GTX 10xx, Quadro P, MX series), Volta (Titan V, Tesla V100, Quadro GV100) +NVIDIA="$(lspci | grep -i 'nvidia')" +if echo "$NVIDIA" | grep -qE "GTX (9[0-9]{2}|10[0-9]{2})|GT 10[0-9]{2}|Quadro [PM][0-9]{3,4}|Quadro GV100|MX *[0-9]+|Titan (X|Xp|V)|Tesla V100"; then + ENVS_CONF="$HOME/.config/hypr/envs.conf" + + if [ -f "$ENVS_CONF" ]; then + # Check if file contains problematic variables + if grep -qE "env = (NVD_BACKEND,direct|LIBVA_DRIVER_NAME,nvidia)" "$ENVS_CONF"; then + echo "Removing incompatible NVIDIA environment variables for legacy GPU..." + + # Create backup + cp "$ENVS_CONF" "$ENVS_CONF.bak.$(date +%s)" + + # Remove all NVIDIA env lines and section headers (we re-add the correct ones below) + sed -i '/^env = \(NVD_BACKEND\|LIBVA_DRIVER_NAME\|__GLX_VENDOR_LIBRARY_NAME\),/d; /^# NVIDIA/d' "$ENVS_CONF" + + # Add correct environment variables for legacy GPUs + cat >>"$ENVS_CONF" <<'EOF' + +# NVIDIA (Maxwell/Pascal/Volta without GSP firmware) +env = NVD_BACKEND,egl +env = __GLX_VENDOR_LIBRARY_NAME,nvidia +EOF + + echo "NVIDIA environment variables updated. A backup was saved to $ENVS_CONF.bak.*" + echo "Please restart Hyprland for changes to take effect." + fi + fi +fi diff --git a/migrations/1770372978.sh b/migrations/1770372978.sh new file mode 100644 index 00000000..8ce213b6 --- /dev/null +++ b/migrations/1770372978.sh @@ -0,0 +1,5 @@ +echo "Disable fingerprint in hyprlock if fingerprint auth is not configured" + +if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then + sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf +fi diff --git a/migrations/1770375655.sh b/migrations/1770375655.sh new file mode 100644 index 00000000..8c2f3727 --- /dev/null +++ b/migrations/1770375655.sh @@ -0,0 +1,5 @@ +echo "Add Super+Shift+Return binding for browser" + +if [[ -f ~/.config/hypr/bindings.conf ]] && ! grep -q "SUPER SHIFT, RETURN.*Browser" ~/.config/hypr/bindings.conf; then + sed -i '/^bindd = SUPER, RETURN, Terminal/a bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser' ~/.config/hypr/bindings.conf +fi diff --git a/migrations/1770375817.sh b/migrations/1770375817.sh new file mode 100644 index 00000000..28e03f8a --- /dev/null +++ b/migrations/1770375817.sh @@ -0,0 +1,6 @@ +echo "Ensure walker service is restarted if it's killed or crashes" + +mkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/ +cp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf +systemctl --user daemon-reload + diff --git a/migrations/1770393078.sh b/migrations/1770393078.sh new file mode 100644 index 00000000..79238051 --- /dev/null +++ b/migrations/1770393078.sh @@ -0,0 +1,7 @@ +echo "Add async-backend = epoll to ghostty config to fix high IO pressure" + +if [[ -f ~/.config/ghostty/config ]] && ! grep -q "^async-backend" ~/.config/ghostty/config; then + echo "" >> ~/.config/ghostty/config + echo "# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)" >> ~/.config/ghostty/config + echo "async-backend = epoll" >> ~/.config/ghostty/config +fi diff --git a/migrations/1770638893.sh b/migrations/1770638893.sh new file mode 100644 index 00000000..0e5f2e54 --- /dev/null +++ b/migrations/1770638893.sh @@ -0,0 +1,9 @@ +echo "Add Tmux as an option with themed styling" + +omarchy-pkg-add tmux + +if [[ ! -f ~/.config/tmux/tmux.conf ]]; then + mkdir -p ~/.config/tmux + cp $OMARCHY_PATH/config/tmux/tmux.conf ~/.config/tmux/tmux.conf + omarchy-theme-refresh +fi diff --git a/migrations/1770811646.sh b/migrations/1770811646.sh new file mode 100644 index 00000000..efb50931 --- /dev/null +++ b/migrations/1770811646.sh @@ -0,0 +1,3 @@ +echo "Disable WiFi power save on AC power" + +source $OMARCHY_PATH/install/config/wifi-powersave-rules.sh diff --git a/migrations/1771188969.sh b/migrations/1771188969.sh new file mode 100644 index 00000000..e89716e1 --- /dev/null +++ b/migrations/1771188969.sh @@ -0,0 +1,14 @@ +echo "Remove temporary Wayland color manager disabling flag from existing Chromium configs" + +# This reverts the workaround originally added by migration 1760401344.sh +# Remove flag and comment from chromium-flags.conf only if found +if [[ -f ~/.config/chromium-flags.conf ]]; then + sed -i '/--disable-features=WaylandWpColorManagerV1/d' ~/.config/chromium-flags.conf + sed -i '/# Chromium crash workaround for Wayland color management on Hyprland/d' ~/.config/chromium-flags.conf +fi + +# Remove flag and comment from brave-flags.conf only if found +if [[ -f ~/.config/brave-flags.conf ]]; then + sed -i '/--disable-features=WaylandWpColorManagerV1/d' ~/.config/brave-flags.conf + sed -i '/# Chromium crash workaround for Wayland color management on Hyprland/d' ~/.config/brave-flags.conf +fi diff --git a/themes/miasma/backgrounds/01-miasma.jpg b/themes/miasma/backgrounds/01-miasma.jpg new file mode 100644 index 00000000..16cf45b7 Binary files /dev/null and b/themes/miasma/backgrounds/01-miasma.jpg differ diff --git a/themes/miasma/backgrounds/02-miasma.jpg b/themes/miasma/backgrounds/02-miasma.jpg new file mode 100644 index 00000000..3a83fb3a Binary files /dev/null and b/themes/miasma/backgrounds/02-miasma.jpg differ diff --git a/themes/miasma/btop.theme b/themes/miasma/btop.theme new file mode 100644 index 00000000..4db76eb7 --- /dev/null +++ b/themes/miasma/btop.theme @@ -0,0 +1,70 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#222222" + +# Main text color +theme[main_fg]="#c2c2b0" + +# Title color for boxes +theme[title]="#bb7744" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#c9a554" + +# Background color of selected item in processes box +theme[selected_bg]="#e4c47a" + +# Foreground color of selected item in processes box +theme[selected_fg]="#000000" + +# Color of inactive/disabled text +theme[inactive_fg]="#666666" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#bb7744" + +# Box outline and divider line color +theme[cpu_box]="#5f875f" +theme[mem_box]="#5f875f" +theme[net_box]="#5f875f" +theme[proc_box]="#5f875f" +theme[div_line]="#666666" + +# Gradient for all meters and graphs +theme[temp_start]="#c9a554" +theme[temp_mid]="#78824b" +theme[temp_end]="#5f875f" + + +theme[cpu_start]="#c9a554" +theme[cpu_mid]="#78824b" +theme[cpu_end]="#5f875f" + + +theme[free_start]="#78824b" +theme[free_mid]="#b36d43" +theme[free_end]="#b36d43" + + +theme[cached_start]="#b36d43" +theme[cached_mid]="#b36d43" +theme[cached_end]="#b36d43" + + +theme[available_start]="#c9a554" +theme[available_mid]="#c9a554" +theme[available_end]="#c9a554" + + +theme[used_start]="#5f875f" +theme[used_mid]="#5f875f" +theme[used_end]="#5f875f" + + +theme[download_start]="#b36d43" +theme[download_mid]="#c9a554" +theme[download_end]="#78824b" + + +theme[upload_start]="#b36d43" +theme[upload_mid]="#c9a554" +theme[upload_end]="#78824b" diff --git a/themes/miasma/colors.toml b/themes/miasma/colors.toml new file mode 100644 index 00000000..705ce2e4 --- /dev/null +++ b/themes/miasma/colors.toml @@ -0,0 +1,23 @@ +accent = "#78824b" +cursor = "#c7c7c7" +foreground = "#c2c2b0" +background = "#222222" +selection_foreground = "#c2c2b0" +selection_background = "#78824b" + +color0 = "#000000" +color1 = "#685742" +color2 = "#5f875f" +color3 = "#b36d43" +color4 = "#78824b" +color5 = "#bb7744" +color6 = "#c9a554" +color7 = "#d7c483" +color8 = "#666666" +color9 = "#685742" +color10 = "#5f875f" +color11 = "#b36d43" +color12 = "#78824b" +color13 = "#bb7744" +color14 = "#c9a554" +color15 = "#d7c483" diff --git a/themes/miasma/icons.theme b/themes/miasma/icons.theme new file mode 100644 index 00000000..37b2350b --- /dev/null +++ b/themes/miasma/icons.theme @@ -0,0 +1 @@ +Yaru-wartybrown \ No newline at end of file diff --git a/themes/miasma/neovim.lua b/themes/miasma/neovim.lua new file mode 100644 index 00000000..f6a31035 --- /dev/null +++ b/themes/miasma/neovim.lua @@ -0,0 +1,12 @@ +return { + { + "xero/miasma.nvim", + priority = 1000, + }, + { + "LazyVim/LazyVim", + opts = { + colorscheme = "miasma", + }, + }, +} diff --git a/themes/miasma/preview.png b/themes/miasma/preview.png new file mode 100644 index 00000000..690c4364 Binary files /dev/null and b/themes/miasma/preview.png differ diff --git a/themes/miasma/vscode.json b/themes/miasma/vscode.json new file mode 100644 index 00000000..9d28bdb1 --- /dev/null +++ b/themes/miasma/vscode.json @@ -0,0 +1,4 @@ +{ + "name": "In The Fog Dark", + "extension": "ganevru.in-the-fog-theme" +} diff --git a/themes/tokyo-night/asusctl.rgb b/themes/tokyo-night/asusctl.rgb new file mode 100644 index 00000000..c9f4a7cc --- /dev/null +++ b/themes/tokyo-night/asusctl.rgb @@ -0,0 +1 @@ +ff00ff diff --git a/themes/vantablack/backgrounds/1-vantablack.jpg b/themes/vantablack/backgrounds/1-vantablack.jpg new file mode 100644 index 00000000..ad81cf17 Binary files /dev/null and b/themes/vantablack/backgrounds/1-vantablack.jpg differ diff --git a/themes/vantablack/backgrounds/2-vantablack.jpg b/themes/vantablack/backgrounds/2-vantablack.jpg new file mode 100644 index 00000000..e0f04b62 Binary files /dev/null and b/themes/vantablack/backgrounds/2-vantablack.jpg differ diff --git a/themes/vantablack/backgrounds/3-vantablack.jpg b/themes/vantablack/backgrounds/3-vantablack.jpg new file mode 100644 index 00000000..4a81b945 Binary files /dev/null and b/themes/vantablack/backgrounds/3-vantablack.jpg differ diff --git a/themes/vantablack/btop.theme b/themes/vantablack/btop.theme new file mode 100644 index 00000000..cf3d98ca --- /dev/null +++ b/themes/vantablack/btop.theme @@ -0,0 +1,70 @@ +# Main background, empty for terminal default, need to be empty if you want transparent background +theme[main_bg]="#0d0d0d" + +# Main text color +theme[main_fg]="#ffffff" + +# Title color for boxes +theme[title]="#9b9b9b" + +# Highlight color for keyboard shortcuts +theme[hi_fg]="#b0b0b0" + +# Background color of selected item in processes box +theme[selected_bg]="#fdfdfd" + +# Foreground color of selected item in processes box +theme[selected_fg]="#ffffff" + +# Color of inactive/disabled text +theme[inactive_fg]="#fdfdfd" + +# Misc colors for processes box including mini cpu graphs, details memory graph and details status text +theme[proc_misc]="#9b9b9b" + +# Box outline and divider line color +theme[cpu_box]="#b6b6b6" +theme[mem_box]="#b6b6b6" +theme[net_box]="#b6b6b6" +theme[proc_box]="#b6b6b6" +theme[div_line]="#fdfdfd" + +# Gradient for all meters and graphs +theme[temp_start]="#b0b0b0" +theme[temp_mid]="#8d8d8d" +theme[temp_end]="#b6b6b6" + + +theme[cpu_start]="#b0b0b0" +theme[cpu_mid]="#8d8d8d" +theme[cpu_end]="#b6b6b6" + + +theme[free_start]="#8d8d8d" +theme[free_mid]="#cecece" +theme[free_end]="#cecece" + + +theme[cached_start]="#cecece" +theme[cached_mid]="#cecece" +theme[cached_end]="#cecece" + + +theme[available_start]="#b0b0b0" +theme[available_mid]="#b0b0b0" +theme[available_end]="#b0b0b0" + + +theme[used_start]="#b6b6b6" +theme[used_mid]="#b6b6b6" +theme[used_end]="#b6b6b6" + + +theme[download_start]="#cecece" +theme[download_mid]="#b0b0b0" +theme[download_end]="#8d8d8d" + + +theme[upload_start]="#cecece" +theme[upload_mid]="#b0b0b0" +theme[upload_end]="#8d8d8d" \ No newline at end of file diff --git a/themes/vantablack/colors.toml b/themes/vantablack/colors.toml new file mode 100644 index 00000000..96e095fc --- /dev/null +++ b/themes/vantablack/colors.toml @@ -0,0 +1,31 @@ +# UI Colors (extended) +accent = "#8d8d8d" +cursor = "#ffffff" + +# Primary colors +foreground = "#ffffff" +background = "#0d0d0d" + +# Selection colors +selection_foreground = "#0d0d0d" +selection_background = "#ffffff" + +# Normal colors (ANSI 0-7) +color0 = "#0d0d0d" +color1 = "#a4a4a4" +color2 = "#b6b6b6" +color3 = "#cecece" +color4 = "#8d8d8d" +color5 = "#9b9b9b" +color6 = "#b0b0b0" +color7 = "#ececec" + +# Bright colors (ANSI 8-15) +color8 = "#fdfdfd" +color9 = "#a4a4a4" +color10 = "#b6b6b6" +color11 = "#cecece" +color12 = "#8d8d8d" +color13 = "#9b9b9b" +color14 = "#b0b0b0" +color15 = "#ffffff" diff --git a/themes/vantablack/icons.theme b/themes/vantablack/icons.theme new file mode 100644 index 00000000..0bc3e2d5 --- /dev/null +++ b/themes/vantablack/icons.theme @@ -0,0 +1 @@ +Yaru-gray diff --git a/themes/vantablack/neovim.lua b/themes/vantablack/neovim.lua new file mode 100644 index 00000000..f9d96169 --- /dev/null +++ b/themes/vantablack/neovim.lua @@ -0,0 +1,12 @@ +return { + { + "bjarneo/vantablack.nvim", + priority = 1000, + }, + { + "LazyVim/LazyVim", + opts = { + colorscheme = "vantablack", + }, + }, +} diff --git a/themes/vantablack/preview.png b/themes/vantablack/preview.png new file mode 100644 index 00000000..e25805d0 Binary files /dev/null and b/themes/vantablack/preview.png differ diff --git a/themes/vantablack/vscode.json b/themes/vantablack/vscode.json new file mode 100644 index 00000000..4221b9ea --- /dev/null +++ b/themes/vantablack/vscode.json @@ -0,0 +1,4 @@ +{ + "name": "Vantablack", + "extension": "Bjarne.vantablack-omarchy" +}