mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-02 20:28:19 +02:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
620c6e606c |
-11
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"workspace": {
|
||||
"library": [
|
||||
"/usr/share/hypr/stubs"
|
||||
],
|
||||
"checkThirdParty": false
|
||||
},
|
||||
"diagnostics": {
|
||||
"globals": ["hl"]
|
||||
}
|
||||
}
|
||||
@@ -6,15 +6,10 @@
|
||||
- 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.
|
||||
|
||||
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:
|
||||
All commands start with `omarchy-`. Prefixes indicate purpose:
|
||||
|
||||
- `cmd-` - check if commands exist, misc utility commands
|
||||
- `capture-` - screenshots, screen recordings, and other capture tools
|
||||
@@ -29,52 +24,6 @@ Common prefixes include:
|
||||
- `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:
|
||||
@@ -82,26 +31,14 @@ Use these instead of raw shell commands:
|
||||
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
|
||||
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
|
||||
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
|
||||
- `omarchy-pkg-drop` - remove packages; use this instead of raw `pacman -R*`
|
||||
- `omarchy-notification-send` - send desktop notifications; do not call `notify-send` directly
|
||||
- `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.
|
||||
|
||||
For interactive UI work, use `wtype` to simulate keyboard input when available. Example: start the UI in the background, wait briefly for focus, then run `wtype -k Right -k Return` to exercise keyboard selection and confirm the resulting command output or state change. Prefer this over manual-only verification when a UI returns a selected value or changes a symlink/config.
|
||||
|
||||
When testing layer-shell UI, capture the reference and candidate states as separate screenshots, then compare them visually before further edits. If a launched UI would otherwise remain open, keep track of its PID and stop it after the screenshot; avoid broad process kills unless checking with `ps` first.
|
||||
|
||||
# Refresh Pattern
|
||||
|
||||
To copy a default config to user config with automatic backup:
|
||||
@@ -116,16 +53,10 @@ 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.
|
||||
|
||||
New migration format:
|
||||
- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly
|
||||
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
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
[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
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
@@ -1,2 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Hidden=true
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 64 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB |
+28
-62
@@ -17,7 +17,6 @@ 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
|
||||
@@ -29,53 +28,47 @@ 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"
|
||||
GROUP_DESCRIPTIONS[games]="Game launchers and helpers"
|
||||
GROUP_DESCRIPTIONS[hibernation]="Hibernation setup and removal"
|
||||
GROUP_DESCRIPTIONS[hook]="User hook runner"
|
||||
GROUP_DESCRIPTIONS[hw]="Hardware detection and controls"
|
||||
GROUP_DESCRIPTIONS[hyprland]="Hyprland window, monitor, and toggle controls"
|
||||
GROUP_DESCRIPTIONS[install]="Optional software installers"
|
||||
GROUP_DESCRIPTIONS[launch]="Application launchers"
|
||||
GROUP_DESCRIPTIONS[mako]="Mako notification controls"
|
||||
GROUP_DESCRIPTIONS[menu]="Omarchy menu commands"
|
||||
GROUP_DESCRIPTIONS[migrate]="Migration runner"
|
||||
GROUP_DESCRIPTIONS[notification]="Notification helpers"
|
||||
GROUP_DESCRIPTIONS[npm]="NPM package wrappers"
|
||||
GROUP_DESCRIPTIONS[npx]="NPX package wrappers"
|
||||
GROUP_DESCRIPTIONS[pkg]="Package management helpers"
|
||||
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[share]="Share clipboard, files, and folders"
|
||||
GROUP_DESCRIPTIONS[snapshot]="System snapshots"
|
||||
GROUP_DESCRIPTIONS[style]="Global UI style controls"
|
||||
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"
|
||||
@@ -137,7 +130,6 @@ register_command() {
|
||||
local examples=""
|
||||
local aliases=""
|
||||
local requires_sudo=""
|
||||
local hidden=""
|
||||
local line=""
|
||||
local metadata_key=""
|
||||
local metadata_value=""
|
||||
@@ -193,10 +185,6 @@ 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
|
||||
@@ -240,7 +228,6 @@ register_command() {
|
||||
fi
|
||||
|
||||
[[ $requires_sudo == "true" ]] || requires_sudo="false"
|
||||
[[ $hidden == "true" ]] || hidden="false"
|
||||
|
||||
local key="$file_binary"
|
||||
COMMAND_KEYS+=("$key")
|
||||
@@ -254,7 +241,6 @@ 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"
|
||||
|
||||
@@ -334,6 +320,19 @@ command_requires_args() {
|
||||
[[ -n $required ]]
|
||||
}
|
||||
|
||||
load_group_extra_commands() {
|
||||
local group="$1"
|
||||
|
||||
case "$group" in
|
||||
install)
|
||||
load_command_by_binary omarchy-pkg-add
|
||||
;;
|
||||
system)
|
||||
load_command_by_binary omarchy-lock-screen
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
load_group_commands() {
|
||||
local group="$1"
|
||||
local file=""
|
||||
@@ -347,6 +346,7 @@ load_group_commands() {
|
||||
register_command "$file"
|
||||
done
|
||||
|
||||
load_group_extra_commands "$group"
|
||||
}
|
||||
|
||||
resolve_direct_route() {
|
||||
@@ -379,9 +379,6 @@ 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-
|
||||
}
|
||||
@@ -425,10 +422,6 @@ 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
|
||||
@@ -506,6 +499,8 @@ 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
|
||||
}
|
||||
|
||||
@@ -517,7 +512,7 @@ Usage:
|
||||
List commands known to the Omarchy command center.
|
||||
|
||||
Options:
|
||||
--all Include commands explicitly marked hidden
|
||||
--all Accepted for compatibility
|
||||
--json Emit machine-readable JSON
|
||||
--markdown Emit a Markdown command table
|
||||
--check Validate command metadata and route collisions
|
||||
@@ -569,9 +564,6 @@ 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
|
||||
|
||||
@@ -610,14 +602,13 @@ 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\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\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]}" \
|
||||
@@ -635,12 +626,11 @@ commands_json_filter() {
|
||||
name: .[3],
|
||||
summary: .[4],
|
||||
requires_sudo: (.[5] == "true"),
|
||||
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)
|
||||
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)
|
||||
}] | {ok: true, commands: .}
|
||||
EOF
|
||||
}
|
||||
@@ -694,14 +684,13 @@ 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\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\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]}" \
|
||||
@@ -794,25 +783,6 @@ 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]}"
|
||||
@@ -1030,10 +1000,6 @@ 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
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#!/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"
|
||||
|
||||
@@ -21,7 +21,7 @@ time_remaining=$(omarchy-battery-remaining-time)
|
||||
capacity=$(omarchy-battery-capacity)
|
||||
|
||||
if [[ $state == "charging" ]]; then
|
||||
echo "Battery ${percentage}% · ${time_remaining} to full · ${power_rate}W / ${capacity}Wh"
|
||||
echo " Battery ${percentage}% · ${time_remaining} to full · ${power_rate}W / ${capacity}Wh"
|
||||
else
|
||||
echo "Battery ${percentage}% · ${time_remaining} left · ${power_rate}W / ${capacity}Wh"
|
||||
echo " Battery ${percentage}% · ${time_remaining} left · ${power_rate}W / ${capacity}Wh"
|
||||
fi
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Edit, set, or reset About branding
|
||||
# omarchy:group=branding
|
||||
# omarchy:name=about
|
||||
# omarchy:args=<image|text|reset>
|
||||
# omarchy:examples=omarchy branding about image | omarchy branding about text | omarchy branding about reset
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SOURCE_DIR="${XDG_PICTURES_DIR:-$HOME/Pictures}"
|
||||
|
||||
case "${1:-}" in
|
||||
image)
|
||||
image=$(omarchy-menu-file "Pick png/svg from $SOURCE_DIR" "${SOURCE_DIR}" "svg png")
|
||||
if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/about.txt --width 54 --height 26; 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 <image|text|reset>" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Edit, set, or reset screensaver branding
|
||||
# omarchy:group=branding
|
||||
# omarchy:name=screensaver
|
||||
# omarchy:args=<image|text|reset>
|
||||
# omarchy:examples=omarchy branding screensaver image | omarchy branding screensaver text | omarchy branding screensaver reset
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SOURCE_DIR="${XDG_PICTURES_DIR:-$HOME/Pictures}"
|
||||
|
||||
case "${1:-}" in
|
||||
image)
|
||||
image=$(omarchy-menu-file "Pick png/svg from $SOURCE_DIR" "${SOURCE_DIR}" "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 <image|text|reset>" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -1,26 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Adjust brightness on the most likely display device.
|
||||
# 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
|
||||
# omarchy:args=<step>
|
||||
|
||||
step="${1:-+5%}"
|
||||
|
||||
if [[ $step == "off" ]]; then
|
||||
hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })' >/dev/null 2>&1 || hyprctl dispatch dpms off >/dev/null 2>&1
|
||||
exit 0
|
||||
elif [[ $step == "on" ]]; then
|
||||
hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })' >/dev/null 2>&1 || hyprctl dispatch dpms on >/dev/null 2>&1
|
||||
exit 0
|
||||
if omarchy-hyprland-monitor-focused-apple; then
|
||||
omarchy-brightness-display-apple "$step"
|
||||
exit
|
||||
fi
|
||||
|
||||
runtime_dir="${XDG_RUNTIME_DIR:-/tmp}"
|
||||
|
||||
# Drop overlapping brightness key events so concurrent invocations do not race.
|
||||
# Hardware key repeat present on some devices can otherwise glitch SwayOSD rendering.
|
||||
exec 9>"$runtime_dir/omarchy-brightness-display.lock"
|
||||
flock -n 9 || exit 0
|
||||
|
||||
# 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
|
||||
@@ -30,12 +19,6 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
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 '%')
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#!/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%"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Adjust keyboard backlight brightness using available steps.
|
||||
# omarchy:args=<up|down|cycle|off|restore>
|
||||
# omarchy:args=<up|down|cycle>
|
||||
|
||||
direction="${1:-up}"
|
||||
|
||||
@@ -19,14 +19,6 @@ 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)"
|
||||
|
||||
@@ -5,18 +5,6 @@
|
||||
# omarchy:args=[--with-desktop-audio] [--with-microphone-audio] [--with-webcam] [--webcam-device=<device>] [--resolution=<size>] [--stop-recording]
|
||||
# omarchy:examples=omarchy screenrecord | omarchy capture screenrecord --with-desktop-audio
|
||||
# omarchy:aliases=omarchy screenrecord
|
||||
#
|
||||
# Env: OMARCHY_SCREENRECORD_USE_PORTAL=true skips the built-in slurp picker and
|
||||
# uses gpu-screen-recorder's xdg-desktop-portal capture backend instead. The
|
||||
# portal backend was originally added (PR #3401) for HDR-aware capture, support
|
||||
# for monitors driven by external GPUs, and window capture — enable it if any
|
||||
# of those matter to you. Off by default because the portal path can fail EGL
|
||||
# DMA-BUF modifier import on some configurations, leaving recording unable to
|
||||
# start.
|
||||
#
|
||||
# Env: OMARCHY_SCREENRECORD_DEBUG=true appends gpu-screen-recorder's stderr (and
|
||||
# the picker target it was launched with) to /tmp/omarchy-screenrecord.log so
|
||||
# users can attach a log when reporting capture failures.
|
||||
|
||||
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
||||
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
|
||||
@@ -33,7 +21,6 @@ WEBCAM_DEVICE=""
|
||||
RESOLUTION=""
|
||||
STOP_RECORDING="false"
|
||||
RECORDING_FILE="/tmp/omarchy-screenrecord-filename"
|
||||
LOG_FILE=$([[ ${OMARCHY_SCREENRECORD_DEBUG:-false} == "true" ]] && echo "/tmp/omarchy-screenrecord.log" || echo "/dev/null")
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
@@ -100,92 +87,7 @@ default_resolution() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Monitor + window rectangles on the focused workspace, in slurp's "X,Y WxH" format.
|
||||
# Mirrors omarchy-capture-screenshot so the picker UX is identical.
|
||||
get_rectangles() {
|
||||
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
|
||||
hyprctl monitors -j | jq -r --arg ws "$active_workspace" '
|
||||
.[] | select(.activeWorkspace.id == ($ws | tonumber)) |
|
||||
"\(.x),\(.y) \(.width / .scale | floor)x\(.height / .scale | floor)"'
|
||||
hyprctl clients -j | jq -r --arg ws "$active_workspace" '
|
||||
.[] | select(.workspace.id == ($ws | tonumber)) |
|
||||
"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
|
||||
}
|
||||
|
||||
# Echoes "monitor:NAME" when the selection matches an entire monitor, otherwise
|
||||
# "region:WxH+X+Y" with physical-pixel coordinates ready for gpu-screen-recorder.
|
||||
# Returns non-zero if the user cancelled the picker.
|
||||
select_capture_target() {
|
||||
local rects=$(get_rectangles)
|
||||
hyprpicker -r -z >/dev/null 2>&1 &
|
||||
local picker_pid=$!
|
||||
sleep .1
|
||||
local selection=$(echo "$rects" | slurp 2>/dev/null)
|
||||
kill $picker_pid 2>/dev/null
|
||||
|
||||
# X and Y can be negative (Hyprland monitor positions in multi-display layouts);
|
||||
# widths and heights are always positive.
|
||||
[[ $selection =~ ^(-?[0-9]+),(-?[0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]] || return 1
|
||||
local sx=${BASH_REMATCH[1]} sy=${BASH_REMATCH[2]}
|
||||
local sw=${BASH_REMATCH[3]} sh=${BASH_REMATCH[4]}
|
||||
|
||||
# A bare click (area < 20px²) snaps to whichever rectangle the click landed
|
||||
# inside, so users don't end up with accidental 2px recordings.
|
||||
if ((sw * sh < 20)); then
|
||||
while IFS= read -r rect; do
|
||||
[[ $rect =~ ^(-?[0-9]+),(-?[0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]] || continue
|
||||
local rx=${BASH_REMATCH[1]} ry=${BASH_REMATCH[2]}
|
||||
local rw=${BASH_REMATCH[3]} rh=${BASH_REMATCH[4]}
|
||||
if ((sx >= rx && sx < rx + rw && sy >= ry && sy < ry + rh)); then
|
||||
sx=$rx sy=$ry sw=$rw sh=$rh
|
||||
break
|
||||
fi
|
||||
done <<<"$rects"
|
||||
fi
|
||||
|
||||
# When the selection exactly matches a monitor, prefer -w <monitor> over a
|
||||
# region capture — same kms backend, but no scaling math and full native res.
|
||||
local monitor=$(hyprctl monitors -j | jq -r --argjson x "$sx" --argjson y "$sy" --argjson w "$sw" --argjson h "$sh" '
|
||||
.[] | select(.x == $x and .y == $y and (.width / .scale | floor) == $w and (.height / .scale | floor) == $h) | .name' | head -1)
|
||||
|
||||
if [[ -n $monitor ]]; then
|
||||
echo "monitor:$monitor"
|
||||
return
|
||||
fi
|
||||
|
||||
# gpu-screen-recorder wants region geometry in the compositor's logical
|
||||
# coordinate space — same space slurp returns — so pass the values through
|
||||
# untouched. (gsr scales to physical pixels itself based on the monitor.)
|
||||
echo "region:${sw}x${sh}+${sx}+${sy}"
|
||||
}
|
||||
|
||||
start_screenrecording() {
|
||||
local capture_args=()
|
||||
local target
|
||||
|
||||
# Opt-in path for HDR, external-GPU monitors, and window capture (all things
|
||||
# the portal backend supports and the kms backend doesn't). Default flow uses
|
||||
# slurp + the kms backend, which avoids the EGL DMA-BUF modifier import
|
||||
# failures the portal path can hit on some configurations.
|
||||
if [[ ${OMARCHY_SCREENRECORD_USE_PORTAL:-false} == "true" ]]; then
|
||||
target="portal"
|
||||
capture_args=(-w portal -s "${RESOLUTION:-$(default_resolution)}")
|
||||
else
|
||||
target=$(select_capture_target) || return 1
|
||||
|
||||
case $target in
|
||||
monitor:*)
|
||||
capture_args=(-w "${target#monitor:}" -s "${RESOLUTION:-$(default_resolution)}")
|
||||
;;
|
||||
region:*)
|
||||
capture_args=(-w "${target#region:}")
|
||||
[[ -n $RESOLUTION ]] && capture_args+=(-s "$RESOLUTION")
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
[[ $WEBCAM == "true" ]] && start_webcam_overlay
|
||||
|
||||
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
|
||||
local audio_devices=""
|
||||
local audio_args=()
|
||||
@@ -200,10 +102,12 @@ start_screenrecording() {
|
||||
|
||||
[[ -n $audio_devices ]] && audio_args+=(-a "$audio_devices" -ac aac)
|
||||
|
||||
echo "===== $(date '+%F %T') args: $* target: $target =====" >>"$LOG_FILE"
|
||||
gpu-screen-recorder "${capture_args[@]}" -k auto -f 60 -fm cfr -fallback-cpu-encoding yes -o "$filename" "${audio_args[@]}" 2>>"$LOG_FILE" &
|
||||
local resolution="${RESOLUTION:-$(default_resolution)}"
|
||||
|
||||
gpu-screen-recorder -w portal -k auto -s "$resolution" -f 60 -fm cfr -fallback-cpu-encoding yes -o "$filename" "${audio_args[@]}" &
|
||||
local pid=$!
|
||||
|
||||
# Wait for recording to actually start (file appears after portal selection)
|
||||
while kill -0 $pid 2>/dev/null && [[ ! -f $filename ]]; do
|
||||
sleep 0.2
|
||||
done
|
||||
@@ -233,7 +137,6 @@ 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
|
||||
@@ -272,10 +175,7 @@ finalize_recording() {
|
||||
# Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass
|
||||
local args=(-y -ss 0.1 -i "$latest" "${video_codec[@]}")
|
||||
if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then
|
||||
# Hard-mute the first 400ms to drop the PipeWire capture-open pop (a near-clipping
|
||||
# transient around 130-200ms that a gentle fade-in can't attenuate enough), then a
|
||||
# 50ms fade avoids a click at the boundary before loudnorm normalizes the rest.
|
||||
args+=(-af "volume=enable='lt(t,0.4)':volume=0,afade=t=in:st=0.4:d=0.05,loudnorm=I=-14:TP=-1.5:LRA=11")
|
||||
args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11)
|
||||
fi
|
||||
|
||||
local processed="${latest%.mp4}-processed.mp4"
|
||||
@@ -291,5 +191,7 @@ if screenrecording_active; then
|
||||
elif [[ $STOP_RECORDING == "true" ]]; then
|
||||
exit 1
|
||||
else
|
||||
[[ $WEBCAM == "true" ]] && start_webcam_overlay
|
||||
|
||||
start_screenrecording || cleanup_webcam
|
||||
fi
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# omarchy:summary=Take a screenshot
|
||||
# omarchy:group=capture
|
||||
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy|save] [--editor=<name>]
|
||||
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
|
||||
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
|
||||
# omarchy:aliases=omarchy screenshot
|
||||
|
||||
@@ -126,22 +126,14 @@ esac
|
||||
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
|
||||
FILEPATH="$OUTPUT_DIR/$FILENAME"
|
||||
|
||||
case "$PROCESSING" in
|
||||
slurp)
|
||||
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
||||
echo "$FILEPATH"
|
||||
wl-copy <"$FILEPATH"
|
||||
if [[ $PROCESSING == "slurp" ]]; then
|
||||
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
||||
wl-copy <"$FILEPATH"
|
||||
|
||||
(
|
||||
ACTION=$(notify-send "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 -i "$FILEPATH" -A "default=edit")
|
||||
[[ $ACTION == "default" ]] && open_editor "$FILEPATH"
|
||||
) >/dev/null 2>&1 &
|
||||
;;
|
||||
copy)
|
||||
grim -g "$SELECTION" - | wl-copy
|
||||
;;
|
||||
save)
|
||||
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
||||
echo "$FILEPATH"
|
||||
;;
|
||||
esac
|
||||
(
|
||||
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
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Extract text from a screenshot region with OCR
|
||||
# omarchy:group=capture
|
||||
# omarchy:examples=omarchy capture ocr
|
||||
|
||||
# Keep hyprpicker alive until after grim captures so the screenshot sees the
|
||||
# frozen overlay rather than live content shifting during teardown.
|
||||
cleanup_freeze() {
|
||||
[[ -n $PID ]] && kill $PID 2>/dev/null
|
||||
}
|
||||
trap cleanup_freeze EXIT
|
||||
|
||||
hyprpicker -r -z >/dev/null 2>&1 &
|
||||
PID=$!
|
||||
sleep .1
|
||||
SELECTION=$(slurp 2>/dev/null)
|
||||
|
||||
[[ -z $SELECTION ]] && exit 0
|
||||
|
||||
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
|
||||
|
||||
printf "%s" "$TEXT" | wl-copy
|
||||
notify-send " Copied text from selection to clipboard"
|
||||
@@ -1,7 +1,6 @@
|
||||
#!/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)
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
#!/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 <chromium|chrome|brave|brave-origin|edge|firefox|zen>"
|
||||
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"
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/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 <code|cursor|zed|sublime_text|helix|vim|emacs|nvim>"
|
||||
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"
|
||||
@@ -1,36 +0,0 @@
|
||||
#!/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 <alacritty|foot|ghostty|kitty>"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
cat >~/.config/xdg-terminals.list <<EOF
|
||||
# Terminal emulator preference order for xdg-terminal-exec
|
||||
# The first found and valid terminal will be used
|
||||
$desktop_id
|
||||
EOF
|
||||
|
||||
notify-send -u low "$glyph $name is now the default terminal"
|
||||
@@ -1,163 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Measure theme switcher cache and selector prep times
|
||||
# omarchy:args=[--repeat=<count>] [--keep-cache]
|
||||
# omarchy:examples=omarchy dev benchmark theme switcher | omarchy dev benchmark theme-switcher --repeat=10
|
||||
# omarchy:aliases=omarchy dev benchmark theme-switcher
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
OMARCHY_BIN_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
OMARCHY_PATH=${OMARCHY_PATH:-$(cd -- "$OMARCHY_BIN_DIR/.." && pwd)}
|
||||
REPEAT=5
|
||||
KEEP_CACHE=false
|
||||
|
||||
show_help() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
omarchy dev benchmark theme switcher [--repeat=<count>] [--keep-cache]
|
||||
|
||||
Measure the non-interactive parts of the theme switcher:
|
||||
- theme preview index build (omarchy-theme-switcher before UI handoff)
|
||||
- lazy selector row prep used by the interactive theme switcher
|
||||
- full thumbnail cache warmup cost (omarchy-menu-images --cache-only)
|
||||
|
||||
Options:
|
||||
--repeat=<count> Number of warm runs to measure for each case (default: 5)
|
||||
--keep-cache Keep the temporary benchmark cache and print its path
|
||||
EOF
|
||||
}
|
||||
|
||||
now_us() {
|
||||
local now="${EPOCHREALTIME/./}"
|
||||
printf '%s' "$now"
|
||||
}
|
||||
|
||||
format_ms() {
|
||||
local us="$1"
|
||||
printf '%d.%03d' "$(( us / 1000 ))" "$(( us % 1000 ))"
|
||||
}
|
||||
|
||||
measure_once() {
|
||||
local start_us end_us
|
||||
start_us=$(now_us)
|
||||
"$@" >/dev/null
|
||||
end_us=$(now_us)
|
||||
printf '%s' "$(( end_us - start_us ))"
|
||||
}
|
||||
|
||||
run_case() {
|
||||
local label="$1"
|
||||
shift
|
||||
local total_us=0
|
||||
local min_us=0
|
||||
local max_us=0
|
||||
local elapsed_us=0
|
||||
|
||||
for (( i = 1; i <= REPEAT; i++ )); do
|
||||
elapsed_us=$(measure_once "$@")
|
||||
total_us=$(( total_us + elapsed_us ))
|
||||
|
||||
if (( i == 1 || elapsed_us < min_us )); then
|
||||
min_us=$elapsed_us
|
||||
fi
|
||||
|
||||
if (( elapsed_us > max_us )); then
|
||||
max_us=$elapsed_us
|
||||
fi
|
||||
done
|
||||
|
||||
printf '%-34s avg %8s ms min %8s ms max %8s ms\n' \
|
||||
"$label" \
|
||||
"$(format_ms "$(( total_us / REPEAT ))")" \
|
||||
"$(format_ms "$min_us")" \
|
||||
"$(format_ms "$max_us")"
|
||||
}
|
||||
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--repeat=*)
|
||||
REPEAT="${1#*=}"
|
||||
;;
|
||||
--keep-cache)
|
||||
KEEP_CACHE=true
|
||||
;;
|
||||
--help | -h)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
show_help >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ ! $REPEAT =~ ^[0-9]+$ ]] || (( REPEAT < 1 )); then
|
||||
echo "--repeat must be a positive integer" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
benchmark_cache=$(mktemp -d)
|
||||
thumbnail_cache=$(mktemp -d)
|
||||
stub_bin=$(mktemp -d)
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$stub_bin"
|
||||
|
||||
if [[ $KEEP_CACHE == "true" ]]; then
|
||||
printf 'Benchmark cache: %s\n' "$benchmark_cache"
|
||||
printf 'Thumbnail cache: %s\n' "$thumbnail_cache"
|
||||
else
|
||||
rm -rf "$benchmark_cache" "$thumbnail_cache"
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
cat >"$stub_bin/omarchy-menu-images" <<'EOF'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x "$stub_bin/omarchy-menu-images"
|
||||
|
||||
benchmark_env=(
|
||||
env
|
||||
"OMARCHY_PATH=$OMARCHY_PATH"
|
||||
"XDG_CACHE_HOME=$benchmark_cache"
|
||||
"PATH=$stub_bin:$OMARCHY_BIN_DIR:$PATH"
|
||||
)
|
||||
|
||||
thumbnail_env=(
|
||||
env
|
||||
"OMARCHY_PATH=$OMARCHY_PATH"
|
||||
"XDG_CACHE_HOME=$thumbnail_cache"
|
||||
"PATH=$stub_bin:$OMARCHY_BIN_DIR:$PATH"
|
||||
)
|
||||
|
||||
preview_dir="$benchmark_cache/omarchy/theme-selector/previews"
|
||||
thumbnail_preview_dir="$thumbnail_cache/omarchy/theme-selector/previews"
|
||||
|
||||
build_theme_index() {
|
||||
"${benchmark_env[@]}" "$OMARCHY_BIN_DIR/omarchy-theme-switcher"
|
||||
}
|
||||
|
||||
prepare_selector_lazy() {
|
||||
"${benchmark_env[@]}" "$OMARCHY_BIN_DIR/omarchy-menu-images" --prepare-only --lazy-thumbnails --show-labels --filterable "$preview_dir"
|
||||
}
|
||||
|
||||
prepare_image_cache() {
|
||||
"${thumbnail_env[@]}" "$OMARCHY_BIN_DIR/omarchy-menu-images" --cache-only "$thumbnail_preview_dir"
|
||||
}
|
||||
|
||||
printf 'Theme switcher benchmark (%d warm runs each)\n\n' "$REPEAT"
|
||||
printf '%-34s %s ms\n' "theme index cold" "$(format_ms "$(measure_once build_theme_index)")"
|
||||
run_case "theme index warm" build_theme_index
|
||||
printf '%-34s %s ms\n' "selector prep cold (lazy)" "$(format_ms "$(measure_once prepare_selector_lazy)")"
|
||||
run_case "selector prep warm (lazy)" prepare_selector_lazy
|
||||
"${thumbnail_env[@]}" "$OMARCHY_BIN_DIR/omarchy-theme-switcher" >/dev/null
|
||||
printf '%-34s %s ms\n' "thumbnail cache cold" "$(format_ms "$(measure_once prepare_image_cache)")"
|
||||
run_case "thumbnail cache warm" prepare_image_cache
|
||||
|
||||
printf '\nTheme previews: %d\n' "$(find -L "$preview_dir" -maxdepth 1 -type f 2>/dev/null | wc -l)"
|
||||
@@ -22,8 +22,7 @@ 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: "hidden", required: false, type: "true", default: false, note: "Hide from default command listings; visible with --all."}
|
||||
{name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}
|
||||
]
|
||||
}'
|
||||
}
|
||||
@@ -44,7 +43,6 @@ Inferred defaults:
|
||||
route omarchy <group> <name>
|
||||
binary filename
|
||||
requires-sudo false
|
||||
hidden false
|
||||
|
||||
Optional fields:
|
||||
# omarchy:group=<group> route override only
|
||||
@@ -53,7 +51,6 @@ Optional fields:
|
||||
# omarchy:examples=<cmd> | <cmd> pipe-separated examples
|
||||
# omarchy:aliases=<route> | <route> 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
|
||||
|
||||
@@ -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-password.
|
||||
# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.
|
||||
|
||||
if (($# == 0)); then
|
||||
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
|
||||
|
||||
@@ -16,11 +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/gdk-scale.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"
|
||||
|
||||
@@ -22,10 +22,6 @@ 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
|
||||
@@ -41,10 +37,6 @@ 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."
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=List installed RetroArch core names
|
||||
|
||||
set -e
|
||||
|
||||
core_dir="/usr/lib/libretro"
|
||||
preferred_cores=(
|
||||
"Amstrad CPC|cap32"
|
||||
"Arcade FBNeo|fbneo"
|
||||
"Arcade MAME|mame"
|
||||
"Commodore Amiga|puae"
|
||||
"Commodore C128|vice_x128"
|
||||
"Commodore C64|vice_x64"
|
||||
"Commodore VIC-20|vice_xvic"
|
||||
"Nintendo DS|desmume"
|
||||
"Nintendo Game Boy / Color|gambatte"
|
||||
"Nintendo Game Boy Advance|mgba"
|
||||
"Nintendo GameCube / Wii|dolphin"
|
||||
"Nintendo NES / Famicom|mesen"
|
||||
"Nintendo 64|parallel_n64"
|
||||
"Nintendo SNES / SFC|snes9x"
|
||||
"NEC PC Engine / TurboGrafx-16|mednafen_pce_fast"
|
||||
"NEC PC Engine CD / TurboGrafx-CD|mednafen_pce"
|
||||
"NEC PC Engine SuperGrafx|mednafen_supergrafx"
|
||||
"Sega Dreamcast|flycast"
|
||||
"Sega Mega Drive / Master System / Game Gear|genesis_plus_gx"
|
||||
"Sega Saturn|kronos"
|
||||
"Sony PlayStation|mednafen_psx_hw"
|
||||
"Sony PlayStation Portable|ppsspp"
|
||||
)
|
||||
|
||||
[[ -d $core_dir ]] || exit 0
|
||||
|
||||
for preferred_core in "${preferred_cores[@]}"; do
|
||||
label="${preferred_core%%|*}"
|
||||
core="${preferred_core#*|}"
|
||||
[[ -f $core_dir/${core}_libretro.so ]] && printf '%s (%s)\n' "$label" "$core"
|
||||
done
|
||||
@@ -1,76 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Create a desktop launcher for a RetroArch game
|
||||
# omarchy:args=[core path-to-game]
|
||||
# omarchy:examples=omarchy games retro install snes9x ~/Games/roms/snes/game.sfc | omarchy-games-retro-install /usr/lib/libretro/mgba_libretro.so ~/Games/roms/gba/game.gba
|
||||
|
||||
set -e
|
||||
|
||||
if (( $# == 0 )); then
|
||||
mapfile -t cores < <(omarchy-games-retro-cores)
|
||||
|
||||
if (( ${#cores[@]} == 0 )); then
|
||||
omarchy-notification-send -g "" "No RetroArch cores found" "/usr/lib/libretro"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
core=$(omarchy-menu-select "RetroArch core" "${cores[@]}") || exit 0
|
||||
[[ -n $core ]] || exit 0
|
||||
core="${core##*(}"
|
||||
core="${core%)}"
|
||||
|
||||
game_path=$(omarchy-menu-file "Retro game" "$HOME/Games/roms" "7z bin ccd chd cue dmg elf fds gb gba gbc iso lha m3u md n64 nds nes pbp sfc smc swc zip z64") || exit 0
|
||||
[[ -n $game_path ]] || exit 0
|
||||
elif (( $# == 2 )); then
|
||||
core="$1"
|
||||
game_path="$2"
|
||||
else
|
||||
echo "Usage: omarchy-games-retro-install [core path-to-game]"
|
||||
echo "Example: omarchy-games-retro-install snes9x ~/Games/roms/snes/game.sfc"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f $game_path ]]; then
|
||||
echo "Game not found: $game_path"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $core == */* ]]; then
|
||||
core_path="$core"
|
||||
else
|
||||
core_path="/usr/lib/libretro/${core}_libretro.so"
|
||||
fi
|
||||
|
||||
if [[ ! -f $core_path ]]; then
|
||||
echo "Core not found: $core_path"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
game_name=$(printf '%s' "${game_path##*/}" | sed 's/\.[^.]*$//; s/[[:space:]]*([^)]*)//g; s/[[:space:]]\+/ /g; s/^ //; s/ $//' | perl -Mopen=locale -pe 's/(^|[[:space:]])([^[:space:]])/$1\U$2/g')
|
||||
desktop_name="$game_name"
|
||||
desktop_id=$(printf '%s' "$desktop_name" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | sed 's/^-//; s/-$//')
|
||||
desktop_dir="$HOME/.local/share/applications"
|
||||
desktop_file="$desktop_dir/$desktop_id.desktop"
|
||||
icon_dir="$desktop_dir/icons"
|
||||
icon_path="$icon_dir/Retro Gaming.png"
|
||||
|
||||
mkdir -p "$desktop_dir" "$icon_dir"
|
||||
[[ -f $icon_path ]] || cp "$HOME/.local/share/omarchy/applications/icons/Retro Gaming.png" "$icon_path"
|
||||
|
||||
cat >"$desktop_file" <<EOF
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=$desktop_name
|
||||
Comment=Play $game_name with RetroArch
|
||||
Exec=retroarch -L "$core_path" "$game_path"
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=$icon_path
|
||||
StartupNotify=true
|
||||
Categories=Game;Emulator;
|
||||
EOF
|
||||
|
||||
chmod +x "$desktop_file"
|
||||
update-desktop-database "$desktop_dir" &>/dev/null || true
|
||||
|
||||
omarchy-notification-send -g "" "$game_name installed" "Start it with Super + Space"
|
||||
Executable
+96
@@ -0,0 +1,96 @@
|
||||
#!/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()
|
||||
@@ -44,6 +44,11 @@ if grep -Fq "$SWAP_FILE" /etc/fstab; then
|
||||
sudo sed -i '/^# Btrfs swapfile for system hibernation$/d' /etc/fstab
|
||||
fi
|
||||
|
||||
# Remove suspend-then-hibernate configuration
|
||||
echo "Removing suspend-then-hibernate configuration"
|
||||
sudo rm -f /etc/systemd/logind.conf.d/lid.conf
|
||||
sudo rm -f /etc/systemd/sleep.conf.d/hibernate.conf
|
||||
|
||||
# Remove mkinitcpio resume hook
|
||||
echo "Removing resume hook"
|
||||
sudo rm "$MKINITCPIO_CONF"
|
||||
|
||||
+2
-11
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/<name> and ~/.config/omarchy/hooks/<name>.d/.
|
||||
# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
|
||||
# omarchy:args=[name] [args...]
|
||||
|
||||
set -e
|
||||
@@ -12,17 +12,8 @@ fi
|
||||
|
||||
HOOK=$1
|
||||
HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
|
||||
HOOK_DIR="$HOOK_PATH.d"
|
||||
shift
|
||||
|
||||
if [[ -f $HOOK_PATH ]]; then
|
||||
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
|
||||
bash "$HOOK_PATH" "$@"
|
||||
fi
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install a hook into ~/.config/omarchy/hooks/<type>.d/
|
||||
# omarchy:group=hook
|
||||
# omarchy:name=install
|
||||
# omarchy:args=<type> <file>
|
||||
# omarchy:examples=omarchy hook install post-update ~/my-hook
|
||||
|
||||
set -e
|
||||
|
||||
if (( $# != 2 )); then
|
||||
echo "Usage: omarchy-hook-install <type> <file>"
|
||||
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"
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Detect ASUS Zenbook UX5406AA series laptops on Intel Panther Lake.
|
||||
|
||||
omarchy-hw-match "ux5406aa" && omarchy-hw-intel-ptl
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/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 ]]
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Detect whether the computer has an NVIDIA GPU with GSP firmware (Turing or newer).
|
||||
|
||||
# GTX 16xx, RTX 20xx-50xx, RTX Pro, Quadro RTX, datacenter A/H/T/L series.
|
||||
lspci | grep -i 'nvidia' | grep -qE "GTX 16[0-9]{2}|RTX [2-5][0-9]{3}|RTX PRO [0-9]{4}|Quadro RTX|RTX A[0-9]{4}|A[1-9][0-9]{2}|H[1-9][0-9]{2}|T4|L[0-9]+"
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Detect whether the computer has an NVIDIA GPU without GSP firmware (Maxwell/Pascal/Volta).
|
||||
|
||||
# GTX 9xx/10xx, GT 10xx, Quadro P/M/GV, MX series, Titan X/Xp/V, Tesla V100.
|
||||
lspci | grep -i 'nvidia' | grep -qE "GTX (9[0-9]{2}|10[0-9]{2})|GT 10[0-9]{2}|Quadro [PM][0-9]{3,4}|Quadro GV100|MX *[0-9]+|Titan (X|Xp|V)|Tesla V100"
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# omarchy:summary=Clear the internal-monitor-disable toggle if no external display is connected.
|
||||
|
||||
TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.lua"
|
||||
TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.conf"
|
||||
|
||||
if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then
|
||||
rm -f "$TOGGLE"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Toggles transparency for the currently focused window.
|
||||
|
||||
hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle
|
||||
@@ -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|Studio XDR")))' >/dev/null
|
||||
hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR")))' >/dev/null
|
||||
|
||||
@@ -4,50 +4,40 @@
|
||||
# omarchy:args=<on|off|toggle|recover>
|
||||
|
||||
TOGGLE="internal-monitor-disable"
|
||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
|
||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
|
||||
MIRROR_TOGGLE="internal-monitor-mirror"
|
||||
|
||||
# Get internal monitor name dynamically
|
||||
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
|
||||
|
||||
on() {
|
||||
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
omarchy-hyprland-toggle $TOGGLE off
|
||||
omarchy-notification-send -g "Laptop display enabled"
|
||||
enable() {
|
||||
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
|
||||
omarchy-hyprland-toggle --disabled-notification " Laptop display enabled" "$TOGGLE"
|
||||
fi
|
||||
}
|
||||
|
||||
off() {
|
||||
disable() {
|
||||
if ! omarchy-hw-external-monitors; then
|
||||
omarchy-notification-send -g "Can't disable the only active display"
|
||||
notify-send -u low " Can't disable the only active display"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if omarchy-hyprland-toggle-disabled $TOGGLE && omarchy-hyprland-toggle-disabled $MIRROR_TOGGLE; then
|
||||
printf 'hl.monitor({ output = "%s", disabled = true })\n' "$INTERNAL" >"$TOGGLE_FLAG"
|
||||
omarchy-notification-send -g "Laptop display disabled"
|
||||
if omarchy-hyprland-toggle-disabled "$TOGGLE" && omarchy-hyprland-toggle-disabled "$MIRROR_TOGGLE"; then
|
||||
echo "monitor=$INTERNAL,disable" >"$TOGGLE_FLAG"
|
||||
notify-send -u low " Laptop display disabled"
|
||||
hyprctl reload
|
||||
fi
|
||||
}
|
||||
|
||||
recover() {
|
||||
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
omarchy-hyprland-toggle $TOGGLE off
|
||||
fi
|
||||
}
|
||||
|
||||
toggle() {
|
||||
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
on
|
||||
else
|
||||
off
|
||||
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
|
||||
omarchy-hyprland-toggle "$TOGGLE"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
on) on ;;
|
||||
off) off ;;
|
||||
toggle) toggle ;;
|
||||
on) enable ;;
|
||||
off) disable ;;
|
||||
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then enable; else disable; fi ;;
|
||||
recover) recover ;;
|
||||
*)
|
||||
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# omarchy:args=<on|off|toggle|recover>
|
||||
|
||||
TOGGLE="internal-monitor-mirror"
|
||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
|
||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
|
||||
DISABLE_TOGGLE="internal-monitor-disable"
|
||||
|
||||
# Get names dynamically
|
||||
@@ -12,51 +12,44 @@ INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).na
|
||||
# Get the first available external monitor
|
||||
EXTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP") | not).name' | head -n 1)
|
||||
|
||||
on() {
|
||||
if [[ -z $EXTERNAL ]]; then
|
||||
omarchy-notification-send -g "No external monitors found for mirror"
|
||||
enable() {
|
||||
if [[ -z "$EXTERNAL" ]]; then
|
||||
notify-send -u low " No external monitors found for mirror"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z $INTERNAL ]]; then
|
||||
omarchy-notification-send -g "No laptop monitor found to mirror"
|
||||
if [[ -z "$INTERNAL" ]]; then
|
||||
notify-send -u low " No laptop monitor found to mirror"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
omarchy-hyprland-toggle $DISABLE_TOGGLE off
|
||||
if omarchy-hyprland-toggle-enabled "$DISABLE_TOGGLE"; then
|
||||
omarchy-hyprland-toggle "$DISABLE_TOGGLE"
|
||||
fi
|
||||
|
||||
if omarchy-hyprland-toggle-disabled $TOGGLE; then
|
||||
printf 'hl.monitor({ output = "%s", mode = "preferred", position = "auto", scale = 1, mirror = "%s" })\n' "$EXTERNAL" "$INTERNAL" >"$TOGGLE_FLAG"
|
||||
omarchy-notification-send -g "Mirroring enabled ($EXTERNAL)"
|
||||
if omarchy-hyprland-toggle-disabled "$TOGGLE"; then
|
||||
echo "monitor=$EXTERNAL, preferred, auto, 1, mirror, $INTERNAL" > "$TOGGLE_FLAG"
|
||||
notify-send -u low " Mirroring enabled ($EXTERNAL)"
|
||||
hyprctl reload
|
||||
fi
|
||||
}
|
||||
|
||||
off() {
|
||||
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
omarchy-hyprland-toggle $TOGGLE off
|
||||
omarchy-notification-send -g "Extended mode restored"
|
||||
fi
|
||||
}
|
||||
|
||||
toggle() {
|
||||
if omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
off
|
||||
else
|
||||
on
|
||||
disable() {
|
||||
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
|
||||
omarchy-hyprland-toggle --disabled-notification " Extended mode restored" "$TOGGLE"
|
||||
fi
|
||||
}
|
||||
|
||||
recover() {
|
||||
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled $TOGGLE; then
|
||||
omarchy-hyprland-toggle $TOGGLE off
|
||||
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
|
||||
omarchy-hyprland-toggle "$TOGGLE"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
on) on ;;
|
||||
off) off ;;
|
||||
toggle) toggle ;;
|
||||
on) enable ;;
|
||||
off) disable ;;
|
||||
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then disable; else enable; fi ;;
|
||||
recover) recover ;;
|
||||
*)
|
||||
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Print the monitor scale of the internal monitor or first other monitor
|
||||
|
||||
hyprctl monitors -j | jq -r '([.[] | select(.name | contains("eDP"))][0] // .[0]).scale // empty | tonumber | if . == floor then floor else . end'
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, 3x, and 4x
|
||||
# omarchy:summary=Cycle scaling for the focused Hyprland monitor
|
||||
|
||||
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
|
||||
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
|
||||
@@ -9,9 +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 monitor/GDK scale pairs: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse)
|
||||
SCALES=(1 1.25 1.6 2 3 4)
|
||||
GDK_SCALES=(1 1.25 1.75 2 3 4)
|
||||
# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse)
|
||||
SCALES=(1 1.25 1.6 2 3)
|
||||
|
||||
# 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)
|
||||
@@ -25,30 +24,24 @@ CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
|
||||
print best
|
||||
}')
|
||||
|
||||
if [[ $1 == "--reverse" ]]; then
|
||||
if [[ "$1" == "--reverse" ]]; then
|
||||
NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} ))
|
||||
else
|
||||
NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} ))
|
||||
fi
|
||||
|
||||
NEW_SCALE=${SCALES[$NEW_IDX]}
|
||||
NEW_GDK_SCALE=${GDK_SCALES[$NEW_IDX]}
|
||||
|
||||
hyprctl eval "hl.monitor({ output = \"$ACTIVE_MONITOR\", mode = \"${WIDTH}x${HEIGHT}@${REFRESH_RATE}\", position = \"auto\", scale = $NEW_SCALE })" >/dev/null
|
||||
hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE"
|
||||
|
||||
# Persist to monitors.lua if the user still has Omarchy's generic catch-all
|
||||
# defaults, so the scale survives reboots.
|
||||
MONITOR_LUA="$HOME/.config/hypr/monitors.lua"
|
||||
if [[ -f $MONITOR_LUA ]] && grep -q '^local omarchy_monitor_scale = ' "$MONITOR_LUA"; then
|
||||
sed -i -E \
|
||||
-e "s|^local omarchy_monitor_scale = .*|local omarchy_monitor_scale = ${NEW_SCALE}|" \
|
||||
-e "s|^local omarchy_gdk_scale = .*|local omarchy_gdk_scale = ${NEW_GDK_SCALE}|" \
|
||||
"$MONITOR_LUA"
|
||||
elif [[ -f $MONITOR_LUA ]] && grep -Eq '^hl\.monitor\(\{ output = "", mode = "preferred", position = "auto", scale = ("auto"|[0-9.]+) \}\)' "$MONITOR_LUA"; then
|
||||
sed -i -E \
|
||||
-e "s|^(hl\.monitor\(\{ output = \"\", mode = \"preferred\", position = \"auto\", scale = )([^ ]+)( \}\))|\\1${NEW_SCALE}\\3|" \
|
||||
-e 's|^hl\.env\("GDK_SCALE", ".*"\)|hl.env("GDK_SCALE", "'"$NEW_GDK_SCALE"'")|' \
|
||||
"$MONITOR_LUA"
|
||||
# Persist to monitors.conf if the user has a single generic catch-all line
|
||||
# (ignoring disabled monitors), so the scale survives reboots.
|
||||
MONITOR_CONF="$HOME/.config/hypr/monitors.conf"
|
||||
if [[ -f $MONITOR_CONF ]]; then
|
||||
mapfile -t ACTIVE_LINES < <(grep -E '^[[:space:]]*monitor=' "$MONITOR_CONF" | grep -vE 'disable[[:space:]]*$')
|
||||
if [[ ${#ACTIVE_LINES[@]} -eq 1 ]] && [[ "${ACTIVE_LINES[0]}" =~ ^monitor=,preferred,auto, ]]; then
|
||||
sed -i -E "s|^(monitor=,preferred,auto,).*|\\1${NEW_SCALE}|" "$MONITOR_CONF"
|
||||
fi
|
||||
fi
|
||||
|
||||
notify-send -u low " Display scaling set to ${NEW_SCALE}x"
|
||||
|
||||
+17
-62
@@ -1,77 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely.
|
||||
# omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]
|
||||
# omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name>
|
||||
|
||||
ENABLED_NOTIFICATION=""
|
||||
DISABLED_NOTIFICATION=""
|
||||
|
||||
while (($# > 0)); do
|
||||
while [[ $# -gt 1 ]]; do
|
||||
case $1 in
|
||||
--enabled-notification)
|
||||
if (($# < 2)); then
|
||||
echo "Missing value for $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
ENABLED_NOTIFICATION="$2"
|
||||
shift 2
|
||||
;;
|
||||
--disabled-notification)
|
||||
if (($# < 2)); then
|
||||
echo "Missing value for $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
DISABLED_NOTIFICATION="$2"
|
||||
shift 2
|
||||
;;
|
||||
--enabled-notification) ENABLED_NOTIFICATION="$2"; shift 2 ;;
|
||||
--disabled-notification) DISABLED_NOTIFICATION="$2"; shift 2 ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if (($# < 1)); then
|
||||
echo "Usage: omarchy-hyprland-toggle [--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]" >&2
|
||||
FLAG_NAME="$1"
|
||||
FLAG="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.conf"
|
||||
FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.conf"
|
||||
|
||||
if [[ -f $FLAG ]]; then
|
||||
rm $FLAG
|
||||
[[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION"
|
||||
elif [[ -f $FLAG_SOURCE ]]; then
|
||||
cp $FLAG_SOURCE $FLAG
|
||||
[[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION"
|
||||
else
|
||||
echo "Flag not found: $FLAG_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FLAG_NAME="$1"
|
||||
ACTION="${2:-toggle}"
|
||||
FLAG_FILE="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.lua"
|
||||
FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.lua"
|
||||
|
||||
on() {
|
||||
if [[ -f $FLAG_SOURCE ]]; then
|
||||
mkdir -p "$(dirname "$FLAG_FILE")"
|
||||
cp "$FLAG_SOURCE" "$FLAG_FILE"
|
||||
[[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION"
|
||||
else
|
||||
echo "Flag not found: $FLAG_NAME" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
off() {
|
||||
rm -f "$FLAG_FILE"
|
||||
[[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION"
|
||||
}
|
||||
|
||||
toggle() {
|
||||
if [[ -f $FLAG_FILE ]]; then
|
||||
off
|
||||
echo "off"
|
||||
else
|
||||
on
|
||||
echo "on"
|
||||
fi
|
||||
}
|
||||
|
||||
case $ACTION in
|
||||
on) on ;;
|
||||
off) off ;;
|
||||
toggle) toggle ;;
|
||||
*)
|
||||
echo "Usage: omarchy-hyprland-toggle [--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
hyprctl reload >/dev/null
|
||||
hyprctl reload
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
# omarchy:summary=Check if a Hyprland toggle is currently disabled (missing).
|
||||
# omarchy:args=<flag-name>
|
||||
|
||||
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
|
||||
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
# omarchy:summary=Check if a Hyprland toggle is currently enabled.
|
||||
# omarchy:args=<flag-name>
|
||||
|
||||
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
|
||||
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
|
||||
|
||||
@@ -4,9 +4,7 @@
|
||||
|
||||
hyprctl clients -j | \
|
||||
jq -r ".[].address" | \
|
||||
while read -r addr; do
|
||||
hyprctl dispatch "hl.dsp.window.close(\"address:$addr\")" >/dev/null 2>&1 || hyprctl dispatch closewindow "address:$addr"
|
||||
done
|
||||
xargs -I{} hyprctl dispatch closewindow address:{}
|
||||
|
||||
# Move to first workspace
|
||||
hyprctl dispatch 'hl.dsp.focus({ workspace = "1" })' >/dev/null 2>&1 || hyprctl dispatch workspace 1
|
||||
hyprctl dispatch workspace 1
|
||||
|
||||
@@ -11,30 +11,24 @@ y=${4:-}
|
||||
active=$(hyprctl activewindow -j)
|
||||
pinned=$(echo "$active" | jq ".pinned")
|
||||
addr=$(echo "$active" | jq -r ".address")
|
||||
window="address:$addr"
|
||||
|
||||
hypr_dispatch() {
|
||||
local lua="$1"
|
||||
shift
|
||||
|
||||
hyprctl dispatch "$lua" >/dev/null 2>&1 || hyprctl dispatch "$@" >/dev/null
|
||||
}
|
||||
|
||||
if [[ $pinned == "true" ]]; then
|
||||
hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
|
||||
hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
|
||||
hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"-pop\" })" tagwindow -pop "$window"
|
||||
hyprctl -q --batch \
|
||||
"dispatch pin address:$addr;" \
|
||||
"dispatch togglefloating address:$addr;" \
|
||||
"dispatch tagwindow -pop address:$addr;"
|
||||
elif [[ -n $addr ]]; then
|
||||
hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
|
||||
hypr_dispatch "hl.dsp.window.resize({ window = \"$window\", x = $width, y = $height })" resizeactive exact "$width" "$height" "$window"
|
||||
hyprctl dispatch togglefloating address:$addr
|
||||
hyprctl dispatch resizeactive exact $width $height address:$addr
|
||||
|
||||
if [[ -n $x && -n $y ]]; then
|
||||
hypr_dispatch "hl.dsp.window.move({ window = \"$window\", x = $x, y = $y })" moveactive "$x" "$y" "$window"
|
||||
hyprctl dispatch moveactive $x $y address:$addr
|
||||
else
|
||||
hypr_dispatch "hl.dsp.window.center({ window = \"$window\" })" centerwindow "$window"
|
||||
hyprctl dispatch centerwindow address:$addr
|
||||
fi
|
||||
|
||||
hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
|
||||
hypr_dispatch "hl.dsp.window.alter_zorder({ window = \"$window\", mode = \"top\" })" alterzorder top "$window"
|
||||
hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"+pop\" })" tagwindow +pop "$window"
|
||||
hyprctl -q --batch \
|
||||
"dispatch pin address:$addr;" \
|
||||
"dispatch alterzorder top address:$addr;" \
|
||||
"dispatch tagwindow +pop address:$addr;"
|
||||
fi
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# omarchy:summary=Toggle single-window square aspect ratio.
|
||||
|
||||
case $(omarchy-hyprland-toggle single-window-aspect-ratio) in
|
||||
on) omarchy-notification-send -g "Enable single-window square aspect ratio" ;;
|
||||
off) omarchy-notification-send -g "Disable single-window square aspect ratio" ;;
|
||||
esac
|
||||
omarchy-hyprland-toggle \
|
||||
--enabled-notification " Enable single-window square aspect ratio" \
|
||||
--disabled-notification " Disable single-window square aspect ratio" \
|
||||
single-window-aspect-ratio
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Toggles transparency for the currently focused window.
|
||||
|
||||
addr=$(hyprctl activewindow -j | jq -r '.address')
|
||||
hyprctl dispatch "hl.dsp.window.set_prop({ window = \"address:$addr\", prop = \"opaque\", value = \"toggle\" })" >/dev/null 2>&1 || \
|
||||
hyprctl dispatch setprop "address:$addr" opaque toggle
|
||||
@@ -10,6 +10,5 @@ case "$CURRENT_LAYOUT" in
|
||||
*) NEW_LAYOUT=dwindle ;;
|
||||
esac
|
||||
|
||||
hyprctl eval "hl.workspace_rule({ workspace = \"$ACTIVE_WORKSPACE\", layout = \"$NEW_LAYOUT\" })" >/dev/null 2>&1 || \
|
||||
hyprctl keyword workspace $ACTIVE_WORKSPACE, layout:$NEW_LAYOUT
|
||||
hyprctl keyword workspace $ACTIVE_WORKSPACE, layout:$NEW_LAYOUT
|
||||
notify-send -u low " Workspace layout set to $NEW_LAYOUT"
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install a supported browser
|
||||
# omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen>
|
||||
# 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 <chrome|brave|brave-origin|edge|firefox|zen>"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -3,7 +3,6 @@
|
||||
# omarchy:summary=Allow Chromium to sign in to Google accounts by adding the required OAuth credentials
|
||||
|
||||
if [[ -f ~/.config/chromium-flags.conf ]]; then
|
||||
echo "Installing Chromium Google account support..."
|
||||
CONF=~/.config/chromium-flags.conf
|
||||
|
||||
grep -qxF -- "--oauth2-client-id=77185425430.apps.googleusercontent.com" "$CONF" ||
|
||||
|
||||
@@ -13,7 +13,6 @@ fi
|
||||
|
||||
if [[ -n $choices ]]; then
|
||||
for db in $choices; do
|
||||
echo "Installing $db..."
|
||||
case $db in
|
||||
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
|
||||
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres18 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:18 ;;
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install lib32 graphics drivers (Vulkan + NVIDIA) for any detected GPUs.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing lib32 graphics drivers..."
|
||||
|
||||
PACKAGES=()
|
||||
|
||||
declare -A VULKAN_DRIVERS=(
|
||||
[Intel]=lib32-vulkan-intel
|
||||
[AMD]=lib32-vulkan-radeon
|
||||
)
|
||||
for vendor in "${!VULKAN_DRIVERS[@]}"; do
|
||||
if lspci | grep -iE "(VGA|Display).*$vendor" >/dev/null; then
|
||||
PACKAGES+=("${VULKAN_DRIVERS[$vendor]}")
|
||||
fi
|
||||
done
|
||||
|
||||
if omarchy-hw-nvidia-gsp; then
|
||||
PACKAGES+=(lib32-nvidia-utils)
|
||||
elif omarchy-hw-nvidia-without-gsp; then
|
||||
PACKAGES+=(lib32-nvidia-580xx-utils)
|
||||
fi
|
||||
|
||||
[[ ${#PACKAGES[@]} -gt 0 ]] && omarchy-pkg-add "${PACKAGES[@]}"
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Heroic Games Launcher (Epic, GOG, Amazon Prime Gaming) with graphics drivers.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Heroic Games Launcher..."
|
||||
omarchy-pkg-add heroic-games-launcher-bin
|
||||
omarchy-install-gaming-gpu-lib32
|
||||
|
||||
setsid gtk-launch heroic >/dev/null 2>&1 &
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Lutris with Wine + DXVK for running Windows games (Battle.net, EA, Ubisoft Connect, etc.)
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Lutris..."
|
||||
omarchy-pkg-add lutris umu-launcher wine-staging wine-mono wine-gecko winetricks python-protobuf
|
||||
omarchy-install-gaming-gpu-lib32
|
||||
|
||||
# Lutris ships with `#!/usr/bin/env python3`, which resolves to mise's Python and
|
||||
# fails to import the lutris module. Pin the shebang to the system Python.
|
||||
sudo sed -i '/env python3/ c\#!/bin/python3' /usr/bin/lutris
|
||||
|
||||
cat <<'EOF'
|
||||
|
||||
Lutris will open and auto-fetch its DXVK and VKD3D runtimes in the background
|
||||
(watch the bottom status bar). Once that finishes, click the + to add or install games.
|
||||
|
||||
EOF
|
||||
|
||||
setsid lutris >/dev/null 2>&1 &
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Moonlight (NVIDIA GameStream / Sunshine client) for streaming games to this PC.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Moonlight..."
|
||||
omarchy-pkg-add moonlight-qt
|
||||
|
||||
setsid gtk-launch com.moonlight_stream.Moonlight.desktop >/dev/null 2>&1 &
|
||||
@@ -1,85 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install RetroArch with the full libretro core set plus FBNeo and a ~/Games ROM directory.
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing RetroArch..."
|
||||
omarchy-pkg-add \
|
||||
retroarch \
|
||||
retroarch-assets-glui retroarch-assets-ozone retroarch-assets-xmb \
|
||||
libretro-beetle-pce libretro-beetle-pce-fast libretro-beetle-psx libretro-beetle-psx-hw libretro-beetle-supergrafx \
|
||||
libretro-blastem \
|
||||
libretro-bsnes libretro-bsnes-hd libretro-bsnes2014 \
|
||||
libretro-core-info \
|
||||
libretro-desmume libretro-dolphin libretro-flycast \
|
||||
libretro-gambatte libretro-genesis-plus-gx \
|
||||
libretro-kronos \
|
||||
libretro-mame libretro-mame2016 libretro-melonds libretro-mesen libretro-mesen-s libretro-mgba libretro-mupen64plus-next \
|
||||
libretro-nestopia \
|
||||
libretro-overlays \
|
||||
libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \
|
||||
libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \
|
||||
libretro-yabause \
|
||||
libretro-cap32-git libretro-fbneo-git libretro-uae-git \
|
||||
libretro-vice-x128-git libretro-vice-x64-git libretro-vice-x64dtv-git libretro-vice-x64sc-git \
|
||||
libretro-vice-xcbm2-git libretro-vice-xcbm5x0-git libretro-vice-xpet-git \
|
||||
libretro-vice-xplus4-git libretro-vice-xscpu64-git libretro-vice-xvic-git \
|
||||
libretro-database-git \
|
||||
retroarch-joypad-autoconfig-git
|
||||
|
||||
# Set up ~/Games for BIOS files and ROMs
|
||||
mkdir -p "$HOME/Games/bios" "$HOME/Games/roms"
|
||||
|
||||
CFG="$HOME/.config/retroarch/retroarch.cfg"
|
||||
mkdir -p "$(dirname "$CFG")"
|
||||
touch "$CFG"
|
||||
|
||||
set_cfg() {
|
||||
local key=$1 value=$2
|
||||
if grep -q "^$key = " "$CFG"; then
|
||||
sed -i "s|^$key = .*|$key = \"$value\"|" "$CFG"
|
||||
else
|
||||
echo "$key = \"$value\"" >>"$CFG"
|
||||
fi
|
||||
}
|
||||
|
||||
set_cfg rgui_browser_directory "$HOME/Games/roms"
|
||||
set_cfg system_directory "$HOME/Games/bios"
|
||||
|
||||
# Point at the cores and assets installed by pacman
|
||||
set_cfg libretro_directory "/usr/lib/libretro"
|
||||
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"
|
||||
set_cfg cheat_database_path "/usr/share/libretro/database/cht"
|
||||
set_cfg cursor_directory "/usr/share/libretro/database/cursors"
|
||||
|
||||
# Vulkan is required for slang shaders and unlocks hardware renderers in beetle-psx-hw, parallel-n64, dolphin
|
||||
set_cfg video_driver "vulkan"
|
||||
|
||||
# XMB is the classic PS3-style menu (vs. ozone/rgui/glui)
|
||||
set_cfg menu_driver "xmb"
|
||||
|
||||
# Default to crt-royale shader for that classic CRT look. The global preset is
|
||||
# auto-loaded by RetroArch when auto_shaders_enable is true and no per-core/per-game
|
||||
# preset takes precedence — setting video_shader alone in retroarch.cfg is not enough.
|
||||
set_cfg video_shader_enable "true"
|
||||
set_cfg auto_shaders_enable "true"
|
||||
mkdir -p ~/.config/retroarch/config
|
||||
echo '#reference "/usr/share/libretro/shaders/shaders_slang/crt/crt-royale.slangp"' \
|
||||
> ~/.config/retroarch/config/global.slangp
|
||||
|
||||
# Hide Images and Video tabs in the main menu sidebar
|
||||
set_cfg content_show_images "false"
|
||||
set_cfg content_show_video "false"
|
||||
|
||||
echo ""
|
||||
echo "Put your roms and bios files in ~/Games. Then start RetroArch from the app launcher (Super + Space)."
|
||||
|
||||
setsid nautilus "$HOME/Games" >/dev/null 2>&1 &
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Xbox Cloud Gaming as a web app and launch it.
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Xbox Cloud Gaming..."
|
||||
omarchy-webapp-install "Xbox Cloud Gaming" "https://www.xbox.com/en-US/play" "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/xbox.png"
|
||||
|
||||
setsid omarchy-launch-webapp "https://www.xbox.com/en-US/play" >/dev/null 2>&1 &
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install support for using Xbox controllers with Steam/RetroArch/etc.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Xbox controller Bluetooth support..."
|
||||
|
||||
# Install xpadneo to ensure controllers work out of the box
|
||||
omarchy-pkg-add linux-headers xpadneo-dkms
|
||||
|
||||
# Prevent xpad/xpadneo driver conflict
|
||||
echo blacklist xpad | sudo tee /etc/modprobe.d/blacklist-xpad.conf >/dev/null
|
||||
echo hid_xpadneo | sudo tee /etc/modules-load.d/xpadneo.conf >/dev/null
|
||||
|
||||
# Ensure user is in the input group (controllers need it)
|
||||
needs_reboot=false
|
||||
if ! id -nG "$USER" | grep -qw input; then
|
||||
sudo usermod -aG input "$USER"
|
||||
needs_reboot=true
|
||||
fi
|
||||
|
||||
# Swap drivers in the running kernel so a reboot isn't needed otherwise
|
||||
if lsmod | grep -q '^xpad '; then
|
||||
sudo modprobe -r xpad 2>/dev/null || needs_reboot=true
|
||||
fi
|
||||
|
||||
if $needs_reboot; then
|
||||
gum confirm "Reboot needed to finish setup. Reboot now?" && sudo reboot now
|
||||
exit 0
|
||||
fi
|
||||
|
||||
sudo modprobe hid_xpadneo
|
||||
|
||||
echo ""
|
||||
echo "Now you can pair your Xbox controller with Bluetooth using Super + Ctrl + B."
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing GeForce NOW..."
|
||||
omarchy-pkg-add flatpak
|
||||
cd /tmp
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Helix and configure it to use the current Omarchy theme
|
||||
# Install Helix and configure it to use the current Omarchy theme.
|
||||
|
||||
echo "Installing Helix..."
|
||||
omarchy-pkg-add helix
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Sunshine and open Moonlight streaming ports for LAN and Tailscale.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
TCP_PORTS=(47984 47989 48010)
|
||||
UDP_PORTS=(5353 47998 47999 48000 48002 48010)
|
||||
PRIVATE_CIDRS=(10.0.0.0/8 172.16.0.0/12 192.168.0.0/16)
|
||||
UFW_COMMENT="omarchy-sunshine"
|
||||
SUNSHINE_ADMIN_APP="Sunshine Admin"
|
||||
SUNSHINE_ADMIN_URL="https://localhost:47990"
|
||||
SUNSHINE_ADMIN_EXEC="omarchy-launch-webapp $SUNSHINE_ADMIN_URL --ignore-certificate-errors"
|
||||
SUNSHINE_ICON_SOURCE="/usr/share/sunshine/web/images/logo-sunshine-45.png"
|
||||
SUNSHINE_ICON_NAME="Sunshine Admin.png"
|
||||
WEBAPP_ICON_DIR="$HOME/.local/share/applications/icons"
|
||||
HYPR_AUTOSTART_FILE="$HOME/.config/hypr/autostart.lua"
|
||||
HYPR_AUTOSTART_ENTRY='o.launch_on_start("sunshine")'
|
||||
|
||||
open_ufw_port_for_private_lans() {
|
||||
local proto="$1"
|
||||
local port="$2"
|
||||
local cidr
|
||||
|
||||
for cidr in "${PRIVATE_CIDRS[@]}"; do
|
||||
sudo ufw allow in proto "$proto" from "$cidr" to any port "$port" comment "$UFW_COMMENT" >/dev/null
|
||||
done
|
||||
}
|
||||
|
||||
open_ufw_port_for_tailscale() {
|
||||
local proto="$1"
|
||||
local port="$2"
|
||||
|
||||
if ip link show tailscale0 >/dev/null 2>&1; then
|
||||
sudo ufw allow in on tailscale0 to any port "$port" proto "$proto" comment "$UFW_COMMENT" >/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
open_ufw_ports() {
|
||||
local port
|
||||
|
||||
if omarchy-cmd-missing ufw; then
|
||||
echo "UFW is not installed; skipping Sunshine firewall rules."
|
||||
return
|
||||
fi
|
||||
|
||||
for port in "${TCP_PORTS[@]}"; do
|
||||
open_ufw_port_for_private_lans tcp "$port"
|
||||
open_ufw_port_for_tailscale tcp "$port"
|
||||
done
|
||||
|
||||
for port in "${UDP_PORTS[@]}"; do
|
||||
open_ufw_port_for_private_lans udp "$port"
|
||||
open_ufw_port_for_tailscale udp "$port"
|
||||
done
|
||||
|
||||
sudo ufw reload
|
||||
}
|
||||
|
||||
install_admin_webapp() {
|
||||
mkdir -p "$WEBAPP_ICON_DIR"
|
||||
cp "$SUNSHINE_ICON_SOURCE" "$WEBAPP_ICON_DIR/$SUNSHINE_ICON_NAME"
|
||||
omarchy-webapp-install "$SUNSHINE_ADMIN_APP" "$SUNSHINE_ADMIN_URL" "$SUNSHINE_ICON_NAME" "$SUNSHINE_ADMIN_EXEC"
|
||||
omarchy-restart-walker
|
||||
}
|
||||
|
||||
enable_hyprland_autostart() {
|
||||
mkdir -p "$(dirname "$HYPR_AUTOSTART_FILE")"
|
||||
touch "$HYPR_AUTOSTART_FILE"
|
||||
|
||||
if ! grep -Fxq "$HYPR_AUTOSTART_ENTRY" "$HYPR_AUTOSTART_FILE"; then
|
||||
printf '\n%s\n' "$HYPR_AUTOSTART_ENTRY" >>"$HYPR_AUTOSTART_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
echo "Installing Sunshine..."
|
||||
omarchy-pkg-add sunshine
|
||||
systemctl --user enable --now sunshine
|
||||
|
||||
echo "Opening Sunshine firewall ports..."
|
||||
open_ufw_ports
|
||||
|
||||
echo "Installing Sunshine admin web app..."
|
||||
install_admin_webapp
|
||||
$SUNSHINE_ADMIN_EXEC >/dev/null 2>&1 &
|
||||
|
||||
echo "Enabling Sunshine autostart..."
|
||||
enable_hyprland_autostart
|
||||
|
||||
echo ""
|
||||
echo "Sunshine has been installed and its Moonlight streaming ports are open for private LANs and Tailscale."
|
||||
@@ -5,11 +5,6 @@
|
||||
|
||||
set -e
|
||||
|
||||
echo "Installing Steam..."
|
||||
omarchy-pkg-add steam
|
||||
omarchy-install-gaming-gpu-lib32
|
||||
|
||||
echo ""
|
||||
echo "Steam will start automatically now. This might take a while..."
|
||||
|
||||
echo "Now pick dependencies matching your graphics card"
|
||||
sudo pacman -S steam
|
||||
setsid gtk-launch steam >/dev/null 2>&1 &
|
||||
@@ -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=<alacritty|foot|ghostty|kitty>
|
||||
# omarchy:args=<alacritty|ghostty|kitty>
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
if (($# == 0)); then
|
||||
echo "Usage: omarchy-install-terminal [alacritty|foot|ghostty|kitty]"
|
||||
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -14,7 +14,6 @@ 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" ;;
|
||||
*)
|
||||
@@ -23,22 +22,12 @@ kitty) desktop_id="kitty.desktop" ;;
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Installing $package..."
|
||||
|
||||
# Install package
|
||||
if omarchy-pkg-add $package; then
|
||||
# Copy custom desktop entries with X-TerminalArg* keys
|
||||
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
|
||||
if [[ $package == "alacritty" ]]; then
|
||||
mkdir -p ~/.local/share/applications
|
||||
cp "$OMARCHY_PATH/default/alacritty/$desktop_id" ~/.local/share/applications/
|
||||
elif [[ $package == "foot" ]]; then
|
||||
mkdir -p ~/.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/
|
||||
cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/
|
||||
fi
|
||||
|
||||
# Update xdg-terminals.list to prioritize the proper terminal
|
||||
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install support for using Xbox controllers with Steam/RetroArch/etc.
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
set -e
|
||||
|
||||
# Install xpadneo to ensure controllers work out of the box
|
||||
omarchy-pkg-add linux-headers
|
||||
omarchy-pkg-aur-add xpadneo-dkms
|
||||
|
||||
# Prevent xpad/xpadneo driver conflict
|
||||
echo blacklist xpad | sudo tee /etc/modprobe.d/blacklist-xpad.conf >/dev/null
|
||||
echo hid_xpadneo | sudo tee /etc/modules-load.d/xpadneo.conf >/dev/null
|
||||
|
||||
# Give user access to game controllers
|
||||
sudo usermod -a -G input $USER
|
||||
|
||||
# Modules need to be loaded
|
||||
gum confirm "Install requires reboot. Ready?" && sudo reboot now
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/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
|
||||
@@ -6,7 +6,7 @@
|
||||
default_browser=$(xdg-settings get default-web-browser)
|
||||
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
|
||||
|
||||
if $browser_exec --help 2>/dev/null | grep -q MOZ_LOG; then
|
||||
if $browser_exec --help | grep -q MOZ_LOG; then
|
||||
private_flag="--private-window"
|
||||
elif [[ $browser_exec =~ edge ]]; then
|
||||
private_flag="--inprivate"
|
||||
@@ -14,6 +14,4 @@ else
|
||||
private_flag="--incognito"
|
||||
fi
|
||||
|
||||
systemd-run --user --quiet --collect --unit="omarchy-browser-$(date +%s%N)" \
|
||||
--property=StandardOutput=null --property=StandardError=null \
|
||||
uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
|
||||
exec setsid uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Launch Files
|
||||
|
||||
exec setsid uwsm-app -- nautilus --new-window
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Launch Files in the active terminal's current directory
|
||||
|
||||
exec setsid uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"
|
||||
@@ -13,7 +13,7 @@ LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}"
|
||||
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
|
||||
|
||||
if [[ -n $WINDOW_ADDRESS ]]; then
|
||||
hyprctl dispatch "hl.dsp.focus({ window = \"address:$WINDOW_ADDRESS\" })" >/dev/null 2>&1 || hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
|
||||
hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
|
||||
else
|
||||
eval exec setsid $LAUNCH_COMMAND
|
||||
fi
|
||||
|
||||
@@ -20,36 +20,34 @@ walker -q
|
||||
focused=$(omarchy-hyprland-monitor-focused)
|
||||
terminal=$(xdg-terminal-exec --print-id)
|
||||
|
||||
hypr_focus_monitor() {
|
||||
hyprctl dispatch "hl.dsp.focus({ monitor = \"$1\" })" >/dev/null 2>&1 || hyprctl dispatch focusmonitor "$1" >/dev/null
|
||||
}
|
||||
|
||||
hypr_exec() {
|
||||
local command="$1"
|
||||
|
||||
hyprctl dispatch "hl.dsp.exec_cmd([[$command]])" >/dev/null 2>&1 || hyprctl dispatch exec -- bash -lc "$command" >/dev/null
|
||||
}
|
||||
|
||||
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
|
||||
hypr_focus_monitor "$m"
|
||||
hyprctl dispatch focusmonitor $m
|
||||
|
||||
case $terminal in
|
||||
*Alacritty*)
|
||||
hypr_exec "alacritty --class=org.omarchy.screensaver --config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml -e omarchy-screensaver"
|
||||
hyprctl dispatch exec -- \
|
||||
alacritty --class=org.omarchy.screensaver \
|
||||
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
|
||||
-e omarchy-screensaver
|
||||
;;
|
||||
*ghostty*)
|
||||
hypr_exec "ghostty --class=org.omarchy.screensaver --config-file=~/.local/share/omarchy/default/ghostty/screensaver --font-size=18 -e omarchy-screensaver"
|
||||
;;
|
||||
*foot*)
|
||||
hypr_exec "foot --app-id=org.omarchy.screensaver --config=\"$OMARCHY_PATH/default/foot/screensaver.ini\" -e omarchy-screensaver"
|
||||
hyprctl dispatch exec -- \
|
||||
ghostty --class=org.omarchy.screensaver \
|
||||
--config-file=~/.local/share/omarchy/default/ghostty/screensaver \
|
||||
--font-size=18 \
|
||||
-e omarchy-screensaver
|
||||
;;
|
||||
*kitty*)
|
||||
hypr_exec "kitty --class=org.omarchy.screensaver --override font_size=18 --override window_padding_width=0 -e omarchy-screensaver"
|
||||
hyprctl dispatch exec -- \
|
||||
kitty --class=org.omarchy.screensaver \
|
||||
--override font_size=18 \
|
||||
--override window_padding_width=0 \
|
||||
-e omarchy-screensaver
|
||||
;;
|
||||
*)
|
||||
notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty"
|
||||
notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
hypr_focus_monitor "$focused"
|
||||
hyprctl dispatch focusmonitor $focused
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Launch a terminal in the active terminal's current directory
|
||||
# omarchy:args=[command...]
|
||||
|
||||
exec setsid uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" "$@"
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Launch or attach to the Work tmux session in a terminal
|
||||
|
||||
exec omarchy-launch-terminal bash -c "tmux attach || tmux new -s Work"
|
||||
+43
-311
@@ -56,11 +56,6 @@ open_in_editor() {
|
||||
omarchy-launch-editor "$1"
|
||||
}
|
||||
|
||||
hypr_config_file() {
|
||||
local name="$1"
|
||||
printf '%s/.config/hypr/%s.lua' "$HOME" "$name"
|
||||
}
|
||||
|
||||
install() {
|
||||
present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2"
|
||||
}
|
||||
@@ -86,8 +81,7 @@ aur_install_and_launch() {
|
||||
}
|
||||
|
||||
show_learn_menu() {
|
||||
case $(menu "Learn" " Keybindings\n Tmux keybindings\n Omarchy\n Hyprland\n Arch\n Neovim\n Bash") in
|
||||
*Tmux*) omarchy-menu-tmux-keybindings ;;
|
||||
case $(menu "Learn" " Keybindings\n Omarchy\n Hyprland\n Arch\n Neovim\n Bash") in
|
||||
*Keybindings*) omarchy-menu-keybindings ;;
|
||||
*Omarchy*) omarchy-launch-webapp "https://learn.omacom.io/2/the-omarchy-manual" ;;
|
||||
*Hyprland*) omarchy-launch-webapp "https://wiki.hypr.land/" ;;
|
||||
@@ -99,10 +93,8 @@ show_learn_menu() {
|
||||
}
|
||||
|
||||
show_trigger_menu() {
|
||||
case $(menu "Trigger" " Reminder\n Capture\n Transcode\n Share\n Toggle\n Hardware") in
|
||||
*Reminder*) show_reminder_menu ;;
|
||||
case $(menu "Trigger" " Capture\n Share\n Toggle\n Hardware") in
|
||||
*Capture*) show_capture_menu ;;
|
||||
*Transcode*) omarchy-transcode || back_to show_trigger_menu ;;
|
||||
*Share*) show_share_menu ;;
|
||||
*Toggle*) show_toggle_menu ;;
|
||||
*Hardware*) show_hardware_menu ;;
|
||||
@@ -110,46 +102,10 @@ 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 -g "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
|
||||
case $(menu "Capture" " Screenshot\n Screenrecord\n Color") in
|
||||
*Screenshot*) omarchy-capture-screenshot ;;
|
||||
*Screenrecord*) show_screenrecord_menu ;;
|
||||
*Text*) omarchy-capture-text-extraction ;;
|
||||
*Color*) pkill hyprpicker || hyprpicker -a ;;
|
||||
*) back_to show_trigger_menu ;;
|
||||
esac
|
||||
@@ -201,8 +157,7 @@ show_screenrecord_menu() {
|
||||
}
|
||||
|
||||
show_share_menu() {
|
||||
case $(menu "Share" " Clipboard\n File \n Folder\n Receive") in
|
||||
*Receive*) uwsm-app -- localsend ;;
|
||||
case $(menu "Share" " Clipboard\n File \n Folder") in
|
||||
*Clipboard*) omarchy-menu-share clipboard ;;
|
||||
*File*) terminal bash -c "omarchy-menu-share file" ;;
|
||||
*Folder*) terminal bash -c "omarchy-menu-share folder" ;;
|
||||
@@ -211,13 +166,12 @@ show_share_menu() {
|
||||
}
|
||||
|
||||
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"
|
||||
local options=" Screensaver\n Nightlight\n Idle Lock\n Top Bar\n Workspace Layout\n Window Gaps\n 1-Window Ratio\n Monitor Scaling\n Direct Boot\n Passwordless Sudo"
|
||||
|
||||
case $(menu "Toggle" "$options") in
|
||||
*Screensaver*) omarchy-toggle-screensaver ;;
|
||||
*Nightlight*) omarchy-toggle-nightlight ;;
|
||||
*Idle*) omarchy-toggle-idle ;;
|
||||
*Notifications*) omarchy-toggle-notification-silencing ;;
|
||||
*Bar*) omarchy-toggle-waybar ;;
|
||||
*Layout*) omarchy-hyprland-workspace-layout-toggle ;;
|
||||
*Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;;
|
||||
@@ -240,18 +194,13 @@ 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 ;;
|
||||
*Haptics*) show_hardware_touchpad_haptics_menu ;;
|
||||
*Mirror*) omarchy-hyprland-monitor-internal-mirror toggle;;
|
||||
*Touchpad*) omarchy-toggle-touchpad ;;
|
||||
*Touchscreen*) omarchy-toggle-touchscreen ;;
|
||||
*"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;;
|
||||
@@ -259,77 +208,25 @@ 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 Waybar\n Corners\n Hyprland\n Screensaver\n About") in
|
||||
|
||||
case $(menu "Style" " Theme\n Unlock\n Font\n Background\n Hyprland\n Screensaver\n About") in
|
||||
*Theme*) show_theme_menu ;;
|
||||
*Unlock*) omarchy-launch-walker -m menus:omarchyunlocks --width 800 --minheight 400 ;;
|
||||
*Font*) show_font_menu ;;
|
||||
*Background*) show_background_menu ;;
|
||||
*Corners*) show_style_corners_menu ;;
|
||||
*Hyprland*) open_in_editor "$(hypr_config_file looknfeel)" ;;
|
||||
*Waybar*) show_waybar_position_menu ;;
|
||||
*Screensaver*) show_screensaver_menu ;;
|
||||
*About*) show_about_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 ;;
|
||||
*) show_main_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_style_corners_menu() {
|
||||
case $(omarchy-menu-select "Corners" " Sharp" " Round") in
|
||||
*Sharp*) omarchy-style-corners sharp ;;
|
||||
*Round*) omarchy-style-corners round ;;
|
||||
*) show_style_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_waybar_position_menu() {
|
||||
case $(menu "Waybar Position" " Top\n Bottom\n Left\n Right") in
|
||||
*Top*) omarchy-style-waybar-position top ;;
|
||||
*Bottom*) omarchy-style-waybar-position bottom ;;
|
||||
*Left*) omarchy-style-waybar-position left ;;
|
||||
*Right*) omarchy-style-waybar-position right ;;
|
||||
*) show_style_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() {
|
||||
theme=$(omarchy-theme-switcher)
|
||||
[[ -n $theme ]] && omarchy-theme-set "$theme"
|
||||
omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400
|
||||
}
|
||||
|
||||
show_background_menu() {
|
||||
background=$(omarchy-theme-bg-switcher)
|
||||
[[ -n $background ]] && omarchy-theme-bg-set "$background"
|
||||
omarchy-launch-walker -m menus:omarchyBackgroundSelector --width 800 --minheight 400
|
||||
}
|
||||
|
||||
show_font_menu() {
|
||||
@@ -343,9 +240,9 @@ show_font_menu() {
|
||||
|
||||
show_setup_menu() {
|
||||
local options=" Audio\n Wifi\n Bluetooth\n Power Profile\n System Sleep\n Monitors"
|
||||
[[ -f ~/.config/hypr/bindings.lua ]] && options="$options\n Keybindings"
|
||||
[[ -f ~/.config/hypr/input.lua ]] && options="$options\n Input"
|
||||
options="$options\n Defaults\n DNS\n Security\n Config"
|
||||
[[ -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"
|
||||
|
||||
case $(menu "Setup" "$options") in
|
||||
*Audio*) omarchy-launch-audio ;;
|
||||
@@ -353,10 +250,9 @@ show_setup_menu() {
|
||||
*Bluetooth*) omarchy-launch-bluetooth ;;
|
||||
*Power*) show_setup_power_menu ;;
|
||||
*System*) show_setup_system_menu ;;
|
||||
*Monitors*) open_in_editor "$(hypr_config_file monitors)" ;;
|
||||
*Keybindings*) open_in_editor "$(hypr_config_file bindings)" ;;
|
||||
*Input*) open_in_editor "$(hypr_config_file input)" ;;
|
||||
*Defaults*) show_setup_default_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 ;;
|
||||
*DNS*) present_terminal omarchy-setup-dns ;;
|
||||
*Security*) show_setup_security_menu ;;
|
||||
*Config*) show_setup_config_menu ;;
|
||||
@@ -376,121 +272,16 @@ show_setup_power_menu() {
|
||||
|
||||
show_setup_security_menu() {
|
||||
case $(menu "Setup" " Fingerprint\n Fido2") in
|
||||
*Fingerprint*) present_terminal omarchy-setup-security-fingerprint ;;
|
||||
*Fido2*) present_terminal omarchy-setup-security-fido2 ;;
|
||||
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
|
||||
*Fido2*) present_terminal omarchy-setup-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" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n Walker\n Waybar\n XCompose") in
|
||||
*Hyprland*) open_in_editor "$(hypr_config_file hyprland)" ;;
|
||||
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 ;;
|
||||
*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 ;;
|
||||
*Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
|
||||
@@ -526,7 +317,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 Browser\n AI\n Gaming\n Windows") in
|
||||
case $(menu "Install" " Package\n AUR\n Web App\n TUI\n Service\n Style\n Development\n Editor\n Terminal\n AI\n Windows\n Gaming") in
|
||||
*Package*) terminal omarchy-pkg-install ;;
|
||||
*AUR*) terminal omarchy-pkg-aur-install ;;
|
||||
*Web*) present_terminal omarchy-webapp-install ;;
|
||||
@@ -536,33 +327,19 @@ 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☀ Sunshine\n Bitwarden\n Chromium Account") in
|
||||
case $(menu "Install" " Dropbox\n Tailscale\n NordVPN [AUR]\n ONCE\n Bitwarden\n Chromium Account") in
|
||||
*Dropbox*) present_terminal omarchy-install-dropbox ;;
|
||||
*Tailscale*) present_terminal omarchy-install-tailscale ;;
|
||||
*NordVPN*) present_terminal omarchy-install-nordvpn ;;
|
||||
*ONCE*) present_terminal omarchy-install-once ;;
|
||||
*Sunshine*) present_terminal omarchy-install-service-sunshine ;;
|
||||
*Bitwarden*) install_and_launch "Bitwarden" "bitwarden bitwarden-cli" "bitwarden" ;;
|
||||
*Chromium*) present_terminal omarchy-install-chromium-google-account ;;
|
||||
*) show_install_menu ;;
|
||||
@@ -570,22 +347,20 @@ show_install_service_menu() {
|
||||
}
|
||||
|
||||
show_install_editor_menu() {
|
||||
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\n Emacs") in
|
||||
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*) present_terminal omarchy-install-zed ;;
|
||||
*Zed*) install_and_launch "Zed" "zed" "dev.zed.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 Foot\n Ghostty\n Kitty") in
|
||||
case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in
|
||||
*Alacritty*) install_terminal "alacritty" ;;
|
||||
*Foot*) install_terminal "foot" ;;
|
||||
*Ghostty*) install_terminal "ghostty" ;;
|
||||
*Kitty*) install_terminal "kitty" ;;
|
||||
*) show_install_menu ;;
|
||||
@@ -609,17 +384,12 @@ 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)\n RetroArch Game Launcher") in
|
||||
*Steam*) present_terminal omarchy-install-gaming-steam ;;
|
||||
*"RetroArch Game Launcher"*) omarchy-games-retro-install ;;
|
||||
*RetroArch*) present_terminal omarchy-install-gaming-retroarch ;;
|
||||
case $(menu "Install" " Steam\n NVIDIA GeForce NOW\n RetroArch [AUR]\n Minecraft\n Xbox Controller [AUR]") in
|
||||
*Steam*) present_terminal omarchy-install-steam ;;
|
||||
*GeForce*) present_terminal omarchy-install-geforce-now ;;
|
||||
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
|
||||
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
|
||||
*GeForce*) present_terminal omarchy-install-gaming-geforce-now ;;
|
||||
*"Xbox Cloud"*) present_terminal omarchy-install-gaming-xbox-cloud ;;
|
||||
*Xbox*) present_terminal omarchy-install-gaming-xbox-controllers ;;
|
||||
*Lutris*) present_terminal omarchy-install-gaming-lutris ;;
|
||||
*Heroic*) present_terminal omarchy-install-gaming-heroic ;;
|
||||
*Moonlight*) present_terminal omarchy-install-gaming-moonlight ;;
|
||||
*Xbox*) present_terminal omarchy-install-xbox-controllers ;;
|
||||
*) show_install_menu ;;
|
||||
esac
|
||||
}
|
||||
@@ -634,12 +404,12 @@ show_install_style_menu() {
|
||||
}
|
||||
|
||||
show_install_font_menu() {
|
||||
case $(menu "Install" " Cascadia Mono\n Meslo LG Mono\n Fira Code\n Victor Code\n Bitstream Vera Mono\n Iosevka" "--width 350") in
|
||||
case $(menu "Install" " Cascadia Mono\n Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono\n Iosevka" "--width 350") in
|
||||
*Cascadia*) install_font "Cascadia Mono" "ttf-cascadia-mono-nerd" "CaskaydiaMono Nerd Font" ;;
|
||||
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
|
||||
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
|
||||
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
|
||||
*Bitstream*) install_font "Bitstream Vera Code" "ttf-bitstream-vera-mono-nerd" "BitstromWera Nerd Font" ;;
|
||||
*Bistream*) install_font "Bistream Vera Code" "ttf-bitstream-vera-mono-nerd" "BitstromWera Nerd Font" ;;
|
||||
*Iosevka*) install_font "Iosevka" "ttf-iosevka-nerd" "Iosevka Nerd Font Mono" ;;
|
||||
*) show_install_menu ;;
|
||||
esac
|
||||
@@ -692,57 +462,21 @@ show_install_elixir_menu() {
|
||||
}
|
||||
|
||||
show_remove_menu() {
|
||||
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
|
||||
case $(menu "Remove" " Package\n Web App\n TUI\n Development\n Preinstalls\n Dictation\n Theme\n Windows\n Fingerprint\n Fido2") in
|
||||
*Package*) terminal omarchy-pkg-remove ;;
|
||||
*Web*) present_terminal omarchy-webapp-remove ;;
|
||||
*TUI*) present_terminal omarchy-tui-remove ;;
|
||||
*Development*) show_remove_development_menu ;;
|
||||
*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" ;;
|
||||
*Preinstalls*) present_terminal omarchy-remove-preinstalls ;;
|
||||
*Security*) show_remove_security_menu ;;
|
||||
*Dictation*) present_terminal omarchy-voxtype-remove ;;
|
||||
*Theme*) present_terminal omarchy-theme-remove ;;
|
||||
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
|
||||
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
|
||||
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
|
||||
*) show_main_menu ;;
|
||||
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 ;;
|
||||
*RetroArch*) present_terminal omarchy-remove-gaming-retroarch ;;
|
||||
*Minecraft*) present_terminal omarchy-remove-gaming-minecraft ;;
|
||||
*GeForce*) present_terminal omarchy-remove-gaming-geforce-now ;;
|
||||
*"Xbox Cloud"*) present_terminal omarchy-remove-gaming-xbox-cloud ;;
|
||||
*Xbox*) present_terminal omarchy-remove-gaming-xbox-controllers ;;
|
||||
*Moonlight*) present_terminal omarchy-remove-gaming-moonlight ;;
|
||||
*Lutris*) present_terminal omarchy-remove-gaming-lutris ;;
|
||||
*Heroic*) present_terminal omarchy-remove-gaming-heroic ;;
|
||||
*) show_remove_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_remove_development_menu() {
|
||||
case $(menu "Remove" " Ruby on Rails\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure\n Scala") in
|
||||
*Rails*) present_terminal "omarchy-remove-dev-env ruby" ;;
|
||||
@@ -852,7 +586,7 @@ show_update_hardware_menu() {
|
||||
|
||||
show_update_password_menu() {
|
||||
case $(menu "Update Password" " Drive Encryption\n User") in
|
||||
*Drive*) present_terminal omarchy-drive-password ;;
|
||||
*Drive*) present_terminal omarchy-drive-set-password ;;
|
||||
*User*) present_terminal passwd ;;
|
||||
*) show_update_menu ;;
|
||||
esac
|
||||
@@ -892,8 +626,6 @@ 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 ;;
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
#!/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 <label> <paths> <formats> [walker args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
label="$1"
|
||||
paths_arg="$2"
|
||||
formats_arg="$3"
|
||||
shift 3
|
||||
|
||||
IFS=: read -r -a paths <<<"$paths_arg"
|
||||
read -r -a formats <<<"$formats_arg"
|
||||
|
||||
if (( ${#paths[@]} == 0 || ${#formats[@]} == 0 )); then
|
||||
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for path in "${paths[@]}"; do
|
||||
[[ -e $path ]] || { echo "Path not found: $path" >&2; exit 1; }
|
||||
done
|
||||
|
||||
find_args=("${paths[@]}" "(" -type d -name ".*" ! -name "." -prune ")" -o -type f ! -name ".*" "(")
|
||||
first_format=true
|
||||
for format in "${formats[@]}"; do
|
||||
if [[ $first_format == "true" ]]; then
|
||||
first_format=false
|
||||
else
|
||||
find_args+=(-o)
|
||||
fi
|
||||
|
||||
format="${format#.}"
|
||||
find_args+=(-iname "*.$format")
|
||||
done
|
||||
find_args+=(")" -printf '%T@\t%p\n')
|
||||
|
||||
find "${find_args[@]}" 2>/dev/null | sort -rn | cut -f2- |
|
||||
omarchy-launch-walker --dmenu --width 800 --minheight 1 --maxheight 500 -p "$label…" "$@" 2>/dev/null
|
||||
@@ -1,285 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Open a generic image selector menu
|
||||
# omarchy:args=[--selected <image>] [--colors-file <path>] [--print-name] [--show-labels] [--filterable] [--lazy-thumbnails] [--cache-only] <image-dir>...
|
||||
|
||||
OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy}
|
||||
|
||||
selected_image=""
|
||||
colors_file=""
|
||||
print_name=false
|
||||
show_labels=false
|
||||
filterable=false
|
||||
lazy_thumbnails=false
|
||||
prepare_only=false
|
||||
cache_only=false
|
||||
image_dirs=()
|
||||
|
||||
usage() {
|
||||
echo "Usage: omarchy-menu-images [--selected <image>] [--colors-file <path>] [--print-name] [--show-labels] [--filterable] [--lazy-thumbnails] [--cache-only] <image-dir>..."
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--selected)
|
||||
if (( $# < 2 )); then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
selected_image="$2"
|
||||
shift 2
|
||||
;;
|
||||
--colors-file)
|
||||
if (( $# < 2 )); then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
colors_file="$2"
|
||||
shift 2
|
||||
;;
|
||||
--print-name)
|
||||
print_name=true
|
||||
shift
|
||||
;;
|
||||
--show-labels)
|
||||
show_labels=true
|
||||
shift
|
||||
;;
|
||||
--filterable)
|
||||
filterable=true
|
||||
shift
|
||||
;;
|
||||
--lazy-thumbnails)
|
||||
lazy_thumbnails=true
|
||||
shift
|
||||
;;
|
||||
--prepare-only)
|
||||
prepare_only=true
|
||||
shift
|
||||
;;
|
||||
--cache-only)
|
||||
cache_only=true
|
||||
shift
|
||||
;;
|
||||
--help|-h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
image_dirs+=("$1")
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if (( ${#image_dirs[@]} == 0 )); then
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
selection_file=$(mktemp)
|
||||
done_file=$(mktemp)
|
||||
rm -f "$done_file"
|
||||
trap 'rm -f "$selection_file" "$done_file"' EXIT
|
||||
socket_path="${XDG_RUNTIME_DIR:-/run/user/$UID}/omarchy-image-selector.sock"
|
||||
selector_qml="$OMARCHY_PATH/default/quickshell/select-by-image.qml"
|
||||
|
||||
image_dirs_env=""
|
||||
for dir in "${image_dirs[@]}"; do
|
||||
if [[ -z $image_dirs_env ]]; then
|
||||
image_dirs_env="$dir"
|
||||
else
|
||||
image_dirs_env+=$'\n'"$dir"
|
||||
fi
|
||||
done
|
||||
|
||||
current_image=$(readlink -f "$selected_image" 2>/dev/null)
|
||||
selected_list_image=""
|
||||
|
||||
if [[ -n $current_image ]]; then
|
||||
for dir in "${image_dirs[@]}"; do
|
||||
if [[ -d $dir && -f $selected_image && ${selected_image%/*} == "$dir" ]]; then
|
||||
selected_list_image="$selected_image"
|
||||
break
|
||||
elif [[ -d $dir ]]; then
|
||||
selected_list_image=$(find -L "$dir" -maxdepth 1 -type f -samefile "$current_image" -print -quit 2>/dev/null)
|
||||
[[ -n $selected_list_image ]] && break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
cache_dir=${XDG_CACHE_HOME:-$HOME/.cache}/omarchy/image-selector
|
||||
index_file="$cache_dir/index.tsv"
|
||||
rows=""
|
||||
mkdir -p "$cache_dir"
|
||||
|
||||
cache_key=$(printf '%s' "$image_dirs_env" | md5sum | cut -d ' ' -f 1)
|
||||
rows_cache_file="$cache_dir/$cache_key.rows"
|
||||
rows_signature_file="$cache_dir/$cache_key.signature"
|
||||
rows_signature="v2"$'\n'
|
||||
rows_cacheable=true
|
||||
image_files=()
|
||||
|
||||
for dir in "${image_dirs[@]}"; do
|
||||
if [[ -d $dir ]]; then
|
||||
rows_signature+="$dir:$(stat -Lc '%Y' "$dir")"$'\n'
|
||||
|
||||
while IFS= read -r -d '' image; do
|
||||
image_files+=("$image")
|
||||
image_signature=$(stat -Lc '%s:%Y' "$image") || continue
|
||||
rows_signature+="$image:$image_signature"$'\n'
|
||||
done < <(find -L "$dir" -maxdepth 1 -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.webp' \) -print0 2>/dev/null | sort -z)
|
||||
fi
|
||||
done
|
||||
|
||||
generate_thumbnail() {
|
||||
local image="$1"
|
||||
local thumbnail="$2"
|
||||
local lock="$thumbnail.lock"
|
||||
local tmp="$thumbnail.$$.jpg"
|
||||
|
||||
if mkdir "$lock" 2>/dev/null; then
|
||||
if magick "${image}[0]" -auto-orient -resize '1536x864^' -gravity center -extent '1536x864' -strip -quality 82 "$tmp"; then
|
||||
mv -f "$tmp" "$thumbnail"
|
||||
else
|
||||
rm -f "$tmp" "$thumbnail"
|
||||
fi
|
||||
|
||||
rmdir "$lock" 2>/dev/null || true
|
||||
else
|
||||
for ((i = 0; i < 3000; i++)); do
|
||||
[[ -f $thumbnail ]] && return
|
||||
[[ -d $lock ]] || break
|
||||
sleep 0.01
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
thumbnail_for() {
|
||||
local image="$1"
|
||||
local signature hash thumbnail
|
||||
|
||||
signature=$(stat -Lc '%s:%Y' "$image") || return
|
||||
hash=$(awk -F '\t' -v path="$image" -v sig="$signature" '$1 == path && $2 == sig { print $3; exit }' "$index_file" 2>/dev/null)
|
||||
|
||||
if [[ -z $hash ]]; then
|
||||
hash=$(printf '%s\t%s' "$image" "$signature" | md5sum | cut -d ' ' -f 1)
|
||||
printf '%s\t%s\t%s\n' "$image" "$signature" "$hash" >>"$index_file"
|
||||
fi
|
||||
|
||||
thumbnail="$cache_dir/$hash.jpg"
|
||||
|
||||
if [[ ! -f $thumbnail ]]; then
|
||||
if [[ $lazy_thumbnails == true && $cache_only != true ]]; then
|
||||
rows_cacheable=false
|
||||
|
||||
if [[ $prepare_only != true ]]; then
|
||||
generate_thumbnail "$image" "$thumbnail" >/dev/null 2>&1 &
|
||||
fi
|
||||
|
||||
printf '%s' "$image"
|
||||
return
|
||||
fi
|
||||
|
||||
generate_thumbnail "$image" "$thumbnail"
|
||||
fi
|
||||
|
||||
[[ -f $thumbnail ]] && printf '%s' "$thumbnail"
|
||||
}
|
||||
|
||||
if [[ -f $rows_cache_file && -f $rows_signature_file ]] && cmp -s "$rows_signature_file" <(printf '%s' "$rows_signature"); then
|
||||
rows=$(<"$rows_cache_file")
|
||||
else
|
||||
for image in "${image_files[@]}"; do
|
||||
thumbnail=$(thumbnail_for "$image")
|
||||
[[ -n $thumbnail ]] || continue
|
||||
if [[ $lazy_thumbnails == true && $cache_only != true && $thumbnail == "$image" ]]; then
|
||||
rows_cacheable=false
|
||||
fi
|
||||
|
||||
if [[ -z $rows ]]; then
|
||||
rows="$image"$'\t'"$thumbnail"
|
||||
else
|
||||
rows+=$'\n'"$image"$'\t'"$thumbnail"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $rows_cacheable == true ]]; then
|
||||
printf '%s' "$rows" >"$rows_cache_file"
|
||||
printf '%s' "$rows_signature" >"$rows_signature_file"
|
||||
else
|
||||
rm -f "$rows_cache_file" "$rows_signature_file"
|
||||
fi
|
||||
fi
|
||||
|
||||
rows_payload=${rows//$'\t'/$'\f'}
|
||||
rows_payload=${rows_payload//$'\n'/$'\v'}
|
||||
colors_file=${colors_file:-$HOME/.config/omarchy/current/theme/quickshell.json}
|
||||
colors_payload=""
|
||||
|
||||
if [[ -f $colors_file ]]; then
|
||||
colors_payload=$(<"$colors_file")
|
||||
colors_payload=${colors_payload//$'\t'/$'\f'}
|
||||
colors_payload=${colors_payload//$'\n'/$'\v'}
|
||||
fi
|
||||
|
||||
if [[ $cache_only == true || $prepare_only == true ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ensure_selector() {
|
||||
if [[ -S $socket_path && $selector_qml -nt $socket_path ]]; then
|
||||
quickshell kill -p "$selector_qml" >/dev/null 2>&1 || true
|
||||
rm -f "$socket_path"
|
||||
fi
|
||||
|
||||
if [[ ! -S $socket_path ]]; then
|
||||
quickshell kill -p "$selector_qml" >/dev/null 2>&1 || true
|
||||
quickshell -d -p "$selector_qml" >/dev/null
|
||||
|
||||
for ((i = 0; i < 100; i++)); do
|
||||
if [[ -S $socket_path ]]; then
|
||||
break
|
||||
fi
|
||||
|
||||
sleep 0.01
|
||||
done
|
||||
fi
|
||||
|
||||
[[ -S $socket_path ]]
|
||||
}
|
||||
|
||||
send_request() {
|
||||
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$rows_payload" "$selected_list_image" "$selection_file" "$done_file" "$colors_payload" "$show_labels" "$filterable" |
|
||||
socat -u - "UNIX-CONNECT:$socket_path"
|
||||
}
|
||||
|
||||
if ! ensure_selector; then
|
||||
echo "Image selector failed to start" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! send_request; then
|
||||
rm -f "$socket_path"
|
||||
|
||||
if ! ensure_selector || ! send_request; then
|
||||
echo "Image selector failed to accept request" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
while [[ ! -e $done_file ]]; do
|
||||
sleep 0.01
|
||||
done
|
||||
|
||||
if [[ -s $selection_file ]]; then
|
||||
if [[ $print_name == true ]]; then
|
||||
selection=$(<"$selection_file")
|
||||
selection=${selection##*/}
|
||||
printf '%s\n' "${selection%.*}"
|
||||
else
|
||||
cat "$selection_file"
|
||||
fi
|
||||
fi
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Prompt for text input with Walker
|
||||
# omarchy:group=menu
|
||||
# omarchy:name=input
|
||||
# omarchy:args=prompt [walker args...]
|
||||
# omarchy:examples=omarchy menu input Reminder|omarchy-menu-input "Reminder in minutes" --width 400
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
prompt="${1:-Input}"
|
||||
if (( $# > 0 )); then
|
||||
shift
|
||||
fi
|
||||
|
||||
omarchy-launch-walker --dmenu --inputonly --width 295 --minheight 1 --maxheight 1 -p "$prompt…" "$@" 2>/dev/null
|
||||
+39
-219
@@ -3,28 +3,6 @@
|
||||
# omarchy:summary=Display Hyprland keybindings defined in your configuration using walker for an interactive search menu.
|
||||
|
||||
declare -A KEYCODE_SYM_MAP
|
||||
# Hyprland reports XKB keycodes for code: bindings. Keep a small fallback for
|
||||
# common keys so the menu remains readable if xkbcli cannot resolve a symbol.
|
||||
declare -A FALLBACK_KEYCODE_SYM_MAP=(
|
||||
[10]="1"
|
||||
[11]="2"
|
||||
[12]="3"
|
||||
[13]="4"
|
||||
[14]="5"
|
||||
[15]="6"
|
||||
[16]="7"
|
||||
[17]="8"
|
||||
[18]="9"
|
||||
[19]="0"
|
||||
[20]="MINUS"
|
||||
[21]="EQUAL"
|
||||
[61]="SLASH"
|
||||
)
|
||||
|
||||
# Hyprland's Lua config provider currently reports code:... binds from hl.bind()
|
||||
# as key="" and keycode=0 in `hyprctl -j binds`. Keep a lightweight
|
||||
# source-derived key cache so the menu can still show those bindings.
|
||||
declare -A LUA_BIND_KEY_MAP
|
||||
|
||||
build_keymap_cache() {
|
||||
local keymap
|
||||
@@ -59,18 +37,7 @@ build_keymap_cache() {
|
||||
}
|
||||
|
||||
lookup_keycode_cached() {
|
||||
local symbol
|
||||
symbol="${KEYCODE_SYM_MAP[$1]}"
|
||||
|
||||
if [[ -z $symbol ]]; then
|
||||
symbol="${FALLBACK_KEYCODE_SYM_MAP[$1]}"
|
||||
fi
|
||||
|
||||
if [[ -z $symbol ]]; then
|
||||
symbol="code:$1"
|
||||
fi
|
||||
|
||||
printf '%s\n' "${symbol^^}"
|
||||
printf '%s\n' "${KEYCODE_SYM_MAP[$1]}"
|
||||
}
|
||||
|
||||
parse_keycodes() {
|
||||
@@ -113,151 +80,44 @@ parse_keycodes() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Supplement `hyprctl -j binds` for Lua-only binds that Hyprland currently
|
||||
# reports without their original key, such as hl.bind("SUPER + code:10", ...).
|
||||
build_lua_bind_key_cache() {
|
||||
local modmask description key
|
||||
|
||||
omarchy-cmd-present lua || return 0
|
||||
|
||||
while IFS=$'\t' read -r modmask description key; do
|
||||
[[ -z $modmask || -z $description || -z $key ]] && continue
|
||||
LUA_BIND_KEY_MAP["$modmask,$description"]="$key"
|
||||
done < <(
|
||||
lua <<'LUA'
|
||||
local modifiers = { SHIFT = 1, CTRL = 4, CONTROL = 4, ALT = 8, SUPER = 64 }
|
||||
|
||||
local function split_keys(keys)
|
||||
local modmask = 0
|
||||
local key = ""
|
||||
|
||||
for part in string.gmatch(keys, "[^+]+") do
|
||||
local value = part:gsub("^%s+", ""):gsub("%s+$", "")
|
||||
local modifier = modifiers[string.upper(value)]
|
||||
|
||||
if modifier then
|
||||
modmask = modmask + modifier
|
||||
else
|
||||
key = value
|
||||
end
|
||||
end
|
||||
|
||||
return modmask, key
|
||||
end
|
||||
|
||||
local function proxy()
|
||||
local p = {}
|
||||
|
||||
return setmetatable(p, {
|
||||
__index = function()
|
||||
return p
|
||||
end,
|
||||
__call = function()
|
||||
return p
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
local p = proxy()
|
||||
|
||||
hl = setmetatable({
|
||||
dsp = p,
|
||||
bind = function(keys, _, opts)
|
||||
opts = opts or {}
|
||||
if opts.description and opts.description ~= "" then
|
||||
local modmask, key = split_keys(keys)
|
||||
print(modmask .. "\t" .. opts.description .. "\t" .. key)
|
||||
end
|
||||
return p
|
||||
end,
|
||||
unbind = function() end,
|
||||
config = function() end,
|
||||
env = function() end,
|
||||
monitor = function() end,
|
||||
window_rule = function() end,
|
||||
gesture = function() end,
|
||||
animation = function() end,
|
||||
curve = function() end,
|
||||
exec_cmd = function() end,
|
||||
}, {
|
||||
__index = function()
|
||||
return function()
|
||||
return p
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local config = os.getenv("HOME") .. "/.config/hypr/hyprland.lua"
|
||||
local file = io.open(config, "r")
|
||||
|
||||
if file then
|
||||
file:close()
|
||||
local ok, err = pcall(dofile, config)
|
||||
if not ok and os.getenv("DEBUG") == "1" then
|
||||
io.stderr:write("[DEBUG] lua bind scan failed: " .. tostring(err) .. "\n")
|
||||
end
|
||||
end
|
||||
LUA
|
||||
)
|
||||
}
|
||||
|
||||
modmask_to_text() {
|
||||
case "$1" in
|
||||
0) printf '' ;;
|
||||
1) printf 'SHIFT' ;;
|
||||
4) printf 'CTRL' ;;
|
||||
5) printf 'SHIFT CTRL' ;;
|
||||
8) printf 'ALT' ;;
|
||||
9) printf 'SHIFT ALT' ;;
|
||||
12) printf 'CTRL ALT' ;;
|
||||
13) printf 'SHIFT CTRL ALT' ;;
|
||||
64) printf 'SUPER' ;;
|
||||
65) printf 'SUPER SHIFT' ;;
|
||||
68) printf 'SUPER CTRL' ;;
|
||||
69) printf 'SUPER SHIFT CTRL' ;;
|
||||
72) printf 'SUPER ALT' ;;
|
||||
73) printf 'SUPER SHIFT ALT' ;;
|
||||
76) printf 'SUPER CTRL ALT' ;;
|
||||
77) printf 'SUPER SHIFT CTRL ALT' ;;
|
||||
*) printf '%s' "$1" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Fetch dynamic keybindings from Hyprland.
|
||||
# Fetch dynamic keybindings from Hyprland
|
||||
#
|
||||
# Also do some pre-processing:
|
||||
# - Fill missing Lua code:... keys from the Lua source cache
|
||||
# - Remove standard Omarchy bin path prefix
|
||||
# - Remove uwsm prefix
|
||||
# - Map numeric modifier key mask to a textual rendition
|
||||
# - Output comma-separated values that the parser can understand
|
||||
dynamic_bindings() {
|
||||
local modmask key keycode description dispatcher arg modifiers
|
||||
|
||||
hyprctl -j binds |
|
||||
jq -r '.[] | [.modmask, (.key // ""), (.keycode // 0), (.description // ""), (.dispatcher // ""), (.arg // "") | tostring] | join("\u001f")' |
|
||||
while IFS=$'\x1f' read -r modmask key keycode description dispatcher arg; do
|
||||
if [[ -z $key && $keycode != "0" ]]; then
|
||||
key="code:$keycode"
|
||||
fi
|
||||
|
||||
if [[ -z $key && -n $description ]]; then
|
||||
key="${LUA_BIND_KEY_MAP["$modmask,$description"]}"
|
||||
fi
|
||||
|
||||
[[ -z $description && $dispatcher == "__lua" ]] && continue
|
||||
|
||||
modifiers=$(modmask_to_text "$modmask")
|
||||
arg="${arg//~\/.local\/share\/omarchy\/bin\//}"
|
||||
arg="${arg//uwsm app -- /}"
|
||||
arg="${arg//uwsm-app -- /}"
|
||||
|
||||
printf '%s,%s,%s,%s,%s\n' "$modifiers" "$key" "$description" "$dispatcher" "$arg"
|
||||
done
|
||||
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
|
||||
sed -r \
|
||||
-e 's/null//' \
|
||||
-e 's,~/.local/share/omarchy/bin/,,' \
|
||||
-e 's,uwsm app -- ,,' \
|
||||
-e 's,uwsm-app -- ,,' \
|
||||
-e 's/@0//' \
|
||||
-e 's/,@/,code:/' \
|
||||
-e 's/^0,/,/' \
|
||||
-e 's/^1,/SHIFT,/' \
|
||||
-e 's/^4,/CTRL,/' \
|
||||
-e 's/^5,/SHIFT CTRL,/' \
|
||||
-e 's/^8,/ALT,/' \
|
||||
-e 's/^9,/SHIFT ALT,/' \
|
||||
-e 's/^12,/CTRL ALT,/' \
|
||||
-e 's/^13,/SHIFT CTRL ALT,/' \
|
||||
-e 's/^64,/SUPER,/' \
|
||||
-e 's/^65,/SUPER SHIFT,/' \
|
||||
-e 's/^68,/SUPER CTRL,/' \
|
||||
-e 's/^69,/SUPER SHIFT CTRL,/' \
|
||||
-e 's/^72,/SUPER ALT,/' \
|
||||
-e 's/^73,/SUPER SHIFT ALT,/' \
|
||||
-e 's/^76,/SUPER CTRL ALT,/' \
|
||||
-e 's/^77,/SUPER SHIFT CTRL ALT,/'
|
||||
}
|
||||
|
||||
# Hardcoded bindings, like the copy-url extension and such
|
||||
static_bindings() {
|
||||
echo "SHIFT ALT,L,Copy URL from Web App,sendshortcut,SHIFT ALT,L,"
|
||||
echo "SHIFT ALT,L,Copy URL from Web App,extension,copy-url"
|
||||
}
|
||||
|
||||
# Parse and format keybindings
|
||||
@@ -266,8 +126,8 @@ static_bindings() {
|
||||
# - Set the field separator to a comma ','.
|
||||
# - Joins the key combination (e.g., "SUPER + Q").
|
||||
# - Joins the command that the key executes.
|
||||
# - Prints display text and dispatch metadata as tab-separated fields.
|
||||
parse_binding_records() {
|
||||
# - Prints everything in a nicely aligned format.
|
||||
parse_bindings() {
|
||||
awk -F, '
|
||||
{
|
||||
# Combine the modifier and key (first two fields)
|
||||
@@ -279,13 +139,6 @@ parse_binding_records() {
|
||||
|
||||
# Use description, if set
|
||||
action = $3;
|
||||
dispatcher = $4;
|
||||
|
||||
# Reconstruct the dispatcher arg from the remaining fields
|
||||
arg = "";
|
||||
for (i = 5; i <= NF; i++) {
|
||||
arg = arg $i (i < NF ? "," : "");
|
||||
}
|
||||
|
||||
if (action == "") {
|
||||
# Reconstruct the command from the remaining fields
|
||||
@@ -296,7 +149,6 @@ parse_binding_records() {
|
||||
# Clean up trailing commas, remove leading "exec, ", and trim
|
||||
sub(/,$/, "", action);
|
||||
gsub(/(^|,)[[:space:]]*exec[[:space:]]*,?/, "", action);
|
||||
gsub(/(^|[[:space:]])uwsm(-app| app)[[:space:]]+--[[:space:]]+/, "", action);
|
||||
gsub(/^[ \t]+|[ \t]+$/, "", action);
|
||||
gsub(/[ \t]+/, " ", key_combo); # Collapse multiple spaces to one
|
||||
|
||||
@@ -309,15 +161,15 @@ parse_binding_records() {
|
||||
}
|
||||
|
||||
if (action != "") {
|
||||
printf "%-35s → %s\t%s\t%s\n", key_combo, action, dispatcher, arg;
|
||||
printf "%-35s → %s\n", key_combo, action;
|
||||
}
|
||||
}'
|
||||
}
|
||||
|
||||
prioritize_entries() {
|
||||
awk -F '\t' '
|
||||
awk '
|
||||
{
|
||||
line = $1
|
||||
line = $0
|
||||
prio = 50
|
||||
if (match(line, /Terminal/)) prio = 0
|
||||
if (match(line, /Tmux/)) prio = 1
|
||||
@@ -368,16 +220,15 @@ prioritize_entries() {
|
||||
if (match(line, /Apple Display/)) prio = 98
|
||||
if (match(line, /XF86/)) prio = 99
|
||||
|
||||
# print "priority<TAB>record"
|
||||
printf "%d\t%s\n", prio, $0
|
||||
# print "priority<TAB>line"
|
||||
printf "%d\t%s\n", prio, line
|
||||
}' |
|
||||
sort -k1,1n -k2,2 |
|
||||
cut -f2-
|
||||
}
|
||||
|
||||
output_binding_records() {
|
||||
output_keybindings() {
|
||||
build_keymap_cache
|
||||
build_lua_bind_key_cache
|
||||
|
||||
{
|
||||
dynamic_bindings
|
||||
@@ -385,47 +236,16 @@ output_binding_records() {
|
||||
} |
|
||||
sort -u |
|
||||
parse_keycodes |
|
||||
parse_binding_records |
|
||||
parse_bindings |
|
||||
prioritize_entries
|
||||
}
|
||||
|
||||
output_keybindings() {
|
||||
output_binding_records | cut -f1
|
||||
}
|
||||
|
||||
dispatch_binding() {
|
||||
local dispatcher="$1"
|
||||
local arg="$2"
|
||||
|
||||
case "$dispatcher" in
|
||||
exec)
|
||||
[[ -n $arg ]] && hyprctl dispatch exec "$arg"
|
||||
;;
|
||||
"") return 1 ;;
|
||||
*)
|
||||
if [[ -n $arg ]]; then
|
||||
hyprctl dispatch "$dispatcher" "$arg"
|
||||
else
|
||||
hyprctl dispatch "$dispatcher"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
if [[ $1 == "--print" || $1 == "-p" ]]; then
|
||||
output_keybindings
|
||||
else
|
||||
records=$(output_binding_records)
|
||||
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
|
||||
menu_height=$((monitor_height * 40 / 100))
|
||||
selection=$(cut -f1 <<<"$records" |
|
||||
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height")
|
||||
|
||||
if [[ -n $selection ]]; then
|
||||
record=$(awk -F '\t' -v selection="$selection" '$1 == selection { print; exit }' <<<"$records")
|
||||
dispatcher=$(cut -f2 <<<"$record")
|
||||
arg=$(cut -f3- <<<"$record")
|
||||
|
||||
dispatch_binding "$dispatcher" "$arg"
|
||||
fi
|
||||
output_keybindings |
|
||||
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"
|
||||
fi
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Pick one option with Walker
|
||||
# omarchy:group=menu
|
||||
# omarchy:name=select
|
||||
# omarchy:args=prompt option... [-- walker args...]
|
||||
# omarchy:examples=omarchy menu select Format jpg png|omarchy-menu-select Resolution 4k 1080p 720p -- --width 400
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if (( $# < 2 )); then
|
||||
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prompt="$1"
|
||||
shift
|
||||
|
||||
options=()
|
||||
walker_args=()
|
||||
|
||||
while (( $# > 0 )); do
|
||||
if [[ $1 == "--" ]]; then
|
||||
shift
|
||||
walker_args=("$@")
|
||||
break
|
||||
fi
|
||||
|
||||
options+=("$1")
|
||||
shift
|
||||
done
|
||||
|
||||
if (( ${#options[@]} == 0 )); then
|
||||
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf '%s\n' "${options[@]}" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 300 -p "$prompt…" "${walker_args[@]}" 2>/dev/null
|
||||
@@ -1,248 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Display Tmux keybindings defined in your configuration using walker for an interactive search menu.
|
||||
# omarchy:args=[--print|-p] [--config <path>]
|
||||
|
||||
print_only=false
|
||||
config_file="${TMUX_CONF:-$HOME/.config/tmux/tmux.conf}"
|
||||
|
||||
while (($#)); do
|
||||
case "$1" in
|
||||
--print|-p)
|
||||
print_only=true
|
||||
;;
|
||||
--config)
|
||||
shift
|
||||
config_file="$1"
|
||||
;;
|
||||
*)
|
||||
config_file="$1"
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ ! -f $config_file ]]; then
|
||||
default_config="${OMARCHY_PATH:-$HOME/.local/share/omarchy}/config/tmux/tmux.conf"
|
||||
|
||||
if [[ -f $default_config ]]; then
|
||||
config_file="$default_config"
|
||||
else
|
||||
echo "Tmux config not found: $config_file" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
output_keybindings() {
|
||||
awk '
|
||||
function trim(value) {
|
||||
gsub(/^[ \t]+|[ \t]+$/, "", value)
|
||||
return value
|
||||
}
|
||||
|
||||
function key_part_text(part, is_modifier, part_count) {
|
||||
gsub(/^\\/, "", part)
|
||||
|
||||
if (is_modifier && part == "C") return "CTRL"
|
||||
if (is_modifier && part == "M") return "ALT"
|
||||
if (is_modifier && part == "S") return "SHIFT"
|
||||
if (part == "Space") return "SPACE"
|
||||
if (part == "BSpace") return "BACKSPACE"
|
||||
if (part == "BTab") return "SHIFT + TAB"
|
||||
if (part == "PPage") return "PAGE UP"
|
||||
if (part == "NPage") return "PAGE DOWN"
|
||||
if (part == "DC") return "DELETE"
|
||||
if (part == "IC") return "INSERT"
|
||||
if (part_count == 1 && part ~ /^[a-z]$/) return part
|
||||
|
||||
return toupper(part)
|
||||
}
|
||||
|
||||
function key_text(key, parts, count, i, part, text) {
|
||||
gsub(/\\/, "", key)
|
||||
count = split(key, parts, "-")
|
||||
text = ""
|
||||
|
||||
for (i = 1; i <= count; i++) {
|
||||
part = key_part_text(parts[i], i < count, count)
|
||||
text = text (text == "" ? "" : " + ") part
|
||||
}
|
||||
|
||||
return text
|
||||
}
|
||||
|
||||
function table_text(table) {
|
||||
if (table == "copy-mode-vi") return "COPY MODE"
|
||||
if (table == "copy-mode") return "COPY MODE"
|
||||
if (table == "prefix") return "PREFIX"
|
||||
|
||||
gsub(/-/, " ", table)
|
||||
return toupper(table)
|
||||
}
|
||||
|
||||
function pretty_command(command) {
|
||||
gsub(/\\;/, ";", command)
|
||||
gsub(/[{}]/, "", command)
|
||||
gsub(/^[ \t]+|[ \t]+$/, "", command)
|
||||
gsub(/[ \t]+/, " ", command)
|
||||
return command
|
||||
}
|
||||
|
||||
function command_action(command, normalized, target) {
|
||||
normalized = pretty_command(command)
|
||||
|
||||
if (normalized ~ /omarchy-menu-tmux-keybindings/) return "Show Tmux keybindings"
|
||||
if (normalized ~ /^send(-keys)? -X begin-selection/) return "Begin selection"
|
||||
if (normalized ~ /^send(-keys)? -X copy-selection-and-cancel/) return "Copy selection"
|
||||
if (normalized ~ /^send-prefix/) return "Send prefix"
|
||||
if (normalized ~ /^source-file/) return "Reload config"
|
||||
if (normalized ~ /^split-window -v/) return "Split pane vertically"
|
||||
if (normalized ~ /^split-window -h/) return "Split pane horizontally"
|
||||
if (normalized ~ /^kill-pane/) return "Kill pane"
|
||||
if (normalized ~ /^select-pane -L/) return "Focus pane left"
|
||||
if (normalized ~ /^select-pane -R/) return "Focus pane right"
|
||||
if (normalized ~ /^select-pane -U/) return "Focus pane up"
|
||||
if (normalized ~ /^select-pane -D/) return "Focus pane down"
|
||||
if (normalized ~ /^resize-pane -L/) return "Resize pane left"
|
||||
if (normalized ~ /^resize-pane -R/) return "Resize pane right"
|
||||
if (normalized ~ /^resize-pane -U/) return "Resize pane up"
|
||||
if (normalized ~ /^resize-pane -D/) return "Resize pane down"
|
||||
if (normalized ~ /^swap-pane -t "?left-of"?/) return "Move pane left"
|
||||
if (normalized ~ /^swap-pane -t "?right-of"?/) return "Move pane right"
|
||||
if (normalized ~ /^swap-pane -t "?up-of"?/) return "Move pane up"
|
||||
if (normalized ~ /^swap-pane -t "?down-of"?/) return "Move pane down"
|
||||
if (normalized ~ /^swap-pane -U/) return "Move pane left"
|
||||
if (normalized ~ /^swap-pane -D/) return "Move pane right"
|
||||
if (normalized ~ /rename-window/) return "Rename window"
|
||||
if (normalized ~ /^new-window/) return "New window"
|
||||
if (normalized ~ /^kill-window/) return "Kill window"
|
||||
|
||||
if (match(normalized, /^select-window -t ([^ ;]+)/, target)) {
|
||||
gsub(/^:=?/, "", target[1])
|
||||
|
||||
if (target[1] == "-1") return "Previous window"
|
||||
if (target[1] == "+1") return "Next window"
|
||||
|
||||
return "Switch to window " target[1]
|
||||
}
|
||||
|
||||
if (normalized ~ /^swap-window -t -1/) return "Move window left"
|
||||
if (normalized ~ /^swap-window -t \+1/) return "Move window right"
|
||||
if (normalized ~ /rename-session/) return "Rename session"
|
||||
if (normalized ~ /^new-session/) return "New session"
|
||||
if (normalized ~ /^kill-session/) return "Kill session"
|
||||
if (normalized ~ /^switch-client -p/) return "Previous session"
|
||||
if (normalized ~ /^switch-client -n/) return "Next session"
|
||||
|
||||
return normalized
|
||||
}
|
||||
|
||||
function add_record(combo, action) {
|
||||
records[++record_count] = sprintf("%-32s → %s", combo, action)
|
||||
}
|
||||
|
||||
function parse_bind(line, words, count, i, table, global, key, command, combo, action) {
|
||||
count = split(line, words, /[ \t]+/)
|
||||
i = 2
|
||||
table = "prefix"
|
||||
global = 0
|
||||
|
||||
while (i <= count && words[i] ~ /^-/) {
|
||||
if (words[i] == "-n") {
|
||||
global = 1
|
||||
i++
|
||||
} else if (words[i] == "-T") {
|
||||
table = words[i + 1]
|
||||
i += 2
|
||||
} else if (words[i] == "-r") {
|
||||
i++
|
||||
} else {
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
key = words[i]
|
||||
i++
|
||||
|
||||
command = ""
|
||||
for (; i <= count; i++) {
|
||||
command = command (command == "" ? "" : " ") words[i]
|
||||
}
|
||||
|
||||
if (key == "" || command == "") return
|
||||
|
||||
if (global) {
|
||||
combo = key_text(key)
|
||||
} else if (table == "prefix") {
|
||||
combo = "PREFIX + " key_text(key)
|
||||
} else {
|
||||
combo = table_text(table) " + " key_text(key)
|
||||
}
|
||||
|
||||
action = command_action(command)
|
||||
add_record(combo, action)
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
prefix = "C-b"
|
||||
prefix2 = ""
|
||||
}
|
||||
|
||||
{
|
||||
line = trim($0)
|
||||
|
||||
if (line == "") next
|
||||
if (line ~ /^#/) next
|
||||
|
||||
if (line ~ /^(set|set-option|setw|set-window-option)[ \t]/) {
|
||||
word_count = split(line, words, /[ \t]+/)
|
||||
|
||||
for (i = 2; i <= word_count; i++) {
|
||||
if (words[i] == "prefix") prefix = words[i + 1]
|
||||
if (words[i] == "prefix2") prefix2 = words[i + 1]
|
||||
}
|
||||
|
||||
next
|
||||
}
|
||||
|
||||
if (line ~ /^(bind|bind-key)[ \t]/) parse_bind(line)
|
||||
}
|
||||
|
||||
END {
|
||||
prefix_description = key_text(prefix)
|
||||
|
||||
if (prefix2 != "" && prefix2 != "None") {
|
||||
prefix_description = prefix_description " / " key_text(prefix2)
|
||||
}
|
||||
|
||||
printf "%-32s → %s\n", "PREFIX", prefix_description
|
||||
|
||||
add_record("PREFIX + {", "Move pane left")
|
||||
add_record("PREFIX + }", "Move pane right")
|
||||
|
||||
for (i = 1; i <= record_count; i++) print records[i]
|
||||
}
|
||||
' "$config_file"
|
||||
}
|
||||
|
||||
if [[ $print_only == "true" ]]; then
|
||||
output_keybindings
|
||||
exit 0
|
||||
fi
|
||||
|
||||
records=$(output_keybindings)
|
||||
|
||||
if [[ -z $WAYLAND_DISPLAY ]] || omarchy-cmd-missing walker; then
|
||||
printf '%s\n' "$records"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
monitor_height=$(hyprctl monitors -j 2>/dev/null | jq -r '.[] | select(.focused == true) | .height' 2>/dev/null)
|
||||
|
||||
if [[ ! $monitor_height =~ ^[0-9]+$ ]] || ((monitor_height <= 0)); then
|
||||
monitor_height=900
|
||||
fi
|
||||
|
||||
menu_height=$((monitor_height * 40 / 100))
|
||||
printf '%s\n' "$records" | walker --dmenu -p 'Tmux keybindings' --width 800 --height "$menu_height" >/dev/null
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Show the current battery status notification
|
||||
|
||||
omarchy-notification-send -g -u low "$(omarchy-battery-status)"
|
||||
@@ -1,76 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Send a desktop notification with Omarchy glyph and body spacing
|
||||
# omarchy:args=<headline> [description] [-g <glyph>] [-u <low|normal|critical>] [notify-send options]
|
||||
# omarchy:examples=omarchy notification send "Reminder" "5 minutes are up" -g -u critical
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
headline=""
|
||||
description=""
|
||||
glyph=""
|
||||
urgency="low"
|
||||
args=()
|
||||
|
||||
parse_omarchy_option() {
|
||||
case $1 in
|
||||
-g | --glyph)
|
||||
if (($# < 2)); then
|
||||
echo "Missing value for $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
glyph="$2"
|
||||
return 0
|
||||
;;
|
||||
-u | --urgency)
|
||||
if (($# < 2)); then
|
||||
echo "Missing value for $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
urgency="$2"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
while (($# > 0)); do
|
||||
if parse_omarchy_option "$@"; then
|
||||
shift 2
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if (($# < 1)); then
|
||||
echo "Usage: omarchy-notification-send [-g <glyph>] [-u <low|normal|critical>] <headline> [description] [notify-send options]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
headline=$1
|
||||
shift
|
||||
|
||||
if (($# > 0)) && [[ $1 != -* ]]; then
|
||||
description=$1
|
||||
shift
|
||||
fi
|
||||
|
||||
while (($# > 0)); do
|
||||
if parse_omarchy_option "$@"; then
|
||||
shift 2
|
||||
else
|
||||
args+=("$1")
|
||||
shift
|
||||
fi
|
||||
done
|
||||
|
||||
summary="$glyph $headline"
|
||||
args+=("-u" "$urgency")
|
||||
|
||||
if [[ -n $description ]]; then
|
||||
description=$(printf '%b' "$description" | sed 's/^/ /')
|
||||
notify-send "${args[@]}" "$summary" "$description"
|
||||
else
|
||||
notify-send "${args[@]}" "$summary"
|
||||
fi
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Show the current time and date notification
|
||||
|
||||
omarchy-notification-send -g -u low "$(date +"%A %H:%M · %d %B %Y · Week %V")"
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Show the current weather notification
|
||||
|
||||
omarchy-notification-send -g $(omarchy-weather-icon) -u low "$(omarchy-weather-status)"
|
||||
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install a pnpm dlx wrapper for a given npm package.
|
||||
# omarchy:summary=Install an npx wrapper for a given npm package.
|
||||
# omarchy:args=<package> [command-name]
|
||||
|
||||
if [[ -z $1 ]]; then
|
||||
echo "Usage: omarchy-npm-install <package> [command-name]"
|
||||
echo "Usage: omarchy-npx-install <package> [command-name]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -23,13 +23,8 @@ if ! node_root="\$(mise where node@latest 2>/dev/null)"; then
|
||||
node_root="\$(mise where node@latest)"
|
||||
fi
|
||||
|
||||
if omarchy-cmd-missing pnpm; then
|
||||
echo "Installing pnpm for \$package..."
|
||||
omarchy-pkg-add pnpm
|
||||
hash -r
|
||||
fi
|
||||
|
||||
export PNPM_CONFIG_MINIMUM_RELEASE_AGE=7200
|
||||
node_bin="\$node_root/bin/node"
|
||||
npx_bin="\$node_root/bin/npx"
|
||||
|
||||
ensure_bin_runtime() {
|
||||
local bin_path=\$1
|
||||
@@ -56,15 +51,15 @@ exec_package_bin() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Resolve the package bin inside pnpm dlx, then run it with node@latest available for node shebangs.
|
||||
# Resolve the package bin inside npx, then run it with node@latest available for node shebangs.
|
||||
# Some wrappers are aliases, e.g. playwright-cli wraps the playwright bin.
|
||||
PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" true
|
||||
"\$node_bin" "\$npx_bin" --yes --prefer-online --package "\$package" -- true
|
||||
|
||||
package_bin_path=\$(PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" which "\$package" 2>/dev/null)
|
||||
package_bin_path=\$("\$node_bin" "\$npx_bin" --yes --package "\$package" -- which "\$package" 2>/dev/null)
|
||||
exec_package_bin "\$package_bin_path" "\$@"
|
||||
|
||||
# Scoped packages like @openai/codex expose an unscoped bin like codex.
|
||||
package_bin_path=\$(PATH="\$node_root/bin:\$PATH" pnpm dlx --package "\$package" which "\$command" 2>/dev/null)
|
||||
package_bin_path=\$("\$node_bin" "\$npx_bin" --yes --package "\$package" -- which "\$command" 2>/dev/null)
|
||||
exec_package_bin "\$package_bin_path" "\$@"
|
||||
|
||||
echo "Could not resolve npm bin for \$package / \$command" >&2
|
||||
+3
-1
@@ -1,8 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy:summary=Install Arch packages if they are missing
|
||||
# omarchy:group=install
|
||||
# omarchy:name=package
|
||||
# omarchy:args=<packages...>
|
||||
# omarchy:examples=omarchy pkg add jq ripgrep
|
||||
# omarchy:examples=omarchy install package jq ripgrep
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
if omarchy-pkg-missing "$@"; then
|
||||
|
||||
@@ -4,13 +4,8 @@
|
||||
# omarchy:args=<packages...>
|
||||
# omarchy:requires-sudo=true
|
||||
|
||||
installed=()
|
||||
for pkg in "$@"; do
|
||||
if pacman -Q "$pkg" &>/dev/null; then
|
||||
installed+=("$pkg")
|
||||
sudo pacman -Rns --noconfirm "$pkg"
|
||||
fi
|
||||
done
|
||||
|
||||
if (( ${#installed[@]} > 0 )); then
|
||||
sudo pacman -Rns --noconfirm "${installed[@]}"
|
||||
fi
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
# omarchy:summary=Preview a Plymouth boot screen with custom colors and logo
|
||||
# omarchy:args=<background-hex> <text-hex> <path-to-logo.png> <output-path>
|
||||
# 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.
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
# omarchy:summary=Set the Plymouth boot theme colors and logo
|
||||
# omarchy:args=<background-hex> <text-hex> <path-to-logo.png>
|
||||
# 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.
|
||||
@@ -68,16 +67,10 @@ sddm_dir="/usr/share/sddm/themes/omarchy"
|
||||
sddm_template="$HOME/.local/share/omarchy/default/sddm/omarchy/Main.qml"
|
||||
|
||||
sed \
|
||||
-e "s/#1a1b26/#$bg_hex/g" \
|
||||
-e "s/#000000/#$bg_hex/g" \
|
||||
-e "s/#ffffff/#$text_hex/g" \
|
||||
-e 's|source: "logo.svg"|source: "logo.png"|' \
|
||||
"$sddm_template" | sudo tee "$sddm_dir/Main.qml" >/dev/null
|
||||
|
||||
sudo cp "$logo_path" "$sddm_dir/logo.png"
|
||||
for asset in bullet.png entry.png lock.png; do
|
||||
sudo cp "$staging_dir/$asset" "$sddm_dir/$asset"
|
||||
done
|
||||
for asset in entry lock; do
|
||||
magick "$staging_dir/$asset.png" -channel RGB +level-colors "#f7768e","#f7768e" "$staging_dir/$asset-failed.png"
|
||||
sudo cp "$staging_dir/$asset-failed.png" "$sddm_dir/$asset-failed.png"
|
||||
done
|
||||
sudo rm -f "$sddm_dir/logo.svg"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user