diff --git a/AGENTS.md b/AGENTS.md index 689f4c50..e1ddb88c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,10 +6,15 @@ - Prefer `(( ))` over numeric operators inside `[[ ]]` (e.g., `(( count < 50 ))`, not `[[ $count -lt 50 ]]`) - For strings/paths with spaces, quote them instead of escaping spaces with `\ ` (e.g., `"$APP_DIR/Disk Usage.desktop"`, not `$APP_DIR/Disk\ Usage.desktop`) - Shebangs must use `#!/bin/bash` consistently (never `#!/usr/bin/env bash`) +- Scripts under `install/` and `migrations/` may be sourced and intentionally omit shebangs # Command Naming -All commands start with `omarchy-`. Prefixes indicate purpose: +All commands start with `omarchy-`. Prefixes indicate purpose. + +The authoritative command group list lives in `bin/omarchy` in `GROUP_DESCRIPTIONS`. Keep `GROUP_DESCRIPTIONS` updated when adding a new command prefix. + +Common prefixes include: - `cmd-` - check if commands exist, misc utility commands - `capture-` - screenshots, screen recordings, and other capture tools @@ -24,6 +29,51 @@ All commands start with `omarchy-`. Prefixes indicate purpose: - `theme-` - theme management - `update-` - update components +Other current prefixes include: + +- `ac-`, `audio-`, `battery-`, `branch-`, `brightness-`, `channel-`, `config-`, `debug-`, `dev-`, `drive-`, `first-`, `font-`, `haptic-`, `hibernation-`, `hook-`, `hyprland-`, `menu-`, `migrate-`, `notification-`, `npx-`, `plymouth-`, `powerprofiles-`, `reinstall-`, `remove-`, `screensaver-`, `show-`, `snapshot-`, `state-`, `sudo-`, `swayosd-`, `system-`, `transcode-`, `tui-`, `tz-`, `upload-`, `version-`, `voxtype-`, `webapp-`, `wifi-`, `windows-` + +# Command Metadata + +Commands in `bin/` can declare CLI metadata in comments near the top of the file. `bin/omarchy` scans the first 80 lines, and tests expect command metadata to remain valid. + +Supported metadata keys: + +- `# omarchy:summary=...` - short help text +- `# omarchy:group=...` - command group when it differs from the filename-derived prefix +- `# omarchy:name=...` - command name within the group +- `# omarchy:args=...` - usage arguments +- `# omarchy:examples=...` - examples separated with ` | ` +- `# omarchy:alias=...` / `# omarchy:aliases=...` - alternate routes +- `# omarchy:requires-sudo=true` - mark commands that require sudo + +Prefer explicit metadata for user-facing commands. Keep routes consistent with the filename unless there is a deliberate alias or compatibility route. + +Example: + +```bash +# omarchy:summary=Take a screenshot +# omarchy:group=capture +# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] +# omarchy:examples=omarchy screenshot | omarchy capture screenshot region +# omarchy:aliases=omarchy screenshot +``` + +# Install Scripts + +Install entry points (`install.sh`, `boot.sh`) use `#!/bin/bash`. Many scripts under `install/` are sourced via `run_logged` and intentionally do not have shebangs. + +Install stage files follow this pattern: + +- `install/*/all.sh` lists scripts in execution order +- leaf scripts are sourced by `run_logged $OMARCHY_INSTALL/path/to/script.sh` +- avoid `exit` in sourced install scripts unless intentionally aborting the install +- use `$OMARCHY_INSTALL` and `$OMARCHY_PATH` instead of hard-coded Omarchy paths +- keep hardware-specific logic under `install/config/hardware/` +- prefer helper commands for package and command checks where available + +Raw `command -v`, `pacman`, and `pacman-key` are acceptable in bootstrap/preflight/package-helper contexts where the helper commands may not be available yet or where direct package-manager behavior is the point of the script. + # Helper Commands Use these instead of raw shell commands: @@ -33,6 +83,8 @@ Use these instead of raw shell commands: - `omarchy-pkg-add` - install packages (handles both pacman and AUR) - `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands) +Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required. + # Config Structure - `config/` - default configs copied to `~/.config/` @@ -53,10 +105,15 @@ This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hyp 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: +New migration format: - No shebang line - Start with an `echo` describing what the migration does - Use `$OMARCHY_PATH` to reference the omarchy directory +- Prefer helper commands such as `omarchy-cmd-present`, `omarchy-cmd-missing`, `omarchy-pkg-present`, and `omarchy-pkg-missing` + +Some older migrations predate these rules. Do not copy older migrations that start with shebangs, omit the leading `echo`, or hard-code `~/.local/share/omarchy`. + +Migrations may use raw `pacman`, `command -v`, or direct config edits when needed for historical compatibility or one-off repair work. Example: ```bash diff --git a/applications/foot-server.desktop b/applications/foot-server.desktop new file mode 100644 index 00000000..0ab86d65 --- /dev/null +++ b/applications/foot-server.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Foot Server +NoDisplay=true diff --git a/applications/foot.desktop b/applications/foot.desktop new file mode 100644 index 00000000..b9f6676a --- /dev/null +++ b/applications/foot.desktop @@ -0,0 +1,21 @@ +[Desktop Entry] +Type=Application +TryExec=foot +Exec=foot +Icon=foot +Terminal=false +Categories=System;TerminalEmulator; +Name=Foot +GenericName=Terminal +Comment=A fast, lightweight and minimalistic Wayland terminal emulator +StartupNotify=true +StartupWMClass=foot +Actions=New; +X-TerminalArgExec=-e +X-TerminalArgAppId=--app-id= +X-TerminalArgTitle=--title= +X-TerminalArgDir=--working-directory= + +[Desktop Action New] +Name=New Terminal +Exec=foot diff --git a/applications/footclient.desktop b/applications/footclient.desktop new file mode 100644 index 00000000..e4590087 --- /dev/null +++ b/applications/footclient.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Foot Client +NoDisplay=true diff --git a/bin/omarchy b/bin/omarchy index 511aeb97..ad743ce7 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -17,6 +17,7 @@ declare -A COMMAND_USAGE declare -A COMMAND_ARGS declare -A COMMAND_EXAMPLES declare -A COMMAND_REQUIRES_SUDO +declare -A COMMAND_HIDDEN declare -A COMMAND_ALIASES declare -A COMMAND_HAS_SUMMARY declare -A COMMAND_METADATA_ERRORS @@ -55,17 +56,17 @@ GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows" GROUP_DESCRIPTIONS[remove]="Removal workflows" GROUP_DESCRIPTIONS[restart]="Restart Omarchy components" GROUP_DESCRIPTIONS[setup]="Interactive setup wizards" +GROUP_DESCRIPTIONS[screensaver]="Screensaver branding and animation" GROUP_DESCRIPTIONS[snapshot]="System snapshots" -GROUP_DESCRIPTIONS[state]="Persistent Omarchy state" GROUP_DESCRIPTIONS[sudo]="Sudo configuration helpers" GROUP_DESCRIPTIONS[swayosd]="SwayOSD status display helpers" GROUP_DESCRIPTIONS[system]="Reboot, shutdown, logout, and lock" GROUP_DESCRIPTIONS[theme]="Theme management" GROUP_DESCRIPTIONS[toggle]="Toggle Omarchy features" +GROUP_DESCRIPTIONS[transcode]="Image and video transcoding" GROUP_DESCRIPTIONS[tui]="Terminal UI launchers" GROUP_DESCRIPTIONS[tz]="Timezone selection" GROUP_DESCRIPTIONS[update]="Omarchy and system updates" -GROUP_DESCRIPTIONS[upload]="Upload helpers" GROUP_DESCRIPTIONS[version]="Version and channel information" GROUP_DESCRIPTIONS[voxtype]="Voxtype dictation" GROUP_DESCRIPTIONS[webapp]="Web app launchers" @@ -129,6 +130,7 @@ register_command() { local examples="" local aliases="" local requires_sudo="" + local hidden="" local line="" local metadata_key="" local metadata_value="" @@ -184,6 +186,10 @@ register_command() { requires_sudo="$metadata_value" [[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "requires-sudo must be omitted or true") ;; + hidden) + hidden="$metadata_value" + [[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "hidden must be omitted or true") + ;; *) ;; esac @@ -227,6 +233,7 @@ register_command() { fi [[ $requires_sudo == "true" ]] || requires_sudo="false" + [[ $hidden == "true" ]] || hidden="false" local key="$file_binary" COMMAND_KEYS+=("$key") @@ -240,6 +247,7 @@ register_command() { COMMAND_ARGS["$key"]="$args" COMMAND_EXAMPLES["$key"]="$examples" COMMAND_REQUIRES_SUDO["$key"]="$requires_sudo" + COMMAND_HIDDEN["$key"]="$hidden" COMMAND_HAS_SUMMARY["$key"]="$has_summary" COMMAND_METADATA_ERRORS["$key"]="$metadata_errors" @@ -319,16 +327,6 @@ command_requires_args() { [[ -n $required ]] } -load_group_extra_commands() { - local group="$1" - - case "$group" in - install) - load_command_by_binary omarchy-pkg-add - ;; - esac -} - load_group_commands() { local group="$1" local file="" @@ -342,7 +340,6 @@ load_group_commands() { register_command "$file" done - load_group_extra_commands "$group" } resolve_direct_route() { @@ -375,6 +372,9 @@ sorted_keys() { local key="" for key in "${COMMAND_KEYS[@]}"; do + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi printf '%s\t%s\n' "${COMMAND_ROUTE[$key]}" "$key" done | sort -u | cut -f2- } @@ -418,6 +418,10 @@ sorted_group_keys() { local route="" for key in "${COMMAND_KEYS[@]}"; do + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi + fallback_group=$(fallback_group_for_key "$key") if [[ ${COMMAND_GROUP[$key]} != "$group" && $fallback_group != "$group" ]]; then continue @@ -495,8 +499,6 @@ Discovery: omarchy commands --all Include commands explicitly marked hidden omarchy commands --json Machine-readable command list omarchy commands --check Validate command metadata and routes - omarchy dev benchmark Measure CLI response times - omarchy dev bin metadata Show bin metadata fields and defaults EOF } @@ -508,7 +510,7 @@ Usage: List commands known to the Omarchy command center. Options: - --all Accepted for compatibility + --all Include commands explicitly marked hidden --json Emit machine-readable JSON --markdown Emit a Markdown command table --check Validate command metadata and route collisions @@ -560,6 +562,9 @@ show_commands() { for route in "${!ROUTE_IS_ALIAS[@]}"; do key="${ROUTE_TO_KEY[$route]}" + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi alias_rows+="$route"$'\t'"${COMMAND_ROUTE[$key]}"$'\n' done @@ -598,13 +603,14 @@ emit_command_records() { while IFS= read -r key; do [[ -n $key ]] || continue - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ "${COMMAND_ROUTE[$key]}" \ "${COMMAND_BINARY[$key]}" \ "${COMMAND_GROUP[$key]}" \ "${COMMAND_NAME[$key]}" \ "${COMMAND_SUMMARY[$key]}" \ "${COMMAND_REQUIRES_SUDO[$key]}" \ + "${COMMAND_HIDDEN[$key]}" \ "${COMMAND_ARGS[$key]}" \ "${COMMAND_EXAMPLES[$key]}" \ "${COMMAND_ALIASES[$key]}" \ @@ -622,11 +628,12 @@ commands_json_filter() { name: .[3], summary: .[4], requires_sudo: (.[5] == "true"), - args: .[6], - examples: (.[7] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), - aliases: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), - filename_route: .[9], - routes: ([.[0], .[9]] + (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique) + hidden: (.[6] == "true"), + args: .[7], + examples: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), + aliases: (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), + filename_route: .[10], + routes: ([.[0], .[10]] + (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique) }] | {ok: true, commands: .} EOF } @@ -680,13 +687,14 @@ show_command_json() { local key="$1" printf '%s\n' "$key" | while IFS= read -r key; do - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ "${COMMAND_ROUTE[$key]}" \ "${COMMAND_BINARY[$key]}" \ "${COMMAND_GROUP[$key]}" \ "${COMMAND_NAME[$key]}" \ "${COMMAND_SUMMARY[$key]}" \ "${COMMAND_REQUIRES_SUDO[$key]}" \ + "${COMMAND_HIDDEN[$key]}" \ "${COMMAND_ARGS[$key]}" \ "${COMMAND_EXAMPLES[$key]}" \ "${COMMAND_ALIASES[$key]}" \ diff --git a/bin/omarchy-battery-monitor b/bin/omarchy-battery-monitor index 63b33277..1238791e 100755 --- a/bin/omarchy-battery-monitor +++ b/bin/omarchy-battery-monitor @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low +# omarchy:hidden=true BATTERY_THRESHOLD=10 NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified" diff --git a/bin/omarchy-brightness-display b/bin/omarchy-brightness-display index 558a47de..193bdb1b 100755 --- a/bin/omarchy-brightness-display +++ b/bin/omarchy-brightness-display @@ -1,15 +1,11 @@ #!/bin/bash # omarchy:summary=Adjust brightness on the most likely display device. -# omarchy:args= +# omarchy:args=<+N%|N%-|N%|off|on> +# omarchy:examples=omarchy brightness display +5% | omarchy brightness display 5%- | omarchy brightness display 50% | omarchy brightness display off | omarchy brightness display on step="${1:-+5%}" -if omarchy-hyprland-monitor-focused-apple; then - omarchy-brightness-display-apple "$step" - exit -fi - # Start with the first possible output, then refine to the most likely given an order heuristic. device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)" for candidate in amdgpu_bl* intel_backlight acpi_video*; do @@ -19,6 +15,19 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do fi done +if [[ $step == "off" ]]; then + hyprctl dispatch dpms off >/dev/null 2>&1 + exit 0 +elif [[ $step == "on" ]]; then + hyprctl dispatch dpms on >/dev/null 2>&1 + exit 0 +fi + +if omarchy-hyprland-monitor-focused-apple; then + omarchy-brightness-display-apple "$step" + exit +fi + # Current brightness percentage current=$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%') diff --git a/bin/omarchy-brightness-display-apple b/bin/omarchy-brightness-display-apple index 28c9e2ea..480b9fe7 100755 --- a/bin/omarchy-brightness-display-apple +++ b/bin/omarchy-brightness-display-apple @@ -1,6 +1,8 @@ #!/bin/bash # omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol. +# omarchy:args=<+N%|N%-|N%> +# omarchy:examples=omarchy brightness display apple +5% | omarchy brightness display apple 5%- | omarchy brightness display apple 50% if (( $# == 0 )); then echo "Adjust Apple Display brightness by passing +5%, 5%-, or 100%" diff --git a/bin/omarchy-brightness-keyboard b/bin/omarchy-brightness-keyboard index f161da47..7e5febe6 100755 --- a/bin/omarchy-brightness-keyboard +++ b/bin/omarchy-brightness-keyboard @@ -1,7 +1,7 @@ #!/bin/bash # omarchy:summary=Adjust keyboard backlight brightness using available steps. -# omarchy:args= +# omarchy:args= direction="${1:-up}" @@ -19,6 +19,14 @@ if [[ -z $device ]]; then exit 1 fi +if [[ $direction == "off" ]]; then + brightnessctl -sd "$device" set 0 >/dev/null + exit 0 +elif [[ $direction == "restore" ]]; then + brightnessctl -rd "$device" >/dev/null + exit 0 +fi + # Get current and max brightness to determine step size. max_brightness="$(brightnessctl -d "$device" max)" current_brightness="$(brightnessctl -d "$device" get)" diff --git a/bin/omarchy-cmd-terminal-cwd b/bin/omarchy-cmd-terminal-cwd index d0f731a4..88da9a69 100755 --- a/bin/omarchy-cmd-terminal-cwd +++ b/bin/omarchy-cmd-terminal-cwd @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Print the current working directory of the active terminal window +# omarchy:hidden=true terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}') shell_pid=$(pgrep -P "$terminal_pid" | tail -n1) diff --git a/bin/omarchy-dev-bin-metadata b/bin/omarchy-dev-bin-metadata index c63667b9..99e87e86 100755 --- a/bin/omarchy-dev-bin-metadata +++ b/bin/omarchy-dev-bin-metadata @@ -22,7 +22,8 @@ show_json() { {name: "args", required: false, type: "string", note: "Only set when the command accepts arguments."}, {name: "examples", required: false, type: "string", note: "Pipe-separated examples."}, {name: "aliases", required: false, type: "string", note: "Pipe-separated alternate routes, e.g. omarchy screenshot."}, - {name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."} + {name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}, + {name: "hidden", required: false, type: "true", default: false, note: "Hide from default command listings; visible with --all."} ] }' } @@ -43,6 +44,7 @@ Inferred defaults: route omarchy binary filename requires-sudo false + hidden false Optional fields: # omarchy:group= route override only @@ -51,6 +53,7 @@ Optional fields: # omarchy:examples= | pipe-separated examples # omarchy:aliases= | pipe-separated alternate routes # omarchy:requires-sudo=true only when true + # omarchy:hidden=true hide from default command listings Do not define: binary inferred from filename diff --git a/bin/omarchy-drive-set-password b/bin/omarchy-drive-password similarity index 100% rename from bin/omarchy-drive-set-password rename to bin/omarchy-drive-password diff --git a/bin/omarchy-drive-select b/bin/omarchy-drive-select index 117cde4d..0ee1f195 100755 --- a/bin/omarchy-drive-select +++ b/bin/omarchy-drive-select @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password. +# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-password. if (($# == 0)); then drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)') diff --git a/bin/omarchy-first-run b/bin/omarchy-first-run index 909e9210..8fde0534 100755 --- a/bin/omarchy-first-run +++ b/bin/omarchy-first-run @@ -16,6 +16,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then bash "$OMARCHY_PATH/install/first-run/firewall.sh" bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh" bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" + bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh" sudo rm -f /etc/sudoers.d/first-run diff --git a/bin/omarchy-font-set b/bin/omarchy-font-set index 2327d341..44bb9833 100755 --- a/bin/omarchy-font-set +++ b/bin/omarchy-font-set @@ -22,6 +22,10 @@ if [[ -n $font_name ]]; then pkill -SIGUSR2 ghostty fi + if [[ -f ~/.config/foot/foot.ini ]]; then + sed -i "s/^font=.*/font=$font_name:size=9/g" ~/.config/foot/foot.ini + fi + sed -i "s/font_family = .*/font_family = $font_name/g" ~/.config/hypr/hyprlock.conf sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css @@ -37,6 +41,10 @@ if [[ -n $font_name ]]; then notify-send -u low " You must restart Ghostty to see font change" fi + if pgrep -x foot; then + notify-send -u low " You must restart Foot to see font change" + fi + omarchy-hook font-set "$font_name" else echo "Font '$font_name' not found." diff --git a/bin/omarchy-hyprland-monitor-focused-apple b/bin/omarchy-hyprland-monitor-focused-apple index 1593c828..99dd55e8 100755 --- a/bin/omarchy-hyprland-monitor-focused-apple +++ b/bin/omarchy-hyprland-monitor-focused-apple @@ -2,4 +2,4 @@ # omarchy:summary=Return success if the focused Hyprland monitor is an Apple display. -hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR")))' >/dev/null +hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR|Studio XDR")))' >/dev/null diff --git a/bin/omarchy-hyprland-monitor-scaling-cycle b/bin/omarchy-hyprland-monitor-scaling-cycle index 32f61e50..984057b6 100755 --- a/bin/omarchy-hyprland-monitor-scaling-cycle +++ b/bin/omarchy-hyprland-monitor-scaling-cycle @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Cycle scaling for the focused Hyprland monitor +# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, and 3x MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)') ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name') diff --git a/bin/omarchy-hyprland-active-window-transparency-toggle b/bin/omarchy-hyprland-window-transparency-toggle similarity index 100% rename from bin/omarchy-hyprland-active-window-transparency-toggle rename to bin/omarchy-hyprland-window-transparency-toggle diff --git a/bin/omarchy-install-browser b/bin/omarchy-install-browser new file mode 100755 index 00000000..eba726e3 --- /dev/null +++ b/bin/omarchy-install-browser @@ -0,0 +1,106 @@ +#!/bin/bash + +# omarchy:summary=Install a supported browser and make it the default +# omarchy:args= +# omarchy:examples=omarchy install browser firefox | omarchy install browser brave + +make_default() { + xdg-settings set default-web-browser "$1" + xdg-mime default "$1" x-scheme-handler/http + xdg-mime default "$1" x-scheme-handler/https + xdg-mime default "$1" text/html +} + +setup_policy_directory() { + sudo mkdir -p "$1" + sudo chmod a+rw "$1" +} + +announce_default_browser() { + echo "" + echo "$1 is now the default browser. Start it with Super + Shift + Return." +} + +copy_chromium_flags() { + mkdir -p ~/.config + cp -f "${OMARCHY_PATH:-$HOME/.local/share/omarchy}/config/chromium-flags.conf" "$1" +} + +setup_firefox_preferences() { + local distribution_dir="$1" + + setup_policy_directory "$distribution_dir" + sudo cp -f "$OMARCHY_PATH/default/firefox/policies.json" "$distribution_dir/policies.json" +} + +setup_firefox_wayland() { + mkdir -p ~/.config/environment.d + echo "MOZ_ENABLE_WAYLAND=1" > ~/.config/environment.d/omarchy-firefox-wayland.conf +} + +case $1 in +chrome) + echo "Installing Chrome..." + omarchy-pkg-aur-add google-chrome || exit 1 + + setup_policy_directory /etc/opt/chrome/policies/managed + copy_chromium_flags ~/.config/chrome-flags.conf + make_default google-chrome.desktop + omarchy-theme-set-browser + announce_default_browser "Chrome" + ;; +edge) + echo "Installing Edge..." + omarchy-pkg-aur-add microsoft-edge-stable-bin || exit 1 + + setup_policy_directory /etc/opt/edge/policies/managed + copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf + make_default microsoft-edge.desktop + omarchy-theme-set-browser + announce_default_browser "Edge" + ;; +brave) + echo "Installing Brave..." + omarchy-pkg-aur-add brave-bin || exit 1 + + setup_policy_directory /etc/brave/policies/managed + copy_chromium_flags ~/.config/brave-flags.conf + make_default brave-browser.desktop + omarchy-theme-set-browser + announce_default_browser "Brave" + ;; +brave-origin) + echo "Installing Brave Origin..." + omarchy-pkg-aur-add brave-origin-beta-bin || exit 1 + + setup_policy_directory /etc/brave/policies/managed + mkdir -p ~/.config + # FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed + echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf + make_default brave-origin-beta.desktop + omarchy-theme-set-browser + announce_default_browser "Brave Origin" + ;; +firefox) + echo "Installing Firefox..." + omarchy-pkg-add firefox || exit 1 + + setup_firefox_preferences /usr/lib/firefox/distribution + setup_firefox_wayland + make_default firefox.desktop + announce_default_browser "Firefox" + ;; +zen) + echo "Installing Zen..." + omarchy-pkg-aur-add zen-browser-bin || exit 1 + + setup_firefox_preferences /opt/zen-browser/distribution + setup_firefox_wayland + make_default zen.desktop + announce_default_browser "Zen" + ;; +*) + echo "Usage: omarchy-install-browser " + exit 1 + ;; +esac diff --git a/bin/omarchy-install-gaming-retroarch b/bin/omarchy-install-gaming-retroarch index b4685b04..828acfc4 100755 --- a/bin/omarchy-install-gaming-retroarch +++ b/bin/omarchy-install-gaming-retroarch @@ -21,8 +21,9 @@ omarchy-pkg-add \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-yabause \ - libretro-fbneo-git \ - libretro-database-git + libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ + libretro-database-git \ + retroarch-joypad-autoconfig-git # Set up ~/Games for BIOS files and ROMs mkdir -p "$HOME/Games/bios" "$HOME/Games/roms" @@ -49,6 +50,7 @@ set_cfg libretro_info_path "/usr/share/libretro/info" set_cfg overlay_directory "/usr/share/libretro/overlays" set_cfg osk_overlay_directory "/usr/share/libretro/overlays/keyboards" set_cfg video_shader_dir "/usr/share/libretro/shaders/shaders_slang" +set_cfg joypad_autoconfig_dir "/usr/share/libretro/autoconfig" # Point at the database, cheats, and cursors from libretro-database-git set_cfg content_database_path "/usr/share/libretro/database/rdb" diff --git a/bin/omarchy-install-helix b/bin/omarchy-install-helix index 97de51c2..e8952c4e 100755 --- a/bin/omarchy-install-helix +++ b/bin/omarchy-install-helix @@ -1,6 +1,6 @@ #!/bin/bash -# Install Helix and configure it to use the current Omarchy theme. +# omarchy:summary=Install Helix and configure it to use the current Omarchy theme echo "Installing Helix..." omarchy-pkg-add helix diff --git a/bin/omarchy-install-terminal b/bin/omarchy-install-terminal index 146e4167..15a869d1 100755 --- a/bin/omarchy-install-terminal +++ b/bin/omarchy-install-terminal @@ -1,11 +1,11 @@ #!/bin/bash # omarchy:summary=Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc). -# omarchy:args= +# omarchy:args= # omarchy:requires-sudo=true if (($# == 0)); then - echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]" + echo "Usage: omarchy-install-terminal [alacritty|foot|ghostty|kitty]" exit 1 fi @@ -14,6 +14,7 @@ package="$1" # Map package name to desktop entry ID case "$package" in alacritty) desktop_id="Alacritty.desktop" ;; +foot) desktop_id="foot.desktop" ;; ghostty) desktop_id="com.mitchellh.ghostty.desktop" ;; kitty) desktop_id="kitty.desktop" ;; *) @@ -26,10 +27,15 @@ echo "Installing $package..." # Install package if omarchy-pkg-add $package; then - # Copy custom desktop entry for alacritty with X-TerminalArg* keys - if [[ $package == "alacritty" ]]; then + # Copy custom desktop entries with X-TerminalArg* keys + if [[ $package == "alacritty" || $package == "foot" ]]; then mkdir -p ~/.local/share/applications - cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/ + cp "$OMARCHY_PATH/applications/$desktop_id" ~/.local/share/applications/ + fi + + # Copy default config for optional terminals when missing + if [[ ! -e ~/.config/$package ]]; then + cp -Rpf "$OMARCHY_PATH/config/$package" ~/.config/ fi # Update xdg-terminals.list to prioritize the proper terminal diff --git a/bin/omarchy-install-zed b/bin/omarchy-install-zed new file mode 100755 index 00000000..9fa9f0ae --- /dev/null +++ b/bin/omarchy-install-zed @@ -0,0 +1,11 @@ +#!/bin/bash + +# omarchy:summary=Install Zed Editor and configure it with the current Omarchy theme + +echo "Installing Zed Editor..." +omarchy-pkg-add zed omazed + +# Apply Omarchy theme to Zed +omazed setup + +setsid gtk-launch dev.zed.Zed diff --git a/bin/omarchy-launch-screensaver b/bin/omarchy-launch-screensaver index e3593ba5..0cd64a70 100755 --- a/bin/omarchy-launch-screensaver +++ b/bin/omarchy-launch-screensaver @@ -37,6 +37,12 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do --font-size=18 \ -e omarchy-screensaver ;; + *foot*) + hyprctl dispatch exec -- \ + foot --app-id=org.omarchy.screensaver \ + --config="$OMARCHY_PATH/default/foot/screensaver.ini" \ + -e omarchy-screensaver + ;; *kitty*) hyprctl dispatch exec -- \ kitty --class=org.omarchy.screensaver \ @@ -45,7 +51,7 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do -e omarchy-screensaver ;; *) - notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty" + notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty" ;; esac done diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 96e3839d..b7068741 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -93,8 +93,9 @@ show_learn_menu() { } show_trigger_menu() { - case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle\n Hardware") in + case $(menu "Trigger" " Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in *Capture*) show_capture_menu ;; + *Transcode*) show_transcode_menu ;; *Share*) show_share_menu ;; *Toggle*) show_toggle_menu ;; *Hardware*) show_hardware_menu ;; @@ -166,6 +167,14 @@ show_share_menu() { esac } +show_transcode_menu() { + case $(menu "Transcode" " Picture\n Video") in + *Picture*) present_terminal "omarchy-transcode --path '$HOME/Pictures'" ;; + *Video*) present_terminal "omarchy-transcode --path '$HOME/Videos'" ;; + *) back_to show_trigger_menu ;; + esac +} + show_toggle_menu() { local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰂛 Notifications\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot\n󰟵 Passwordless Sudo" @@ -217,12 +226,36 @@ show_style_menu() { *Font*) show_font_menu ;; *Background*) show_background_menu ;; *Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;; - *Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;; + *Screensaver*) show_screensaver_menu ;; *About*) open_in_editor ~/.config/omarchy/branding/about.txt ;; *) show_main_menu ;; esac } +show_screensaver_menu() { + case $(menu "Screensaver" " Edit Text\n Set From Image\n󱄄 Preview\n Restore Default") in + *Text*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;; + *Image*) set_screensaver_from_image ;; + *Preview*) omarchy-launch-screensaver force ;; + *Default*) terminal bash -lc 'omarchy-screensaver-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;; + *) show_style_menu ;; + esac +} + +set_screensaver_from_image() { + terminal bash -lc ' + image=$(fd --type file --ignore-case --extension svg --extension png . "$HOME" 2>/dev/null | fzf --prompt "Logo image> ") + if [[ -n $image ]]; then + if omarchy-screensaver-logo "$image"; then + echo + echo "Preview with: omarchy-launch-screensaver force" + fi + echo + read -n 1 -s -r -p "Press any key to close..." + fi + ' +} + show_theme_menu() { omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400 } @@ -319,7 +352,7 @@ show_setup_system_menu() { } show_install_menu() { - case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n󰍲 Windows\n Gaming") in + case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n Browser\n󱚤 AI\n Gaming\n󰍲 Windows") in *Package*) terminal omarchy-pkg-install ;; *AUR*) terminal omarchy-pkg-aur-install ;; *Web*) present_terminal omarchy-webapp-install ;; @@ -329,13 +362,26 @@ show_install_menu() { *Development*) show_install_development_menu ;; *Editor*) show_install_editor_menu ;; *Terminal*) show_install_terminal_menu ;; + *Browser*) show_install_browser_menu ;; + *Gaming*) show_install_gaming_menu ;; *AI*) show_install_ai_menu ;; *Windows*) present_terminal "omarchy-windows-vm install" ;; - *Gaming*) show_install_gaming_menu ;; *) show_main_menu ;; esac } +show_install_browser_menu() { + case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in + *Chrome*) present_terminal "omarchy-install-browser chrome" ;; + *Edge*) present_terminal "omarchy-install-browser edge" ;; + *"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;; + *Brave*) present_terminal "omarchy-install-browser brave" ;; + *Firefox*) present_terminal "omarchy-install-browser firefox" ;; + *Zen*) present_terminal "omarchy-install-browser zen" ;; + *) show_install_menu ;; + esac +} + show_install_service_menu() { case $(menu "Install" " Dropbox\n Tailscale\n󱇱 NordVPN [AUR]\n󰏖 ONCE\n󰟵 Bitwarden\n Chromium Account") in *Dropbox*) present_terminal omarchy-install-dropbox ;; @@ -352,7 +398,7 @@ show_install_editor_menu() { case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in *VSCode*) present_terminal omarchy-install-vscode ;; *Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;; - *Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;; + *Zed*) present_terminal omarchy-install-zed ;; *Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;; *Helix*) present_terminal omarchy-install-helix ;; *Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;; @@ -361,8 +407,9 @@ show_install_editor_menu() { } show_install_terminal_menu() { - case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in + case $(menu "Install" " Alacritty\n Foot\n Ghostty\n Kitty") in *Alacritty*) install_terminal "alacritty" ;; + *Foot*) install_terminal "foot" ;; *Ghostty*) install_terminal "ghostty" ;; *Kitty*) install_terminal "kitty" ;; *) show_install_menu ;; @@ -468,8 +515,9 @@ show_install_elixir_menu() { } show_remove_menu() { - case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in + case $(menu "Remove" "󰣇 Package\n Browser\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in *Package*) terminal omarchy-pkg-remove ;; + *Browser*) show_remove_browser_menu ;; *Web*) present_terminal omarchy-webapp-remove ;; *TUI*) present_terminal omarchy-tui-remove ;; *Development*) show_remove_development_menu ;; @@ -484,6 +532,18 @@ show_remove_menu() { esac } +show_remove_browser_menu() { + case $(menu "Remove" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in + *Chrome*) present_terminal "omarchy-remove-browser chrome" ;; + *Edge*) present_terminal "omarchy-remove-browser edge" ;; + *"Brave Origin"*) present_terminal "omarchy-remove-browser brave-origin" ;; + *Brave*) present_terminal "omarchy-remove-browser brave" ;; + *Firefox*) present_terminal "omarchy-remove-browser firefox" ;; + *Zen*) present_terminal "omarchy-remove-browser zen" ;; + *) show_remove_menu ;; + esac +} + show_remove_gaming_menu() { case $(menu "Remove" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰖺 Xbox Controller (󰂯)\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in *Steam*) present_terminal omarchy-remove-gaming-steam ;; @@ -608,7 +668,7 @@ show_update_hardware_menu() { show_update_password_menu() { case $(menu "Update Password" " Drive Encryption\n User") in - *Drive*) present_terminal omarchy-drive-set-password ;; + *Drive*) present_terminal omarchy-drive-password ;; *User*) present_terminal passwd ;; *) show_update_menu ;; esac @@ -648,6 +708,7 @@ go_to_menu() { *toggle*) show_toggle_menu ;; *hardware*) show_hardware_menu ;; *share*) show_share_menu ;; + *transcode*) show_transcode_menu ;; *background*) show_background_menu ;; *capture*) show_capture_menu ;; *style*) show_style_menu ;; diff --git a/bin/omarchy-pkg-add b/bin/omarchy-pkg-add index 5c18ae02..4db19e05 100755 --- a/bin/omarchy-pkg-add +++ b/bin/omarchy-pkg-add @@ -1,10 +1,8 @@ #!/bin/bash # omarchy:summary=Install Arch packages if they are missing -# omarchy:group=install -# omarchy:name=package # omarchy:args= -# omarchy:examples=omarchy install package jq ripgrep +# omarchy:examples=omarchy pkg add jq ripgrep # omarchy:requires-sudo=true if omarchy-pkg-missing "$@"; then diff --git a/bin/omarchy-plymouth-preview b/bin/omarchy-plymouth-preview index 88cc71df..b3724f5a 100755 --- a/bin/omarchy-plymouth-preview +++ b/bin/omarchy-plymouth-preview @@ -2,6 +2,7 @@ # omarchy:summary=Preview a Plymouth boot screen with custom colors and logo # omarchy:args= +# omarchy:examples=omarchy plymouth preview '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png /tmp/plymouth-preview.png # Render a Plymouth login-screen preview PNG by compositing the staged omarchy # theme assets (recolored with the given text color) onto the background. diff --git a/bin/omarchy-plymouth-set b/bin/omarchy-plymouth-set index 46a4a9a8..ff9ca27d 100755 --- a/bin/omarchy-plymouth-set +++ b/bin/omarchy-plymouth-set @@ -2,6 +2,7 @@ # omarchy:summary=Set the Plymouth boot theme colors and logo # omarchy:args= +# omarchy:examples=omarchy plymouth set '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png # omarchy:requires-sudo=true # Configure the Plymouth boot theme with a custom background color, text color, and logo. diff --git a/bin/omarchy-remove-browser b/bin/omarchy-remove-browser new file mode 100755 index 00000000..6ae076df --- /dev/null +++ b/bin/omarchy-remove-browser @@ -0,0 +1,73 @@ +#!/bin/bash + +# omarchy:summary=Remove a supported browser and clean up Omarchy browser defaults +# omarchy:args= +# omarchy:examples=omarchy remove browser firefox | omarchy remove browser brave +# omarchy:requires-sudo=true + +set_fallback_default_browser() { + local current_browser + current_browser=$(xdg-settings get default-web-browser) + + if [[ $current_browser != "$1" ]]; then + return + fi + + if omarchy-cmd-present chromium; then + xdg-settings set default-web-browser chromium.desktop + xdg-mime default chromium.desktop x-scheme-handler/http + xdg-mime default chromium.desktop x-scheme-handler/https + xdg-mime default chromium.desktop text/html + fi +} + +case $1 in +chrome) + echo "Removing Chrome..." + set_fallback_default_browser google-chrome.desktop + omarchy-pkg-drop google-chrome + rm -f ~/.config/chrome-flags.conf + sudo rm -f /etc/opt/chrome/policies/managed/color.json + ;; +edge) + echo "Removing Edge..." + set_fallback_default_browser microsoft-edge.desktop + omarchy-pkg-drop microsoft-edge-stable-bin + rm -f ~/.config/microsoft-edge-stable-flags.conf + sudo rm -f /etc/opt/edge/policies/managed/color.json + ;; +brave) + echo "Removing Brave..." + set_fallback_default_browser brave-browser.desktop + omarchy-pkg-drop brave-bin + rm -f ~/.config/brave-flags.conf + + if omarchy-pkg-missing brave-origin-beta-bin; then + sudo rm -rf /etc/brave + fi + ;; +brave-origin) + echo "Removing Brave Origin..." + set_fallback_default_browser brave-origin-beta.desktop + omarchy-pkg-drop brave-origin-beta-bin + rm -f ~/.config/brave-origin-beta-flags.conf + + if omarchy-pkg-missing brave-bin; then + sudo rm -rf /etc/brave + fi + ;; +firefox) + echo "Removing Firefox..." + set_fallback_default_browser firefox.desktop + omarchy-pkg-drop firefox + ;; +zen) + echo "Removing Zen..." + set_fallback_default_browser zen.desktop + omarchy-pkg-drop zen-browser-bin + ;; +*) + echo "Usage: omarchy-remove-browser " + exit 1 + ;; +esac diff --git a/bin/omarchy-remove-gaming-retroarch b/bin/omarchy-remove-gaming-retroarch index d3c101c8..16e549f2 100755 --- a/bin/omarchy-remove-gaming-retroarch +++ b/bin/omarchy-remove-gaming-retroarch @@ -21,7 +21,8 @@ omarchy-pkg-drop \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-yabause \ - libretro-fbneo-git + libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ + retroarch-joypad-autoconfig-git rm -rf \ "$HOME/.config/retroarch" \ diff --git a/bin/omarchy-restart-helix b/bin/omarchy-restart-helix index 878cc6c9..a5af10e8 100755 --- a/bin/omarchy-restart-helix +++ b/bin/omarchy-restart-helix @@ -1,6 +1,6 @@ #!/bin/bash -# Reload Helix configuration (used by the Omarchy theme switching). +# omarchy:summary=Reload Helix configuration if pgrep -x helix >/dev/null; then pkill -USR1 helix diff --git a/bin/omarchy-restart-trackpad b/bin/omarchy-restart-trackpad index 45898dc3..085087ad 100755 --- a/bin/omarchy-restart-trackpad +++ b/bin/omarchy-restart-trackpad @@ -4,7 +4,7 @@ # omarchy:requires-sudo=true for dev in /sys/bus/i2c/drivers/i2c_hid_acpi/i2c-*; do - [ -e "$dev" ] || continue + [[ -e $dev ]] || continue I2C_DEVICE=$(basename "$dev") echo "Resetting $I2C_DEVICE via i2c_hid_acpi unbind/rebind..." echo "$I2C_DEVICE" | sudo tee /sys/bus/i2c/drivers/i2c_hid_acpi/unbind > /dev/null diff --git a/bin/omarchy-screensaver-logo b/bin/omarchy-screensaver-logo new file mode 100755 index 00000000..1c51a648 --- /dev/null +++ b/bin/omarchy-screensaver-logo @@ -0,0 +1,384 @@ +#!/bin/bash + +# omarchy:summary=Set the screensaver logo text from an SVG/PNG or the default +# omarchy:args= [--width ] [--height ] [--mode ] [--threshold ] [--invert] [--stdout] +# omarchy:examples=omarchy screensaver logo ~/logo.svg | omarchy screensaver logo default | omarchy screensaver logo ~/logo.png --width 80 --mode block --stdout + +set -o pipefail + +usage() { + cat <<'EOF' +Usage: omarchy-screensaver-logo [options] + +Sets the screensaver logo text from an image. +Pass "default" instead of an image path to restore the Omarchy default. +By default, writes to ~/.config/omarchy/branding/screensaver.txt. + +Options: + -w, --width Maximum output width in terminal columns (default: 80) + -H, --height Maximum output height in terminal rows (default: 26) + -m, --mode Output style (default: braille) + -t, --threshold Pixel threshold from 0-100 (default: 50) + --invert Treat light pixels as the logo instead of dark pixels + --no-trim Preserve surrounding whitespace/background + --stdout Print converted text instead of writing the screensaver file + --help Show this help +EOF +} + +width=80 +height=26 +mode=braille +threshold=50 +invert=false +trim=true +output_path="$HOME/.config/omarchy/branding/screensaver.txt" +image_path="" +reset_default=false + +while (($# > 0)); do + case "$1" in + --help) + usage + exit 0 + ;; + -w | --width) + shift + if [[ -z $1 ]]; then + echo "Missing value for --width" >&2 + exit 1 + fi + width="$1" + ;; + --width=*) + width="${1#*=}" + ;; + -H | --height) + shift + if [[ -z $1 ]]; then + echo "Missing value for --height" >&2 + exit 1 + fi + height="$1" + ;; + --height=*) + height="${1#*=}" + ;; + -m | --mode) + shift + if [[ -z $1 ]]; then + echo "Missing value for --mode" >&2 + exit 1 + fi + mode="$1" + ;; + --mode=*) + mode="${1#*=}" + ;; + --block | --blocks) + mode=block + ;; + --braille) + mode=braille + ;; + -t | --threshold) + shift + if [[ -z $1 ]]; then + echo "Missing value for --threshold" >&2 + exit 1 + fi + threshold="$1" + ;; + --threshold=*) + threshold="${1#*=}" + ;; + --invert) + invert=true + ;; + --no-trim) + trim=false + ;; + --stdout) + output_path="-" + ;; + --) + shift + break + ;; + -*) + echo "Unknown option: $1" >&2 + usage >&2 + exit 1 + ;; + *) + if [[ $1 == "default" && -z $image_path ]]; then + reset_default=true + elif [[ -z $image_path ]]; then + image_path="$1" + else + echo "Unexpected argument: $1" >&2 + usage >&2 + exit 1 + fi + ;; + esac + shift +done + +if (($# > 0)); then + while (($# > 0)); do + if [[ $1 == "default" && -z $image_path ]]; then + reset_default=true + elif [[ -z $image_path ]]; then + image_path="$1" + else + echo "Unexpected argument: $1" >&2 + usage >&2 + exit 1 + fi + shift + done +fi + +if [[ $reset_default == "true" ]]; then + if [[ -n $image_path ]]; then + echo "default does not accept an image path" >&2 + exit 1 + fi + + default_path="${OMARCHY_PATH:-$HOME/.local/share/omarchy}/logo.txt" + if [[ ! -f $default_path ]]; then + echo "Default screensaver logo text not found: $default_path" >&2 + exit 1 + fi + + if [[ $output_path == "-" ]]; then + cat "$default_path" + else + mkdir -p "$(dirname "$output_path")" + cp "$default_path" "$output_path" + echo "Restored default screensaver logo text to $output_path" + fi + exit 0 +fi + +if [[ -z $image_path ]]; then + usage >&2 + exit 1 +fi + +if ! [[ $width =~ ^[0-9]+$ ]] || (( width < 1 )); then + echo "Invalid width: $width" >&2 + exit 1 +fi + +if ! [[ $height =~ ^[0-9]+$ ]] || (( height < 1 )); then + echo "Invalid height: $height" >&2 + exit 1 +fi + +if [[ $mode != "braille" && $mode != "block" ]]; then + echo "Invalid mode: $mode (expected braille or block)" >&2 + exit 1 +fi + +if ! [[ $threshold =~ ^[0-9]+$ ]] || (( threshold < 0 || threshold > 100 )); then + echo "Invalid threshold: $threshold (expected 0-100)" >&2 + exit 1 +fi + +if [[ ! -f $image_path ]]; then + echo "Logo file not found: $image_path" >&2 + exit 1 +fi + +if omarchy-cmd-missing magick; then + echo "ImageMagick is required to convert logo images" >&2 + exit 1 +fi + +case "$mode" in +braille) + pixel_width=$((width * 2)) + pixel_height=$((height * 4)) + ;; +block) + pixel_width=$width + pixel_height=$((height * 2)) + ;; +esac + +alpha_min=$(magick -background none "$image_path" -alpha extract -format '%[fx:minima]' info: 2>/dev/null) || { + echo "Unable to read logo image: $image_path" >&2 + exit 1 +} +alpha_max=$(magick -background none "$image_path" -alpha extract -format '%[fx:maxima]' info: 2>/dev/null) || { + echo "Unable to read logo image: $image_path" >&2 + exit 1 +} + +use_alpha=false +if awk -v min="$alpha_min" -v max="$alpha_max" 'BEGIN { exit !(min < 0.999 && max > min) }'; then + use_alpha=true +fi + +magick_args=(-background none "$image_path" -auto-orient) + +if [[ $use_alpha == "true" ]]; then + magick_args+=(-alpha extract -alpha off) + if [[ $invert == "true" ]]; then + magick_args+=(-negate) + fi +else + magick_args+=(-alpha remove -alpha off -colorspace Gray) + if [[ $invert == "false" ]]; then + magick_args+=(-negate) + fi +fi + +if [[ $trim == "true" ]]; then + magick_args+=(-bordercolor black -border 1 -trim +repage) +fi + +magick_args+=(-resize "${pixel_width}x${pixel_height}" -threshold "${threshold}%" -negate -compress none pbm:-) + +tmp_output=$(mktemp) +trap 'rm -f "$tmp_output"' EXIT + +if [[ $mode == "braille" ]]; then + if ! magick "${magick_args[@]}" | awk ' + BEGIN { + braille_base = 10240 + dot[0,0] = 1 + dot[0,1] = 2 + dot[0,2] = 4 + dot[1,0] = 8 + dot[1,1] = 16 + dot[1,2] = 32 + dot[0,3] = 64 + dot[1,3] = 128 + } + { + sub(/#.*/, "") + for (i = 1; i <= NF; i++) { + token[++token_count] = $i + } + } + END { + if (token[1] != "P1") { + exit 1 + } + + width = token[2] + height = token[3] + pixel_offset = 4 + + for (y = 0; y < height; y += 4) { + line = "" + for (x = 0; x < width; x += 2) { + code = 0 + for (dy = 0; dy < 4; dy++) { + for (dx = 0; dx < 2; dx++) { + if (y + dy < height && x + dx < width) { + pixel = token[pixel_offset + ((y + dy) * width) + x + dx] + if (pixel == 1) { + code += dot[dx,dy] + } + } + } + } + + if (code == 0) { + line = line " " + } else { + line = line sprintf("%c", braille_base + code) + } + } + sub(/[ ]+$/, "", line) + lines[++line_count] = line + } + + first = 1 + while (first <= line_count && lines[first] ~ /^[ ]*$/) { + first++ + } + + last = line_count + while (last >= first && lines[last] ~ /^[ ]*$/) { + last-- + } + + for (i = first; i <= last; i++) { + print lines[i] + } + } + ' >"$tmp_output"; then + echo "Unable to convert logo image: $image_path" >&2 + exit 1 + fi +else + if ! magick "${magick_args[@]}" | awk ' + BEGIN { + block["11"] = "█" + block["10"] = "▀" + block["01"] = "▄" + block["00"] = " " + } + { + sub(/#.*/, "") + for (i = 1; i <= NF; i++) { + token[++token_count] = $i + } + } + END { + if (token[1] != "P1") { + exit 1 + } + + width = token[2] + height = token[3] + pixel_offset = 4 + + for (y = 0; y < height; y += 2) { + line = "" + for (x = 0; x < width; x++) { + top = token[pixel_offset + (y * width) + x] + bottom = (y + 1 < height) ? token[pixel_offset + ((y + 1) * width) + x] : 0 + line = line block[top bottom] + } + sub(/[ ]+$/, "", line) + lines[++line_count] = line + } + + first = 1 + while (first <= line_count && lines[first] ~ /^[ ]*$/) { + first++ + } + + last = line_count + while (last >= first && lines[last] ~ /^[ ]*$/) { + last-- + } + + for (i = first; i <= last; i++) { + print lines[i] + } + } + ' >"$tmp_output"; then + echo "Unable to convert logo image: $image_path" >&2 + exit 1 + fi +fi + +if [[ ! -s $tmp_output ]]; then + echo "No logo pixels found in: $image_path" >&2 + exit 1 +fi + +if [[ $output_path == "-" ]]; then + cat "$tmp_output" +else + mkdir -p "$(dirname "$output_path")" + cp "$tmp_output" "$output_path" + echo "Wrote screensaver logo text to $output_path" +fi diff --git a/bin/omarchy-state b/bin/omarchy-state index 2a294df4..4fda5b3a 100755 --- a/bin/omarchy-state +++ b/bin/omarchy-state @@ -2,6 +2,7 @@ # omarchy:summary=Manage persistent state files for Omarchy toggles and settings. # omarchy:args= +# omarchy:hidden=true STATE_DIR="$HOME/.local/state/omarchy" mkdir -p "$STATE_DIR" diff --git a/bin/omarchy-swayosd-brightness b/bin/omarchy-swayosd-brightness index cf089a86..8a1e852d 100755 --- a/bin/omarchy-swayosd-brightness +++ b/bin/omarchy-swayosd-brightness @@ -1,7 +1,8 @@ #!/bin/bash # omarchy:summary=Display brightness level using SwayOSD on the current monitor. -# omarchy:args= +# omarchy:args=<0-100> +# omarchy:examples=omarchy swayosd brightness 0 | omarchy swayosd brightness 50 | omarchy swayosd brightness 100 percent="$1" diff --git a/bin/omarchy-swayosd-kbd-brightness b/bin/omarchy-swayosd-kbd-brightness index 9252d475..52e7959a 100755 --- a/bin/omarchy-swayosd-kbd-brightness +++ b/bin/omarchy-swayosd-kbd-brightness @@ -1,7 +1,8 @@ #!/bin/bash # omarchy:summary=Display keyboard brightness level using SwayOSD on the current monitor. -# omarchy:args= +# omarchy:args=<0-100> +# omarchy:examples=omarchy swayosd kbd brightness 0 | omarchy swayosd kbd brightness 50 | omarchy swayosd kbd brightness 100 percent="$1" diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index 0ccd4d90..a1ea82b4 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -1,11 +1,16 @@ #!/bin/bash -# omarchy:summary=Lock the screen +# omarchy:summary=Lock the computer and turn off the display # omarchy:group=system # omarchy:name=lock # omarchy:examples=omarchy system lock -pidof hyprlock || hyprlock & +if ! pidof hyprlock >/dev/null; then + ( + hyprlock + omarchy-system-wake + ) & +fi # Set keyboard layout to default (first layout) hyprctl switchxkblayout all 0 > /dev/null 2>&1 @@ -17,3 +22,12 @@ fi # Avoid running screensaver when locked pkill -f org.omarchy.screensaver + +if [[ ${OMARCHY_LOCK_ONLY:-false} != "true" ]]; then + ( + sleep 3 + pidof hyprlock >/dev/null || exit 0 + omarchy-brightness-keyboard off + omarchy-brightness-display off + ) & +fi diff --git a/bin/omarchy-system-wake b/bin/omarchy-system-wake new file mode 100755 index 00000000..e5b90389 --- /dev/null +++ b/bin/omarchy-system-wake @@ -0,0 +1,9 @@ +#!/bin/bash + +# omarchy:summary=Wake displays and restore brightness after idle +# omarchy:group=system +# omarchy:name=wake +# omarchy:examples=omarchy system wake + +omarchy-brightness-display on +omarchy-brightness-keyboard restore diff --git a/bin/omarchy-theme-bg-set b/bin/omarchy-theme-bg-set index 4b069086..9c695d0e 100755 --- a/bin/omarchy-theme-bg-set +++ b/bin/omarchy-theme-bg-set @@ -9,9 +9,14 @@ if [[ -z $1 ]]; then exit 1 fi -BACKGROUND="$1" +BACKGROUND="$(realpath "$1")" CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background" +if [[ ! -f "$BACKGROUND" ]]; then + echo "File does not exist: $BACKGROUND" >&2 + exit 1 +fi + # Create symlink to the new background ln -nsf "$BACKGROUND" "$CURRENT_BACKGROUND_LINK" diff --git a/bin/omarchy-theme-colors-from-alacritty b/bin/omarchy-theme-colors-from-alacritty index 7c41b5ec..a740c0ed 100755 --- a/bin/omarchy-theme-colors-from-alacritty +++ b/bin/omarchy-theme-colors-from-alacritty @@ -2,6 +2,7 @@ # omarchy:summary=Generate a theme's colors.toml from its alacritty.toml palette # omarchy:args= +# omarchy:hidden=true set -e diff --git a/bin/omarchy-theme-refresh b/bin/omarchy-theme-refresh index bbd79a31..28c75437 100755 --- a/bin/omarchy-theme-refresh +++ b/bin/omarchy-theme-refresh @@ -5,5 +5,5 @@ THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name" if [[ -f $THEME_NAME_PATH ]]; then - omarchy-theme-set "$(cat $THEME_NAME_PATH)" + OMARCHY_THEME_SKIP_BACKGROUND=1 omarchy-theme-set "$(cat $THEME_NAME_PATH)" fi diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index f231d11e..fe57c2af 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -45,7 +45,9 @@ mv "$NEXT_THEME_PATH" "$CURRENT_THEME_PATH" echo "$THEME_NAME" >"$HOME/.config/omarchy/current/theme.name" # Change background with theme -omarchy-theme-bg-next +if [[ $OMARCHY_THEME_SKIP_BACKGROUND != "1" ]]; then + omarchy-theme-bg-next +fi # Restart components to apply new theme if pgrep -x waybar >/dev/null; then @@ -60,6 +62,7 @@ omarchy-restart-mako omarchy-restart-helix # Change app-specific themes +omarchy-theme-set-foot omarchy-theme-set-gnome omarchy-theme-set-browser omarchy-theme-set-vscode @@ -67,4 +70,4 @@ omarchy-theme-set-obsidian omarchy-theme-set-keyboard # Call hook on theme set -omarchy-hook theme-set "$THEME_NAME" +omarchy-hook theme-set "$THEME_NAME" >/dev/null diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index e43f0634..ee189d17 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -1,30 +1,44 @@ #!/bin/bash -# omarchy:summary=Apply the current theme color to Chromium and Brave +# omarchy:summary=Apply the current theme color to Chromium, Chrome, Edge, and Brave +# omarchy:hidden=true CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme -if omarchy-cmd-present chromium || omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then - if [[ -f $CHROMIUM_THEME ]]; then - THEME_RGB_COLOR=$(<$CHROMIUM_THEME) - THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) - else - # Use a default, neutral grey if theme doesn't have a color - THEME_RGB_COLOR="28,32,39" - THEME_HEX_COLOR="#1c2027" - fi - - if omarchy-cmd-present chromium; then - echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null - pgrep -x chromium >/dev/null && chromium --refresh-platform-policy --no-startup-window &>/dev/null - fi - - # Brave and Brave Origin Beta share /etc/brave/policies, so a single write covers both - if omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then - echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/brave/policies/managed/color.json" >/dev/null - if pgrep -x brave >/dev/null; then - omarchy-cmd-present brave && brave --refresh-platform-policy --no-startup-window &>/dev/null - omarchy-cmd-present brave-origin-beta && brave-origin-beta --refresh-platform-policy --no-startup-window &>/dev/null - fi - fi +if [[ -f $CHROMIUM_THEME ]]; then + THEME_RGB_COLOR=$(<$CHROMIUM_THEME) + THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) +else + # Use a default, neutral grey if theme doesn't have a color + THEME_HEX_COLOR="#1c2027" fi + +set_browser_policy() { + local policy_dir="$1" + + [[ -d $policy_dir ]] || return + echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "$policy_dir/color.json" >/dev/null +} + +refresh_running_browser() { + local process="$1" + local command="$2" + local pgrep_args="${3:--x}" + + if omarchy-cmd-present "$command" && pgrep $pgrep_args "$process" >/dev/null; then + "$command" --refresh-platform-policy --no-startup-window &>/dev/null + fi +} + +set_browser_policy /etc/chromium/policies/managed +refresh_running_browser chromium chromium + +set_browser_policy /etc/opt/chrome/policies/managed +refresh_running_browser chrome google-chrome-stable || refresh_running_browser chrome google-chrome + +set_browser_policy /etc/opt/edge/policies/managed +refresh_running_browser msedge microsoft-edge-stable + +set_browser_policy /etc/brave/policies/managed +refresh_running_browser brave brave +refresh_running_browser brave-origin-beta brave-origin-beta -f diff --git a/bin/omarchy-theme-set-foot b/bin/omarchy-theme-set-foot new file mode 100755 index 00000000..f7268d22 --- /dev/null +++ b/bin/omarchy-theme-set-foot @@ -0,0 +1,28 @@ +#!/bin/bash + +# omarchy:summary=Apply current Omarchy theme colors to running Foot terminals +# omarchy:hidden=true + +foot_theme=~/.config/omarchy/current/theme/foot.ini + +if [[ ! -f $foot_theme ]] || ! pgrep -x foot >/dev/null; then + exit 0 +fi + +foot_osc=$(awk -F= ' + function color(value) { return "#" value } + /^foreground=/ { printf "\033]10;%s\007", color($2) } + /^background=/ { printf "\033]11;%s\007", color($2) } + /^cursor=/ { split($2, parts, " "); printf "\033]12;%s\007", color(parts[2]) } + /^selection-background=/ { printf "\033]17;%s\007", color($2) } + /^selection-foreground=/ { printf "\033]19;%s\007", color($2) } + /^regular[0-7]=/ { split($1, parts, "regular"); printf "\033]4;%d;%s\007", parts[2], color($2) } + /^bright[0-7]=/ { split($1, parts, "bright"); printf "\033]4;%d;%s\007", parts[2] + 8, color($2) } +' "$foot_theme") + +for foot_pid in $(pgrep -x foot); do + for child_pid in $(pgrep -P "$foot_pid"); do + tty=$(readlink "/proc/$child_pid/fd/1" 2>/dev/null) + [[ $tty == /dev/pts/* ]] && printf '%b' "$foot_osc" >"$tty" + done +done diff --git a/bin/omarchy-theme-set-gnome b/bin/omarchy-theme-set-gnome index 66e3e204..379f76ec 100755 --- a/bin/omarchy-theme-set-gnome +++ b/bin/omarchy-theme-set-gnome @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme to GNOME color mode and icon settings +# omarchy:hidden=true if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then gsettings set org.gnome.desktop.interface color-scheme "prefer-light" diff --git a/bin/omarchy-theme-set-keyboard b/bin/omarchy-theme-set-keyboard index 7fc9c7a5..0fd1a202 100755 --- a/bin/omarchy-theme-set-keyboard +++ b/bin/omarchy-theme-set-keyboard @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to supported keyboards +# omarchy:hidden=true omarchy-theme-set-keyboard-asus-rog omarchy-theme-set-keyboard-f16 diff --git a/bin/omarchy-theme-set-keyboard-asus-rog b/bin/omarchy-theme-set-keyboard-asus-rog index 971097e6..c485e795 100755 --- a/bin/omarchy-theme-set-keyboard-asus-rog +++ b/bin/omarchy-theme-set-keyboard-asus-rog @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to ASUS ROG keyboards +# omarchy:hidden=true ASUSCTL_THEME=~/.config/omarchy/current/theme/keyboard.rgb diff --git a/bin/omarchy-theme-set-keyboard-f16 b/bin/omarchy-theme-set-keyboard-f16 index 466690d4..c8fb283e 100755 --- a/bin/omarchy-theme-set-keyboard-f16 +++ b/bin/omarchy-theme-set-keyboard-f16 @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to Framework Laptop 16 keyboards +# omarchy:hidden=true FRAMEWORK16_THEME=~/.config/omarchy/current/theme/keyboard.rgb diff --git a/bin/omarchy-theme-set-obsidian b/bin/omarchy-theme-set-obsidian index dd9468aa..e92bf6f5 100755 --- a/bin/omarchy-theme-set-obsidian +++ b/bin/omarchy-theme-set-obsidian @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Sync Omarchy theme to all Obsidian vaults +# omarchy:hidden=true CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" diff --git a/bin/omarchy-theme-set-templates b/bin/omarchy-theme-set-templates index f272ffff..92236d19 100755 --- a/bin/omarchy-theme-set-templates +++ b/bin/omarchy-theme-set-templates @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Generate themed config files from Omarchy templates +# omarchy:hidden=true TEMPLATES_DIR="$OMARCHY_PATH/default/themed" USER_TEMPLATES_DIR="$HOME/.config/omarchy/themed" diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index 703b1563..d0e0331c 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Sync Omarchy theme to VS Code, VSCodium, and Cursor +# omarchy:hidden=true VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" diff --git a/bin/omarchy-transcode b/bin/omarchy-transcode new file mode 100755 index 00000000..66495db1 --- /dev/null +++ b/bin/omarchy-transcode @@ -0,0 +1,231 @@ +#!/bin/bash + +# omarchy:group=transcode +# omarchy:name= +# omarchy:summary=Transcode pictures and videos for sharing +# omarchy:args=[--path path] [input] [format] [resolution] +# omarchy:examples=omarchy transcode|omarchy transcode --path ~/Downloads|omarchy transcode ~/Videos/demo.mov mp4 1080p|omarchy transcode ~/Pictures/wallpaper.heic jpg medium + +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: + omarchy transcode [--path path] [input] [format] [resolution] + +With no input, fuzzy-pick a picture or video from ~/Pictures and ~/Videos, +or only from --path when provided. Then pick the output format and resolution. + +Options: + --path path Limit interactive fuzzy file selection to this path + +Formats: + Pictures: jpg, png + Videos: mp4, gif + +Resolutions: + Pictures: high, medium, low + Videos: 4k, 1080p, 720p +EOF +} + +pick_file() { + local search_path="$1" + local paths=() + + if [[ -n $search_path ]]; then + [[ -e $search_path ]] || { echo "Path not found: $search_path" >&2; return 1; } + paths=("$search_path") + else + paths=("$HOME/Pictures" "$HOME/Videos") + fi + + find "${paths[@]}" -type f \ + \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' -o -iname '*.heic' -o -iname '*.avif' \ + -o -iname '*.mp4' -o -iname '*.mov' -o -iname '*.m4v' -o -iname '*.mkv' -o -iname '*.webm' -o -iname '*.avi' \) \ + -printf '%T@\t%p\n' 2>/dev/null | sort -rn | cut -f2- | fzf --layout=reverse-list --prompt="Transcode file> " +} + +pick_option() { + local prompt="$1" + shift + + gum choose --header "$prompt" "$@" +} + +media_type() { + local mime + mime=$(file -b --mime-type "$1") + + case "$mime" in + image/*) echo picture ;; + video/*) echo video ;; + *) + echo "Unsupported file type: $mime" >&2 + return 1 + ;; + esac +} + +output_path() { + local input="$1" + local format="$2" + local resolution="$3" + local dir base stem + + dir=$(dirname -- "$input") + base=$(basename -- "$input") + stem="${base%.*}" + + printf '%s/%s-%s.%s' "$dir" "$stem" "$resolution" "$format" +} + +transcode_picture() { + local input="$1" format="$2" resolution="$3" output="$4" + local resize + + case "$resolution" in + high) resize='3160x>' ;; + medium) resize='2160x>' ;; + low) resize='1080x>' ;; + *) + echo "Invalid picture resolution: $resolution" >&2 + return 1 + ;; + esac + + case "$format" in + jpg) + magick "$input" -resize "$resize" -quality 85 -strip "$output" + ;; + png) + magick "$input" -resize "$resize" -strip -define png:compression-filter=5 \ + -define png:compression-level=9 \ + -define png:compression-strategy=1 \ + -define png:exclude-chunk=all \ + "$output" + ;; + *) + echo "Invalid picture format: $format" >&2 + return 1 + ;; + esac +} + +transcode_video() { + local input="$1" format="$2" resolution="$3" output="$4" + local scale + + case "$resolution" in + 4k) scale='scale=-2:2160' ;; + 1080p) scale='scale=-2:1080' ;; + 720p) scale='scale=-2:720' ;; + *) + echo "Invalid video resolution: $resolution" >&2 + return 1 + ;; + esac + + case "$format" in + mp4) + if [[ $resolution == "4k" ]]; then + ffmpeg -i "$input" -vf "$scale" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "$output" + else + ffmpeg -i "$input" -vf "$scale" -c:v libx264 -preset fast -crf 23 -c:a copy "$output" + fi + ;; + gif) + ffmpeg -i "$input" -vf "fps=10,$scale:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "$output" + ;; + *) + echo "Invalid video format: $format" >&2 + return 1 + ;; + esac +} + +copy_to_clipboard() { + local output="$1" + local uri + + uri="file://$(realpath -- "$output")" + printf '%s\n' "$uri" | wl-copy --type text/uri-list +} + +main() { + local input="" format="" resolution="" search_path="" + local type output positional=() + + while (( $# > 0 )); do + case "$1" in + --path) + shift + [[ $# -gt 0 ]] || { echo "Missing value for --path" >&2; return 2; } + search_path="$1" + ;; + --help | -h) + usage + return 0 + ;; + --) + shift + positional+=("$@") + break + ;; + --*) + echo "Unknown option: $1" >&2 + usage >&2 + return 2 + ;; + *) + positional+=("$1") + ;; + esac + shift + done + + input="${positional[0]:-}" + format="${positional[1]:-}" + resolution="${positional[2]:-}" + + if [[ -z $input ]]; then + input=$(pick_file "$search_path") + fi + + [[ -n $input ]] || return 1 + [[ -f $input ]] || { echo "File not found: $input" >&2; return 1; } + + type=$(media_type "$input") + + if [[ -z $format ]]; then + if [[ $type == "picture" ]]; then + format=$(pick_option "Select format..." jpg png) + else + format=$(pick_option "Select format..." mp4 gif) + fi + fi + + if [[ -z $resolution ]]; then + if [[ $type == "picture" ]]; then + resolution=$(pick_option "Select resolution..." high medium low) + else + resolution=$(pick_option "Select resolution..." 4k 1080p 720p) + fi + fi + + output=$(output_path "$input" "$format" "$resolution") + + if [[ $type == "picture" ]]; then + transcode_picture "$input" "$format" "$resolution" "$output" + else + transcode_video "$input" "$format" "$resolution" "$output" + echo "" + fi + + copy_to_clipboard "$output" + echo "Your $type has been transcoded into $format as $resolution. It's on your clipboard." + echo "" + echo "It's also in $output" +} + +main "$@" diff --git a/bin/omarchy-update-without-idle b/bin/omarchy-update-without-idle index 62a38fa4..bea1400b 100755 --- a/bin/omarchy-update-without-idle +++ b/bin/omarchy-update-without-idle @@ -1,3 +1,4 @@ #!/bin/bash # omarchy:summary=No-op now that omarchy-update-perform is responsible for idle management. +# omarchy:hidden=true diff --git a/bin/omarchy-upload-log b/bin/omarchy-upload-log index 6d38eee8..7d06ac3b 100755 --- a/bin/omarchy-upload-log +++ b/bin/omarchy-upload-log @@ -2,6 +2,7 @@ # omarchy:summary=Upload logs to 0x0.st # omarchy:args= +# omarchy:hidden=true LOG_TYPE="${1:-install}" TEMP_LOG="/tmp/upload-log.txt" diff --git a/config/brave-flags.conf b/config/brave-flags.conf deleted file mode 100644 index 57eba524..00000000 --- a/config/brave-flags.conf +++ /dev/null @@ -1 +0,0 @@ ---load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url diff --git a/config/brave-origin-beta-flags.conf b/config/brave-origin-beta-flags.conf deleted file mode 120000 index f3609ca7..00000000 --- a/config/brave-origin-beta-flags.conf +++ /dev/null @@ -1 +0,0 @@ -brave-flags.conf \ No newline at end of file diff --git a/config/foot/foot.ini b/config/foot/foot.ini new file mode 100644 index 00000000..9cbd91ec --- /dev/null +++ b/config/foot/foot.ini @@ -0,0 +1,19 @@ +[main] +include=~/.config/omarchy/current/theme/foot.ini +term=xterm-256color +font=JetBrainsMono Nerd Font:size=9 +pad=14x14 +initial-window-mode=windowed +workers=0 + +[scrollback] +lines=10000 + +[cursor] +style=block +blink=no + +[key-bindings] +clipboard-copy=Control+Insert +primary-paste=none +clipboard-paste=Shift+Insert diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf index 7d003275..32ecb12d 100644 --- a/config/hypr/hypridle.conf +++ b/config/hypr/hypridle.conf @@ -1,28 +1,19 @@ general { lock_cmd = omarchy-system-lock # lock screen and 1password - before_sleep_cmd = loginctl lock-session # lock before suspend. - after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display. + before_sleep_cmd = OMARCHY_LOCK_ONLY=true omarchy-system-lock # lock before suspend without scheduling display off. + after_sleep_cmd = sleep 1 && omarchy-system-wake # delay for PAM readiness, then turn on display. inhibit_sleep = 3 # wait until screen is locked } +# Start screensaver after 2.5 minutes listener { - timeout = 150 # 2.5min - on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already) + timeout = 150 + on-timeout = pidof hyprlock || omarchy-launch-screensaver } +# Lock system after 5 minutes listener { - timeout = 151 # 5min - on-timeout = loginctl lock-session # lock screen when timeout has passed -} - -listener { - timeout = 330 # 5.5min - on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight - on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight -} - -listener { - timeout = 330 # 5.5min - on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed - on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected + timeout = 152 + on-timeout = omarchy-system-lock + on-resume = omarchy-system-wake } diff --git a/config/hypr/input.conf b/config/hypr/input.conf index 36fb4403..ad15ddaf 100644 --- a/config/hypr/input.conf +++ b/config/hypr/input.conf @@ -41,7 +41,7 @@ input { } # Scroll nicely in the terminal -windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5 +windowrule = match:class (Alacritty|kitty|foot), scroll_touchpad 1.5 windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2 # Enable touchpad gestures for changing workspaces diff --git a/config/hypr/looknfeel.conf b/config/hypr/looknfeel.conf index f4a2c00c..ea30461d 100644 --- a/config/hypr/looknfeel.conf +++ b/config/hypr/looknfeel.conf @@ -32,3 +32,9 @@ layout { # Avoid overly wide single-window layouts on wide screens # single_window_aspect_ratio = 1 1 } + +# https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ +scrolling { + # See only one column per screen instead of two + # column_width = 0.97 +} diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf index 083abb63..de772031 100644 --- a/config/tmux/tmux.conf +++ b/config/tmux/tmux.conf @@ -70,6 +70,9 @@ set -g set-clipboard on set -g allow-passthrough on setw -g aggressive-resize on set -g detach-on-destroy off +set -g extended-keys on +set -g extended-keys-format csi-u +set -sg escape-time 10 # Status bar set -g status-position top diff --git a/default/bash/completions b/default/bash/completions index 003d4f8c..4b85d0a8 100644 --- a/default/bash/completions +++ b/default/bash/completions @@ -46,7 +46,7 @@ _omarchy_complete() { fi } -complete -F _omarchy_complete omarchy +complete -o default -F _omarchy_complete omarchy # Hide individual omarchy-* binaries from initial-word command completion; # the unified `omarchy` dispatcher is the user-facing entry point. diff --git a/default/bash/fns/transcoding b/default/bash/fns/transcoding index 81ad0016..017ddb66 100644 --- a/default/bash/fns/transcoding +++ b/default/bash/fns/transcoding @@ -1,58 +1,33 @@ -# Transcode a video to a good-balance 1080p that's great for sharing online +# Transcoding helpers have moved to omarchy-transcode. + transcode-video-1080p() { - ffmpeg -i "$1" -vf scale=1920:1080 -c:v libx264 -preset fast -crf 23 -c:a copy "${1%.*}-1080p.mp4" + omarchy-transcode "$1" mp4 1080p } -# Transcode a video to a good-balance 4K that's great for sharing online transcode-video-4K() { - ffmpeg -i "$1" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "${1%.*}-optimized.mp4" + omarchy-transcode "$1" mp4 4k } -# Transcode a video to an animated GIF using a palette for accurate colors transcode-video-gif() { - ffmpeg -i "$1" -vf "fps=10,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "${1%.*}.gif" + omarchy-transcode "$1" gif 1080p } -# Transcode any image to JPG image that's great for shrinking wallpapers img2jpg() { - img="$1" - shift - - magick "$img" "$@" -quality 85 -strip "${img%.*}-converted.jpg" + omarchy-transcode "$1" jpg high } -# Transcode any image to a small JPG (max 1080px wide) img2jpg-small() { - img="$1" - shift - - magick "$img" "$@" -resize 1080x\> -quality 85 -strip "${img%.*}-small.jpg" + omarchy-transcode "$1" jpg low } -# Transcode any image to a 4K JPG (max 2160px wide) img2jpg-medium() { - img="$1" - shift - - magick "$img" "$@" -resize 2160x\> -quality 85 -strip "${img%.*}-medium.jpg" + omarchy-transcode "$1" jpg medium } -# Transcode any image to a 6K JPG (max 3160px wide) img2jpg-large() { - img="$1" - shift - - magick "$img" "$@" -resize 3160x\> -quality 85 -strip "${img%.*}-large.jpg" + omarchy-transcode "$1" jpg high } -# Transcode any image to compressed-but-lossless PNG img2png() { - img="$1" - shift - - magick "$img" "$@" -strip -define png:compression-filter=5 \ - -define png:compression-level=9 \ - -define png:compression-strategy=1 \ - -define png:exclude-chunk=all \ - "${img%.*}-optimized.png" + omarchy-transcode "$1" png high } diff --git a/default/firefox/policies.json b/default/firefox/policies.json new file mode 100644 index 00000000..d102c51c --- /dev/null +++ b/default/firefox/policies.json @@ -0,0 +1,26 @@ +{ + "policies": { + "Preferences": { + "apz.overscroll.enabled": { + "Value": true, + "Status": "default" + }, + "media.ffmpeg.vaapi.enabled": { + "Value": true, + "Status": "default" + }, + "media.hardware-video-decoding.force-enabled": { + "Value": true, + "Status": "default" + }, + "widget.disable-swipe-tracker": { + "Value": false, + "Status": "default" + }, + "widget.wayland.fractional-scale.enabled": { + "Value": true, + "Status": "default" + } + } + } +} diff --git a/default/foot/screensaver.ini b/default/foot/screensaver.ini new file mode 100644 index 00000000..7130d069 --- /dev/null +++ b/default/foot/screensaver.ini @@ -0,0 +1,7 @@ +[main] +font=JetBrainsMono Nerd Font:size=18 +pad=0x0 + +[colors-dark] +background=000000 +foreground=ffffff diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf index 443fb069..6f82aa35 100644 --- a/default/hypr/apps/system.conf +++ b/default/hypr/apps/system.conf @@ -3,7 +3,7 @@ windowrule = float on, match:tag floating-window windowrule = center on, match:tag floating-window windowrule = size 875 600, match:tag floating-window -windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv) +windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.codeberg.dnkl.foot|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv) windowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*) windowrule = float on, match:class org.gnome.Calculator diff --git a/default/hypr/apps/terminals.conf b/default/hypr/apps/terminals.conf index ead08dde..b4940720 100644 --- a/default/hypr/apps/terminals.conf +++ b/default/hypr/apps/terminals.conf @@ -1,4 +1,4 @@ # Define terminal tag to style them uniformly -windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty) +windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty|foot) 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 2b871c92..083a4c91 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -15,7 +15,7 @@ bindd = , XF86Calculator, Calculator, exec, gnome-calculator bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar bindd = SUPER CTRL, SPACE, Theme background menu, exec, omarchy-menu background bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme -bindd = SUPER, BACKSPACE, Toggle window transparency, exec, omarchy-hyprland-active-window-transparency-toggle +bindd = SUPER, BACKSPACE, Toggle window transparency, exec, omarchy-hyprland-window-transparency-toggle bindd = SUPER SHIFT, BACKSPACE, Toggle window gaps, exec, omarchy-hyprland-window-gaps-toggle bindd = SUPER CTRL, BACKSPACE, Toggle single-window square aspect, exec, omarchy-hyprland-window-single-square-aspect-toggle @@ -43,6 +43,9 @@ bindd = SUPER CTRL, PRINT, Extract text (OCR) from screenshot, exec, omarchy-cap # File sharing bindd = SUPER CTRL, S, Share, exec, omarchy-menu share +# Transcoding +bindd = SUPER CTRL, R, Transcode, exec, omarchy-menu transcode + # Waybar-less information bindd = SUPER CTRL ALT, T, Show time, exec, notify-send -u low " $(date +"%A %H:%M · %d %B %Y · Week %V")" bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send -u low "$(omarchy-battery-status)" diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index ab2567c9..1a6a8d97 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -113,6 +113,10 @@ dwindle { force_split = 2 # Always split on the right } +scrolling { + column_width = 0.49 +} + # See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more master { new_status = master diff --git a/default/hypr/toggles/window-no-gaps.conf b/default/hypr/toggles/window-no-gaps.conf index a9b6c578..47520e80 100644 --- a/default/hypr/toggles/window-no-gaps.conf +++ b/default/hypr/toggles/window-no-gaps.conf @@ -4,3 +4,7 @@ general { gaps_in = 0 border_size = 0 } + +decoration { + rounding = 0 +} diff --git a/default/omarchy-skill/SKILL.md b/default/omarchy-skill/SKILL.md index db09dcd4..5f9d5a7e 100644 --- a/default/omarchy-skill/SKILL.md +++ b/default/omarchy-skill/SKILL.md @@ -3,7 +3,7 @@ name: omarchy description: > REQUIRED for end-user customization of Linux desktop, window manager, or system config. Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/, - ~/.config/alacritty/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/, + ~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/, or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings, monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes, wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace @@ -24,7 +24,7 @@ It is not for contributing to Omarchy source code. - Editing ANY file in `~/.config/hypr/` (window rules, animations, keybindings, monitors, etc.) - Editing ANY file in `~/.config/waybar/`, `~/.config/walker/`, `~/.config/mako/` -- Editing terminal configs (alacritty, kitty, ghostty) +- Editing terminal configs (alacritty, foot, kitty, ghostty) - Editing ANY file in `~/.config/omarchy/` - Window behavior, animations, opacity, blur, gaps, borders - Layer rules, workspace settings, display/monitor configuration @@ -78,7 +78,7 @@ Omarchy is built on: | **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` | | **Waybar** | Status bar | `~/.config/waybar/` | | **Walker** | App launcher | `~/.config/walker/` | -| **Alacritty/Kitty/Ghostty** | Terminals | `~/.config//` | +| **Alacritty/Foot/Kitty/Ghostty** | Terminals | `~/.config//` | | **Mako** | Notifications | `~/.config/mako/` | | **SwayOSD** | On-screen display | `~/.config/swayosd/` | @@ -163,6 +163,7 @@ Run `omarchy --help` for the full list. The most common groups: ``` ~/.config/alacritty/alacritty.toml +~/.config/foot/foot.ini ~/.config/kitty/kitty.conf ~/.config/ghostty/config ``` diff --git a/default/themed/foot.ini.tpl b/default/themed/foot.ini.tpl new file mode 100644 index 00000000..c56dc610 --- /dev/null +++ b/default/themed/foot.ini.tpl @@ -0,0 +1,25 @@ +[colors-dark] +foreground={{ foreground_strip }} +background={{ background_strip }} +selection-foreground={{ selection_foreground_strip }} +selection-background={{ selection_background_strip }} + +cursor={{ background_strip }} {{ cursor_strip }} + +regular0={{ color0_strip }} +regular1={{ color1_strip }} +regular2={{ color2_strip }} +regular3={{ color3_strip }} +regular4={{ color4_strip }} +regular5={{ color5_strip }} +regular6={{ color6_strip }} +regular7={{ color7_strip }} + +bright0={{ color8_strip }} +bright1={{ color9_strip }} +bright2={{ color10_strip }} +bright3={{ color11_strip }} +bright4={{ color12_strip }} +bright5={{ color13_strip }} +bright6={{ color14_strip }} +bright7={{ color15_strip }} diff --git a/default/themed/gum.env.conf.tpl b/default/themed/gum.env.conf.tpl index 179c08ff..616f5a5f 100644 --- a/default/themed/gum.env.conf.tpl +++ b/default/themed/gum.env.conf.tpl @@ -23,7 +23,7 @@ env = GUM_INPUT_HEADER_FOREGROUND,#{{ foreground }} env = GUM_INPUT_HEADER_BACKGROUND,#{{ background }} # Gum Choose Style Variables -env = GUM_CHOOSE_CURSOR_FOREGROUND,#{{ cursor }} +env = GUM_CHOOSE_CURSOR_FOREGROUND,#{{ accent }} env = GUM_CHOOSE_CURSOR_BACKGROUND,#{{ background }} env = GUM_CHOOSE_HEADER_FOREGROUND,#{{ foreground }} env = GUM_CHOOSE_HEADER_BACKGROUND,#{{ background }} diff --git a/install/config/all.sh b/install/config/all.sh index bdd3f4ba..1656a2d5 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -47,6 +47,7 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/ipu7-camera.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/ptl-kernel.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/fred.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/fix-wifi7-eht.sh +run_logged $OMARCHY_INSTALL/config/hardware/intel/sof-firmware.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.sh diff --git a/install/config/hardware/intel/sof-firmware.sh b/install/config/hardware/intel/sof-firmware.sh new file mode 100644 index 00000000..36b0be95 --- /dev/null +++ b/install/config/hardware/intel/sof-firmware.sh @@ -0,0 +1,8 @@ +# Install Sound Open Firmware for the audio DSP on non-XPS Intel Panther +# Lake systems. XPS PTL stays on linux-ptl, which hard-deps sof-firmware. +# Mainline `linux` only optdeps it, so without this the DSP fails to boot +# and only auto_null shows up in PipeWire. + +if omarchy-hw-intel-ptl && ! omarchy-hw-match "XPS"; then + omarchy-pkg-add sof-firmware +fi diff --git a/install/config/increase-fd-limit.sh b/install/config/increase-fd-limit.sh old mode 100755 new mode 100644 diff --git a/install/config/theme.sh b/install/config/theme.sh index 83e2b8dd..fe7e9112 100644 --- a/install/config/theme.sh +++ b/install/config/theme.sh @@ -5,14 +5,10 @@ sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr # Setup user theme folder mkdir -p ~/.config/omarchy/themes -# Add managed policy directories for Chromium and Brave for theme changes. -# Must exist before the first omarchy-theme-set, which writes color.json into them. +# Chromium policy directory for theme sudo mkdir -p /etc/chromium/policies/managed sudo chmod a+rw /etc/chromium/policies/managed -sudo mkdir -p /etc/brave/policies/managed -sudo chmod a+rw /etc/brave/policies/managed - # Set initial theme omarchy-theme-set "Tokyo Night" rm -rf ~/.config/chromium/SingletonLock # otherwise archiso will own the chromium singleton diff --git a/install/first-run/gtk-primary-paste.sh b/install/first-run/gtk-primary-paste.sh new file mode 100755 index 00000000..9a4304ed --- /dev/null +++ b/install/first-run/gtk-primary-paste.sh @@ -0,0 +1 @@ +gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true diff --git a/install/omarchy-other.packages b/install/omarchy-other.packages index a68ecd30..e5f88998 100644 --- a/install/omarchy-other.packages +++ b/install/omarchy-other.packages @@ -41,6 +41,7 @@ pipewire-jack pipewire-pulse qt6-wayland snapper +sof-firmware thermald webp-pixbuf-loader yay-debug diff --git a/migrations/1767478687.sh b/migrations/1767478687.sh index e10e3d58..3793cb1b 100644 --- a/migrations/1767478687.sh +++ b/migrations/1767478687.sh @@ -1,4 +1,4 @@ -echo "Add opencode with system themeing" +echo "Add opencode with system theming" omarchy-pkg-add opencode diff --git a/migrations/1769510847.sh b/migrations/1769510847.sh index d9c5b260..5ddfd508 100644 --- a/migrations/1769510847.sh +++ b/migrations/1769510847.sh @@ -1,4 +1,4 @@ -echo "Switch back to mainline chromium now that it supports full live themeing" +echo "Switch back to mainline chromium now that it supports full live theming" if omarchy-pkg-present omarchy-chromium; then if gum confirm "Ready to switch to mainstream chromium? (Will close Chromium + reset settings)"; then diff --git a/migrations/1777909712.sh b/migrations/1777909712.sh new file mode 100644 index 00000000..60c738a1 --- /dev/null +++ b/migrations/1777909712.sh @@ -0,0 +1,10 @@ +echo "Remove stale Xe Panel Replay kernel cmdline from Dell XPS Panther Lake systems" + +DEFAULT_LIMINE="/etc/default/limine" + +if omarchy-hw-match "XPS" && omarchy-hw-intel-ptl; then + if [[ -f $DEFAULT_LIMINE ]] && grep -q 'xe\.enable_panel_replay' "$DEFAULT_LIMINE"; then + sudo sed -i '/^KERNEL_CMDLINE.*xe\.enable_panel_replay/d' "$DEFAULT_LIMINE" + sudo limine-update + fi +fi diff --git a/migrations/1777929468.sh b/migrations/1777929468.sh new file mode 100755 index 00000000..9f1afa87 --- /dev/null +++ b/migrations/1777929468.sh @@ -0,0 +1,5 @@ +echo "Enable middle-click primary paste for GTK/Chromium-family apps (Ghostty, Brave, Chromium)" + +if command -v gsettings >/dev/null; then + gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true || true +fi diff --git a/migrations/1778008689.sh b/migrations/1778008689.sh new file mode 100644 index 00000000..dbe97743 --- /dev/null +++ b/migrations/1778008689.sh @@ -0,0 +1,45 @@ +echo "Add Foot terminal config and theme support" + +if [[ ! -f ~/.config/foot/foot.ini ]]; then + mkdir -p ~/.config/foot + cp -Rpf "$OMARCHY_PATH/config/foot/foot.ini" ~/.config/foot/foot.ini +elif ! grep -q "^primary-paste=none" ~/.config/foot/foot.ini; then + sed -i '/^clipboard-copy=Control+Insert/a primary-paste=none' ~/.config/foot/foot.ini +fi + +if [[ -f ~/.config/omarchy/current/theme/foot.ini ]]; then + sed -i 's/^\[colors\]$/[colors-dark]/' ~/.config/omarchy/current/theme/foot.ini +fi + +if [[ ! -f ~/.config/omarchy/current/theme/foot.ini && -f ~/.config/omarchy/current/theme/colors.toml ]]; then + sed_script=$(mktemp) + + while IFS='=' read -r key value; do + key="${key//[\"\' ]/}" + [[ $key && $key != \#* ]] || continue + value="${value#*[\"\']}" + value="${value%%[\"\']*}" + + printf 's|{{ %s }}|%s|g\n' "$key" "$value" + printf 's|{{ %s_strip }}|%s|g\n' "$key" "${value#\#}" + done <~/.config/omarchy/current/theme/colors.toml >"$sed_script" + + sed -f "$sed_script" "$OMARCHY_PATH/default/themed/foot.ini.tpl" >~/.config/omarchy/current/theme/foot.ini + rm "$sed_script" +fi + +if omarchy-cmd-present foot; then + mkdir -p ~/.local/share/applications + rm -f ~/.local/share/applications/org.codeberg.dnkl.foot.desktop + cp -Rpf "$OMARCHY_PATH/applications/foot.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/footclient.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/foot-server.desktop" ~/.local/share/applications/ +fi + +if [[ -f ~/.config/hypr/input.conf ]]; then + sed -Ei 's/match:class \(Alacritty\|kitty\)/match:class (Alacritty|kitty|foot)/' ~/.config/hypr/input.conf +fi + +if [[ -f ~/.config/hypr/apps/terminals.conf ]]; then + sed -Ei 's/match:class \(Alacritty\|kitty\|com\.mitchellh\.ghostty\)/match:class (Alacritty|kitty|com.mitchellh.ghostty|foot)/' ~/.config/hypr/apps/terminals.conf +fi diff --git a/migrations/1778026496.sh b/migrations/1778026496.sh new file mode 100644 index 00000000..d9d7b893 --- /dev/null +++ b/migrations/1778026496.sh @@ -0,0 +1,11 @@ +echo "Install sof-firmware on Intel Panther Lake to restore DSP audio" + +# linux-ptl hard-depped sof-firmware, mainline linux only optdeps it, so the +# orphan sweep after migration 1777572869 removed it. Force explicit so a +# subsequent orphan sweep in the same update cycle cannot take it again. + +if omarchy-hw-intel-ptl && ! omarchy-hw-match "XPS"; then + omarchy-pkg-add sof-firmware + sudo pacman -D --asexplicit sof-firmware >/dev/null + omarchy-state set reboot-required +fi diff --git a/migrations/1778052575.sh b/migrations/1778052575.sh new file mode 100644 index 00000000..fc6a46cf --- /dev/null +++ b/migrations/1778052575.sh @@ -0,0 +1,7 @@ +echo "Enable extended keyboard support in tmux" + +tmux_config="$HOME/.config/tmux/tmux.conf" + +if [[ -f $tmux_config ]] && ! grep -qxF "set -g extended-keys on" "$tmux_config"; then + sed -i '/^set -g detach-on-destroy off$/a set -g extended-keys on\nset -g extended-keys-format csi-u\nset -sg escape-time 10' "$tmux_config" +fi diff --git a/migrations/1778054328.sh b/migrations/1778054328.sh new file mode 100644 index 00000000..1722c7b4 --- /dev/null +++ b/migrations/1778054328.sh @@ -0,0 +1,3 @@ +echo "Use omarchy-system-lock and omarchy-system-wake in hypridle" + +omarchy-refresh-hypridle diff --git a/themes/catppuccin/neovim.lua b/themes/catppuccin/neovim.lua index f22267d6..f0d503f9 100644 --- a/themes/catppuccin/neovim.lua +++ b/themes/catppuccin/neovim.lua @@ -7,7 +7,7 @@ return { { "LazyVim/LazyVim", opts = { - colorscheme = "catppuccin", + colorscheme = "catppuccin-nvim", }, }, } diff --git a/version b/version index 7c69a55d..a76ccff2 100644 --- a/version +++ b/version @@ -1 +1 @@ -3.7.0 +3.7.1