diff --git a/AGENTS.md b/AGENTS.md index 689f4c50..7d61ac11 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,52 @@ 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:hidden=true` - hide from default command listings +- `# 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,12 +84,18 @@ 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/` - `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors - `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15) +# Visual Changes + +When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots. + # Refresh Pattern To copy a default config to user config with automatic backup: @@ -53,10 +110,16 @@ 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: +- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly - 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/hidden/foot-server.desktop b/applications/hidden/foot-server.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/foot-server.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/footclient.desktop b/applications/hidden/footclient.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/footclient.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/icons/Cliamp.png b/applications/icons/Cliamp.png deleted file mode 100644 index 94b3b06e..00000000 Binary files a/applications/icons/Cliamp.png and /dev/null differ diff --git a/bin/omarchy b/bin/omarchy index 511aeb97..c23a6457 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 @@ -28,12 +29,14 @@ declare -A GROUP_DESCRIPTIONS GROUP_DESCRIPTIONS[ac]="AC power detection" GROUP_DESCRIPTIONS[battery]="Battery status helpers" GROUP_DESCRIPTIONS[branch]="Omarchy git branch management" +GROUP_DESCRIPTIONS[branding]="About and screensaver branding" GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness" GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording" GROUP_DESCRIPTIONS[channel]="Omarchy release channel management" GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers" GROUP_DESCRIPTIONS[config]="System configuration helpers" GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs" +GROUP_DESCRIPTIONS[default]="Default application selection" GROUP_DESCRIPTIONS[dev]="Omarchy development tools" GROUP_DESCRIPTIONS[drive]="Drive selection and encryption" GROUP_DESCRIPTIONS[font]="Font management" @@ -52,22 +55,24 @@ GROUP_DESCRIPTIONS[plymouth]="Plymouth boot theme management" GROUP_DESCRIPTIONS[powerprofiles]="Power profile management" GROUP_DESCRIPTIONS[refresh]="Reset config to defaults" GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows" +GROUP_DESCRIPTIONS[reminder]="Desktop notification reminders" 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[weather]="Weather status" GROUP_DESCRIPTIONS[webapp]="Web app launchers" GROUP_DESCRIPTIONS[wifi]="Wi-Fi helpers" GROUP_DESCRIPTIONS[windows]="Windows VM management" @@ -129,6 +134,7 @@ register_command() { local examples="" local aliases="" local requires_sudo="" + local hidden="" local line="" local metadata_key="" local metadata_value="" @@ -184,6 +190,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 +237,7 @@ register_command() { fi [[ $requires_sudo == "true" ]] || requires_sudo="false" + [[ $hidden == "true" ]] || hidden="false" local key="$file_binary" COMMAND_KEYS+=("$key") @@ -240,6 +251,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 +331,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 +344,6 @@ load_group_commands() { register_command "$file" done - load_group_extra_commands "$group" } resolve_direct_route() { @@ -375,6 +376,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 +422,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 +503,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 +514,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 +566,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 +607,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 +632,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 +691,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]}" \ @@ -779,6 +791,25 @@ show_group_help() { fi } +show_prefix_help() { + local prefix="$1" + local prefix_with_space="$prefix " + local key="" + local rows="" + + while IFS= read -r key; do + [[ -n $key ]] || continue + if [[ ${COMMAND_USAGE[$key]} == $prefix_with_space* ]]; then + rows+="${COMMAND_USAGE[$key]}"$'\t'$'\t'"${COMMAND_SUMMARY[$key]}"$'\n' + fi + done < <(sorted_keys false) + + [[ -n $rows ]] || return 1 + + echo "${prefix#omarchy } commands:" + print_command_table "$rows" +} + show_related_commands() { local key="$1" local group="${COMMAND_GROUP[$key]}" @@ -996,6 +1027,10 @@ dispatch_or_help() { return 0 fi + if show_prefix_help "omarchy ${args[*]}"; then + return 0 + fi + echo "Unknown Omarchy command: omarchy ${args[*]}" >&2 suggestion=$(suggest_command "${args[0]}") if [[ -n $suggestion ]]; then 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-branding-about b/bin/omarchy-branding-about new file mode 100755 index 00000000..aca234de --- /dev/null +++ b/bin/omarchy-branding-about @@ -0,0 +1,28 @@ +#!/bin/bash + +# omarchy:summary=Edit, set, or reset About branding +# omarchy:group=branding +# omarchy:name=about +# omarchy:args= +# omarchy:examples=omarchy branding about image | omarchy branding about text | omarchy branding about reset + +set -euo pipefail + +case "${1:-}" in +image) + image=$(omarchy-menu-file "Logo image" "$HOME" "svg png") + if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/about.txt --width 54 --height 26 --mode block; then + omarchy-launch-about >/dev/null 2>&1 + fi + ;; +text) + omarchy-launch-editor ~/.config/omarchy/branding/about.txt >/dev/null 2>&1 && omarchy-launch-about >/dev/null 2>&1 + ;; +reset) + cp "$OMARCHY_PATH/icon.txt" ~/.config/omarchy/branding/about.txt && omarchy-launch-about >/dev/null 2>&1 + ;; +*) + echo "Usage: omarchy-branding-about " >&2 + exit 1 + ;; +esac diff --git a/bin/omarchy-branding-screensaver b/bin/omarchy-branding-screensaver new file mode 100755 index 00000000..57012af8 --- /dev/null +++ b/bin/omarchy-branding-screensaver @@ -0,0 +1,28 @@ +#!/bin/bash + +# omarchy:summary=Edit, set, or reset screensaver branding +# omarchy:group=branding +# omarchy:name=screensaver +# omarchy:args= +# omarchy:examples=omarchy branding screensaver image | omarchy branding screensaver text | omarchy branding screensaver reset + +set -euo pipefail + +case "${1:-}" in +image) + image=$(omarchy-menu-file "Logo image" "$HOME" "svg png") + if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/screensaver.txt; then + omarchy-launch-screensaver force >/dev/null 2>&1 + fi + ;; +text) + omarchy-launch-editor ~/.config/omarchy/branding/screensaver.txt >/dev/null 2>&1 && omarchy-launch-screensaver force >/dev/null 2>&1 + ;; +reset) + cp "$OMARCHY_PATH/logo.txt" ~/.config/omarchy/branding/screensaver.txt && omarchy-launch-screensaver force >/dev/null 2>&1 + ;; +*) + echo "Usage: omarchy-branding-screensaver " >&2 + exit 1 + ;; +esac 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-capture-screenrecording b/bin/omarchy-capture-screenrecording index 5636bb9e..75a5c207 100755 --- a/bin/omarchy-capture-screenrecording +++ b/bin/omarchy-capture-screenrecording @@ -233,6 +233,7 @@ stop_screenrecording() { else finalize_recording local filename=$(cat "$RECORDING_FILE" 2>/dev/null) + echo "$filename" local preview="${filename%.mp4}-preview.png" # Generate a preview thumbnail from the first frame diff --git a/bin/omarchy-capture-screenshot b/bin/omarchy-capture-screenshot index 627eda07..572330f7 100755 --- a/bin/omarchy-capture-screenshot +++ b/bin/omarchy-capture-screenshot @@ -2,7 +2,7 @@ # omarchy:summary=Take a screenshot # omarchy:group=capture -# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=] +# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy|save] [--editor=] # omarchy:examples=omarchy screenshot | omarchy capture screenshot region # omarchy:aliases=omarchy screenshot @@ -126,14 +126,22 @@ esac FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" FILEPATH="$OUTPUT_DIR/$FILENAME" -if [[ $PROCESSING == "slurp" ]]; then - grim -g "$SELECTION" "$FILEPATH" || exit 1 - wl-copy <"$FILEPATH" +case "$PROCESSING" in + slurp) + grim -g "$SELECTION" "$FILEPATH" || exit 1 + echo "$FILEPATH" + 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 + ( + 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" + ) >/dev/null 2>&1 & + ;; + copy) + grim -g "$SELECTION" - | wl-copy + ;; + save) + grim -g "$SELECTION" "$FILEPATH" || exit 1 + echo "$FILEPATH" + ;; +esac diff --git a/bin/omarchy-capture-text-extraction b/bin/omarchy-capture-text-extraction index cb0c62b5..4b49b16b 100755 --- a/bin/omarchy-capture-text-extraction +++ b/bin/omarchy-capture-text-extraction @@ -18,7 +18,7 @@ SELECTION=$(slurp 2>/dev/null) [[ -z $SELECTION ]] && exit 0 -TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l eng --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1 +TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l "${OMARCHY_OCR_LANGS:-eng}" --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1 [[ -z $TEXT ]] && exit 1 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-default-browser b/bin/omarchy-default-browser new file mode 100755 index 00000000..0b38d760 --- /dev/null +++ b/bin/omarchy-default-browser @@ -0,0 +1,40 @@ +#!/bin/bash + +# omarchy:summary=Set the default browser for Omarchy and XDG handlers +# omarchy:args=[chromium|chrome|brave|brave-origin|edge|firefox|zen] +# omarchy:examples=omarchy default browser firefox | omarchy default browser brave + +if (($# == 0)); then + case "$(xdg-settings get default-web-browser)" in + chromium.desktop) echo "chromium" ;; + google-chrome.desktop) echo "chrome" ;; + brave-browser.desktop) echo "brave" ;; + brave-origin-beta.desktop) echo "brave-origin" ;; + microsoft-edge.desktop) echo "edge" ;; + firefox.desktop) echo "firefox" ;; + zen.desktop) echo "zen" ;; + *) xdg-settings get default-web-browser ;; + esac + exit 0 +fi + +case "$1" in +chromium) desktop_id="chromium.desktop"; name="Chromium"; glyph="" ;; +chrome) desktop_id="google-chrome.desktop"; name="Chrome"; glyph="󰊯" ;; +brave) desktop_id="brave-browser.desktop"; name="Brave"; glyph="󰖟" ;; +brave-origin) desktop_id="brave-origin-beta.desktop"; name="Brave Origin"; glyph="󰖟" ;; +edge) desktop_id="microsoft-edge.desktop"; name="Edge"; glyph="󰇩" ;; +firefox) desktop_id="firefox.desktop"; name="Firefox"; glyph="󰈹" ;; +zen) desktop_id="zen.desktop"; name="Zen"; glyph="󰰷" ;; +*) + echo "Usage: omarchy-default-browser " + exit 1 + ;; +esac + +xdg-settings set default-web-browser "$desktop_id" +xdg-mime default "$desktop_id" x-scheme-handler/http +xdg-mime default "$desktop_id" x-scheme-handler/https +xdg-mime default "$desktop_id" text/html + +notify-send -u low "$glyph $name is now the default browser" diff --git a/bin/omarchy-default-editor b/bin/omarchy-default-editor new file mode 100755 index 00000000..31846450 --- /dev/null +++ b/bin/omarchy-default-editor @@ -0,0 +1,30 @@ +#!/bin/bash + +# omarchy:summary=Set the default editor for $EDITOR +# omarchy:args=[code|cursor|zed|sublime_text|helix|vim|emacs|nvim] +# omarchy:examples=omarchy default editor | omarchy default editor code | omarchy default editor helix + +if (($# == 0)); then + sed -n 's/^export EDITOR=//p' ~/.config/uwsm/default | head -n 1 + exit 0 +fi + +case "$1" in +code) editor="code"; name="VSCode"; glyph="" ;; +cursor) editor="cursor"; name="Cursor"; glyph="" ;; +zed | zeditor) editor="zeditor"; name="Zed"; glyph="" ;; +sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;; +helix) editor="helix"; name="Helix"; glyph="" ;; +vim) editor="vim"; name="Vim"; glyph="" ;; +emacs) editor="emacs"; name="Emacs"; glyph="" ;; +nvim) editor="nvim"; name="Neovim"; glyph="" ;; +*) + echo "Usage: omarchy-default-editor " + exit 1 + ;; +esac + +sed -i "s/^export EDITOR=.*/export EDITOR=$editor/" ~/.config/uwsm/default + +export EDITOR="$editor" +notify-send -u low "$glyph $name is now the default editor" " Effective after logging out" diff --git a/bin/omarchy-default-terminal b/bin/omarchy-default-terminal new file mode 100755 index 00000000..b44b0511 --- /dev/null +++ b/bin/omarchy-default-terminal @@ -0,0 +1,36 @@ +#!/bin/bash + +# omarchy:summary=Set the default terminal used by xdg-terminal-exec +# omarchy:args=[alacritty|foot|ghostty|kitty] +# omarchy:examples=omarchy default terminal ghostty | omarchy default terminal kitty + +if (($# == 0)); then + desktop_id=$(grep -vE '^($|#)' ~/.config/xdg-terminals.list 2>/dev/null | head -n 1) + case "$desktop_id" in + Alacritty.desktop) echo "alacritty" ;; + foot.desktop) echo "foot" ;; + com.mitchellh.ghostty.desktop) echo "ghostty" ;; + kitty.desktop) echo "kitty" ;; + *) echo "$desktop_id" ;; + esac + exit 0 +fi + +case "$1" in +alacritty) desktop_id="Alacritty.desktop"; name="Alacritty"; glyph="" ;; +foot) desktop_id="foot.desktop"; name="Foot"; glyph="" ;; +ghostty) desktop_id="com.mitchellh.ghostty.desktop"; name="Ghostty"; glyph="" ;; +kitty) desktop_id="kitty.desktop"; name="Kitty"; glyph="" ;; +*) + echo "Usage: omarchy-default-terminal " + exit 1 + ;; +esac + +cat >~/.config/xdg-terminals.list < 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..023d1a65 100755 --- a/bin/omarchy-first-run +++ b/bin/omarchy-first-run @@ -16,7 +16,10 @@ 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/swayosd.sh" + bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh" + omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook" sudo rm -f /etc/sudoers.d/first-run bash "$OMARCHY_PATH/install/first-run/welcome.sh" 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-haptic-touchpad b/bin/omarchy-haptic-touchpad deleted file mode 100755 index a98bd90a..00000000 --- a/bin/omarchy-haptic-touchpad +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 - -# omarchy:summary=Run the Synaptics touchpad haptic feedback daemon - -"""Haptic feedback daemon for Synaptics touchpads with Manual Trigger. - -Monitors touchpad button press events and sends haptic pulses via HID -feature reports. Required because the kernel's HID haptic subsystem only -supports Auto Trigger with waveform enumeration, not the simpler Manual -Trigger protocol used by these Synaptics touchpads. -""" - -import fcntl, glob, os, struct, sys - -VENDOR = "06CB" -REPORT_ID = 0x37 -INTENSITY = 40 # 0-100 - -# input_event: struct timeval (16 bytes on 64-bit) + type(H) + code(H) + value(i) -EVENT_FORMAT = "llHHi" -EVENT_SIZE = struct.calcsize(EVENT_FORMAT) -EV_KEY = 0x01 -BTN_LEFT = 272 -BTN_RIGHT = 273 -BTN_MIDDLE = 274 - -# ioctl: HIDIOCSFEATURE(len) = _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) -def HIDIOCSFEATURE(length): - return 0xC0000000 | (length << 16) | (ord("H") << 8) | 0x06 - - -def find_hidraw(): - for path in sorted(glob.glob("/sys/class/hidraw/hidraw*")): - uevent = os.path.join(path, "device", "uevent") - try: - with open(uevent) as f: - content = f.read().upper() - if f"0000{VENDOR}" in content: - return os.path.join("/dev", os.path.basename(path)) - except OSError: - continue - return None - - -def find_touchpad_event(): - for path in sorted(glob.glob("/sys/class/input/event*/device/name")): - try: - with open(path) as f: - name = f.read().strip().upper() - if VENDOR in name and "TOUCHPAD" in name: - event = path.split("/")[-3] - return os.path.join("/dev/input", event) - except OSError: - continue - return None - - -def main(): - hidraw = find_hidraw() - if not hidraw: - print("No Synaptics haptic touchpad hidraw device found", file=sys.stderr) - sys.exit(1) - - event = find_touchpad_event() - if not event: - print("No Synaptics haptic touchpad input device found", file=sys.stderr) - sys.exit(1) - - print(f"Haptic touchpad: hidraw={hidraw} input={event} intensity={INTENSITY}", flush=True) - - haptic_report = struct.pack("BB", REPORT_ID, INTENSITY) - ioctl_req = HIDIOCSFEATURE(len(haptic_report)) - - hidraw_fd = os.open(hidraw, os.O_RDWR) - event_fd = os.open(event, os.O_RDONLY) - - try: - while True: - data = os.read(event_fd, EVENT_SIZE) - if len(data) < EVENT_SIZE: - continue - _, _, ev_type, code, value = struct.unpack(EVENT_FORMAT, data) - if ev_type == EV_KEY and code in (BTN_LEFT, BTN_RIGHT, BTN_MIDDLE) and value == 1: - try: - fcntl.ioctl(hidraw_fd, ioctl_req, haptic_report) - except OSError: - pass - except KeyboardInterrupt: - pass - finally: - os.close(event_fd) - os.close(hidraw_fd) - - -if __name__ == "__main__": - main() diff --git a/bin/omarchy-hook b/bin/omarchy-hook index 85b5a180..8c2a59d9 100755 --- a/bin/omarchy-hook +++ b/bin/omarchy-hook @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update). +# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/ and ~/.config/omarchy/hooks/.d/. # omarchy:args=[name] [args...] set -e @@ -12,8 +12,17 @@ fi HOOK=$1 HOOK_PATH="$HOME/.config/omarchy/hooks/$1" +HOOK_DIR="$HOOK_PATH.d" shift if [[ -f $HOOK_PATH ]]; then - bash "$HOOK_PATH" "$@" + bash "$HOOK_PATH" "$@" || echo "Hook failed: $HOOK_PATH" +fi + +if [[ -d $HOOK_DIR ]]; then + for hook in "$HOOK_DIR"/*; do + [[ -f $hook ]] || continue + [[ $hook == *.sample ]] && continue + bash "$hook" "$@" || echo "Hook failed: $hook" + done fi diff --git a/bin/omarchy-hook-install b/bin/omarchy-hook-install new file mode 100755 index 00000000..7c536482 --- /dev/null +++ b/bin/omarchy-hook-install @@ -0,0 +1,31 @@ +#!/bin/bash + +# omarchy:summary=Install a hook into ~/.config/omarchy/hooks/.d/ +# omarchy:group=hook +# omarchy:name=install +# omarchy:args= +# omarchy:examples=omarchy hook install post-update ~/my-hook + +set -e + +if (( $# != 2 )); then + echo "Usage: omarchy-hook-install " + exit 1 +fi + +HOOK_TYPE=$1 +HOOK_FILE=$2 +HOOK_DIR="$HOME/.config/omarchy/hooks/$HOOK_TYPE.d" +HOOK_NAME=$(basename "$HOOK_FILE") +HOOK_PATH="$HOOK_DIR/$HOOK_NAME" + +if [[ ! -f $HOOK_FILE ]]; then + echo "Hook file not found: $HOOK_FILE" + exit 1 +fi + +mkdir -p "$HOOK_DIR" +cp "$HOOK_FILE" "$HOOK_PATH" +chmod 755 "$HOOK_PATH" + +echo "Installed $HOOK_TYPE hook: $HOOK_PATH" diff --git a/bin/omarchy-hw-asus-zenbook-ux5406aa b/bin/omarchy-hw-asus-zenbook-ux5406aa new file mode 100755 index 00000000..9f8da811 --- /dev/null +++ b/bin/omarchy-hw-asus-zenbook-ux5406aa @@ -0,0 +1,5 @@ +#!/bin/bash + +# omarchy:summary=Detect ASUS Zenbook UX5406AA series laptops on Intel Panther Lake. + +omarchy-hw-match "ux5406aa" && omarchy-hw-intel-ptl diff --git a/bin/omarchy-hw-dell-xps-haptic-touchpad b/bin/omarchy-hw-dell-xps-haptic-touchpad new file mode 100755 index 00000000..cc0e5a62 --- /dev/null +++ b/bin/omarchy-hw-dell-xps-haptic-touchpad @@ -0,0 +1,5 @@ +#!/bin/bash + +# omarchy:summary=Match Dell XPS systems with the Synaptics haptic touchpad. + +omarchy-hw-match "XPS" && [[ -e /sys/bus/i2c/devices/i2c-VEN_06CB:00 ]] 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..8628c17c 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, 3x, and 4x MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)') ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name') @@ -9,8 +9,8 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width') HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height') REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate') -# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse) -SCALES=(1 1.25 1.6 2 3) +# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse) +SCALES=(1 1.25 1.6 2 3 4) # Find the index of the scale closest to the current one (Hyprland may # snap fractional scales to nearby values, so we can't match exactly) 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..ed067d8d --- /dev/null +++ b/bin/omarchy-install-browser @@ -0,0 +1,93 @@ +#!/bin/bash + +# omarchy:summary=Install a supported browser +# omarchy:args= +# omarchy:examples=omarchy install browser firefox | omarchy install browser brave + +setup_policy_directory() { + sudo mkdir -p "$1" + sudo chmod a+rw "$1" +} + +announce_browser_installed() { + echo "" + echo "$1 browser installed. Make it the default via Setup > Defaults > Browser." +} + +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 + omarchy-theme-set-browser + announce_browser_installed "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 + omarchy-theme-set-browser + announce_browser_installed "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 + omarchy-theme-set-browser + announce_browser_installed "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 + omarchy-theme-set-browser + announce_browser_installed "Brave Origin" + ;; +firefox) + echo "Installing Firefox..." + omarchy-pkg-add firefox || exit 1 + + setup_firefox_preferences /usr/lib/firefox/distribution + setup_firefox_wayland + announce_browser_installed "Firefox" + ;; +zen) + echo "Installing Zen..." + omarchy-pkg-aur-add zen-browser-bin || exit 1 + + setup_firefox_preferences /opt/zen-browser/distribution + setup_firefox_wayland + announce_browser_installed "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..2fb040dd 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,18 @@ echo "Installing $package..." # Install package if omarchy-pkg-add $package; then - # Copy custom desktop entry for alacritty with X-TerminalArg* keys + # Copy custom desktop entries with X-TerminalArg* keys if [[ $package == "alacritty" ]]; then mkdir -p ~/.local/share/applications - cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/ + cp "$OMARCHY_PATH/applications/$desktop_id" ~/.local/share/applications/ + elif [[ $package == "foot" ]]; then + mkdir -p ~/.local/share/applications + cp "$OMARCHY_PATH/default/foot/$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..9f098c92 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -93,8 +93,10 @@ show_learn_menu() { } show_trigger_menu() { - case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle\n Hardware") in + case $(menu "Trigger" "󰔛 Reminder\n Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in + *Reminder*) show_reminder_menu ;; *Capture*) show_capture_menu ;; + *Transcode*) omarchy-transcode || back_to show_trigger_menu ;; *Share*) show_share_menu ;; *Toggle*) show_toggle_menu ;; *Hardware*) show_hardware_menu ;; @@ -102,6 +104,41 @@ show_trigger_menu() { esac } +show_reminder_menu() { + case $(menu "Reminder" "󰔛 Set one\n󰔛 Show all\n󰔛 Clear all") in + *Set*) show_custom_reminder_input ;; + *"Show all"*) omarchy-reminder show ;; + *"Clear all"*) omarchy-reminder clear ;; + *) back_to show_trigger_menu ;; + esac +} + +show_custom_reminder_input() { + local minutes + minutes=$(omarchy-menu-input "Remind in minutes") + + if [[ $minutes =~ ^[0-9]+$ ]] && ((minutes > 0)); then + show_reminder_message_input "$minutes" + elif [[ -n $minutes ]]; then + omarchy-notification-send "󰔛" "Invalid reminder" "Enter the number of minutes" -u critical + show_custom_reminder_input + else + back_to show_reminder_menu + fi +} + +show_reminder_message_input() { + local minutes="$1" + local message + message=$(omarchy-menu-input "Reminder message") + + if [[ -n $message ]]; then + omarchy-reminder "$minutes" "$message" + else + omarchy-reminder "$minutes" + fi +} + show_capture_menu() { case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in *Screenshot*) omarchy-capture-screenshot ;; @@ -196,13 +233,18 @@ show_hardware_menu() { options="$options\n󰟸 Touchpad" fi + if omarchy-hw-dell-xps-haptic-touchpad && omarchy-cmd-present dell-xps-touchpad-haptics; then + options="$options\n󰌌 Touchpad Haptics" + fi + if omarchy-hw-touchscreen; then options="$options\n󰆽 Touchscreen" fi case $(menu "Toggle" "$options") in *Laptop*) omarchy-hyprland-monitor-internal toggle ;; - *Mirror*) omarchy-hyprland-monitor-internal-mirror toggle;; + *Mirror*) omarchy-hyprland-monitor-internal-mirror toggle ;; + *Haptics*) show_hardware_touchpad_haptics_menu ;; *Touchpad*) omarchy-toggle-touchpad ;; *Touchscreen*) omarchy-toggle-touchscreen ;; *"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;; @@ -210,6 +252,17 @@ show_hardware_menu() { esac } +show_hardware_touchpad_haptics_menu() { + local current=$(dell-xps-touchpad-haptics get) + local selected=$(menu "Touchpad Haptics" "low\nmid\nhigh" "" "$current") + + if [[ -n $selected ]]; then + dell-xps-touchpad-haptics set "$selected" + else + back_to show_hardware_menu + fi +} + show_style_menu() { case $(menu "Style" "󰸌 Theme\n󰟵 Unlock\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in *Theme*) show_theme_menu ;; @@ -217,12 +270,30 @@ 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 ;; - *About*) open_in_editor ~/.config/omarchy/branding/about.txt ;; + *Screensaver*) show_screensaver_menu ;; + *About*) show_about_menu ;; *) show_main_menu ;; esac } +show_about_menu() { + case $(menu "About" " Edit Text\n Set From Image\n Restore Default") in + *Text*) omarchy-branding-about text ;; + *Image*) omarchy-branding-about image ;; + *Default*) omarchy-branding-about reset ;; + *) show_style_menu ;; + esac +} + +show_screensaver_menu() { + case $(menu "Screensaver" " Edit Text\n Set From Image\n Restore Default") in + *Text*) omarchy-branding-screensaver text ;; + *Image*) omarchy-branding-screensaver image ;; + *Default*) omarchy-branding-screensaver reset ;; + *) show_style_menu ;; + esac +} + show_theme_menu() { omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400 } @@ -244,7 +315,7 @@ show_setup_menu() { local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" [[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" [[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" - options="$options\n󰱔 DNS\n Security\n Config" + options="$options\n Defaults\n󰱔 DNS\n Security\n Config" case $(menu "Setup" "$options") in *Audio*) omarchy-launch-audio ;; @@ -255,6 +326,7 @@ show_setup_menu() { *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Input*) open_in_editor ~/.config/hypr/input.conf ;; + *Defaults*) show_setup_default_menu ;; *DNS*) present_terminal omarchy-setup-dns ;; *Security*) show_setup_security_menu ;; *Config*) show_setup_config_menu ;; @@ -274,15 +346,120 @@ show_setup_power_menu() { show_setup_security_menu() { case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in - *Fingerprint*) present_terminal omarchy-setup-fingerprint ;; - *Fido2*) present_terminal omarchy-setup-fido2 ;; + *Fingerprint*) present_terminal omarchy-setup-security-fingerprint ;; + *Fido2*) present_terminal omarchy-setup-security-fido2 ;; *) show_setup_menu ;; esac } +show_setup_default_menu() { + case $(menu "Default" " Browser\n Terminal\n Editor") in + *Browser*) show_setup_default_browser_menu ;; + *Terminal*) show_setup_default_terminal_menu ;; + *Editor*) show_setup_default_editor_menu ;; + *) show_setup_menu ;; + esac +} + +browser_desktop_exists() { + [[ -f ~/.local/share/applications/$1 || -f ~/.nix-profile/share/applications/$1 || -f /usr/share/applications/$1 ]] +} + +show_setup_default_browser_menu() { + local options="" + browser_desktop_exists chromium.desktop && options="$options Chromium" + browser_desktop_exists google-chrome.desktop && options="${options:+$options\n}󰊯 Chrome" + browser_desktop_exists brave-browser.desktop && options="${options:+$options\n}󰖟 Brave" + browser_desktop_exists brave-origin-beta.desktop && options="${options:+$options\n}󰖟 Brave Origin" + browser_desktop_exists microsoft-edge.desktop && options="${options:+$options\n}󰇩 Edge" + browser_desktop_exists firefox.desktop && options="${options:+$options\n}󰈹 Firefox" + browser_desktop_exists zen.desktop && options="${options:+$options\n}󰖟 Zen" + + local current="" + case "$(omarchy-default-browser)" in + chromium) current=" Chromium" ;; + chrome) current="󰊯 Chrome" ;; + brave) current="󰖟 Brave" ;; + brave-origin) current="󰖟 Brave Origin" ;; + edge) current="󰇩 Edge" ;; + firefox) current="󰈹 Firefox" ;; + zen) current="󰖟 Zen" ;; + esac + + case $(menu "Default Browser" "$options" "" "$current") in + *Chromium*) omarchy-default-browser chromium ;; + *Chrome*) omarchy-default-browser chrome ;; + *"Brave Origin"*) omarchy-default-browser brave-origin ;; + *Brave*) omarchy-default-browser brave ;; + *Edge*) omarchy-default-browser edge ;; + *Firefox*) omarchy-default-browser firefox ;; + *Zen*) omarchy-default-browser zen ;; + *) show_setup_default_menu ;; + esac +} + +show_setup_default_terminal_menu() { + local options="" + omarchy-cmd-present alacritty && options="$options Alacritty" + omarchy-cmd-present foot && options="${options:+$options\n} Foot" + omarchy-cmd-present ghostty && options="${options:+$options\n} Ghostty" + omarchy-cmd-present kitty && options="${options:+$options\n} Kitty" + + local current="" + case "$(omarchy-default-terminal)" in + alacritty) current=" Alacritty" ;; + foot) current=" Foot" ;; + ghostty) current=" Ghostty" ;; + kitty) current=" Kitty" ;; + esac + + case $(menu "Default Terminal" "$options" "" "$current") in + *Alacritty*) omarchy-default-terminal alacritty ;; + *Foot*) omarchy-default-terminal foot ;; + *Ghostty*) omarchy-default-terminal ghostty ;; + *Kitty*) omarchy-default-terminal kitty ;; + *) show_setup_default_menu ;; + esac +} + +show_setup_default_editor_menu() { + local options="" + omarchy-cmd-present nvim && options="$options Neovim" + omarchy-cmd-present code && options="${options:+$options\n} VSCode" + omarchy-cmd-present cursor && options="${options:+$options\n} Cursor" + omarchy-cmd-present zeditor && options="${options:+$options\n} Zed" + omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text" + omarchy-cmd-present helix && options="${options:+$options\n} Helix" + omarchy-cmd-present vim && options="${options:+$options\n} Vim" + omarchy-cmd-present emacs && options="${options:+$options\n} Emacs" + + local current="" + case "$(omarchy-default-editor)" in + nvim) current=" Neovim" ;; + code) current=" VSCode" ;; + cursor) current=" Cursor" ;; + zed | zeditor) current=" Zed" ;; + sublime_text) current=" Sublime Text" ;; + helix) current=" Helix" ;; + vim) current=" Vim" ;; + emacs) current=" Emacs" ;; + esac + + case $(menu "Default Editor" "$options" "" "$current") in + *Neovim*) omarchy-default-editor nvim ;; + *VSCode*) omarchy-default-editor code ;; + *Cursor*) omarchy-default-editor cursor ;; + *Zed*) omarchy-default-editor zed ;; + *Sublime*) omarchy-default-editor sublime_text ;; + *Helix*) omarchy-default-editor helix ;; + *Vim*) omarchy-default-editor vim ;; + *Emacs*) omarchy-default-editor emacs ;; + *) show_setup_default_menu ;; + esac +} + show_setup_config_menu() { - case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in - *Defaults*) open_in_editor ~/.config/uwsm/default ;; + case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in *Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;; *Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;; *Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;; @@ -319,7 +496,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 +506,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 ;; @@ -349,20 +539,22 @@ show_install_service_menu() { } show_install_editor_menu() { - case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in + case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\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 ;; + *Vim*) install "Vim" "vim" ;; *Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;; *) show_install_menu ;; esac } 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 ;; @@ -386,7 +578,7 @@ show_install_ai_menu() { } show_install_gaming_menu() { - case $(menu "Install" " 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 + case $(menu "Install" " 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-install-gaming-steam ;; *RetroArch*) present_terminal omarchy-install-gaming-retroarch ;; *Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;; @@ -468,22 +660,42 @@ 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 Web App\n TUI\n󰵮 Development\n󰸌 Theme\n Browser\n Dictation\n Gaming\n󰍲 Windows\n󰏓 Preinstalls\n Security") in *Package*) terminal omarchy-pkg-remove ;; *Web*) present_terminal omarchy-webapp-remove ;; *TUI*) present_terminal omarchy-tui-remove ;; *Development*) show_remove_development_menu ;; - *Gaming*) show_remove_gaming_menu ;; - *Preinstalls*) present_terminal omarchy-remove-preinstalls ;; - *Dictation*) present_terminal omarchy-voxtype-remove ;; *Theme*) present_terminal omarchy-theme-remove ;; + *Browser*) show_remove_browser_menu ;; + *Dictation*) present_terminal omarchy-voxtype-remove ;; + *Gaming*) show_remove_gaming_menu ;; *Windows*) present_terminal "omarchy-windows-vm remove" ;; - *Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;; - *Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;; + *Preinstalls*) present_terminal omarchy-remove-preinstalls ;; + *Security*) show_remove_security_menu ;; *) show_main_menu ;; esac } +show_remove_security_menu() { + case $(menu "Remove" "󰈷 Fingerprint\n Fido2") in + *Fingerprint*) present_terminal omarchy-remove-security-fingerprint ;; + *Fido2*) present_terminal omarchy-remove-security-fido2 ;; + *) 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 +820,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 +860,8 @@ go_to_menu() { *toggle*) show_toggle_menu ;; *hardware*) show_hardware_menu ;; *share*) show_share_menu ;; + *reminder-set*) show_custom_reminder_input ;; + *reminder*) show_reminder_menu ;; *background*) show_background_menu ;; *capture*) show_capture_menu ;; *style*) show_style_menu ;; diff --git a/bin/omarchy-menu-file b/bin/omarchy-menu-file new file mode 100755 index 00000000..8cdf4bb0 --- /dev/null +++ b/bin/omarchy-menu-file @@ -0,0 +1,48 @@ +#!/bin/bash + +# omarchy:summary=Pick a file with Walker +# omarchy:group=menu +# omarchy:name=file +# omarchy:args=label paths formats [walker args...] +# omarchy:examples=omarchy menu file "Select image" "$HOME/Pictures" "jpg png webp"|omarchy-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800 + +set -euo pipefail + +if (( $# < 3 )); then + echo "Usage: omarchy-menu-file