mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-04 12:47:51 +02:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2453ca6ea4 |
-11
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"workspace": {
|
|
||||||
"library": [
|
|
||||||
"/usr/share/hypr/stubs"
|
|
||||||
],
|
|
||||||
"checkThirdParty": false
|
|
||||||
},
|
|
||||||
"diagnostics": {
|
|
||||||
"globals": ["hl"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +1,13 @@
|
|||||||
# Style
|
# Style
|
||||||
|
|
||||||
- Two spaces for indentation, no tabs
|
- Two spaces for indentation, no tabs
|
||||||
- Use bash 5 conditionals: use `[[ ]]` for string/file tests and `(( ))` for numeric tests
|
- Use Bash syntax for conditionals: `[[ -f $file ]]`, not `[ -f "$file" ]`
|
||||||
- In `[[ ]]`, don't quote variables, but do quote string literals when comparing values (e.g., `[[ $branch == "dev" ]]`)
|
|
||||||
- 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
|
# Command Naming
|
||||||
|
|
||||||
All commands start with `omarchy-`. Prefixes indicate purpose.
|
All commands start with `omarchy-`. Prefixes indicate purpose:
|
||||||
|
|
||||||
The authoritative command group list lives in `bin/omarchy` in `GROUP_DESCRIPTIONS`. Keep `GROUP_DESCRIPTIONS` updated when adding a new command prefix.
|
|
||||||
|
|
||||||
Common prefixes include:
|
|
||||||
|
|
||||||
- `cmd-` - check if commands exist, misc utility commands
|
- `cmd-` - check if commands exist, misc utility commands
|
||||||
- `capture-` - screenshots, screen recordings, and other capture tools
|
|
||||||
- `pkg-` - package management helpers
|
- `pkg-` - package management helpers
|
||||||
- `hw-` - hardware detection (return exit codes for use in conditionals)
|
- `hw-` - hardware detection (return exit codes for use in conditionals)
|
||||||
- `refresh-` - copy default config to user's `~/.config/`
|
- `refresh-` - copy default config to user's `~/.config/`
|
||||||
@@ -29,52 +19,6 @@ Common prefixes include:
|
|||||||
- `theme-` - theme management
|
- `theme-` - theme management
|
||||||
- `update-` - update components
|
- `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
|
# Helper Commands
|
||||||
|
|
||||||
Use these instead of raw shell commands:
|
Use these instead of raw shell commands:
|
||||||
@@ -82,26 +26,14 @@ Use these instead of raw shell commands:
|
|||||||
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
|
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
|
||||||
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
|
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
|
||||||
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
|
- `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)
|
- `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 Structure
|
||||||
|
|
||||||
- `config/` - default configs copied to `~/.config/`
|
- `config/` - default configs copied to `~/.config/`
|
||||||
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
|
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
|
||||||
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
|
- `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
|
# Refresh Pattern
|
||||||
|
|
||||||
To copy a default config to user config with automatic backup:
|
To copy a default config to user config with automatic backup:
|
||||||
@@ -116,16 +48,9 @@ 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.
|
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:
|
Migration format:
|
||||||
- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly
|
|
||||||
- No shebang line
|
- No shebang line
|
||||||
- Start with an `echo` describing what the migration does
|
- 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:
|
Example:
|
||||||
```bash
|
```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
|
|
||||||
@@ -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.
|
Before Width: | Height: | Size: 63 KiB |
-1066
File diff suppressed because it is too large
Load Diff
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Returns true if AC power is connected.
|
|
||||||
|
|
||||||
for ac in /sys/class/power_supply/AC* /sys/class/power_supply/ADP*; do
|
|
||||||
[[ -r $ac/online && $(cat "$ac/online") == "1" ]] && exit 0
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Toggle microphone mute. Drives the hardware mic-mute LED on laptops that expose one.
|
|
||||||
|
|
||||||
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle >/dev/null
|
|
||||||
|
|
||||||
if pactl get-source-mute @DEFAULT_SOURCE@ | rg -q 'yes'; then
|
|
||||||
led=on
|
|
||||||
osd_message='Microphone muted'
|
|
||||||
osd_icon='microphone-sensitivity-muted-symbolic'
|
|
||||||
else
|
|
||||||
led=off
|
|
||||||
osd_message='Microphone on'
|
|
||||||
osd_icon='audio-input-microphone-symbolic'
|
|
||||||
fi
|
|
||||||
|
|
||||||
omarchy-brightness-keyboard-mute "$led"
|
|
||||||
|
|
||||||
omarchy-swayosd-client \
|
|
||||||
--custom-message "$osd_message" \
|
|
||||||
--custom-icon "$osd_icon"
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.
|
|
||||||
|
|
||||||
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
|
|
||||||
sinks_count=$(echo "$sinks" | jq '. | length')
|
|
||||||
|
|
||||||
if (( sinks_count == 0 )); then
|
|
||||||
omarchy-swayosd-client --custom-message "No audio devices found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
current_sink_name=$(pactl get-default-sink)
|
|
||||||
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')
|
|
||||||
|
|
||||||
if [[ $current_sink_index != "null" ]]; then
|
|
||||||
next_sink_index=$(((current_sink_index + 1) % sinks_count))
|
|
||||||
else
|
|
||||||
next_sink_index=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
|
|
||||||
next_sink_name=$(echo "$next_sink" | jq -r '.name')
|
|
||||||
|
|
||||||
next_sink_description=$(echo "$next_sink" | jq -r '.description')
|
|
||||||
if [[ $next_sink_description == "(null)" ]] || [[ $next_sink_description == "null" ]] || [[ -z $next_sink_description ]]; then
|
|
||||||
# For Bluetooth devices, the friendly name is on the Device entry (device.id), not the Sink entry (object.id)
|
|
||||||
device_id=$(echo "$next_sink" | jq -r '.properties."device.id"')
|
|
||||||
if [[ $device_id != "null" ]] && [[ -n $device_id ]]; then
|
|
||||||
next_sink_description=$(wpctl status | grep -E "^\s*│?\s+${device_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
|
|
||||||
fi
|
|
||||||
# Fall back to object.id lookup if device.id didn't yield a result
|
|
||||||
if [[ -z $next_sink_description ]]; then
|
|
||||||
sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
|
|
||||||
next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink_volume=$(echo "$next_sink" | jq -r \
|
|
||||||
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
|
|
||||||
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
|
|
||||||
|
|
||||||
if [[ $next_sink_is_muted = "true" ]] || (( next_sink_volume == 0 )); then
|
|
||||||
icon_state="muted"
|
|
||||||
elif (( next_sink_volume <= 33 )); then
|
|
||||||
icon_state="low"
|
|
||||||
elif (( next_sink_volume <= 66 )); then
|
|
||||||
icon_state="medium"
|
|
||||||
else
|
|
||||||
icon_state="high"
|
|
||||||
fi
|
|
||||||
|
|
||||||
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
|
|
||||||
|
|
||||||
if [[ $next_sink_name != $current_sink_name ]]; then
|
|
||||||
next_sink_wpid=$(echo "$next_sink" | jq -r '.properties."object.id"')
|
|
||||||
wpctl set-default "$next_sink_wpid"
|
|
||||||
fi
|
|
||||||
|
|
||||||
omarchy-swayosd-client \
|
|
||||||
--custom-message "$next_sink_description" \
|
|
||||||
--custom-icon "$next_sink_volume_icon"
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Returns the battery full capacity in Wh (rounded to whole number).
|
|
||||||
|
|
||||||
battery_info=$(upower -i $(upower -e | grep BAT))
|
|
||||||
|
|
||||||
echo "$battery_info" | awk '/energy-full:/ {
|
|
||||||
printf "%d", $2
|
|
||||||
exit
|
|
||||||
}'
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low
|
# Designed to be run by systemd timer every 30 seconds and alerts if battery is low
|
||||||
# omarchy:hidden=true
|
|
||||||
|
|
||||||
BATTERY_THRESHOLD=10
|
BATTERY_THRESHOLD=10
|
||||||
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
|
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
|
||||||
@@ -10,11 +9,10 @@ BATTERY_STATE=$(upower -i $(upower -e | grep 'BAT') | grep -E "state" | awk '{pr
|
|||||||
|
|
||||||
send_notification() {
|
send_notification() {
|
||||||
notify-send -u critical " Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
|
notify-send -u critical " Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
|
||||||
omarchy-hook battery-low "$1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ -n $BATTERY_LEVEL && $BATTERY_LEVEL =~ ^[0-9]+$ ]]; then
|
if [[ -n "$BATTERY_LEVEL" && "$BATTERY_LEVEL" =~ ^[0-9]+$ ]]; then
|
||||||
if [[ $BATTERY_STATE == "discharging" ]] && (( BATTERY_LEVEL <= BATTERY_THRESHOLD )); then
|
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then
|
||||||
if [[ ! -f $NOTIFICATION_FLAG ]]; then
|
if [[ ! -f $NOTIFICATION_FLAG ]]; then
|
||||||
send_notification $BATTERY_LEVEL
|
send_notification $BATTERY_LEVEL
|
||||||
touch $NOTIFICATION_FLAG
|
touch $NOTIFICATION_FLAG
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Returns true if a battery is present on the system.
|
# Returns true if a battery is present on the system.
|
||||||
|
# Used by the battery monitor and other battery-related checks.
|
||||||
|
|
||||||
for bat in /sys/class/power_supply/BAT*; do
|
for bat in /sys/class/power_supply/BAT*; do
|
||||||
[[ -r $bat/present ]] &&
|
[[ -r "$bat/present" ]] &&
|
||||||
[[ $(cat $bat/present) == "1" ]] &&
|
[[ "$(cat "$bat/present")" == "1" ]] &&
|
||||||
[[ $(cat $bat/type) == "Battery" ]] &&
|
[[ "$(cat "$bat/type")" == "Battery" ]] &&
|
||||||
exit 0
|
exit 0
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Returns the battery percentage remaining as an integer.
|
# Returns the battery percentage remaining as an integer.
|
||||||
|
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
|
||||||
|
|
||||||
upower -i $(upower -e | grep BAT) | awk '/percentage/ {
|
upower -i $(upower -e | grep BAT) \
|
||||||
print int($2)
|
| awk -F: '/percentage/ {
|
||||||
|
gsub(/[%[:space:]]/, "", $2);
|
||||||
|
val=$2;
|
||||||
|
printf("%d\n", (val+0.5))
|
||||||
exit
|
exit
|
||||||
}'
|
}'
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Returns the battery time remaining (to empty or full) in a compact format.
|
|
||||||
|
|
||||||
battery_info=$(upower -i $(upower -e | grep BAT))
|
|
||||||
|
|
||||||
echo "$battery_info" | awk '/time to (empty|full)/ {
|
|
||||||
value = $4
|
|
||||||
unit = $5
|
|
||||||
if (unit ~ /^minute/) {
|
|
||||||
printf "%dm", int(value)
|
|
||||||
} else {
|
|
||||||
hours = int(value)
|
|
||||||
minutes = int((value - hours) * 60)
|
|
||||||
if (minutes > 0) {
|
|
||||||
printf "%dh %dm", hours, minutes
|
|
||||||
} else {
|
|
||||||
printf "%dh", hours
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit
|
|
||||||
}'
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Returns a formatted battery status string with percentage and power draw/charge.
|
|
||||||
|
|
||||||
battery_info=$(upower -i $(upower -e | grep BAT))
|
|
||||||
|
|
||||||
percentage=$(echo "$battery_info" | awk '/percentage/ {
|
|
||||||
print int($2)
|
|
||||||
exit
|
|
||||||
}')
|
|
||||||
|
|
||||||
power_rate=$(echo "$battery_info" | awk '/energy-rate/ {
|
|
||||||
rounded = sprintf("%.1f", $2)
|
|
||||||
sub(/\.0$/, "", rounded)
|
|
||||||
print rounded
|
|
||||||
exit
|
|
||||||
}')
|
|
||||||
|
|
||||||
state=$(echo "$battery_info" | awk '/state/ { print $2; exit }')
|
|
||||||
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"
|
|
||||||
else
|
|
||||||
echo "Battery ${percentage}% · ${time_remaining} left · ${power_rate}W / ${capacity}Wh"
|
|
||||||
fi
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Set the branch for Omarchy's git repository.
|
# Set the branch for Omarchy's git repository.
|
||||||
# omarchy:args=<master|rc|dev>
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
echo "Usage: omarchy-branch-set [master|rc|dev]"
|
echo "Usage: omarchy-branch-set [master|rc|dev]"
|
||||||
@@ -10,7 +9,7 @@ else
|
|||||||
branch="$1"
|
branch="$1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $branch != "master" && $branch != "rc" && $branch != "dev" ]]; then
|
if [[ "$branch" != "master" && "$branch" != "rc" && "$branch" != "dev" ]]; then
|
||||||
echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev"
|
echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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,66 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Adjust brightness on the most likely display device.
|
# Adjust brightness on the most likely display device.
|
||||||
# omarchy:args=<+N%|N%-|N%|off|on>
|
# Usage: omarchy-brightness-display <step>
|
||||||
# omarchy:examples=omarchy brightness display +5% | omarchy brightness display 5%- | omarchy brightness display 50% | omarchy brightness display off | omarchy brightness display on
|
|
||||||
|
|
||||||
step="${1:-+5%}"
|
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
|
|
||||||
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.
|
# 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)"
|
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
|
||||||
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
|
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
|
||||||
if [[ -e /sys/class/backlight/$candidate ]]; then
|
if [[ -e "/sys/class/backlight/$candidate" ]]; then
|
||||||
device="$candidate"
|
device="$candidate"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
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 '%')
|
|
||||||
|
|
||||||
# Apply non-uniform step size: 1% steps if at or below 5%, otherwise set an
|
|
||||||
# absolute target percentage to avoid raw backlight rounding causing uneven OSD steps.
|
|
||||||
if [[ $step == "+5%" ]]; then
|
|
||||||
if (( current < 5 )); then
|
|
||||||
(( target = current + 1 ))
|
|
||||||
else
|
|
||||||
(( target = current + 5 ))
|
|
||||||
fi
|
|
||||||
|
|
||||||
(( target > 100 )) && target=100
|
|
||||||
step="$target%"
|
|
||||||
elif [[ $step == "5%-" ]]; then
|
|
||||||
if (( current <= 5 )); then
|
|
||||||
(( target = current - 1 ))
|
|
||||||
else
|
|
||||||
(( target = current - 5 ))
|
|
||||||
fi
|
|
||||||
|
|
||||||
(( target < 1 )) && target=1
|
|
||||||
step="$target%"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Set the actual brightness of the display device.
|
# Set the actual brightness of the display device.
|
||||||
brightnessctl -d "$device" set "$step" >/dev/null
|
brightnessctl -d "$device" set "$step" >/dev/null
|
||||||
|
|
||||||
|
|||||||
@@ -1,34 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
|
# 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
|
if [[ $# -eq 0 ]]; then
|
||||||
echo "Adjust Apple Display brightness by passing +5%, 5%-, or 100%"
|
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
|
||||||
else
|
else
|
||||||
step="$1"
|
device="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
|
||||||
if [[ $step =~ ^([0-9]+)%-$ ]]; then
|
sudo asdcontrol "$device" -- "$1" >/dev/null
|
||||||
step="-${BASH_REMATCH[1]}%"
|
|
||||||
fi
|
|
||||||
|
|
||||||
devices=()
|
|
||||||
for path in /dev/usb/hiddev* /dev/hiddev*; do
|
|
||||||
[[ -e $path ]] && devices+=("$path")
|
|
||||||
done
|
|
||||||
|
|
||||||
if (( ${#devices[@]} == 0 )); then
|
|
||||||
echo "No Apple Display HID device found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
device="$(sudo asdcontrol --detect "${devices[@]}" | grep -E '^/dev/(usb/)?hiddev' | cut -d: -f1 | head -n1)"
|
|
||||||
if [[ -z $device ]]; then
|
|
||||||
echo "No Apple Display HID device found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
sudo asdcontrol "$device" -- "$step" >/dev/null
|
|
||||||
value="$(sudo asdcontrol "$device" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
|
value="$(sudo asdcontrol "$device" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
|
||||||
omarchy-swayosd-brightness "$(( value * 100 / 60000 ))"
|
omarchy-swayosd-brightness "$(( value * 100 / 60000 ))"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,50 +1,35 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Adjust keyboard backlight brightness using available steps.
|
# Adjust keyboard backlight brightness using available steps.
|
||||||
# omarchy:args=<up|down|cycle|off|restore>
|
# Usage: omarchy-brightness-keyboard <up|down>
|
||||||
|
|
||||||
direction="${1:-up}"
|
direction="${1:-up}"
|
||||||
|
|
||||||
# Find keyboard backlight device (look for *kbd_backlight* pattern in leds class).
|
# Find keyboard backlight device (look for *kbd_backlight* pattern in leds class).
|
||||||
device=""
|
device=""
|
||||||
for candidate in /sys/class/leds/*kbd_backlight*; do
|
for candidate in /sys/class/leds/*kbd_backlight*; do
|
||||||
if [[ -e $candidate ]]; then
|
if [[ -e "$candidate" ]]; then
|
||||||
device="$(basename "$candidate")"
|
device="$(basename "$candidate")"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ -z $device ]]; then
|
if [[ -z "$device" ]]; then
|
||||||
echo "No keyboard backlight device found" >&2
|
echo "No keyboard backlight device found" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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.
|
# Get current and max brightness to determine step size.
|
||||||
max_brightness="$(brightnessctl -d "$device" max)"
|
max_brightness="$(brightnessctl -d "$device" max)"
|
||||||
current_brightness="$(brightnessctl -d "$device" get)"
|
current_brightness="$(brightnessctl -d "$device" get)"
|
||||||
|
|
||||||
# Calculate step as 10% of max brightness. Keyboards with many levels (e.g. 512)
|
# Calculate step as one unit (keyboards typically have discrete levels like 0-3).
|
||||||
# need larger steps; keyboards with few levels (e.g. 3) fall back to step=1.
|
if [[ "$direction" == "up" ]]; then
|
||||||
step=$(( max_brightness / 10 ))
|
new_brightness=$((current_brightness + 1))
|
||||||
(( step < 1 )) && step=1
|
[[ $new_brightness -gt $max_brightness ]] && new_brightness=$max_brightness
|
||||||
|
|
||||||
if [[ $direction == "cycle" ]]; then
|
|
||||||
new_brightness=$(( current_brightness + step ))
|
|
||||||
(( new_brightness > max_brightness )) && new_brightness=0
|
|
||||||
elif [[ $direction == "up" ]]; then
|
|
||||||
new_brightness=$(( current_brightness + step ))
|
|
||||||
(( new_brightness > max_brightness )) && new_brightness=$max_brightness
|
|
||||||
else
|
else
|
||||||
new_brightness=$(( current_brightness - step ))
|
new_brightness=$((current_brightness - 1))
|
||||||
(( new_brightness < 0 )) && new_brightness=0
|
[[ $new_brightness -lt 0 ]] && new_brightness=0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set the new brightness.
|
# Set the new brightness.
|
||||||
@@ -52,4 +37,4 @@ brightnessctl -d "$device" set "$new_brightness" >/dev/null
|
|||||||
|
|
||||||
# Use SwayOSD to display the new brightness setting.
|
# Use SwayOSD to display the new brightness setting.
|
||||||
percent=$((new_brightness * 100 / max_brightness))
|
percent=$((new_brightness * 100 / max_brightness))
|
||||||
omarchy-swayosd-kbd-brightness "$percent"
|
omarchy-swayosd-brightness "$percent"
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Set the mic-mute indicator LED on laptops that expose a platform::micmute LED node.
|
|
||||||
# omarchy:args=<on|off>
|
|
||||||
|
|
||||||
if [[ -e /sys/class/leds/platform::micmute/brightness ]]; then
|
|
||||||
case "$1" in
|
|
||||||
on) value=1 ;;
|
|
||||||
off) value=0 ;;
|
|
||||||
*) echo "Usage: $(basename "$0") <on|off>" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
brightnessctl --device="platform::micmute" set "$value" >/dev/null 2>&1 || true
|
|
||||||
fi
|
|
||||||
@@ -1,295 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Start or stop screen recording
|
|
||||||
# omarchy:group=capture
|
|
||||||
# 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}}"
|
|
||||||
|
|
||||||
if [[ ! -d $OUTPUT_DIR ]]; then
|
|
||||||
notify-send "Screen recording directory does not exist: $OUTPUT_DIR" -u critical -t 3000
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
DESKTOP_AUDIO="false"
|
|
||||||
MICROPHONE_AUDIO="false"
|
|
||||||
WEBCAM="false"
|
|
||||||
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
|
|
||||||
--with-desktop-audio) DESKTOP_AUDIO="true" ;;
|
|
||||||
--with-microphone-audio) MICROPHONE_AUDIO="true" ;;
|
|
||||||
--with-webcam) WEBCAM="true" ;;
|
|
||||||
--webcam-device=*) WEBCAM_DEVICE="${arg#*=}" ;;
|
|
||||||
--resolution=*) RESOLUTION="${arg#*=}" ;;
|
|
||||||
--stop-recording) STOP_RECORDING="true" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
start_webcam_overlay() {
|
|
||||||
cleanup_webcam
|
|
||||||
|
|
||||||
# Auto-detect first available webcam if none specified
|
|
||||||
if [[ -z $WEBCAM_DEVICE ]]; then
|
|
||||||
WEBCAM_DEVICE=$(v4l2-ctl --list-devices 2>/dev/null | grep -m1 "^[[:space:]]*/dev/video" | tr -d '\t')
|
|
||||||
if [[ -z $WEBCAM_DEVICE ]]; then
|
|
||||||
notify-send "No webcam devices found" -u critical -t 3000
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get monitor scale
|
|
||||||
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
|
|
||||||
|
|
||||||
# Target width (base 360px, scaled to monitor)
|
|
||||||
local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}")
|
|
||||||
|
|
||||||
# Try preferred 16:9 resolutions in order, use first available
|
|
||||||
local preferred_resolutions=("640x360" "1280x720" "1920x1080")
|
|
||||||
local video_size_arg=""
|
|
||||||
local available_formats=$(v4l2-ctl --list-formats-ext -d "$WEBCAM_DEVICE" 2>/dev/null)
|
|
||||||
|
|
||||||
for resolution in "${preferred_resolutions[@]}"; do
|
|
||||||
if echo "$available_formats" | grep -q "$resolution"; then
|
|
||||||
video_size_arg="-video_size $resolution"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
ffplay -f v4l2 $video_size_arg -framerate 30 "$WEBCAM_DEVICE" \
|
|
||||||
-vf "crop=iw/2:ih,scale=${target_width}:-1" \
|
|
||||||
-window_title "WebcamOverlay" \
|
|
||||||
-noborder \
|
|
||||||
-fflags nobuffer -flags low_delay \
|
|
||||||
-probesize 32 -analyzeduration 0 \
|
|
||||||
-loglevel quiet &
|
|
||||||
sleep 1
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup_webcam() {
|
|
||||||
pkill -f "WebcamOverlay" 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
default_resolution() {
|
|
||||||
local width height
|
|
||||||
read -r width height < <(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.width) \(.height)"')
|
|
||||||
if ((width > 3840 || height > 2160)); then
|
|
||||||
echo "3840x2160"
|
|
||||||
else
|
|
||||||
echo "0x0"
|
|
||||||
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=()
|
|
||||||
|
|
||||||
[[ $DESKTOP_AUDIO == "true" ]] && audio_devices+="default_output"
|
|
||||||
|
|
||||||
if [[ $MICROPHONE_AUDIO == "true" ]]; then
|
|
||||||
# Merge audio tracks into one - separate tracks only play one at a time in most players
|
|
||||||
[[ -n $audio_devices ]] && audio_devices+="|"
|
|
||||||
audio_devices+="default_input"
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ -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 pid=$!
|
|
||||||
|
|
||||||
while kill -0 $pid 2>/dev/null && [[ ! -f $filename ]]; do
|
|
||||||
sleep 0.2
|
|
||||||
done
|
|
||||||
|
|
||||||
if kill -0 $pid 2>/dev/null; then
|
|
||||||
echo "$filename" >"$RECORDING_FILE"
|
|
||||||
toggle_screenrecording_indicator
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
stop_screenrecording() {
|
|
||||||
pkill -SIGINT -f "^gpu-screen-recorder" # SIGINT required to save video properly
|
|
||||||
|
|
||||||
# Wait a maximum of 5 seconds to finish before hard killing
|
|
||||||
local count=0
|
|
||||||
while pgrep -f "^gpu-screen-recorder" >/dev/null && ((count < 50)); do
|
|
||||||
sleep 0.1
|
|
||||||
count=$((count + 1))
|
|
||||||
done
|
|
||||||
|
|
||||||
toggle_screenrecording_indicator
|
|
||||||
cleanup_webcam
|
|
||||||
|
|
||||||
if pgrep -f "^gpu-screen-recorder" >/dev/null; then
|
|
||||||
pkill -9 -f "^gpu-screen-recorder"
|
|
||||||
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
|
|
||||||
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
|
|
||||||
ffmpeg -y -i "$filename" -ss 00:00:00.1 -vframes 1 -q:v 2 "$preview" -loglevel quiet 2>/dev/null
|
|
||||||
|
|
||||||
(
|
|
||||||
ACTION=$(notify-send "Screen recording saved" "Open with Super + Alt + , (or click this)" -t 10000 -i "${preview:-$filename}" -A "default=open")
|
|
||||||
[[ $ACTION == "default" ]] && mpv "$filename"
|
|
||||||
rm -f "$preview"
|
|
||||||
) &
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f "$RECORDING_FILE"
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle_screenrecording_indicator() {
|
|
||||||
pkill -RTMIN+8 waybar
|
|
||||||
}
|
|
||||||
|
|
||||||
screenrecording_active() {
|
|
||||||
pgrep -f "^gpu-screen-recorder" >/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
finalize_recording() {
|
|
||||||
local latest
|
|
||||||
latest=$(cat "$RECORDING_FILE" 2>/dev/null)
|
|
||||||
[[ -f $latest ]] || return
|
|
||||||
|
|
||||||
# Re-encode only when the first GOP contains discardable warmup packets — stream copy can't
|
|
||||||
# trim those (it rewinds to the keyframe). Clean recordings stay on the fast stream-copy path.
|
|
||||||
local video_codec=(-c:v copy)
|
|
||||||
if ffprobe -v error -select_streams v:0 -read_intervals %+0.2 -show_entries packet=flags -of csv=p=0 "$latest" 2>/dev/null | grep -q D; then
|
|
||||||
video_codec=(-c:v libx264 -preset veryfast -crf 20)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 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")
|
|
||||||
fi
|
|
||||||
|
|
||||||
local processed="${latest%.mp4}-processed.mp4"
|
|
||||||
if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then
|
|
||||||
mv "$processed" "$latest"
|
|
||||||
else
|
|
||||||
rm -f "$processed"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
if screenrecording_active; then
|
|
||||||
stop_screenrecording
|
|
||||||
elif [[ $STOP_RECORDING == "true" ]]; then
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
start_screenrecording || cleanup_webcam
|
|
||||||
fi
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Take a screenshot
|
|
||||||
# omarchy:group=capture
|
|
||||||
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy|save] [--editor=<name>]
|
|
||||||
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
|
|
||||||
# omarchy:aliases=omarchy screenshot
|
|
||||||
|
|
||||||
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
|
||||||
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
|
|
||||||
|
|
||||||
if [[ ! -d $OUTPUT_DIR ]]; then
|
|
||||||
mkdir -p "$OUTPUT_DIR"
|
|
||||||
notify-send "Created screenshot directory: $OUTPUT_DIR" -u normal -t 2000
|
|
||||||
fi
|
|
||||||
|
|
||||||
pkill slurp && exit 0
|
|
||||||
|
|
||||||
SCREENSHOT_EDITOR="${OMARCHY_SCREENSHOT_EDITOR:-satty}"
|
|
||||||
|
|
||||||
# Parse --editor flag from any position
|
|
||||||
ARGS=()
|
|
||||||
for arg in "$@"; do
|
|
||||||
if [[ $arg == --editor=* ]]; then
|
|
||||||
SCREENSHOT_EDITOR="${arg#--editor=}"
|
|
||||||
else
|
|
||||||
ARGS+=("$arg")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
set -- "${ARGS[@]}"
|
|
||||||
|
|
||||||
open_editor() {
|
|
||||||
local filepath="$1"
|
|
||||||
if [[ $SCREENSHOT_EDITOR == "satty" ]]; then
|
|
||||||
satty --filename "$filepath" \
|
|
||||||
--output-filename "$filepath" \
|
|
||||||
--actions-on-enter save-to-clipboard \
|
|
||||||
--save-after-copy \
|
|
||||||
--copy-command 'wl-copy'
|
|
||||||
else
|
|
||||||
$SCREENSHOT_EDITOR "$filepath"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
MODE="${1:-smart}"
|
|
||||||
PROCESSING="${2:-slurp}"
|
|
||||||
|
|
||||||
# accounting for portrait/transformed displays
|
|
||||||
JQ_MONITOR_GEO='
|
|
||||||
def format_geo:
|
|
||||||
.x as $x | .y as $y |
|
|
||||||
(.width / .scale | floor) as $w |
|
|
||||||
(.height / .scale | floor) as $h |
|
|
||||||
.transform as $t |
|
|
||||||
if $t == 1 or $t == 3 then
|
|
||||||
"\($x),\($y) \($h)x\($w)"
|
|
||||||
else
|
|
||||||
"\($x),\($y) \($w)x\($h)"
|
|
||||||
end;
|
|
||||||
'
|
|
||||||
|
|
||||||
get_rectangles() {
|
|
||||||
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
|
|
||||||
hyprctl monitors -j | jq -r --arg ws "$active_workspace" "${JQ_MONITOR_GEO} .[] | select(.activeWorkspace.id == (\$ws | tonumber)) | format_geo"
|
|
||||||
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# Select based on mode
|
|
||||||
case "$MODE" in
|
|
||||||
region)
|
|
||||||
hyprpicker -r -z >/dev/null 2>&1 &
|
|
||||||
PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(slurp 2>/dev/null)
|
|
||||||
;;
|
|
||||||
windows)
|
|
||||||
hyprpicker -r -z >/dev/null 2>&1 &
|
|
||||||
PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
|
|
||||||
;;
|
|
||||||
fullscreen)
|
|
||||||
SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
|
|
||||||
;;
|
|
||||||
smart | *)
|
|
||||||
RECTS=$(get_rectangles)
|
|
||||||
hyprpicker -r -z >/dev/null 2>&1 &
|
|
||||||
PID=$!
|
|
||||||
sleep .1
|
|
||||||
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
|
|
||||||
|
|
||||||
# If the selection area is L * W < 20, we'll assume you were trying to select whichever
|
|
||||||
# window or output it was inside of to prevent accidental 2px snapshots
|
|
||||||
if [[ $SELECTION =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
|
|
||||||
if ((${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20)); then
|
|
||||||
click_x="${BASH_REMATCH[1]}"
|
|
||||||
click_y="${BASH_REMATCH[2]}"
|
|
||||||
|
|
||||||
while IFS= read -r rect; do
|
|
||||||
if [[ $rect =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
|
|
||||||
rect_x="${BASH_REMATCH[1]}"
|
|
||||||
rect_y="${BASH_REMATCH[2]}"
|
|
||||||
rect_width="${BASH_REMATCH[3]}"
|
|
||||||
rect_height="${BASH_REMATCH[4]}"
|
|
||||||
|
|
||||||
if ((click_x >= rect_x && click_x < rect_x + rect_width && click_y >= rect_y && click_y < rect_y + rect_height)); then
|
|
||||||
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done <<<"$RECTS"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
[[ -z $SELECTION ]] && exit 0
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
||||||
(
|
|
||||||
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
|
|
||||||
@@ -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"
|
|
||||||
+14
-5
@@ -1,8 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Set the Omarchy channel, which dictates what git branch and package repository is used.
|
# Set the Omarchy channel, which dictates what git branch and package repository is used.
|
||||||
# omarchy:args=<stable|rc|edge|dev>
|
#
|
||||||
# omarchy:requires-sudo=true
|
# Stable uses the master branch, which only sees updates on official releases, and
|
||||||
|
# the stable package repository, which typically lags the edge by a month to ensure
|
||||||
|
# better compatibility.
|
||||||
|
#
|
||||||
|
# Edge tracks the latest package repository, but still relies on the master branch,
|
||||||
|
# so new packages which require config changes may cause conflicts or errors.
|
||||||
|
#
|
||||||
|
# Dev tracks the active development dev branch, which may include partial or broken updates,
|
||||||
|
# as well as the latest package repository. This should only be used by Omarchy developers
|
||||||
|
# and people with a lot of experience managing Linux systems.
|
||||||
|
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
|
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
|
||||||
@@ -12,8 +21,8 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
case "$channel" in
|
case "$channel" in
|
||||||
"stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" ;;
|
"stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" && sudo pacman -Suu --noconfirm ;;
|
||||||
"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" ;;
|
"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" && sudo pacman -Suu --noconfirm ;;
|
||||||
"edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;;
|
"edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;;
|
||||||
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
|
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
|
||||||
*) echo "Unknown channel: $channel"; exit 1; ;;
|
*) echo "Unknown channel: $channel"; exit 1; ;;
|
||||||
|
|||||||
Executable
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.
|
||||||
|
|
||||||
|
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
|
||||||
|
|
||||||
|
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
|
||||||
|
sinks_count=$(echo "$sinks" | jq '. | length')
|
||||||
|
|
||||||
|
if [ "$sinks_count" -eq 0 ]; then
|
||||||
|
swayosd-client \
|
||||||
|
--monitor "$focused_monitor" \
|
||||||
|
--custom-message "No audio devices found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
current_sink_name=$(pactl get-default-sink)
|
||||||
|
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')
|
||||||
|
|
||||||
|
if [ "$current_sink_index" != "null" ]; then
|
||||||
|
next_sink_index=$(((current_sink_index + 1) % sinks_count))
|
||||||
|
else
|
||||||
|
next_sink_index=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
|
||||||
|
next_sink_name=$(echo "$next_sink" | jq -r '.name')
|
||||||
|
|
||||||
|
next_sink_description=$(echo "$next_sink" | jq -r '.description')
|
||||||
|
if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then
|
||||||
|
sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
|
||||||
|
next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
|
||||||
|
fi
|
||||||
|
|
||||||
|
next_sink_volume=$(echo "$next_sink" | jq -r \
|
||||||
|
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
|
||||||
|
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
|
||||||
|
|
||||||
|
if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
|
||||||
|
icon_state="muted"
|
||||||
|
elif [ "$next_sink_volume" -le 33 ]; then
|
||||||
|
icon_state="low"
|
||||||
|
elif [ "$next_sink_volume" -le 66 ]; then
|
||||||
|
icon_state="medium"
|
||||||
|
else
|
||||||
|
icon_state="high"
|
||||||
|
fi
|
||||||
|
|
||||||
|
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
|
||||||
|
|
||||||
|
if [ "$next_sink_name" != "$current_sink_name" ]; then
|
||||||
|
pactl set-default-sink "$next_sink_name"
|
||||||
|
fi
|
||||||
|
|
||||||
|
swayosd-client \
|
||||||
|
--monitor "$focused_monitor" \
|
||||||
|
--custom-message "$next_sink_description" \
|
||||||
|
--custom-icon "$next_sink_volume_icon"
|
||||||
@@ -1,26 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Finish the installation of Omarchy with items that can only be done after logging in.
|
# Finish the installation of Omarchy with items that can only be done after logging in.
|
||||||
# omarchy:requires-sudo=true
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
|
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
|
||||||
|
|
||||||
if [[ -f $FIRST_RUN_MODE ]]; then
|
if [[ -f "$FIRST_RUN_MODE" ]]; then
|
||||||
rm -f "$FIRST_RUN_MODE"
|
rm -f "$FIRST_RUN_MODE"
|
||||||
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
|
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
|
||||||
bash "$OMARCHY_PATH/install/first-run/recover-internal-monitor.sh"
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh"
|
bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh"
|
||||||
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
|
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
|
||||||
bash "$OMARCHY_PATH/install/first-run/dns-resolver.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/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"
|
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
|
sudo rm -f /etc/sudoers.d/first-run
|
||||||
|
|
||||||
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
|
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Check whether any required commands are missing
|
# Returns true if any of the commands passed in as arguments are missing on the system.
|
||||||
|
|
||||||
for cmd in "$@"; do
|
for cmd in "$@"; do
|
||||||
if ! command -v "$cmd" &>/dev/null; then
|
if ! command -v "$cmd" &>/dev/null; then
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Check whether all required commands are available
|
# Returns true if all the commands passed in as arguments exit on the system.
|
||||||
|
|
||||||
for cmd in "$@"; do
|
for cmd in "$@"; do
|
||||||
command -v "$cmd" &>/dev/null || exit 1
|
command -v "$cmd" &>/dev/null || exit 1
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Reboot after closing application windows
|
# Reboot command that first closes all application windows (thus giving them a chance to save state).
|
||||||
# omarchy:examples=omarchy reboot | omarchy system reboot
|
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
||||||
# omarchy:aliases=omarchy reboot
|
|
||||||
|
|
||||||
omarchy-state clear re*-required
|
omarchy-state clear re*-required
|
||||||
|
|
||||||
Executable
+134
@@ -0,0 +1,134 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Start and stop a screenrecording, which will be saved to ~/Videos by default.
|
||||||
|
# Alternative location can be set via OMARCHY_SCREENRECORD_DIR or XDG_VIDEOS_DIR ENVs.
|
||||||
|
|
||||||
|
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
||||||
|
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
|
||||||
|
|
||||||
|
if [[ ! -d "$OUTPUT_DIR" ]]; then
|
||||||
|
notify-send "Screen recording directory does not exist: $OUTPUT_DIR" -u critical -t 3000
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DESKTOP_AUDIO="false"
|
||||||
|
MICROPHONE_AUDIO="false"
|
||||||
|
WEBCAM="false"
|
||||||
|
WEBCAM_DEVICE=""
|
||||||
|
STOP_RECORDING="false"
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
--with-desktop-audio) DESKTOP_AUDIO="true" ;;
|
||||||
|
--with-microphone-audio) MICROPHONE_AUDIO="true" ;;
|
||||||
|
--with-webcam) WEBCAM="true" ;;
|
||||||
|
--webcam-device=*) WEBCAM_DEVICE="${arg#*=}" ;;
|
||||||
|
--stop-recording) STOP_RECORDING="true"
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
cleanup_webcam() {
|
||||||
|
pkill -f "WebcamOverlay" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
start_webcam_overlay() {
|
||||||
|
cleanup_webcam
|
||||||
|
|
||||||
|
# Auto-detect first available webcam if none specified
|
||||||
|
if [[ -z "$WEBCAM_DEVICE" ]]; then
|
||||||
|
WEBCAM_DEVICE=$(v4l2-ctl --list-devices 2>/dev/null | grep -m1 "^\s*/dev/video" | tr -d '\t')
|
||||||
|
if [[ -z "$WEBCAM_DEVICE" ]]; then
|
||||||
|
notify-send "No webcam devices found" -u critical -t 3000
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get monitor scale
|
||||||
|
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
|
||||||
|
|
||||||
|
# Target width (base 360px, scaled to monitor)
|
||||||
|
local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}")
|
||||||
|
|
||||||
|
# Try preferred 16:9 resolutions in order, use first available
|
||||||
|
local preferred_resolutions=("640x360" "1280x720" "1920x1080")
|
||||||
|
local video_size_arg=""
|
||||||
|
local available_formats=$(v4l2-ctl --list-formats-ext -d "$WEBCAM_DEVICE" 2>/dev/null)
|
||||||
|
|
||||||
|
for resolution in "${preferred_resolutions[@]}"; do
|
||||||
|
if echo "$available_formats" | grep -q "$resolution"; then
|
||||||
|
video_size_arg="-video_size $resolution"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
ffplay -f v4l2 $video_size_arg -framerate 30 "$WEBCAM_DEVICE" \
|
||||||
|
-vf "scale=${target_width}:-1" \
|
||||||
|
-window_title "WebcamOverlay" \
|
||||||
|
-noborder \
|
||||||
|
-fflags nobuffer -flags low_delay \
|
||||||
|
-probesize 32 -analyzeduration 0 \
|
||||||
|
-loglevel quiet &
|
||||||
|
sleep 1
|
||||||
|
}
|
||||||
|
|
||||||
|
start_screenrecording() {
|
||||||
|
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
|
||||||
|
local audio_devices=""
|
||||||
|
local audio_args=""
|
||||||
|
|
||||||
|
[[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output"
|
||||||
|
|
||||||
|
if [[ "$MICROPHONE_AUDIO" == "true" ]]; then
|
||||||
|
# Merge audio tracks into one - separate tracks only play one at a time in most players
|
||||||
|
[[ -n "$audio_devices" ]] && audio_devices+="|"
|
||||||
|
audio_devices+="default_input"
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ -n "$audio_devices" ]] && audio_args+="-a $audio_devices"
|
||||||
|
|
||||||
|
gpu-screen-recorder -w portal -f 60 -fallback-cpu-encoding yes -o "$filename" $audio_args -ac aac &
|
||||||
|
toggle_screenrecording_indicator
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_screenrecording() {
|
||||||
|
pkill -SIGINT -f "^gpu-screen-recorder" # SIGINT required to save video properly
|
||||||
|
|
||||||
|
# Wait a maximum of 5 seconds to finish before hard killing
|
||||||
|
local count=0
|
||||||
|
while pgrep -f "^gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
|
||||||
|
sleep 0.1
|
||||||
|
count=$((count + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if pgrep -f "^gpu-screen-recorder" >/dev/null; then
|
||||||
|
pkill -9 -f "^gpu-screen-recorder"
|
||||||
|
cleanup_webcam
|
||||||
|
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
|
||||||
|
else
|
||||||
|
cleanup_webcam
|
||||||
|
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
|
||||||
|
fi
|
||||||
|
toggle_screenrecording_indicator
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle_screenrecording_indicator() {
|
||||||
|
pkill -RTMIN+8 waybar
|
||||||
|
}
|
||||||
|
|
||||||
|
screenrecording_active() {
|
||||||
|
pgrep -f "^gpu-screen-recorder" >/dev/null || pgrep -f "WebcamOverlay" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
if screenrecording_active; then
|
||||||
|
if pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "^gpu-screen-recorder" >/dev/null; then
|
||||||
|
cleanup_webcam
|
||||||
|
else
|
||||||
|
stop_screenrecording
|
||||||
|
fi
|
||||||
|
elif [[ "$STOP_RECORDING" == "false" ]]; then
|
||||||
|
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
|
||||||
|
|
||||||
|
start_screenrecording || cleanup_webcam
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Run the Omarchy screensaver using random effects from TTE.
|
# Run the Omarchy screensaver using random effects from TTE.
|
||||||
|
|
||||||
screensaver_in_focus() {
|
screensaver_in_focus() {
|
||||||
hyprctl activewindow -j | jq -e '.class == "org.omarchy.screensaver"' >/dev/null 2>&1
|
hyprctl activewindow -j | jq -e '.class == "org.omarchy.screensaver"' >/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
exit_screensaver() {
|
exit_screensaver() {
|
||||||
hyprctl eval 'hl.config({ cursor = { invisible = false } })' &>/dev/null || hyprctl keyword cursor:invisible false &>/dev/null || true
|
hyprctl keyword cursor:invisible false &>/dev/null || true
|
||||||
pkill -x tte 2>/dev/null
|
pkill -x tte 2>/dev/null
|
||||||
pkill -f org.omarchy.screensaver 2>/dev/null
|
pkill -f org.omarchy.screensaver 2>/dev/null
|
||||||
exit 0
|
exit 0
|
||||||
@@ -18,14 +18,15 @@ trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
|
|||||||
|
|
||||||
printf '\033]11;rgb:00/00/00\007' # Set background color to black
|
printf '\033]11;rgb:00/00/00\007' # Set background color to black
|
||||||
|
|
||||||
hyprctl eval 'hl.config({ cursor = { invisible = true } })' &>/dev/null || hyprctl keyword cursor:invisible true &>/dev/null
|
hyprctl keyword cursor:invisible true &>/dev/null
|
||||||
|
|
||||||
tty=$(tty 2>/dev/null)
|
tty=$(tty 2>/dev/null)
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
tte -i ~/.config/omarchy/branding/screensaver.txt \
|
tte -i ~/.config/omarchy/branding/screensaver.txt \
|
||||||
--frame-rate 120 --canvas-width 0 --canvas-height 0 --reuse-canvas --anchor-canvas c --anchor-text c\
|
--frame-rate 120 --canvas-width 0 --canvas-height 0 --reuse-canvas --anchor-canvas c --anchor-text c\
|
||||||
--random-effect --no-eol --no-restore-cursor &
|
--random-effect --exclude-effects dev_worm \
|
||||||
|
--no-eol --no-restore-cursor &
|
||||||
|
|
||||||
while pgrep -t "${tty#/dev/}" -x tte >/dev/null; do
|
while pgrep -t "${tty#/dev/}" -x tte >/dev/null; do
|
||||||
if read -n1 -t 1 || ! screensaver_in_focus; then
|
if read -n1 -t 1 || ! screensaver_in_focus; then
|
||||||
Executable
+117
@@ -0,0 +1,117 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Take a screenshot of the whole screen, a specific window, or a user-drawn region.
|
||||||
|
# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs.
|
||||||
|
# Editor defaults to Satty but can be changed via --editor=<name> or OMARCHY_SCREENSHOT_EDITOR env
|
||||||
|
|
||||||
|
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
|
||||||
|
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
|
||||||
|
|
||||||
|
if [[ ! -d "$OUTPUT_DIR" ]]; then
|
||||||
|
notify-send "Screenshot directory does not exist: $OUTPUT_DIR" -u critical -t 3000
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
pkill slurp && exit 0
|
||||||
|
|
||||||
|
SCREENSHOT_EDITOR="${OMARCHY_SCREENSHOT_EDITOR:-satty}"
|
||||||
|
|
||||||
|
# Parse --editor flag from any position
|
||||||
|
ARGS=()
|
||||||
|
for arg in "$@"; do
|
||||||
|
if [[ "$arg" == --editor=* ]]; then
|
||||||
|
SCREENSHOT_EDITOR="${arg#--editor=}"
|
||||||
|
else
|
||||||
|
ARGS+=("$arg")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
set -- "${ARGS[@]}"
|
||||||
|
|
||||||
|
open_editor() {
|
||||||
|
local filepath="$1"
|
||||||
|
if [[ "$SCREENSHOT_EDITOR" == "satty" ]]; then
|
||||||
|
satty --filename "$filepath" \
|
||||||
|
--output-filename "$filepath" \
|
||||||
|
--early-exit \
|
||||||
|
--actions-on-enter save-to-clipboard \
|
||||||
|
--save-after-copy \
|
||||||
|
--copy-command 'wl-copy'
|
||||||
|
else
|
||||||
|
$SCREENSHOT_EDITOR "$filepath"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
MODE="${1:-smart}"
|
||||||
|
PROCESSING="${2:-slurp}"
|
||||||
|
|
||||||
|
get_rectangles() {
|
||||||
|
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
|
||||||
|
hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"'
|
||||||
|
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Select based on mode
|
||||||
|
case "$MODE" in
|
||||||
|
region)
|
||||||
|
wayfreeze & PID=$!
|
||||||
|
sleep .1
|
||||||
|
SELECTION=$(slurp 2>/dev/null)
|
||||||
|
kill $PID 2>/dev/null
|
||||||
|
;;
|
||||||
|
windows)
|
||||||
|
wayfreeze & PID=$!
|
||||||
|
sleep .1
|
||||||
|
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
|
||||||
|
kill $PID 2>/dev/null
|
||||||
|
;;
|
||||||
|
fullscreen)
|
||||||
|
SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"')
|
||||||
|
;;
|
||||||
|
smart|*)
|
||||||
|
RECTS=$(get_rectangles)
|
||||||
|
wayfreeze & PID=$!
|
||||||
|
sleep .1
|
||||||
|
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
|
||||||
|
kill $PID 2>/dev/null
|
||||||
|
|
||||||
|
# If the selection area is L * W < 20, we'll assume you were trying to select whichever
|
||||||
|
# window or output it was inside of to prevent accidental 2px snapshots
|
||||||
|
if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
|
||||||
|
if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
|
||||||
|
click_x="${BASH_REMATCH[1]}"
|
||||||
|
click_y="${BASH_REMATCH[2]}"
|
||||||
|
|
||||||
|
while IFS= read -r rect; do
|
||||||
|
if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
|
||||||
|
rect_x="${BASH_REMATCH[1]}"
|
||||||
|
rect_y="${BASH_REMATCH[2]}"
|
||||||
|
rect_width="${BASH_REMATCH[3]}"
|
||||||
|
rect_height="${BASH_REMATCH[4]}"
|
||||||
|
|
||||||
|
if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then
|
||||||
|
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done <<< "$RECTS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[[ -z $SELECTION ]] && exit 0
|
||||||
|
|
||||||
|
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
|
||||||
|
FILEPATH="$OUTPUT_DIR/$FILENAME"
|
||||||
|
|
||||||
|
if [[ $PROCESSING == "slurp" ]]; then
|
||||||
|
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
||||||
|
wl-copy < "$FILEPATH"
|
||||||
|
|
||||||
|
(
|
||||||
|
ACTION=$(notify-send "Screenshot copied & saved" "Click to edit" -t 10000 -i "$FILEPATH" -A "default=edit")
|
||||||
|
[[ "$ACTION" == "default" ]] && open_editor "$FILEPATH"
|
||||||
|
) &
|
||||||
|
else
|
||||||
|
grim -g "$SELECTION" - | wl-copy
|
||||||
|
fi
|
||||||
@@ -1,13 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Share clipboard, files, or folders with LocalSend
|
# Share clipboard, file, or folder using LocalSend. Bound to Super + Ctrl + S by default.
|
||||||
# omarchy:group=share
|
|
||||||
# omarchy:name=
|
|
||||||
# omarchy:args=<clipboard|file|folder> [path...]
|
|
||||||
# omarchy:examples=omarchy share clipboard | omarchy share file ~/Downloads/example.txt
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
echo "Usage: omarchy-menu-share [clipboard|file|folder]"
|
echo "Usage: omarchy-cmd-share [clipboard|file|folder]"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -29,7 +25,7 @@ else
|
|||||||
# Pick one or more files from home directory
|
# Pick one or more files from home directory
|
||||||
FILES=$(find "$HOME" -type f 2>/dev/null | fzf --multi)
|
FILES=$(find "$HOME" -type f 2>/dev/null | fzf --multi)
|
||||||
fi
|
fi
|
||||||
[[ -z $FILES ]] && exit 0
|
[ -z "$FILES" ] && exit 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Shut down after closing application windows
|
# Shutdown command that first closes all application windows (thus giving them a chance to save state).
|
||||||
# omarchy:examples=omarchy shutdown | omarchy system shutdown
|
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
||||||
# omarchy:aliases=omarchy shutdown
|
|
||||||
|
|
||||||
omarchy-state clear re*-required
|
omarchy-state clear re*-required
|
||||||
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Print the current working directory of the active terminal window
|
# Returns the current working directory of the active terminal window,
|
||||||
# omarchy:hidden=true
|
# so a new terminal window can be started in the same directory.
|
||||||
|
|
||||||
|
# Go from current active terminal to its child shell process and run cwd there
|
||||||
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
|
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
|
||||||
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
|
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
|
||||||
|
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Add or remove an EFI boot entry for the Omarchy UKI, allowing the system to boot directly
|
|
||||||
# omarchy:requires-sudo=true
|
|
||||||
|
|
||||||
if [[ ! -d /sys/firmware/efi ]]; then
|
|
||||||
echo "Error: System is not booted in UEFI mode" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! efibootmgr &>/dev/null; then
|
|
||||||
echo "Error: efibootmgr is not available or not functional" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "American Megatrends"; then
|
|
||||||
echo "Error: American Megatrends firmware may not safely support custom EFI entries" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
|
|
||||||
echo "Error: Apple firmware uses its own boot manager" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
existing_entry=$(efibootmgr | grep -E "^Boot[0-9A-Fa-f]+\*? Omarchy([[:space:]]|$)" | head -1)
|
|
||||||
|
|
||||||
if [[ -n $existing_entry ]]; then
|
|
||||||
boot_num=$(echo "$existing_entry" | sed -n 's/^Boot\([0-9A-Fa-f]\+\).*/\1/p')
|
|
||||||
|
|
||||||
if gum confirm "Disable direct boot (remove Omarchy EFI entry)?"; then
|
|
||||||
echo "Removing EFI boot entry $boot_num"
|
|
||||||
sudo efibootmgr --bootnum "$boot_num" --delete-bootnum >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
|
|
||||||
|
|
||||||
if [[ -z $uki_file ]]; then
|
|
||||||
echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
boot_source=$(findmnt -n -o SOURCE /boot)
|
|
||||||
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//')
|
|
||||||
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
|
|
||||||
|
|
||||||
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then
|
|
||||||
echo "Creating EFI boot entry for $uki_file"
|
|
||||||
|
|
||||||
sudo efibootmgr --create \
|
|
||||||
--disk "$disk" \
|
|
||||||
--part "$part" \
|
|
||||||
--label "Omarchy" \
|
|
||||||
--loader "\\EFI\\Linux\\$uki_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
+6
-9
@@ -1,14 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Print debugging information
|
# Return exhaustive debugging information about the system to help diagnose problems.
|
||||||
# omarchy:args=[--no-sudo] [--print]
|
|
||||||
# omarchy:examples=omarchy debug --print --no-sudo
|
|
||||||
# omarchy:requires-sudo=true
|
|
||||||
|
|
||||||
NO_SUDO=false
|
NO_SUDO=false
|
||||||
PRINT_ONLY=false
|
PRINT_ONLY=false
|
||||||
|
|
||||||
while (( $# > 0 )); do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--no-sudo)
|
--no-sudo)
|
||||||
NO_SUDO=true
|
NO_SUDO=true
|
||||||
@@ -28,7 +25,7 @@ done
|
|||||||
|
|
||||||
LOG_FILE="/tmp/omarchy-debug.log"
|
LOG_FILE="/tmp/omarchy-debug.log"
|
||||||
|
|
||||||
if [[ $NO_SUDO = "true" ]]; then
|
if [ "$NO_SUDO" = true ]; then
|
||||||
DMESG_OUTPUT="(skipped - --no-sudo flag used)"
|
DMESG_OUTPUT="(skipped - --no-sudo flag used)"
|
||||||
else
|
else
|
||||||
DMESG_OUTPUT="$(sudo dmesg)"
|
DMESG_OUTPUT="$(sudo dmesg)"
|
||||||
@@ -50,7 +47,7 @@ DMESG
|
|||||||
$DMESG_OUTPUT
|
$DMESG_OUTPUT
|
||||||
|
|
||||||
=========================================
|
=========================================
|
||||||
JOURNALCTL (CURRENT BOOT, WARNINGS+ERRORS)
|
JOURNALCTL (CURRENT BOOT, ERRORS ONLY)
|
||||||
=========================================
|
=========================================
|
||||||
$(journalctl -b -p 4..1)
|
$(journalctl -b -p 4..1)
|
||||||
|
|
||||||
@@ -60,7 +57,7 @@ INSTALLED PACKAGES
|
|||||||
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
|
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [[ $PRINT_ONLY = "true" ]]; then
|
if [ "$PRINT_ONLY" = true ]; then
|
||||||
cat "$LOG_FILE"
|
cat "$LOG_FILE"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -76,7 +73,7 @@ case "$ACTION" in
|
|||||||
"Upload log")
|
"Upload log")
|
||||||
echo "Uploading debug log to 0x0.st..."
|
echo "Uploading debug log to 0x0.st..."
|
||||||
URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st)
|
URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st)
|
||||||
if (( $? == 0 )) && [[ -n $URL ]]; then
|
if [ $? -eq 0 ] && [ -n "$URL" ]; then
|
||||||
echo "✓ Log uploaded successfully!"
|
echo "✓ Log uploaded successfully!"
|
||||||
echo "Share this URL:"
|
echo "Share this URL:"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
@@ -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,12 +1,13 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Creates a new Omarchy migration named after the unix timestamp of the last commit.
|
# Creates a new Omarchy migration named after the unix timestamp of the last commit.
|
||||||
|
# Only intended for Omarchy developers.
|
||||||
|
|
||||||
cd ~/.local/share/omarchy
|
cd ~/.local/share/omarchy
|
||||||
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
|
||||||
touch $migration_file
|
touch $migration_file
|
||||||
|
|
||||||
if [[ $1 != "--no-edit" ]]; then
|
if [[ "$1" != "--no-edit" ]]; then
|
||||||
nvim $migration_file
|
nvim $migration_file
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Measure Omarchy CLI response times
|
|
||||||
# omarchy:args=[--repeat=<count>]
|
|
||||||
# omarchy:examples=omarchy dev benchmark | omarchy dev benchmark --repeat=10
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
OMARCHY_BIN_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
|
||||||
CLI="$OMARCHY_BIN_DIR/omarchy"
|
|
||||||
REPEAT=5
|
|
||||||
|
|
||||||
show_help() {
|
|
||||||
cat <<'EOF'
|
|
||||||
Usage:
|
|
||||||
omarchy dev benchmark [--repeat=<count>]
|
|
||||||
|
|
||||||
Measure response times for common Omarchy CLI surfaces.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--repeat=<count> Number of times to run each case (default: 5)
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
now_us() {
|
|
||||||
local now="${EPOCHREALTIME/./}"
|
|
||||||
printf '%s' "$now"
|
|
||||||
}
|
|
||||||
|
|
||||||
format_ms() {
|
|
||||||
local us="$1"
|
|
||||||
printf '%d.%03d' "$(( us / 1000 ))" "$(( us % 1000 ))"
|
|
||||||
}
|
|
||||||
|
|
||||||
run_case() {
|
|
||||||
local label="$1"
|
|
||||||
shift
|
|
||||||
local total_us=0
|
|
||||||
local min_us=0
|
|
||||||
local max_us=0
|
|
||||||
local elapsed_us=0
|
|
||||||
local start_us=0
|
|
||||||
local end_us=0
|
|
||||||
local status=0
|
|
||||||
|
|
||||||
for (( i = 1; i <= REPEAT; i++ )); do
|
|
||||||
start_us=$(now_us)
|
|
||||||
if "$@" >/dev/null; then
|
|
||||||
status=0
|
|
||||||
else
|
|
||||||
status=$?
|
|
||||||
fi
|
|
||||||
end_us=$(now_us)
|
|
||||||
|
|
||||||
if (( status != 0 )); then
|
|
||||||
printf '%-34s failed (exit %d)\n' "$label" "$status"
|
|
||||||
return "$status"
|
|
||||||
fi
|
|
||||||
|
|
||||||
elapsed_us=$(( end_us - start_us ))
|
|
||||||
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#*=}"
|
|
||||||
;;
|
|
||||||
--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
|
|
||||||
|
|
||||||
printf 'Omarchy CLI benchmark (%d runs each)\n\n' "$REPEAT"
|
|
||||||
run_case "omarchy" "$CLI"
|
|
||||||
run_case "omarchy --help" "$CLI" --help
|
|
||||||
run_case "omarchy commands" "$CLI" commands
|
|
||||||
run_case "omarchy commands --json" "$CLI" commands --json
|
|
||||||
run_case "omarchy commands --all --json" "$CLI" commands --all --json
|
|
||||||
run_case "omarchy theme set --help" "$CLI" theme set --help
|
|
||||||
run_case "omarchy screenshot --help" "$CLI" screenshot --help
|
|
||||||
run_case "omarchy restart --help" "$CLI" restart --help
|
|
||||||
run_case "omarchy theme current" "$CLI" theme current
|
|
||||||
@@ -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)"
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Show Omarchy bin metadata fields and defaults
|
|
||||||
# omarchy:args=[--json]
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
show_json() {
|
|
||||||
jq -n '{
|
|
||||||
ok: true,
|
|
||||||
defaults: {
|
|
||||||
group: "first filename segment after omarchy-",
|
|
||||||
name: "remaining filename segments with dashes converted to spaces",
|
|
||||||
route: "omarchy <group> <name>",
|
|
||||||
binary: "filename",
|
|
||||||
requires_sudo: false
|
|
||||||
},
|
|
||||||
fields: [
|
|
||||||
{name: "summary", required: true, type: "string", note: "One-line human and agent-facing description."},
|
|
||||||
{name: "group", required: false, type: "string", note: "Only set when the route group should differ from the filename-derived group."},
|
|
||||||
{name: "name", required: false, type: "string", note: "Only set when the route name should differ from the filename-derived name. May be empty for root commands."},
|
|
||||||
{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."}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
}
|
|
||||||
|
|
||||||
show_help() {
|
|
||||||
cat <<'EOF'
|
|
||||||
Omarchy bin metadata
|
|
||||||
|
|
||||||
Metadata lives in the top comment block of each executable bin/omarchy-* file.
|
|
||||||
Keep it slim: define only fields that are required or override defaults.
|
|
||||||
|
|
||||||
Required:
|
|
||||||
# omarchy:summary=<one-line description>
|
|
||||||
|
|
||||||
Inferred defaults:
|
|
||||||
group first filename segment after omarchy-
|
|
||||||
name remaining filename segments, with dashes converted to spaces
|
|
||||||
route omarchy <group> <name>
|
|
||||||
binary filename
|
|
||||||
requires-sudo false
|
|
||||||
hidden false
|
|
||||||
|
|
||||||
Optional fields:
|
|
||||||
# omarchy:group=<group> route override only
|
|
||||||
# omarchy:name=<name> route override only; may be empty
|
|
||||||
# omarchy:args=<args> only if the command accepts args
|
|
||||||
# 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
|
|
||||||
usage derived from route + args
|
|
||||||
false flags or empty args
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
# omarchy:summary=Restart Walker and related user services
|
|
||||||
|
|
||||||
# omarchy:summary=Take a screenshot
|
|
||||||
# omarchy:group=capture
|
|
||||||
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
|
|
||||||
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
|
|
||||||
# omarchy:aliases=omarchy screenshot
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
case "${1:-}" in
|
|
||||||
--json)
|
|
||||||
show_json
|
|
||||||
;;
|
|
||||||
--help | -h)
|
|
||||||
show_help
|
|
||||||
;;
|
|
||||||
"")
|
|
||||||
show_help
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown option: $1" >&2
|
|
||||||
show_help >&2
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
+5
-26
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Print drive information such as size, model, and mount details
|
# Returns drive information about a given volumne, like /dev/nvme0, which is used by omarchy-drive-select.
|
||||||
# omarchy:args=<drive>
|
|
||||||
|
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
echo "Usage: omarchy-drive-info [/dev/drive]"
|
echo "Usage: omarchy-drive-info [/dev/drive]"
|
||||||
@@ -12,7 +11,7 @@ fi
|
|||||||
|
|
||||||
# Find the root drive in case we are looking at partitions
|
# Find the root drive in case we are looking at partitions
|
||||||
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
|
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
|
||||||
if [[ -n $root_drive ]]; then
|
if [[ -n "$root_drive" ]]; then
|
||||||
root_drive="/dev/$root_drive"
|
root_drive="/dev/$root_drive"
|
||||||
else
|
else
|
||||||
root_drive="$drive"
|
root_drive="$drive"
|
||||||
@@ -20,31 +19,11 @@ fi
|
|||||||
|
|
||||||
# Get basic disk information
|
# Get basic disk information
|
||||||
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
|
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
|
||||||
vendor=$(lsblk -dno VENDOR "$root_drive" 2>/dev/null | sed 's/ *$//')
|
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null)
|
||||||
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null | sed 's/ *$//')
|
|
||||||
|
|
||||||
# Combine vendor and model, avoiding duplication
|
|
||||||
label=""
|
|
||||||
if [[ -n $vendor && -n $model ]]; then
|
|
||||||
if [[ $model == *$vendor* ]]; then
|
|
||||||
label="$model"
|
|
||||||
else
|
|
||||||
label="$vendor $model"
|
|
||||||
fi
|
|
||||||
elif [[ -n $model ]]; then
|
|
||||||
label="$model"
|
|
||||||
elif [[ -n $vendor ]]; then
|
|
||||||
label="$vendor"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Format display string
|
# Format display string
|
||||||
display="$drive"
|
display="$drive"
|
||||||
[[ -n $size ]] && display="$display ($size)"
|
[[ -n "$size" ]] && display="$display ($size)"
|
||||||
[[ -n $label ]] && display="$display - $label"
|
[[ -n "$model" ]] && display="$display - $model"
|
||||||
|
|
||||||
# Append compact partition summary
|
|
||||||
part_summary=$(lsblk -nro TYPE,NAME,FSTYPE,MOUNTPOINT "$root_drive" 2>/dev/null | \
|
|
||||||
awk '$1=="part" { printf "%s%s%s", s, ($3==""?"unknown":$3), ($4==""?"":"("$4")"); s=", " }')
|
|
||||||
[[ -n $part_summary ]] && display+=" [$part_summary]"
|
|
||||||
|
|
||||||
echo "$display"
|
echo "$display"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-password.
|
# Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.
|
||||||
|
|
||||||
if (($# == 0)); then
|
if (($# == 0)); then
|
||||||
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
|
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
|
||||||
@@ -10,7 +10,7 @@ fi
|
|||||||
|
|
||||||
drives_with_info=""
|
drives_with_info=""
|
||||||
while IFS= read -r drive; do
|
while IFS= read -r drive; do
|
||||||
[[ -n $drive ]] || continue
|
[[ -n "$drive" ]] || continue
|
||||||
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
|
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
|
||||||
done <<<"$drives"
|
done <<<"$drives"
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Set a new encryption password for a drive selected.
|
# Set a new encryption password for a drive selected.
|
||||||
# omarchy:requires-sudo=true
|
|
||||||
|
|
||||||
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
|
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
|
||||||
|
|
||||||
if [[ -n $encrypted_drives ]]; then
|
if [[ -n $encrypted_drives ]]; then
|
||||||
if (( $(wc -l <<<"$encrypted_drives") == 1 )); then
|
if [[ $(wc -l <<<"$encrypted_drives") -eq 1 ]]; then
|
||||||
drive_to_change="$encrypted_drives"
|
drive_to_change="$encrypted_drives"
|
||||||
else
|
else
|
||||||
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
|
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Show current monospace font
|
# Returns the name of the current monospace font being used by extracting it from the Waybar stylesheet.
|
||||||
# omarchy:examples=omarchy font current
|
# This can be changed using omarchy-font-set.
|
||||||
|
|
||||||
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1
|
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=List available monospace fonts
|
# Returns a list of all the monospace fonts available on the system that can be set using omarchy-font-set.
|
||||||
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
|
|
||||||
|
|
||||||
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u
|
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u
|
||||||
|
|||||||
+4
-13
@@ -1,12 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Set the system monospace font
|
# Set the system-wide monospace font that should be used by the terminal, hyprlock, waybar, swayosd, etc.
|
||||||
# omarchy:args=<font-name>
|
# The font name must be one of the ones returned by omarchy-font-list.
|
||||||
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
|
|
||||||
|
|
||||||
font_name="$1"
|
font_name="$1"
|
||||||
|
|
||||||
if [[ -n $font_name ]]; then
|
if [[ -n "$font_name" ]]; then
|
||||||
if fc-list | grep -iq "$font_name"; then
|
if fc-list | grep -iq "$font_name"; then
|
||||||
if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
|
if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
|
||||||
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
|
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
|
||||||
@@ -22,10 +21,6 @@ if [[ -n $font_name ]]; then
|
|||||||
pkill -SIGUSR2 ghostty
|
pkill -SIGUSR2 ghostty
|
||||||
fi
|
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/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/waybar/style.css
|
||||||
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
|
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
|
||||||
@@ -38,11 +33,7 @@ if [[ -n $font_name ]]; then
|
|||||||
omarchy-restart-swayosd
|
omarchy-restart-swayosd
|
||||||
|
|
||||||
if pgrep -x ghostty; then
|
if pgrep -x ghostty; then
|
||||||
notify-send -u low " You must restart Ghostty to see font change"
|
notify-send " 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
|
fi
|
||||||
|
|
||||||
omarchy-hook font-set "$font_name"
|
omarchy-hook font-set "$font_name"
|
||||||
|
|||||||
@@ -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"
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Check if hibernation is supported
|
# Check if hibernation is supported
|
||||||
|
|
||||||
if [[ ! -f /sys/power/image_size ]]; then
|
if [[ ! -f /sys/power/image_size ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -12,7 +11,7 @@ SWAPSIZE=$(( 1024 * ${SWAPSIZE_KB:-0} ))
|
|||||||
|
|
||||||
HIBERNATION_IMAGE_SIZE=$(cat /sys/power/image_size)
|
HIBERNATION_IMAGE_SIZE=$(cat /sys/power/image_size)
|
||||||
|
|
||||||
if (( SWAPSIZE > HIBERNATION_IMAGE_SIZE )) && [[ -f /etc/mkinitcpio.conf.d/omarchy_resume.conf ]]; then
|
if [[ "$SWAPSIZE" -gt "$HIBERNATION_IMAGE_SIZE" ]] && [[ -f /etc/mkinitcpio.conf.d/omarchy_resume.conf ]]; then
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Remove hibernation setup including swap and boot resume settings
|
# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry,
|
||||||
# omarchy:requires-sudo=true
|
# removes resume hook, and removes suspend-then-hibernate configuration.
|
||||||
|
|
||||||
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
|
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
|
||||||
|
|
||||||
# Check if hibernation is configured
|
# Check if hibernation is configured
|
||||||
if [[ ! -f $MKINITCPIO_CONF ]] || ! grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
|
if [ ! -f "$MKINITCPIO_CONF" ] || ! grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
|
||||||
echo "Hibernation is not set up"
|
echo "Hibernation is not set up"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -25,7 +25,7 @@ if swapon --show | grep -q "$SWAP_FILE"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove swapfile
|
# Remove swapfile
|
||||||
if [[ -f $SWAP_FILE ]]; then
|
if [ -f "$SWAP_FILE" ]; then
|
||||||
echo "Removing swapfile"
|
echo "Removing swapfile"
|
||||||
sudo rm "$SWAP_FILE"
|
sudo rm "$SWAP_FILE"
|
||||||
fi
|
fi
|
||||||
@@ -44,6 +44,11 @@ if grep -Fq "$SWAP_FILE" /etc/fstab; then
|
|||||||
sudo sed -i '/^# Btrfs swapfile for system hibernation$/d' /etc/fstab
|
sudo sed -i '/^# Btrfs swapfile for system hibernation$/d' /etc/fstab
|
||||||
fi
|
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
|
# Remove mkinitcpio resume hook
|
||||||
echo "Removing resume hook"
|
echo "Removing resume hook"
|
||||||
sudo rm "$MKINITCPIO_CONF"
|
sudo rm "$MKINITCPIO_CONF"
|
||||||
|
|||||||
@@ -1,52 +1,23 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Set up hibernation with swap and boot resume configuration
|
# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab,
|
||||||
# omarchy:requires-sudo=true
|
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.
|
||||||
# omarchy:args=[--force] [--no-rebuild]
|
|
||||||
|
|
||||||
FORCE=false
|
|
||||||
NO_REBUILD=false
|
|
||||||
for arg in "$@"; do
|
|
||||||
case "$arg" in
|
|
||||||
--force) FORCE=true ;;
|
|
||||||
--no-rebuild) NO_REBUILD=true ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ! -f /sys/power/image_size ]]; then
|
if [[ ! -f /sys/power/image_size ]]; then
|
||||||
echo -e "Hibernation is not supported on your system" >&2
|
echo -e "\033[31mError: Hibernation is not supported on your system\033[0m" >&2
|
||||||
exit 0
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# When --no-rebuild is set, the caller is responsible for the UKI rebuild
|
|
||||||
# (e.g. running before limine-mkinitcpio-hook is installed during initial
|
|
||||||
# install), so we only require limine-mkinitcpio when we'd invoke it ourselves.
|
|
||||||
if ! $NO_REBUILD && ! command -v limine-mkinitcpio &>/dev/null; then
|
|
||||||
echo "Skipping hibernation setup (requires Limine bootloader)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
|
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
|
||||||
SWAP_FILE="/swap/swapfile"
|
|
||||||
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
|
|
||||||
|
|
||||||
# Check if hibernation is already configured
|
# Check if hibernation is already configured
|
||||||
if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
|
if [ -f "$MKINITCPIO_CONF" ] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
|
||||||
# Fix empty resume_offset if btrfs map-swapfile failed during initial setup
|
|
||||||
if [[ -f $RESUME_DROP_IN ]] && grep -q 'resume_offset="$' "$RESUME_DROP_IN" && [[ -f $SWAP_FILE ]]; then
|
|
||||||
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE" 2>/dev/null)
|
|
||||||
if [[ -n $RESUME_OFFSET ]]; then
|
|
||||||
echo "Fixing empty resume_offset ($RESUME_OFFSET)"
|
|
||||||
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" "$RESUME_DROP_IN"
|
|
||||||
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" /etc/default/limine
|
|
||||||
$NO_REBUILD || sudo limine-mkinitcpio
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
echo "Hibernation is already set up"
|
echo "Hibernation is already set up"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $FORCE; then
|
if [[ $1 != "--force" ]]; then
|
||||||
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
|
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
|
||||||
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
|
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
|
||||||
exit 0
|
exit 0
|
||||||
@@ -54,6 +25,7 @@ if ! $FORCE; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
SWAP_SUBVOLUME="/swap"
|
SWAP_SUBVOLUME="/swap"
|
||||||
|
SWAP_FILE="$SWAP_SUBVOLUME/swapfile"
|
||||||
|
|
||||||
# Create btrfs subvolume for swap
|
# Create btrfs subvolume for swap
|
||||||
if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then
|
if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then
|
||||||
@@ -90,43 +62,23 @@ echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null
|
|||||||
# Ensure keyboard backlight doesn't prevent sleep
|
# Ensure keyboard backlight doesn't prevent sleep
|
||||||
sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
|
sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
|
||||||
|
|
||||||
# Add resume= kernel parameters so the initramfs resume hook knows where to find the
|
|
||||||
# hibernation image. Without these, resume happens late (after GPU drivers load) and fails.
|
|
||||||
if [[ ! -f $RESUME_DROP_IN ]]; then
|
|
||||||
echo "Adding resume kernel parameters"
|
|
||||||
sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null
|
|
||||||
RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//')
|
|
||||||
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE")
|
|
||||||
if [[ -n $RESUME_OFFSET ]]; then
|
|
||||||
sudo mkdir -p /etc/limine-entry-tool.d
|
|
||||||
echo "KERNEL_CMDLINE[default]+=\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null
|
|
||||||
sudo tee -a /etc/default/limine < "$RESUME_DROP_IN" >/dev/null
|
|
||||||
else
|
|
||||||
echo "Warning: Could not determine resume offset for $SWAP_FILE" >&2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
|
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
|
||||||
if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
|
if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
|
||||||
LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf"
|
LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf"
|
||||||
if [[ ! -f $LIMINE_DROP_IN ]]; then
|
if [[ ! -f "$LIMINE_DROP_IN" ]]; then
|
||||||
echo "Enabling ACPI RTC alarm for s2idle suspend"
|
echo "Enabling ACPI RTC alarm for s2idle suspend"
|
||||||
sudo mkdir -p /etc/limine-entry-tool.d
|
sudo mkdir -p /etc/limine-entry-tool.d
|
||||||
echo 'KERNEL_CMDLINE[default]+=" rtc_cmos.use_acpi_alarm=1"' | sudo tee "$LIMINE_DROP_IN" >/dev/null
|
echo 'KERNEL_CMDLINE[default]+="rtc_cmos.use_acpi_alarm=1"' | sudo tee "$LIMINE_DROP_IN" >/dev/null
|
||||||
sudo tee -a /etc/default/limine < "$LIMINE_DROP_IN" >/dev/null
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $NO_REBUILD; then
|
# Regenerate initramfs and boot entry
|
||||||
# limine-mkinitcpio rebuilds initramfs/UKI for all kernels and updates the
|
echo "Regenerating initramfs..."
|
||||||
# /boot/limine.conf entries via limine-entry-tool. The limine bootloader
|
sudo limine-mkinitcpio
|
||||||
# binary on the ESP doesn't change here, so we don't need limine-update
|
sudo limine-update
|
||||||
# (which would also re-deploy the binary and rebuild a second time).
|
|
||||||
echo "Regenerating initramfs..."
|
|
||||||
sudo limine-mkinitcpio
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! $FORCE && ! $NO_REBUILD && gum confirm "Reboot to enable hibernation?"; then
|
echo
|
||||||
omarchy-system-reboot
|
|
||||||
|
if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then
|
||||||
|
omarchy-cmd-reboot
|
||||||
fi
|
fi
|
||||||
|
|||||||
+3
-13
@@ -1,28 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/<name> and ~/.config/omarchy/hooks/<name>.d/.
|
# Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
|
||||||
# omarchy:args=[name] [args...]
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if (( $# < 1 )); then
|
if [[ $# -lt 1 ]]; then
|
||||||
echo "Usage: omarchy-hook [name] [args...]"
|
echo "Usage: omarchy-hook [name] [args...]"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
HOOK=$1
|
HOOK=$1
|
||||||
HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
|
HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
|
||||||
HOOK_DIR="$HOOK_PATH.d"
|
|
||||||
shift
|
shift
|
||||||
|
|
||||||
if [[ -f $HOOK_PATH ]]; then
|
if [[ -f $HOOK_PATH ]]; then
|
||||||
bash "$HOOK_PATH" "$@" || echo "Hook failed: $HOOK_PATH"
|
bash "$HOOK_PATH" "$@"
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -d $HOOK_DIR ]]; then
|
|
||||||
for hook in "$HOOK_DIR"/*; do
|
|
||||||
[[ -f $hook ]] || continue
|
|
||||||
[[ $hook == *.sample ]] && continue
|
|
||||||
bash "$hook" "$@" || echo "Hook failed: $hook"
|
|
||||||
done
|
|
||||||
fi
|
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 ExpertBook B9406 series laptops on Intel Panther Lake.
|
|
||||||
|
|
||||||
omarchy-hw-match "B9406" && omarchy-hw-intel-ptl
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the computer is an Asus ROG machine.
|
# Detect whether the computer is an Asus ROG machine.
|
||||||
|
|
||||||
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "ASUSTeK COMPUTER INC." ]] &&
|
[[ "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null)" == "ASUSTeK COMPUTER INC." ]] &&
|
||||||
grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
|
grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
|
||||||
|
|||||||
@@ -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,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Match Dell XPS systems with LG OLED panel on Intel Panther Lake (Xe3) GPU.
|
|
||||||
|
|
||||||
omarchy-hw-match "XPS" \
|
|
||||||
&& omarchy-hw-intel-ptl \
|
|
||||||
&& test "$(od -An -tx1 -j8 -N2 /sys/class/drm/card*-eDP-*/edid 2>/dev/null | tr -d ' \n')" = "30e4"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Returns true when an external monitor is physically connected.
|
|
||||||
|
|
||||||
for status in /sys/class/drm/card*-*/status; do
|
|
||||||
[[ "$status" == *-eDP-*/status ]] && continue
|
|
||||||
[[ "$(<"$status")" == "connected" ]] && exit 0
|
|
||||||
done
|
|
||||||
exit 1
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the computer is a Framework Laptop 16.
|
|
||||||
|
|
||||||
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Framework" ]] &&
|
|
||||||
omarchy-hw-match "Laptop 16"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the system has an active hybrid GPU configuration
|
|
||||||
|
|
||||||
if command -v supergfxctl &>/dev/null; then
|
|
||||||
supergfxctl -s 2>/dev/null | grep -qw Hybrid
|
|
||||||
else
|
|
||||||
(($(lspci | grep -cE 'VGA|3D|Display') >= 2))
|
|
||||||
fi
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the computer has an Intel CPU.
|
|
||||||
|
|
||||||
[[ $(grep -m1 "vendor_id" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ') == "GenuineIntel" ]]
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the computer has an Intel Panther Lake GPU.
|
|
||||||
|
|
||||||
lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake'
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Match against the computer's DMI product name or product family (case-insensitive).
|
|
||||||
# omarchy:args=<pattern>
|
|
||||||
|
|
||||||
grep -qi "$1" /sys/class/dmi/id/product_name 2>/dev/null ||
|
|
||||||
grep -qi "$1" /sys/class/dmi/id/product_family 2>/dev/null
|
|
||||||
@@ -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"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 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"
|
|
||||||
|
|
||||||
if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then
|
|
||||||
rm -f "$TOGGLE"
|
|
||||||
fi
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether the computer is a Microsoft Surface device.
|
|
||||||
|
|
||||||
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Microsoft Corporation" ]] &&
|
|
||||||
omarchy-hw-match "Surface"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Print the detected Hyprland touchpad or trackpad device name
|
|
||||||
|
|
||||||
device=$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty')
|
|
||||||
[[ -n $device ]] && echo "$device"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Print the detected Hyprland touchscreen or tablet device name
|
|
||||||
|
|
||||||
device=$(hyprctl devices -j | jq -r '[.touch[]?.name, .tablets[]?.name] | first // empty')
|
|
||||||
[[ -n $device ]] && echo "$device"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Detect whether Vulkan is available.
|
|
||||||
|
|
||||||
[[ -d /usr/share/vulkan/icd.d ]] &&
|
|
||||||
find /usr/share/vulkan/icd.d -maxdepth 1 -name "*.json" -print -quit | grep -q .
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Print the name of the currently focused Hyprland monitor.
|
|
||||||
|
|
||||||
hyprctl monitors -j | jq -r '.[] | select(.focused == true).name'
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 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
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Enable, disable, toggle, or recover the internal laptop display
|
|
||||||
# omarchy:args=<on|off|toggle|recover>
|
|
||||||
|
|
||||||
TOGGLE="internal-monitor-disable"
|
|
||||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
|
|
||||||
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"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
off() {
|
|
||||||
if ! omarchy-hw-external-monitors; then
|
|
||||||
omarchy-notification-send -g "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"
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
on) on ;;
|
|
||||||
off) off ;;
|
|
||||||
toggle) toggle ;;
|
|
||||||
recover) recover ;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Enable, disable, toggle, or recover mirroring the internal display to an external monitor
|
|
||||||
# omarchy:args=<on|off|toggle|recover>
|
|
||||||
|
|
||||||
TOGGLE="internal-monitor-mirror"
|
|
||||||
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.lua"
|
|
||||||
DISABLE_TOGGLE="internal-monitor-disable"
|
|
||||||
|
|
||||||
# Get names dynamically
|
|
||||||
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
|
|
||||||
# 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"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z $INTERNAL ]]; then
|
|
||||||
omarchy-notification-send -g "No laptop monitor found to mirror"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
omarchy-hyprland-toggle $DISABLE_TOGGLE off
|
|
||||||
|
|
||||||
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)"
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
recover() {
|
|
||||||
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled $TOGGLE; then
|
|
||||||
omarchy-hyprland-toggle $TOGGLE off
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
on) on ;;
|
|
||||||
off) off ;;
|
|
||||||
toggle) toggle ;;
|
|
||||||
recover) recover ;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -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,54 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, 3x, and 4x
|
|
||||||
|
|
||||||
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
|
|
||||||
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
|
|
||||||
CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale')
|
|
||||||
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)
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
|
|
||||||
n = split(list, arr, " ")
|
|
||||||
best = 0; best_diff = 1e9
|
|
||||||
for (i = 1; i <= n; i++) {
|
|
||||||
d = s - arr[i]; if (d < 0) d = -d
|
|
||||||
if (d < best_diff) { best_diff = d; best = i - 1 }
|
|
||||||
}
|
|
||||||
print best
|
|
||||||
}')
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
# 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"
|
|
||||||
fi
|
|
||||||
|
|
||||||
notify-send -u low " Display scaling set to ${NEW_SCALE}x"
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Watch Hyprland monitor events and recover monitor toggles when a monitor is removed
|
|
||||||
|
|
||||||
SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
|
|
||||||
|
|
||||||
socat -U - "UNIX-CONNECT:$SOCKET" | while read -r event; do
|
|
||||||
case "$event" in
|
|
||||||
monitorremoved\>\>*|monitorremovedv2\>\>*)
|
|
||||||
omarchy-hyprland-monitor-internal recover
|
|
||||||
omarchy-hyprland-monitor-internal-mirror recover
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
#!/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]
|
|
||||||
|
|
||||||
ENABLED_NOTIFICATION=""
|
|
||||||
DISABLED_NOTIFICATION=""
|
|
||||||
|
|
||||||
while (($# > 0)); 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
|
|
||||||
;;
|
|
||||||
*) break ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if (($# < 1)); then
|
|
||||||
echo "Usage: omarchy-hyprland-toggle [--enabled-notification <text>] [--disabled-notification <text>] <flag-name> [on|off|toggle]" >&2
|
|
||||||
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
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Check if a Hyprland toggle is currently disabled (missing).
|
|
||||||
# omarchy:args=<flag-name>
|
|
||||||
|
|
||||||
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Check if a Hyprland toggle is currently enabled.
|
|
||||||
# omarchy:args=<flag-name>
|
|
||||||
|
|
||||||
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.lua" ]]
|
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Close all open windows
|
# Close all open windows
|
||||||
|
|
||||||
hyprctl clients -j | \
|
hyprctl clients -j | \
|
||||||
jq -r ".[].address" | \
|
jq -r ".[].address" | \
|
||||||
while read -r addr; do
|
xargs -I{} hyprctl dispatch closewindow address:{}
|
||||||
hyprctl dispatch "hl.dsp.window.close(\"address:$addr\")" >/dev/null 2>&1 || hyprctl dispatch closewindow "address:$addr"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Move to first workspace
|
# Move to first workspace
|
||||||
hyprctl dispatch 'hl.dsp.focus({ workspace = "1" })' >/dev/null 2>&1 || hyprctl dispatch workspace 1
|
hyprctl dispatch workspace 1
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# omarchy:summary=Toggles the window gaps globally between no gaps and the default.
|
|
||||||
|
|
||||||
omarchy-hyprland-toggle window-no-gaps
|
|
||||||
@@ -1,7 +1,19 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# omarchy:summary=Toggle to pop-out a tile to stay fixed on a display basis.
|
# Toggle to pop-out a tile to stay fixed on a display basis.
|
||||||
# omarchy:args=[width height x y]
|
|
||||||
|
# Usage:
|
||||||
|
# omarchy-hyprland-window-pop [width height [x y]]
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# width Optional. Width of the floating window. Default: 1300
|
||||||
|
# height Optional. Height of the floating window. Default: 900
|
||||||
|
# x Optional. X position of the window. Must provide both X and Y to take effect.
|
||||||
|
# y Optional. Y position of the window. Must provide both X and Y to take effect.
|
||||||
|
#
|
||||||
|
# Behavior:
|
||||||
|
# - If the window is already pinned, it will be unpinned and removed from the pop layer.
|
||||||
|
# - If the window is not pinned, it will be floated, resized, moved/centered, pinned, brought to top, and popped.
|
||||||
|
|
||||||
width=${1:-1300}
|
width=${1:-1300}
|
||||||
height=${2:-900}
|
height=${2:-900}
|
||||||
@@ -11,30 +23,24 @@ y=${4:-}
|
|||||||
active=$(hyprctl activewindow -j)
|
active=$(hyprctl activewindow -j)
|
||||||
pinned=$(echo "$active" | jq ".pinned")
|
pinned=$(echo "$active" | jq ".pinned")
|
||||||
addr=$(echo "$active" | jq -r ".address")
|
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
|
if [[ $pinned == "true" ]]; then
|
||||||
hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
|
hyprctl -q --batch \
|
||||||
hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
|
"dispatch pin address:$addr;" \
|
||||||
hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"-pop\" })" tagwindow -pop "$window"
|
"dispatch togglefloating address:$addr;" \
|
||||||
|
"dispatch tagwindow -pop address:$addr;"
|
||||||
elif [[ -n $addr ]]; then
|
elif [[ -n $addr ]]; then
|
||||||
hypr_dispatch "hl.dsp.window.float({ window = \"$window\", action = \"toggle\" })" togglefloating "$window"
|
hyprctl dispatch togglefloating address:$addr
|
||||||
hypr_dispatch "hl.dsp.window.resize({ window = \"$window\", x = $width, y = $height })" resizeactive exact "$width" "$height" "$window"
|
hyprctl dispatch resizeactive exact $width $height address:$addr
|
||||||
|
|
||||||
if [[ -n $x && -n $y ]]; then
|
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
|
else
|
||||||
hypr_dispatch "hl.dsp.window.center({ window = \"$window\" })" centerwindow "$window"
|
hyprctl dispatch centerwindow address:$addr
|
||||||
fi
|
fi
|
||||||
|
|
||||||
hypr_dispatch "hl.dsp.window.pin({ window = \"$window\" })" pin "$window"
|
hyprctl -q --batch \
|
||||||
hypr_dispatch "hl.dsp.window.alter_zorder({ window = \"$window\", mode = \"top\" })" alterzorder top "$window"
|
"dispatch pin address:$addr;" \
|
||||||
hypr_dispatch "hl.dsp.window.tag({ window = \"$window\", tag = \"+pop\" })" tagwindow +pop "$window"
|
"dispatch alterzorder top address:$addr;" \
|
||||||
|
"dispatch tagwindow +pop address:$addr;"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user