mirror of
https://github.com/basecamp/omarchy.git
synced 2026-02-17 15:25:37 +00:00
Compare commits
184 Commits
v3.3.0
...
463417a281
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
463417a281 | ||
|
|
bbb57e98c1 | ||
|
|
e38dd063a6 | ||
|
|
a4d6e3ab03 | ||
|
|
fc529b368d | ||
|
|
ce01b6e0d6 | ||
|
|
450d4dd82b | ||
|
|
8895384b0e | ||
|
|
e4b7372666 | ||
|
|
a30448ceec | ||
|
|
4fadf666e6 | ||
|
|
07ede07193 | ||
|
|
527819b750 | ||
|
|
98bfe20839 | ||
|
|
4d48409926 | ||
|
|
ffafe1727e | ||
|
|
f2f306269a | ||
|
|
e4913ca2db | ||
|
|
ff234bba1f | ||
|
|
ecf48a3b4c | ||
|
|
74eea9e716 | ||
|
|
66cb888a2e | ||
|
|
0a5755e51f | ||
|
|
7bd5bf25cd | ||
|
|
0c9b38e507 | ||
|
|
0e2ed5439e | ||
|
|
75a0ee6149 | ||
|
|
2c9c0f883a | ||
|
|
8a58b8153c | ||
|
|
badd1f8495 | ||
|
|
67ee1450f0 | ||
|
|
c289cd0730 | ||
|
|
cbcd0e49be | ||
|
|
ae45f06847 | ||
|
|
1070a87a47 | ||
|
|
9741b29a7c | ||
|
|
ea24b0dc68 | ||
|
|
3bbb57b54d | ||
|
|
ebfb7f16e8 | ||
|
|
347afae8c0 | ||
|
|
ebfcefa553 | ||
|
|
2087d96ad8 | ||
|
|
b638cbc57a | ||
|
|
636a7cefda | ||
|
|
f7e22fcfd8 | ||
|
|
b0e8a4dcea | ||
|
|
f57234b991 | ||
|
|
be7f316371 | ||
|
|
b1553d3b31 | ||
|
|
055e969a56 | ||
|
|
050899e5b3 | ||
|
|
bd8b12b23b | ||
|
|
c268fb6c9b | ||
|
|
248a7a611b | ||
|
|
e487dace43 | ||
|
|
ba14cd36dd | ||
|
|
34b22a23f6 | ||
|
|
f0d5c35271 | ||
|
|
63fc96a541 | ||
|
|
4ba39ba73c | ||
|
|
1a14938382 | ||
|
|
9581cce1af | ||
|
|
cf72c02ea5 | ||
|
|
a8ce084460 | ||
|
|
4b3e21445b | ||
|
|
8878478103 | ||
|
|
74ff475693 | ||
|
|
22f64160f5 | ||
|
|
ea76f8196c | ||
|
|
49a2941e2b | ||
|
|
6a5b64b4bc | ||
|
|
c484b66bcb | ||
|
|
87da28a965 | ||
|
|
23b74c6212 | ||
|
|
69dbee75cd | ||
|
|
d9c5df29d1 | ||
|
|
7c9708d647 | ||
|
|
5a9f0318e8 | ||
|
|
ab4694e3f5 | ||
|
|
bebf14a18c | ||
|
|
ff2a47c67e | ||
|
|
d9bd4a8db3 | ||
|
|
8fc5b6e346 | ||
|
|
7265c22728 | ||
|
|
32d187eab0 | ||
|
|
c19fc1593a | ||
|
|
7ffdfdbda9 | ||
|
|
161fa3f313 | ||
|
|
d6c28f317d | ||
|
|
4348ab6ef1 | ||
|
|
9d07cc884c | ||
|
|
ba31e3073c | ||
|
|
2df5f231cb | ||
|
|
26afde34ff | ||
|
|
3b94207ba7 | ||
|
|
e567020e1b | ||
|
|
f78f5b2c2c | ||
|
|
ec305459f8 | ||
|
|
55231e9726 | ||
|
|
a8e0762fbe | ||
|
|
bb91f90839 | ||
|
|
a7995efac2 | ||
|
|
5b534de6a0 | ||
|
|
4fe357972e | ||
|
|
7015601d77 | ||
|
|
532f4310d0 | ||
|
|
56b02f62b5 | ||
|
|
83628ab3bd | ||
|
|
d89614248b | ||
|
|
77a57aa838 | ||
|
|
e455d1bd68 | ||
|
|
adfe182984 | ||
|
|
febd18ce84 | ||
|
|
768c553c4c | ||
|
|
bf99a2ddc0 | ||
|
|
0930583526 | ||
|
|
4a6baafd05 | ||
|
|
c1bf6c4694 | ||
|
|
66daacb30d | ||
|
|
5b2c0dafbf | ||
|
|
988418aea1 | ||
|
|
25451f4a03 | ||
|
|
d884265d46 | ||
|
|
5e1ce16358 | ||
|
|
713b6e3a36 | ||
|
|
2c7b283aef | ||
|
|
4701726c83 | ||
|
|
bfc3c69cf1 | ||
|
|
21514dc577 | ||
|
|
5ff76df5e4 | ||
|
|
bab0004d08 | ||
|
|
93079858f1 | ||
|
|
4287472e02 | ||
|
|
291786d36a | ||
|
|
ed9a4a45ba | ||
|
|
05b82cbee5 | ||
|
|
697d09022a | ||
|
|
1ff31cfe41 | ||
|
|
cd995319bf | ||
|
|
281f0b86d2 | ||
|
|
55668f4c6d | ||
|
|
9c71962a16 | ||
|
|
7d77500c33 | ||
|
|
fb1d9ccfa3 | ||
|
|
2f75e9c7ec | ||
|
|
b22ed8448a | ||
|
|
a0d2f007fd | ||
|
|
955844cb5d | ||
|
|
295c7c91fc | ||
|
|
bc1a531534 | ||
|
|
4cec214a53 | ||
|
|
0b5ba427b2 | ||
|
|
53b8fc4257 | ||
|
|
dcb9527770 | ||
|
|
6c35e840f5 | ||
|
|
da984ce243 | ||
|
|
65bafa4f3b | ||
|
|
f5a35a1afe | ||
|
|
c9b3e13df8 | ||
|
|
9775b01070 | ||
|
|
b42dcf098b | ||
|
|
6ae31aedae | ||
|
|
63b0cd64bd | ||
|
|
bf779a6bbc | ||
|
|
774b4700ef | ||
|
|
400a87955e | ||
|
|
fe48a16a90 | ||
|
|
78ef351269 | ||
|
|
558cd68810 | ||
|
|
067ec2bd71 | ||
|
|
ec4cd81e63 | ||
|
|
7c0a05cc70 | ||
|
|
70bdbfe545 | ||
|
|
72b3b930c7 | ||
|
|
e08301dee2 | ||
|
|
9fc65dd2de | ||
|
|
5603fb50fd | ||
|
|
037f034ece | ||
|
|
e95f8f2847 | ||
|
|
8826aa10ca | ||
|
|
2851687bbb | ||
|
|
e25a00a38c | ||
|
|
7d9858a013 | ||
|
|
95bfb16cd4 |
62
AGENTS.md
Normal file
62
AGENTS.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# Style
|
||||
|
||||
- Two spaces for indentation, no tabs
|
||||
- Use Bash syntax for conditionals: `[[ -f $file ]]`, not `[ -f "$file" ]`
|
||||
|
||||
# Command Naming
|
||||
|
||||
All commands start with `omarchy-`. Prefixes indicate purpose:
|
||||
|
||||
- `cmd-` - check if commands exist, misc utility commands
|
||||
- `pkg-` - package management helpers
|
||||
- `hw-` - hardware detection (return exit codes for use in conditionals)
|
||||
- `refresh-` - copy default config to user's `~/.config/`
|
||||
- `restart-` - restart a component
|
||||
- `launch-` - open applications
|
||||
- `install-` - install optional software
|
||||
- `setup-` - interactive setup wizards
|
||||
- `toggle-` - toggle features on/off
|
||||
- `theme-` - theme management
|
||||
- `update-` - update components
|
||||
|
||||
# Helper Commands
|
||||
|
||||
Use these instead of raw shell commands:
|
||||
|
||||
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
|
||||
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
|
||||
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
|
||||
- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)
|
||||
|
||||
# Config Structure
|
||||
|
||||
- `config/` - default configs copied to `~/.config/`
|
||||
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
|
||||
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
|
||||
|
||||
# Refresh Pattern
|
||||
|
||||
To copy a default config to user config with automatic backup:
|
||||
|
||||
```bash
|
||||
omarchy-refresh-config hypr/hyprlock.conf
|
||||
```
|
||||
|
||||
This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hypr/hyprlock.conf`.
|
||||
|
||||
# Migrations
|
||||
|
||||
To create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit.
|
||||
|
||||
Migration format:
|
||||
- No shebang line
|
||||
- Start with an `echo` describing what the migration does
|
||||
|
||||
Example:
|
||||
```bash
|
||||
echo "Disable fingerprint in hyprlock if fingerprint auth is not configured"
|
||||
|
||||
if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then
|
||||
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
|
||||
fi
|
||||
```
|
||||
13
bin/omarchy-battery-present
Executable file
13
bin/omarchy-battery-present
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Returns true if a battery is present on the system.
|
||||
# Used by the battery monitor and other battery-related checks.
|
||||
|
||||
for bat in /sys/class/power_supply/BAT*; do
|
||||
[[ -r "$bat/present" ]] &&
|
||||
[[ "$(cat "$bat/present")" == "1" ]] &&
|
||||
[[ "$(cat "$bat/type")" == "Battery" ]] &&
|
||||
exit 0
|
||||
done
|
||||
|
||||
exit 1
|
||||
@@ -3,14 +3,15 @@
|
||||
# Set the branch for Omarchy's git repository.
|
||||
|
||||
if (($# == 0)); then
|
||||
echo "Usage: omarchy-branch-set [master|dev]"
|
||||
echo "Usage: omarchy-branch-set [master|rc|dev]"
|
||||
exit 1
|
||||
else
|
||||
branch="$1"
|
||||
fi
|
||||
|
||||
case "$branch" in
|
||||
"master") git -C $OMARCHY_PATH switch master ;;
|
||||
"dev") git -C $OMARCHY_PATH switch dev ;;
|
||||
*) echo "Unknown branch: $branch"; exit 1; ;;
|
||||
esac
|
||||
if [[ "$branch" != "master" && "$branch" != "rc" && "$branch" != "dev" ]]; then
|
||||
echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git -C $OMARCHY_PATH switch $branch
|
||||
|
||||
21
bin/omarchy-brightness-display
Executable file
21
bin/omarchy-brightness-display
Executable file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Adjust brightness on the most likely display device.
|
||||
# Usage: omarchy-brightness-display <step>
|
||||
|
||||
step="${1:-+5%}"
|
||||
|
||||
# Start with the first possible output, then refine to the most likely given an order heuristic.
|
||||
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
|
||||
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
|
||||
if [[ -e "/sys/class/backlight/$candidate" ]]; then
|
||||
device="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Set the actual brightness of the display device.
|
||||
brightnessctl -d "$device" set "$step" >/dev/null
|
||||
|
||||
# Use SwayOSD to display the new brightness setting.
|
||||
omarchy-swayosd-brightness "$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%')"
|
||||
12
bin/omarchy-brightness-display-apple
Executable file
12
bin/omarchy-brightness-display-apple
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
|
||||
else
|
||||
device="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
|
||||
sudo asdcontrol "$device" -- "$1" >/dev/null
|
||||
value="$(sudo asdcontrol "$device" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
|
||||
omarchy-swayosd-brightness "$(( value * 100 / 60000 ))"
|
||||
fi
|
||||
40
bin/omarchy-brightness-keyboard
Executable file
40
bin/omarchy-brightness-keyboard
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Adjust keyboard backlight brightness using available steps.
|
||||
# Usage: omarchy-brightness-keyboard <up|down>
|
||||
|
||||
direction="${1:-up}"
|
||||
|
||||
# Find keyboard backlight device (look for *kbd_backlight* pattern in leds class).
|
||||
device=""
|
||||
for candidate in /sys/class/leds/*kbd_backlight*; do
|
||||
if [[ -e "$candidate" ]]; then
|
||||
device="$(basename "$candidate")"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ -z "$device" ]]; then
|
||||
echo "No keyboard backlight device found" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get current and max brightness to determine step size.
|
||||
max_brightness="$(brightnessctl -d "$device" max)"
|
||||
current_brightness="$(brightnessctl -d "$device" get)"
|
||||
|
||||
# Calculate step as one unit (keyboards typically have discrete levels like 0-3).
|
||||
if [[ "$direction" == "up" ]]; then
|
||||
new_brightness=$((current_brightness + 1))
|
||||
[[ $new_brightness -gt $max_brightness ]] && new_brightness=$max_brightness
|
||||
else
|
||||
new_brightness=$((current_brightness - 1))
|
||||
[[ $new_brightness -lt 0 ]] && new_brightness=0
|
||||
fi
|
||||
|
||||
# Set the new brightness.
|
||||
brightnessctl -d "$device" set "$new_brightness" >/dev/null
|
||||
|
||||
# Use SwayOSD to display the new brightness setting.
|
||||
percent=$((new_brightness * 100 / max_brightness))
|
||||
omarchy-swayosd-brightness "$percent"
|
||||
@@ -14,7 +14,7 @@
|
||||
# and people with a lot of experience managing Linux systems.
|
||||
|
||||
if (($# == 0)); then
|
||||
echo "Usage: omarchy-channel-set [stable|edge|dev]"
|
||||
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
|
||||
exit 1
|
||||
else
|
||||
channel="$1"
|
||||
@@ -22,6 +22,7 @@ fi
|
||||
|
||||
case "$channel" in
|
||||
"stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" && sudo pacman -Suu --noconfirm ;;
|
||||
"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" && sudo pacman -Suu --noconfirm ;;
|
||||
"edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;;
|
||||
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
|
||||
*) echo "Unknown channel: $channel"; exit 1; ;;
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
|
||||
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
|
||||
else
|
||||
DEVICE="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
|
||||
sudo asdcontrol "$DEVICE" -- "$1" >/dev/null
|
||||
VALUE="$(sudo asdcontrol "$DEVICE" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
|
||||
swayosd-client \
|
||||
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
|
||||
--custom-icon display-brightness \
|
||||
--custom-progress "$(awk -v v="$VALUE" 'BEGIN{printf "%.2f", v/60000}')" \
|
||||
--custom-progress-text "$(( VALUE * 100 / 60000 ))%"
|
||||
fi
|
||||
@@ -14,6 +14,7 @@ fi
|
||||
DESKTOP_AUDIO="false"
|
||||
MICROPHONE_AUDIO="false"
|
||||
WEBCAM="false"
|
||||
WEBCAM_DEVICE=""
|
||||
STOP_RECORDING="false"
|
||||
|
||||
for arg in "$@"; do
|
||||
@@ -21,6 +22,7 @@ for arg in "$@"; do
|
||||
--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
|
||||
@@ -32,6 +34,15 @@ cleanup_webcam() {
|
||||
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')
|
||||
|
||||
@@ -41,7 +52,7 @@ start_webcam_overlay() {
|
||||
# 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 /dev/video0 2>/dev/null)
|
||||
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
|
||||
@@ -50,7 +61,7 @@ start_webcam_overlay() {
|
||||
fi
|
||||
done
|
||||
|
||||
ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \
|
||||
ffplay -f v4l2 $video_size_arg -framerate 30 "$WEBCAM_DEVICE" \
|
||||
-vf "scale=${target_width}:-1" \
|
||||
-window_title "WebcamOverlay" \
|
||||
-noborder \
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
# Take a screenshot of the whole screen, a specific window, or a user-drawn region.
|
||||
# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs.
|
||||
# Editor defaults to Satty but can be changed via --editor=<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}}"
|
||||
@@ -13,6 +14,33 @@ 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}"
|
||||
|
||||
@@ -46,7 +74,7 @@ case "$MODE" in
|
||||
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
|
||||
kill $PID 2>/dev/null
|
||||
|
||||
# If the selction area is L * W < 20, we'll assume you were trying to select whichever
|
||||
# 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
|
||||
@@ -71,16 +99,19 @@ case "$MODE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -z "$SELECTION" ] && exit 0
|
||||
[[ -z $SELECTION ]] && exit 0
|
||||
|
||||
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
|
||||
FILEPATH="$OUTPUT_DIR/$FILENAME"
|
||||
|
||||
if [[ $PROCESSING == "slurp" ]]; then
|
||||
grim -g "$SELECTION" - |
|
||||
satty --filename - \
|
||||
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
|
||||
--early-exit \
|
||||
--actions-on-enter save-to-clipboard \
|
||||
--save-after-copy \
|
||||
--copy-command 'wl-copy'
|
||||
grim -g "$SELECTION" "$FILEPATH" || exit 1
|
||||
wl-copy < "$FILEPATH"
|
||||
|
||||
(
|
||||
ACTION=$(notify-send "Screenshot copied & saved" "Click to edit" -t 10000 -i "$FILEPATH" -A "default=edit")
|
||||
[[ "$ACTION" == "default" ]] && open_editor "$FILEPATH"
|
||||
) &
|
||||
else
|
||||
grim -g "$SELECTION" - | wl-copy
|
||||
fi
|
||||
|
||||
@@ -17,9 +17,11 @@ if [ -f "$MKINITCPIO_CONF" ] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF";
|
||||
exit 0
|
||||
fi
|
||||
|
||||
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
|
||||
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
|
||||
exit 0
|
||||
if [[ $1 != "--force" ]]; then
|
||||
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
|
||||
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
SWAP_SUBVOLUME="/swap"
|
||||
@@ -57,14 +59,26 @@ sudo mkdir -p /etc/mkinitcpio.conf.d
|
||||
echo "Adding resume hook to $MKINITCPIO_CONF"
|
||||
echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null
|
||||
|
||||
# Configure suspend-then-hibernate
|
||||
echo "Configuring suspend-then-hibernate"
|
||||
sudo mkdir -p /etc/systemd/logind.conf.d /etc/systemd/sleep.conf.d
|
||||
sudo cp "$OMARCHY_PATH/default/systemd/lid.conf" /etc/systemd/logind.conf.d/
|
||||
sudo cp "$OMARCHY_PATH/default/systemd/hibernate.conf" /etc/systemd/sleep.conf.d/
|
||||
# Ensure keyboard backlight doesn't prevent sleep
|
||||
sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
|
||||
|
||||
# Regenerate initramfs
|
||||
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
|
||||
if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
|
||||
LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf"
|
||||
if [[ ! -f "$LIMINE_DROP_IN" ]]; then
|
||||
echo "Enabling ACPI RTC alarm for s2idle suspend"
|
||||
sudo mkdir -p /etc/limine-entry-tool.d
|
||||
echo 'KERNEL_CMDLINE[default]+="rtc_cmos.use_acpi_alarm=1"' | sudo tee "$LIMINE_DROP_IN" >/dev/null
|
||||
fi
|
||||
fi
|
||||
|
||||
# Regenerate initramfs and boot entry
|
||||
echo "Regenerating initramfs..."
|
||||
sudo limine-mkinitcpio
|
||||
sudo limine-update
|
||||
|
||||
echo "Hibernation enabled"
|
||||
echo
|
||||
|
||||
if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then
|
||||
omarchy-cmd-reboot
|
||||
fi
|
||||
|
||||
6
bin/omarchy-hw-asus-rog
Executable file
6
bin/omarchy-hw-asus-rog
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Detect whether the computer is an Asus ROG machine.
|
||||
|
||||
[[ "$(cat /sys/class/dmi/id/sys_vendor 2>/dev/null)" == "ASUSTeK COMPUTER INC." ]] &&
|
||||
grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
|
||||
17
bin/omarchy-install-geforce-now
Executable file
17
bin/omarchy-install-geforce-now
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Install and launch Geforce Now.
|
||||
|
||||
set -e
|
||||
|
||||
omarchy-pkg-add flatpak
|
||||
cd /tmp
|
||||
|
||||
# Download and run GeForce NOW
|
||||
curl -LO https://international.download.nvidia.com/GFNLinux/GeForceNOWSetup.bin
|
||||
chmod +x GeForceNOWSetup.bin
|
||||
./GeForceNOWSetup.bin
|
||||
|
||||
# Ensure a separate browser process not started by GFN is available.
|
||||
# If not, it seems like GFN has a tendency to hang on login.
|
||||
setsid omarchy-launch-browser
|
||||
@@ -1,15 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Install the Tailscale mesh VPN service, the tsui TUI management app, and a web app for the Tailscale Admin Console.
|
||||
# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.
|
||||
|
||||
curl -fsSL https://tailscale.com/install.sh | sh
|
||||
curl -fsSL https://neuralink.com/tsui/install.sh | bash
|
||||
|
||||
echo -e "\nStarting Tailscale..."
|
||||
sudo tailscale up --accept-routes
|
||||
|
||||
echo -e "\nAdd tsui to sudoers..."
|
||||
echo "$USER ALL=(ALL) NOPASSWD: $(which tsui)" | sudo tee /etc/sudoers.d/tsui
|
||||
|
||||
omarchy-tui-install "Tailscale" "sudo tsui" float https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
|
||||
omarchy-webapp-install "Tailscale Admin Console" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
|
||||
omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is runnig first.
|
||||
# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is running first.
|
||||
|
||||
# Ensure elephant is running before launching walker
|
||||
if ! pgrep -x elephant > /dev/null; then
|
||||
|
||||
@@ -88,10 +88,11 @@ show_learn_menu() {
|
||||
}
|
||||
|
||||
show_trigger_menu() {
|
||||
case $(menu "Trigger" " Capture\n Share\n Toggle") in
|
||||
case $(menu "Trigger" " Capture\n Share\n Toggle\n Hardware") in
|
||||
*Capture*) show_capture_menu ;;
|
||||
*Share*) show_share_menu ;;
|
||||
*Toggle*) show_toggle_menu ;;
|
||||
*Hardware*) show_hardware_menu ;;
|
||||
*) show_main_menu ;;
|
||||
esac
|
||||
}
|
||||
@@ -113,13 +114,43 @@ show_screenshot_menu() {
|
||||
esac
|
||||
}
|
||||
|
||||
get_webcam_list() {
|
||||
v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do
|
||||
if [[ "$line" != $'\t'* && -n "$line" ]]; then
|
||||
local name="$line"
|
||||
IFS= read -r device || break
|
||||
device=$(echo "$device" | tr -d '\t' | head -1)
|
||||
[[ -n "$device" ]] && echo "$device $name"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
show_webcam_select_menu() {
|
||||
local devices=$(get_webcam_list)
|
||||
local count=$(echo "$devices" | grep -c . 2>/dev/null || echo 0)
|
||||
|
||||
if [[ -z "$devices" || "$count" -eq 0 ]]; then
|
||||
notify-send "No webcam devices found" -u critical -t 3000
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$count" -eq 1 ]]; then
|
||||
echo "$devices" | awk '{print $1}'
|
||||
else
|
||||
menu "Select Webcam" "$devices" | awk '{print $1}'
|
||||
fi
|
||||
}
|
||||
|
||||
show_screenrecord_menu() {
|
||||
omarchy-cmd-screenrecord --stop-recording && exit 0
|
||||
|
||||
case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
|
||||
*"With desktop audio") omarchy-cmd-screenrecord --with-desktop-audio ;;
|
||||
*"With desktop + microphone audio") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;;
|
||||
*"With desktop + microphone audio + webcam") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam ;;
|
||||
*"With desktop + microphone audio + webcam")
|
||||
local device=$(show_webcam_select_menu) || { back_to show_capture_menu; return; }
|
||||
omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device"
|
||||
;;
|
||||
*) back_to show_capture_menu ;;
|
||||
esac
|
||||
}
|
||||
@@ -143,6 +174,13 @@ show_toggle_menu() {
|
||||
esac
|
||||
}
|
||||
|
||||
show_hardware_menu() {
|
||||
case $(menu "Toggle" " Hybrid GPU") in
|
||||
*"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;;
|
||||
*) show_trigger_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_style_menu() {
|
||||
case $(menu "Style" " Theme\n Font\n Background\n Hyprland\n Screensaver\n About") in
|
||||
*Theme*) show_theme_menu ;;
|
||||
@@ -317,8 +355,9 @@ show_install_ai_menu() {
|
||||
}
|
||||
|
||||
show_install_gaming_menu() {
|
||||
case $(menu "Install" " Steam\n RetroArch [AUR]\n Minecraft\n Xbox Controller [AUR]") in
|
||||
case $(menu "Install" " Steam\n NVIDIA GeForce NOW\n RetroArch [AUR]\n Minecraft\n Xbox Controller [AUR]") in
|
||||
*Steam*) present_terminal omarchy-install-steam ;;
|
||||
*GeForce*) present_terminal omarchy-install-geforce-now ;;
|
||||
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
|
||||
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
|
||||
*Xbox*) present_terminal omarchy-install-xbox-controllers ;;
|
||||
@@ -392,11 +431,12 @@ show_install_elixir_menu() {
|
||||
}
|
||||
|
||||
show_remove_menu() {
|
||||
case $(menu "Remove" " Package\n Web App\n TUI\n Development\n Dictation\n Theme\n Windows\n Fingerprint\n Fido2") in
|
||||
case $(menu "Remove" " Package\n Web App\n TUI\n Development\n Preinstalls\n Dictation\n Theme\n Windows\n Fingerprint\n Fido2") in
|
||||
*Package*) terminal omarchy-pkg-remove ;;
|
||||
*Web*) present_terminal omarchy-webapp-remove ;;
|
||||
*TUI*) present_terminal omarchy-tui-remove ;;
|
||||
*Development*) show_remove_development_menu ;;
|
||||
*Preinstalls*) present_terminal omarchy-remove-all ;;
|
||||
*Dictation*) present_terminal omarchy-voxtype-remove ;;
|
||||
*Theme*) present_terminal omarchy-theme-remove ;;
|
||||
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
|
||||
@@ -407,7 +447,7 @@ show_remove_menu() {
|
||||
}
|
||||
|
||||
show_remove_development_menu() {
|
||||
case $(menu "Remove" " Ruby on Rails\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
|
||||
case $(menu "Remove" " Ruby on Rails\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
|
||||
*Rails*) present_terminal "omarchy-remove-dev-env ruby" ;;
|
||||
*JavaScript*) show_remove_javascript_menu ;;
|
||||
*Go*) present_terminal "omarchy-remove-dev-env go" ;;
|
||||
@@ -425,7 +465,7 @@ show_remove_development_menu() {
|
||||
}
|
||||
|
||||
show_remove_javascript_menu() {
|
||||
case $(menu "Remove" " Node.js\n Bun\n Deno") in
|
||||
case $(menu "Remove" " Node.js\n Bun\n Deno") in
|
||||
*Node*) present_terminal "omarchy-remove-dev-env node" ;;
|
||||
*Bun*) present_terminal "omarchy-remove-dev-env bun" ;;
|
||||
*Deno*) present_terminal "omarchy-remove-dev-env deno" ;;
|
||||
@@ -434,7 +474,7 @@ show_remove_javascript_menu() {
|
||||
}
|
||||
|
||||
show_remove_php_menu() {
|
||||
case $(menu "Remove" " PHP\n Laravel\n Symfony") in
|
||||
case $(menu "Remove" " PHP\n Laravel\n Symfony") in
|
||||
*PHP*) present_terminal "omarchy-remove-dev-env php" ;;
|
||||
*Laravel*) present_terminal "omarchy-remove-dev-env laravel" ;;
|
||||
*Symfony*) present_terminal "omarchy-remove-dev-env symfony" ;;
|
||||
@@ -443,7 +483,7 @@ show_remove_php_menu() {
|
||||
}
|
||||
|
||||
show_remove_elixir_menu() {
|
||||
case $(menu "Remove" " Elixir\n Phoenix") in
|
||||
case $(menu "Remove" " Elixir\n Phoenix") in
|
||||
*Elixir*) present_terminal "omarchy-remove-dev-env elixir" ;;
|
||||
*Phoenix*) present_terminal "omarchy-remove-dev-env phoenix" ;;
|
||||
*) show_remove_development_menu ;;
|
||||
@@ -451,7 +491,7 @@ show_remove_elixir_menu() {
|
||||
}
|
||||
|
||||
show_update_menu() {
|
||||
case $(menu "Update" " Omarchy\n Channel\n Config\n Extra Themes\n Process\n Hardware\n Firmware\n Password\n Timezone\n Time") in
|
||||
case $(menu "Update" " Omarchy\n Channel\n Config\n Extra Themes\n Process\n Hardware\n Firmware\n Password\n Timezone\n Time") in
|
||||
*Omarchy*) present_terminal omarchy-update ;;
|
||||
*Channel*) show_update_channel_menu ;;
|
||||
*Config*) show_update_config_menu ;;
|
||||
@@ -467,8 +507,9 @@ show_update_menu() {
|
||||
}
|
||||
|
||||
show_update_channel_menu() {
|
||||
case $(menu "Update channel" "🟢 Stable\n🟡 Edge\n🔴 Dev") in
|
||||
case $(menu "Update channel" "🟢 Stable\n🟡 RC\n🟠 Edge\n🔴 Dev") in
|
||||
*Stable*) present_terminal "omarchy-channel-set stable" ;;
|
||||
*RC*) present_terminal "omarchy-channel-set rc" ;;
|
||||
*Edge*) present_terminal "omarchy-channel-set edge" ;;
|
||||
*Dev*) present_terminal "omarchy-channel-set dev" ;;
|
||||
*) show_update_menu ;;
|
||||
@@ -516,6 +557,10 @@ show_update_password_menu() {
|
||||
esac
|
||||
}
|
||||
|
||||
show_about() {
|
||||
omarchy-launch-about
|
||||
}
|
||||
|
||||
show_system_menu() {
|
||||
local options=" Lock\n Screensaver"
|
||||
[ -f ~/.local/state/omarchy/toggles/suspend-on ] && options="$options\n Suspend"
|
||||
@@ -543,6 +588,7 @@ go_to_menu() {
|
||||
*learn*) show_learn_menu ;;
|
||||
*trigger*) show_trigger_menu ;;
|
||||
*share*) show_share_menu ;;
|
||||
*capture*) show_capture_menu ;;
|
||||
*style*) show_style_menu ;;
|
||||
*theme*) show_theme_menu ;;
|
||||
*screenshot*) show_screenshot_menu ;;
|
||||
@@ -552,7 +598,7 @@ go_to_menu() {
|
||||
*install*) show_install_menu ;;
|
||||
*remove*) show_remove_menu ;;
|
||||
*update*) show_update_menu ;;
|
||||
*about*) omarchy-launch-about ;;
|
||||
*about*) show_about ;;
|
||||
*system*) show_system_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -7,17 +7,18 @@
|
||||
sudo cp -f /etc/pacman.conf /etc/pacman.conf.bak
|
||||
sudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
|
||||
|
||||
if [[ $1 == "edge" ]]; then
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-edge.conf /etc/pacman.conf
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-edge /etc/pacman.d/mirrorlist
|
||||
echo "Setting channel to edge"
|
||||
else
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-stable.conf /etc/pacman.conf
|
||||
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-stable /etc/pacman.d/mirrorlist
|
||||
echo "Setting channel to stable"
|
||||
channel="${1:-stable}"
|
||||
|
||||
if [[ "$channel" != "stable" && "$channel" != "rc" && "$channel" != "edge" ]]; then
|
||||
echo "Error: Invalid channel '$channel'. Must be one of: stable, rc, edge"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Setting channel to $channel"
|
||||
echo
|
||||
|
||||
sudo cp -f "$OMARCHY_PATH/default/pacman/pacman-$channel.conf" /etc/pacman.conf
|
||||
sudo cp -f "$OMARCHY_PATH/default/pacman/mirrorlist-$channel" /etc/pacman.d/mirrorlist
|
||||
|
||||
# Reset all package DBs and then update
|
||||
sudo pacman -Syyu --noconfirm
|
||||
|
||||
5
bin/omarchy-refresh-tmux
Executable file
5
bin/omarchy-refresh-tmux
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Overwrite the user tmux config with the Omarchy default and reload tmux.
|
||||
|
||||
omarchy-refresh-config tmux/tmux.conf
|
||||
@@ -5,9 +5,17 @@
|
||||
# Ensure walker is set to autostart
|
||||
mkdir -p ~/.config/autostart/
|
||||
cp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/
|
||||
|
||||
# And restarts if it crashes or is killed
|
||||
mkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/
|
||||
cp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf
|
||||
|
||||
systemctl --user daemon-reload
|
||||
|
||||
# Refresh configs
|
||||
omarchy-refresh-config walker/config.toml
|
||||
omarchy-refresh-config elephant/calc.toml
|
||||
omarchy-refresh-config elephant/desktopapplications.toml
|
||||
|
||||
# Restart service
|
||||
omarchy-restart-walker
|
||||
|
||||
25
bin/omarchy-remove-all
Executable file
25
bin/omarchy-remove-all
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Remove preinstalled Omarchy applications (web apps, TUIs, and selected packages).
|
||||
# This removes all web apps, TUIs, plus specific desktop applications.
|
||||
|
||||
if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI wrappers, and desktop applications?"; then
|
||||
echo -e "Removing preinstalled Omarchy applications...\n"
|
||||
|
||||
omarchy-webapp-remove-all
|
||||
omarchy-tui-remove-all
|
||||
|
||||
omarchy-pkg-drop \
|
||||
aether \
|
||||
typora \
|
||||
spotify \
|
||||
libreoffice-fresh \
|
||||
1password-beta \
|
||||
1password-cli \
|
||||
xournalpp \
|
||||
signal-desktop \
|
||||
pinta \
|
||||
obsidian \
|
||||
obs-studio \
|
||||
kdenlive
|
||||
fi
|
||||
@@ -1,5 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Remove a development environment that was previously installed via omarchy-install-dev-env.
|
||||
# Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure>
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure>" >&2
|
||||
exit 1
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Reset the sudo lockout/faillock for the current user.
|
||||
# This clears any failed authentication attempts that may have locked the user out.
|
||||
|
||||
# Resetting sudo lockout for user
|
||||
su -c "faillock --reset --user $USER"
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Restart an application by killing it and relaunching via uwsm.
|
||||
# Usage: omarchy-restart-app <application-name>
|
||||
|
||||
pkill -x $1
|
||||
setsid uwsm-app -- $1 >/dev/null 2>&1 &
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Unblock and restart the bluetooth service.
|
||||
|
||||
echo -e "Unblocking bluetooth...\n"
|
||||
rfkill unblock bluetooth
|
||||
rfkill list bluetooth
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Restart the hypridle service (used for idle detection and auto-lock).
|
||||
|
||||
omarchy-restart-app hypridle
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Restart the hyprsunset service (used for blue light filtering/night light).
|
||||
|
||||
omarchy-restart-app hyprsunset
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
|
||||
# Reload opencode configuration (used by the Omarchy theme switching).
|
||||
|
||||
killall -SIGUSR2 opencode
|
||||
if pgrep -x opencode >/dev/null; then
|
||||
killall -SIGUSR2 opencode
|
||||
fi
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Restart the PipeWire audio service to fix audio issues or apply new configuration.
|
||||
|
||||
echo -e "Restarting pipewire audio service...\n"
|
||||
systemctl --user restart pipewire.service
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Unblock and restart the Wi-Fi service.
|
||||
|
||||
echo -e "Unblocking wifi...\n"
|
||||
rfkill unblock wifi
|
||||
rfkill list wifi
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Restart the XCompose input method service (fcitx5) to apply new compose key settings.
|
||||
|
||||
omarchy-restart-app fcitx5
|
||||
|
||||
@@ -58,11 +58,13 @@ EOF
|
||||
add_hyprlock_fingerprint_icon() {
|
||||
print_info "Adding fingerprint icon to hyprlock placeholder text..."
|
||||
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password <\/span>/' ~/.config/hypr/hyprlock.conf
|
||||
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
|
||||
}
|
||||
|
||||
remove_hyprlock_fingerprint_icon() {
|
||||
print_info "Removing fingerprint icon from hyprlock placeholder text..."
|
||||
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
|
||||
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
|
||||
}
|
||||
|
||||
remove_pam_config() {
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Display a "Done!" message with a spinner and wait for user to press any key.
|
||||
# Used by various install scripts to indicate completion.
|
||||
|
||||
echo
|
||||
gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s'
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Display the Omarchy logo in the terminal using green color.
|
||||
# Used by various presentation scripts to show branding.
|
||||
|
||||
clear
|
||||
echo -e "\033[32m"
|
||||
cat <~/.local/share/omarchy/logo.txt
|
||||
|
||||
@@ -31,4 +31,6 @@ create)
|
||||
restore)
|
||||
sudo limine-snapper-restore
|
||||
;;
|
||||
delete)
|
||||
sudo snapper -c "$config" delete 0
|
||||
esac
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Manage persistent state files for Omarchy toggles and settings.
|
||||
# Usage: omarchy-state <set|clear> <state-name-or-pattern>
|
||||
# Used to track whether features like suspend, idle lock, etc are enabled or disabled.
|
||||
|
||||
STATE_DIR="$HOME/.local/state/omarchy"
|
||||
mkdir -p "$STATE_DIR"
|
||||
|
||||
|
||||
15
bin/omarchy-swayosd-brightness
Executable file
15
bin/omarchy-swayosd-brightness
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Display brightness level using SwayOSD on the current monitor.
|
||||
# Usage: omarchy-swayosd-brightness <percent>
|
||||
|
||||
percent="$1"
|
||||
|
||||
progress="$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')"
|
||||
[[ "$progress" == "0.00" ]] && progress="0.01"
|
||||
|
||||
swayosd-client \
|
||||
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
|
||||
--custom-icon display-brightness \
|
||||
--custom-progress "$progress" \
|
||||
--custom-progress-text "${percent}%"
|
||||
9
bin/omarchy-theme-refresh
Executable file
9
bin/omarchy-theme-refresh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Refresh the current theme from its templates.
|
||||
|
||||
THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name"
|
||||
|
||||
if [[ -f $THEME_NAME_PATH ]]; then
|
||||
omarchy-theme-set "$(cat $THEME_NAME_PATH)"
|
||||
fi
|
||||
@@ -56,9 +56,8 @@ omarchy-restart-mako
|
||||
omarchy-theme-set-gnome
|
||||
omarchy-theme-set-browser
|
||||
omarchy-theme-set-vscode
|
||||
omarchy-theme-set-vscodium
|
||||
omarchy-theme-set-cursor
|
||||
omarchy-theme-set-obsidian
|
||||
omarchy-theme-set-asusctl
|
||||
|
||||
# Call hook on theme set
|
||||
omarchy-hook theme-set "$THEME_NAME"
|
||||
|
||||
7
bin/omarchy-theme-set-asusctl
Executable file
7
bin/omarchy-theme-set-asusctl
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
ASUSCTL_THEME=~/.config/omarchy/current/theme/asusctl.rgb
|
||||
|
||||
if omarchy-cmd-present asusctl; then
|
||||
asusctl aura effect static -c $(sed 's/^#//' $ASUSCTL_THEME)
|
||||
fi
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme
|
||||
|
||||
if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy-cmd-present brave; then
|
||||
if omarchy-cmd-present chromium || omarchy-cmd-present brave; then
|
||||
if [[ -f $CHROMIUM_THEME ]]; then
|
||||
THEME_RGB_COLOR=$(<$CHROMIUM_THEME)
|
||||
THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ })
|
||||
@@ -13,14 +13,8 @@ if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy
|
||||
fi
|
||||
|
||||
if omarchy-cmd-present chromium; then
|
||||
rm -f /etc/chromium/policies/managed/color.json
|
||||
chromium --no-startup-window --set-theme-color="$THEME_RGB_COLOR" >/dev/null
|
||||
|
||||
if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then
|
||||
chromium --no-startup-window --set-color-scheme="light" >/dev/null
|
||||
else
|
||||
chromium --no-startup-window --set-color-scheme="dark" >/dev/null
|
||||
fi
|
||||
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null
|
||||
chromium --refresh-platform-policy --no-startup-window >/dev/null
|
||||
fi
|
||||
|
||||
if omarchy-cmd-present brave; then
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Call the VSCode theme setter with Cursor-specific parameters
|
||||
omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes"
|
||||
@@ -1,52 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# omarchy-theme-set-obsidian: Bootstrap and update Omarchy theme for Obsidian
|
||||
#
|
||||
# - Ensures registry at ~/.local/state/omarchy/obsidian-vaults
|
||||
# - Populates by extracting vault paths from ~/.config/obsidian/obsidian.json
|
||||
# - For each valid vault:
|
||||
# - Ensures .obsidian/themes/Omarchy/{manifest.json, theme.css}
|
||||
# - Updates theme.css (uses current theme’s obsidian.css if present; otherwise generates -- see below)
|
||||
# Sync Omarchy theme to all Obsidian vaults
|
||||
|
||||
# Theme automagic generation logic:
|
||||
#
|
||||
# - Background/foreground: read from ~/.config/omarchy/current/theme/alacritty.toml [colors.primary]
|
||||
# (background/foreground). Fallbacks: bg=#1a1b26, fg=#a9b1d6. Compute bg brightness for light/dark handling.
|
||||
# - Palette extraction: collect colors from Alacritty (primary/normal/bright/dim/selection), Waybar (@define-color),
|
||||
# and Hyprland (col.*_border; rgba->hex). Normalize, dedupe, and count frequencies.
|
||||
# - Slot ordering: remove bg/fg, sort remaining colors by frequency, then fill 13 slots by cycling. Map slots to:
|
||||
# h1–h6, links, inline code, marks, interactive accent, blockquote border; muted/faint use border color.
|
||||
# - Code colors: code background = closest color to bg (Euclidean RGB); if none, make a subtle bg variant (+/− RGB).
|
||||
# code foreground = closest color to fg; fallback #e0e0e0.
|
||||
# - Border color: from btop.theme theme[div_line]; else blended mix biased toward bg (≈ (bg+fg)/3).
|
||||
# - Selection: from Alacritty [colors.selection] (background/text), honoring CellForeground/Background.
|
||||
# If missing, background = 75% bg + 25% fg; text chosen for contrast vs selection background.
|
||||
# - Fonts: monospace from Alacritty [font] or fontconfig monospace; UI font from fontconfig sans-serif.
|
||||
|
||||
VAULTS_FILE="$HOME/.local/state/omarchy/obsidian-vaults"
|
||||
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
|
||||
|
||||
ensure_vaults_file() {
|
||||
mkdir -p "$(dirname "$VAULTS_FILE")"
|
||||
local tmpfile
|
||||
tmpfile="$(mktemp)"
|
||||
# Extract the Obsidian vault location from config file <base>/<vault>/.obsidian
|
||||
jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null >>"$tmpfile"
|
||||
if [ -s "$tmpfile" ]; then
|
||||
sort -u "$tmpfile" >"$VAULTS_FILE"
|
||||
else
|
||||
: >"$VAULTS_FILE"
|
||||
fi
|
||||
rm "$tmpfile"
|
||||
}
|
||||
[ -f "$CURRENT_THEME_DIR/obsidian.css" ] || exit 0
|
||||
|
||||
# Ensure theme directory and minimal manifest exist in a vault
|
||||
ensure_theme_scaffold() {
|
||||
local vault_path="$1"
|
||||
local theme_dir="$vault_path/.obsidian/themes/Omarchy"
|
||||
jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null | while read -r vault_path; do
|
||||
[ -d "$vault_path/.obsidian" ] || continue
|
||||
|
||||
theme_dir="$vault_path/.obsidian/themes/Omarchy"
|
||||
mkdir -p "$theme_dir"
|
||||
if [ ! -f "$theme_dir/manifest.json" ]; then
|
||||
cat >"$theme_dir/manifest.json" <<'EOF'
|
||||
|
||||
[ -f "$theme_dir/manifest.json" ] || cat >"$theme_dir/manifest.json" <<'EOF'
|
||||
{
|
||||
"name": "Omarchy",
|
||||
"version": "1.0.0",
|
||||
@@ -56,624 +22,6 @@ ensure_theme_scaffold() {
|
||||
"authorUrl": "https://omarchy.org"
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
[ -f "$theme_dir/theme.css" ] || : >"$theme_dir/theme.css"
|
||||
}
|
||||
|
||||
# Function to extract hex color from string
|
||||
extract_hex_color() {
|
||||
echo "$1" | grep -oE '#[0-9a-fA-F]{6}' | head -1
|
||||
}
|
||||
|
||||
# Function to convert RGB/RGBA to hex
|
||||
rgb_to_hex() {
|
||||
local rgb_string="$1"
|
||||
if [[ $rgb_string =~ rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+) ]]; then
|
||||
printf "#%02x%02x%02x\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Convert hex to RGB components
|
||||
hex_to_rgb() {
|
||||
local hex="${1#\#}"
|
||||
printf "%d %d %d\n" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}"
|
||||
}
|
||||
|
||||
# Calculate perceived brightness (0-255)
|
||||
calculate_brightness() {
|
||||
local hex="$1"
|
||||
read -r r g b <<<"$(hex_to_rgb "$hex")"
|
||||
# Use perceived brightness formula
|
||||
echo $(((r * 299 + g * 587 + b * 114) / 1000))
|
||||
}
|
||||
|
||||
# Calculate approximate contrast ratio between two colors
|
||||
# Returns ratio scaled by 100 (e.g., 450 = 4.5:1 ratio)
|
||||
# (this is due to bash not supporting decimal math)
|
||||
calculate_contrast_ratio() {
|
||||
local hex1="$1" hex2="$2"
|
||||
local br1=$(calculate_brightness "$hex1") # 0-255 range
|
||||
local br2=$(calculate_brightness "$hex2") # 0-255 range
|
||||
|
||||
# Ensure br1 is the lighter color (higher brightness)
|
||||
if [ $br1 -lt $br2 ]; then
|
||||
local temp=$br1
|
||||
br1=$br2
|
||||
br2=$temp
|
||||
fi
|
||||
|
||||
# Approximate contrast ratio scaled by 100
|
||||
# Add offset to avoid division by zero and approximate WCAG +0.05 behavior
|
||||
echo $(((br1 + 13) * 100 / (br2 + 13)))
|
||||
}
|
||||
|
||||
# Check if two colors meet minimum contrast threshold
|
||||
# Usage: meets_contrast_threshold <ratio> <threshold>
|
||||
# Both ratio and threshold should be scaled by 100 (e.g., 300 = 3:1)
|
||||
meets_contrast_threshold() {
|
||||
local ratio="$1" # Ratio scaled by 100 (from calculate_contrast_ratio)
|
||||
local threshold="$2" # Threshold scaled by 100 (300=3:1, 450=4.5:1, 700=7:1)
|
||||
[ $ratio -ge $threshold ]
|
||||
}
|
||||
|
||||
# Calculate color distance (euclidean in RGB space)
|
||||
color_distance() {
|
||||
local hex1="$1"
|
||||
local hex2="$2"
|
||||
read -r r1 g1 b1 <<<"$(hex_to_rgb "$hex1")"
|
||||
read -r r2 g2 b2 <<<"$(hex_to_rgb "$hex2")"
|
||||
echo $(((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2)))
|
||||
}
|
||||
|
||||
# Extract all colors with frequency count
|
||||
extract_all_colors_with_count() {
|
||||
local -A color_counts
|
||||
local color
|
||||
|
||||
# Extract from Alacritty config
|
||||
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
|
||||
# Primary colors
|
||||
while IFS= read -r color; do
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[ -n "$color" ] && ((color_counts["$color"]++))
|
||||
done < <(grep -E "(background|foreground|cursor|text)" "$CURRENT_THEME_DIR/alacritty.toml" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
|
||||
|
||||
# Normal colors
|
||||
while IFS= read -r color; do
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[ -n "$color" ] && ((color_counts["$color"]++))
|
||||
done < <(grep -A 20 "\[colors.normal\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
|
||||
|
||||
# Bright colors
|
||||
while IFS= read -r color; do
|
||||
# Add # if missing
|
||||
[[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
|
||||
done < <(grep -A 20 "\[colors.bright\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
|
||||
|
||||
# Dim colors if present
|
||||
while IFS= read -r color; do
|
||||
# Add # if missing
|
||||
[[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
|
||||
done < <(grep -A 20 "\[colors.dim\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
|
||||
|
||||
# Selection colors
|
||||
while IFS= read -r color; do
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[ -n "$color" ] && ((color_counts["$color"]++))
|
||||
done < <(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(background|text)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
|
||||
fi
|
||||
|
||||
# Extract from Waybar CSS
|
||||
if [ -f "$CURRENT_THEME_DIR/waybar.css" ]; then
|
||||
while IFS= read -r color; do
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[ -n "$color" ] && ((color_counts["$color"]++))
|
||||
done < <(grep -oE '@define-color [a-z_-]+ #[0-9a-fA-F]{6}' "$CURRENT_THEME_DIR/waybar.css" | grep -oE '#[0-9a-fA-F]{6}')
|
||||
fi
|
||||
|
||||
# Extract from Hyprland config
|
||||
if [ -f "$CURRENT_THEME_DIR/hyprland.conf" ]; then
|
||||
while IFS= read -r color; do
|
||||
if [[ $color == rgba* ]] || [[ $color == rgb* ]]; then
|
||||
color=$(rgb_to_hex "$color")
|
||||
fi
|
||||
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
|
||||
[ -n "$color" ] && ((color_counts["$color"]++))
|
||||
done < <(grep -E "col\.(active|inactive)_border" "$CURRENT_THEME_DIR/hyprland.conf" | grep -oE 'rgba?\([^)]+\)|#[0-9a-fA-F]{6,8}' | sed 's/ff$//')
|
||||
fi
|
||||
|
||||
# Output colors with their counts
|
||||
for color in "${!color_counts[@]}"; do
|
||||
echo "${color_counts[$color]} $color"
|
||||
done
|
||||
}
|
||||
|
||||
# Sort colors by frequency
|
||||
sort_colors_by_frequency() {
|
||||
# Input is already "count color" format
|
||||
sort -rn | cut -d' ' -f2
|
||||
}
|
||||
|
||||
# Fill color slots with cycling if needed
|
||||
fill_color_slots() {
|
||||
local -a colors=("$@")
|
||||
local -a slots
|
||||
local num_colors=${#colors[@]}
|
||||
|
||||
# Need 13 slots total (code colors are handled separately)
|
||||
local slots_needed=13
|
||||
|
||||
if [ $num_colors -eq 0 ]; then
|
||||
# No colors available, use defaults
|
||||
colors=("#3d3d3d" "#5d5d5d" "#7d7d7d" "#9d9d9d" "#bd93f9" "#50fa7b")
|
||||
num_colors=6
|
||||
fi
|
||||
|
||||
# Fill slots, cycling if necessary
|
||||
for ((i = 0; i < slots_needed; i++)); do
|
||||
slots[$i]="${colors[$((i % num_colors))]}"
|
||||
done
|
||||
|
||||
echo "${slots[@]}"
|
||||
}
|
||||
|
||||
# Main color extraction and theme generation
|
||||
extract_theme_data() {
|
||||
# Get primary colors from Alacritty
|
||||
local bg_color="#1a1b26"
|
||||
local fg_color="#a9b1d6"
|
||||
|
||||
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
|
||||
local extracted_bg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
|
||||
local extracted_fg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^foreground = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
|
||||
[ -n "$extracted_bg" ] && bg_color="$extracted_bg"
|
||||
[ -n "$extracted_fg" ] && fg_color="$extracted_fg"
|
||||
fi
|
||||
|
||||
# Determine if light or dark theme
|
||||
local bg_brightness=$(calculate_brightness "$bg_color")
|
||||
local is_light_theme=false
|
||||
[ $bg_brightness -gt 127 ] && is_light_theme=true
|
||||
|
||||
# Extract all colors with counts
|
||||
local color_data=$(extract_all_colors_with_count)
|
||||
|
||||
# Filter out background and foreground colors for the main array
|
||||
local filtered_data=$(echo "$color_data" | grep -v "$bg_color" | grep -v "$fg_color")
|
||||
|
||||
# Get all unique colors (including bg/fg) for distance calculations
|
||||
local -a all_unique_colors
|
||||
readarray -t all_unique_colors < <(echo "$color_data" | cut -d' ' -f2 | sort -u)
|
||||
|
||||
# Find the 3 closest colors to background for background variations
|
||||
local -a bg_distances
|
||||
for color in "${all_unique_colors[@]}"; do
|
||||
if [ "$color" != "$bg_color" ]; then
|
||||
distance=$(color_distance "$color" "$bg_color")
|
||||
bg_distances+=("$distance:$color")
|
||||
fi
|
||||
done
|
||||
|
||||
# All background variations use the same as primary background
|
||||
local bg_primary_alt="$bg_color"
|
||||
local bg_secondary="$bg_color"
|
||||
local bg_secondary_alt="$bg_color"
|
||||
|
||||
# Generate code background color that will contrast with foreground text
|
||||
read -r r g b <<<"$(hex_to_rgb "$bg_color")"
|
||||
if [ $bg_brightness -gt 127 ]; then
|
||||
r=$((r - 10))
|
||||
g=$((g - 10))
|
||||
b=$((b - 10))
|
||||
else
|
||||
r=$((r + 15))
|
||||
g=$((g + 15))
|
||||
b=$((b + 15))
|
||||
fi
|
||||
[ $r -lt 0 ] && r=0
|
||||
[ $r -gt 255 ] && r=255
|
||||
[ $g -lt 0 ] && g=0
|
||||
[ $g -gt 255 ] && g=255
|
||||
[ $b -lt 0 ] && b=0
|
||||
[ $b -gt 255 ] && b=255
|
||||
code_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
|
||||
|
||||
|
||||
# Find closest color to foreground for code block text
|
||||
local code_fg=""
|
||||
min_distance=999999999
|
||||
for color in "${all_unique_colors[@]}"; do
|
||||
if [ "$color" != "$fg_color" ]; then
|
||||
distance=$(color_distance "$color" "$fg_color")
|
||||
if [ $distance -lt $min_distance ]; then
|
||||
min_distance=$distance
|
||||
code_fg="$color"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
[ -z "$code_fg" ] && code_fg="#e0e0e0" # Fallback
|
||||
|
||||
# Extract text selection colors from Alacritty
|
||||
local selection_bg=""
|
||||
local selection_fg=""
|
||||
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
|
||||
selection_bg=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
|
||||
local selection_text=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
# If text is set to CellForeground/CellBackground, use the appropriate color
|
||||
if [ -z "$selection_text" ] || [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellForeground"* ]]; then
|
||||
selection_fg="$fg_color"
|
||||
elif [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellBackground"* ]]; then
|
||||
selection_fg="$bg_color"
|
||||
else
|
||||
selection_fg="$selection_text"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback if no selection colors found
|
||||
if [ -z "$selection_bg" ]; then
|
||||
read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
|
||||
read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
|
||||
local r=$(((r1 * 3 + r2) / 4)) # 75% background, 25% foreground
|
||||
local g=$(((g1 * 3 + g2) / 4))
|
||||
local b=$(((b1 * 3 + b2) / 4))
|
||||
selection_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
|
||||
fi
|
||||
|
||||
# Use contrasting color for selection text if not defined
|
||||
if [ -z "$selection_fg" ]; then
|
||||
# Calculate brightness of selection background
|
||||
local sel_brightness=$(calculate_brightness "$selection_bg")
|
||||
if [ $sel_brightness -gt 127 ]; then
|
||||
selection_fg="$bg_color" # Dark text on light selection
|
||||
else
|
||||
selection_fg="$fg_color" # Light text on dark selection
|
||||
fi
|
||||
fi
|
||||
|
||||
# Extract border color from btop theme
|
||||
local border_color=""
|
||||
if [ -f "$CURRENT_THEME_DIR/btop.theme" ]; then
|
||||
# Look for theme[div_line] in btop theme
|
||||
local btop_divline=$(grep 'theme\[div_line\]' "$CURRENT_THEME_DIR/btop.theme" | head -1)
|
||||
|
||||
if [ -n "$btop_divline" ]; then
|
||||
# Extract the color value after the = sign
|
||||
local extracted=$(echo "$btop_divline" | sed 's/.*=//' | xargs)
|
||||
|
||||
# Check if it's a hex color and lowercase it
|
||||
if [[ $extracted =~ ^#[0-9a-fA-F]{6}$ ]]; then
|
||||
border_color=$(echo "$extracted" | tr '[:upper:]' '[:lower:]')
|
||||
elif [[ $extracted =~ ^[0-9a-fA-F]{6}$ ]]; then
|
||||
# Add # if missing and lowercase
|
||||
border_color=$(echo "#$extracted" | tr '[:upper:]' '[:lower:]')
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fallback if no border color found
|
||||
if [ -z "$border_color" ]; then
|
||||
# Use a color between bg and fg
|
||||
read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
|
||||
read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
|
||||
local r=$(((r1 + r2) / 3)) # Closer to background
|
||||
local g=$(((g1 + g2) / 3))
|
||||
local b=$(((b1 + b2) / 3))
|
||||
border_color=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
|
||||
fi
|
||||
|
||||
# Set text colors for muted/faint based on contrast
|
||||
local text_muted_color="$border_color"
|
||||
local text_faint_color="$border_color"
|
||||
|
||||
# Validate border color contrast against background
|
||||
|
||||
# Represents a 3:1 WCAG contrast ratio
|
||||
local ideal_contrast_ratio=300
|
||||
|
||||
local border_contrast=$(calculate_contrast_ratio "$border_color" "$bg_color")
|
||||
if ! meets_contrast_threshold "$border_contrast" "$ideal_contrast_ratio"; then
|
||||
# Override text colors for readability, keep border color for visibility
|
||||
text_muted_color="$fg_color"
|
||||
text_faint_color="$fg_color"
|
||||
fi
|
||||
|
||||
# Get unique colors array (without bg/fg) sorted by frequency
|
||||
local -a unique_colors
|
||||
readarray -t unique_colors < <(echo "$filtered_data" | sort_colors_by_frequency)
|
||||
|
||||
# Fill the 13 color slots (code colors handled separately)
|
||||
local -a color_slots
|
||||
readarray -t color_slots < <(fill_color_slots "${unique_colors[@]}" | tr ' ' '\n')
|
||||
|
||||
# Extract fonts
|
||||
local monospace_font="JetBrainsMono Nerd Font"
|
||||
local ui_font="Liberation Sans"
|
||||
|
||||
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
|
||||
local alacritty_font=$(grep -A 5 "\[font\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep 'family = ' | head -1 | cut -d'"' -f2)
|
||||
[ -n "$alacritty_font" ] && monospace_font="$alacritty_font"
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.config/fontconfig/fonts.conf" ]; then
|
||||
local fontconfig_mono=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
|
||||
[ -n "$fontconfig_mono" ] && monospace_font="$fontconfig_mono"
|
||||
|
||||
local fontconfig_sans=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="sans-serif"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
|
||||
[ -n "$fontconfig_sans" ] && ui_font="$fontconfig_sans"
|
||||
fi
|
||||
|
||||
# Generate CSS with 14-slot system
|
||||
cat <<EOF
|
||||
/* Omarchy Theme for Obsidian */
|
||||
/* Generated on $(date) from theme: $(basename "$(readlink "$CURRENT_THEME_DIR" 2>/dev/null || echo "unknown")") */
|
||||
/* Colors sorted by frequency, backgrounds by distance */
|
||||
|
||||
.theme-dark, .theme-light {
|
||||
/* Core colors */
|
||||
--background-primary: $bg_color;
|
||||
--text-normal: $fg_color;
|
||||
|
||||
/* Background variations (always distance-based) */
|
||||
--background-primary-alt: $bg_primary_alt;
|
||||
--background-secondary: $bg_secondary;
|
||||
--background-secondary-alt: $bg_secondary_alt;
|
||||
|
||||
/* Code block colors (always distance-based) */
|
||||
--code-background: $code_bg;
|
||||
--code-foreground: $code_fg;
|
||||
|
||||
/* Border color from btop theme */
|
||||
--border-color: $border_color;
|
||||
|
||||
/* Selection colors from Alacritty */
|
||||
--text-selection: $selection_bg;
|
||||
--text-selection-fg: $selection_fg;
|
||||
|
||||
/* 13-slot color system for remaining elements */
|
||||
--text-title-h1: ${color_slots[0]};
|
||||
--text-title-h2: ${color_slots[1]};
|
||||
--text-title-h3: ${color_slots[2]};
|
||||
--text-title-h4: ${color_slots[3]};
|
||||
--text-title-h5: ${color_slots[4]};
|
||||
--text-title-h6: ${color_slots[4]}; /* Same as h5 */
|
||||
--text-link: ${color_slots[5]};
|
||||
--markup-code: ${color_slots[6]};
|
||||
--text-mark: ${color_slots[7]};
|
||||
--interactive-accent: ${color_slots[8]};
|
||||
--blockquote-border: ${color_slots[9]};
|
||||
--text-muted: $text_muted_color; /* Use text-specific color for muted text */
|
||||
--text-faint: $text_faint_color; /* Use text-specific color for faint text */
|
||||
|
||||
/* Additional mappings */
|
||||
--text-accent: var(--interactive-accent);
|
||||
--text-accent-hover: var(--interactive-accent);
|
||||
--text-error: var(--text-title-h1);
|
||||
--text-error-hover: var(--text-title-h1);
|
||||
--text-highlight-bg: $fg_color; /* Use text color as highlight background */
|
||||
--text-on-accent: $bg_color;
|
||||
|
||||
--interactive-normal: var(--code-background);
|
||||
--interactive-hover: var(--interactive-accent);
|
||||
--interactive-accent-hover: var(--interactive-accent);
|
||||
--interactive-success: var(--text-title-h2);
|
||||
|
||||
--scrollbar-bg: var(--background-primary);
|
||||
--scrollbar-thumb-bg: var(--code-background);
|
||||
--scrollbar-active-thumb-bg: var(--interactive-accent);
|
||||
|
||||
--background-modifier-border: var(--border-color);
|
||||
--background-modifier-form-field: var(--code-background);
|
||||
--background-modifier-form-field-highlighted: var(--code-background);
|
||||
--background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
|
||||
--background-modifier-success: var(--interactive-success);
|
||||
--background-modifier-error: var(--text-error);
|
||||
--background-modifier-error-hover: var(--text-error);
|
||||
--background-modifier-cover: rgba(0, 0, 0, 0.8);
|
||||
|
||||
--link-color: var(--text-link);
|
||||
--link-color-hover: var(--text-link);
|
||||
--link-unresolved-color: var(--text-muted);
|
||||
--link-unresolved-opacity: 0.7;
|
||||
|
||||
--tag-color: var(--text-title-h3);
|
||||
--tag-background: var(--code-background);
|
||||
|
||||
--graph-line: var(--text-muted);
|
||||
--graph-node: var(--interactive-accent);
|
||||
--graph-node-unresolved: var(--text-muted);
|
||||
--graph-node-focused: var(--text-link);
|
||||
--graph-node-tag: var(--text-title-h3);
|
||||
--graph-node-attachment: var(--text-title-h2);
|
||||
|
||||
/* Fonts */
|
||||
--font-interface-theme: "$ui_font";
|
||||
--font-text-theme: "$ui_font";
|
||||
--font-monospace-theme: "$monospace_font";
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); }
|
||||
.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); }
|
||||
.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); }
|
||||
.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); }
|
||||
.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); }
|
||||
.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); }
|
||||
|
||||
/* Code blocks */
|
||||
.markdown-rendered code {
|
||||
font-family: var(--font-monospace-theme);
|
||||
background-color: var(--code-background);
|
||||
color: var(--markup-code);
|
||||
padding: 2px 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown-rendered pre {
|
||||
background-color: var(--code-background);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.markdown-rendered pre code {
|
||||
background-color: transparent;
|
||||
color: var(--code-foreground);
|
||||
}
|
||||
|
||||
/* Syntax highlighting */
|
||||
.cm-s-obsidian span.cm-keyword { color: var(--text-title-h1); }
|
||||
.cm-s-obsidian span.cm-string { color: var(--text-title-h2); }
|
||||
.cm-s-obsidian span.cm-number { color: var(--text-title-h3); }
|
||||
.cm-s-obsidian span.cm-comment { color: var(--text-muted); }
|
||||
.cm-s-obsidian span.cm-operator { color: var(--text-link); }
|
||||
.cm-s-obsidian span.cm-variable { color: var(--text-normal); }
|
||||
.cm-s-obsidian span.cm-def { color: var(--text-link); }
|
||||
|
||||
/* Highlighted text */
|
||||
.markdown-rendered mark,
|
||||
.cm-s-obsidian span.cm-highlight,
|
||||
mark {
|
||||
background-color: var(--text-highlight-bg) !important;
|
||||
color: var(--code-background) !important;
|
||||
}
|
||||
|
||||
/* Links */
|
||||
.markdown-rendered a {
|
||||
color: var(--text-link);
|
||||
}
|
||||
|
||||
/* Blockquotes */
|
||||
.markdown-rendered blockquote {
|
||||
border-left: 4px solid var(--blockquote-border);
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
/* Status bar */
|
||||
.status-bar {
|
||||
background-color: var(--code-background);
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
/* Active file */
|
||||
.workspace-leaf.mod-active .workspace-leaf-header-title {
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.nav-file-title.is-active {
|
||||
background-color: var(--code-background);
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
/* Text selection */
|
||||
::selection {
|
||||
background-color: var(--text-selection);
|
||||
color: var(--text-selection-fg);
|
||||
}
|
||||
|
||||
/* Search results */
|
||||
.search-result-file-title {
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.search-result-file-match {
|
||||
background-color: var(--code-background);
|
||||
color: var(--text-normal);
|
||||
border-left: 3px solid var(--interactive-accent);
|
||||
}
|
||||
|
||||
.search-result-file-matched-text {
|
||||
color: var(--code-background);
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
.markdown-rendered table {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.markdown-rendered th {
|
||||
background-color: var(--code-background);
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
.markdown-rendered td {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
/* Callouts */
|
||||
.callout {
|
||||
border-left: 4px solid var(--interactive-accent);
|
||||
background-color: var(--code-background);
|
||||
}
|
||||
.callout * {
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
/* Modal dialogs */
|
||||
.modal {
|
||||
background-color: var(--background-primary);
|
||||
border: 2px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
/* Settings */
|
||||
.vertical-tab-header-group-title {
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.vertical-tab-nav-item.is-active {
|
||||
background-color: var(--code-background);
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
# Option handling
|
||||
if [ "${1:-}" = "--reset" ]; then
|
||||
echo "♻️ Resetting Omarchy themes and registry..."
|
||||
if [ -f "$VAULTS_FILE" ] && [ -s "$VAULTS_FILE" ]; then
|
||||
while IFS= read -r vault_path || [ -n "$vault_path" ]; do
|
||||
case "$vault_path" in ""|\#*) continue ;; esac
|
||||
vault_path="${vault_path%/}"
|
||||
vault_name=$(basename "$vault_path")
|
||||
theme_dir="$vault_path/.obsidian/themes/Omarchy"
|
||||
if [ -d "$theme_dir" ]; then
|
||||
rm -rf "$theme_dir"
|
||||
echo " ✅ $vault_name (theme removed)"
|
||||
else
|
||||
echo " ℹ️ $vault_name (no theme present)"
|
||||
fi
|
||||
done <"$VAULTS_FILE"
|
||||
fi
|
||||
rm -f "$VAULTS_FILE"
|
||||
echo "✅ Registry removed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Step 1: ensure registry exists (bootstrap if needed)
|
||||
ensure_vaults_file
|
||||
|
||||
while IFS= read -r vault_path || [ -n "$vault_path" ]; do
|
||||
case "$vault_path" in "" | \#*) continue ;; esac
|
||||
vault_path="${vault_path%/}"
|
||||
vault_name=$(basename "$vault_path")
|
||||
|
||||
# Step 2: verify path exists; log/skip gracefully if invalid
|
||||
if [ ! -d "$vault_path" ] || [ ! -d "$vault_path/.obsidian" ]; then
|
||||
echo " ❌ $vault_name (invalid entry: missing directory or .obsidian)"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Ensure theme files exist for this vault
|
||||
ensure_theme_scaffold "$vault_path"
|
||||
THEME_DIR="$vault_path/.obsidian/themes/Omarchy"
|
||||
|
||||
# Step 3: update theme.css
|
||||
if [ -f "$CURRENT_THEME_DIR/obsidian.css" ]; then
|
||||
cp "$CURRENT_THEME_DIR/obsidian.css" "$THEME_DIR/theme.css"
|
||||
else
|
||||
extract_theme_data >"$THEME_DIR/theme.css"
|
||||
fi
|
||||
done <"$VAULTS_FILE"
|
||||
cp "$CURRENT_THEME_DIR/obsidian.css" "$theme_dir/theme.css"
|
||||
done
|
||||
|
||||
@@ -13,22 +13,21 @@ hex_to_rgb() {
|
||||
|
||||
# Only generate dynamic templates for themes with a colors.toml definition
|
||||
if [[ -f $COLORS_FILE ]]; then
|
||||
# Parse TOML using yq (treating it as YAML since the flat key=value structure is compatible)
|
||||
# We convert 'key = value' to 'key: value' to make it valid YAML, then use yq/jq to generate the replacement commands.
|
||||
sed_script=$(mktemp)
|
||||
|
||||
# Generate standard and _strip substitutions
|
||||
sed 's/=/:/' "$COLORS_FILE" | yq -r 'to_entries[] | "s|{{ \(.key) }}|\(.value)|g", "s|{{ \(.key)_strip }}|\(.value | sub("^#";""))|g"' > "$sed_script"
|
||||
|
||||
# Generate _rgb substitutions for hex colors
|
||||
while IFS='=' read -r key value; do
|
||||
key=$(echo "$key" | xargs)
|
||||
value=$(echo "$value" | xargs | tr -d '"')
|
||||
key="${key//[\"\' ]/}" # strip quotes and spaces from key
|
||||
[[ $key && $key != \#* ]] || continue # skip empty lines and comments
|
||||
value="${value#*[\"\']}"
|
||||
value="${value%%[\"\']*}" # extract value between quotes (ignores inline comments)
|
||||
|
||||
printf 's|{{ %s }}|%s|g\n' "$key" "$value" # {{ key }} -> value
|
||||
printf 's|{{ %s_strip }}|%s|g\n' "$key" "${value#\#}" # {{ key_strip }} -> value without leading #
|
||||
if [[ $value =~ ^# ]]; then
|
||||
rgb=$(hex_to_rgb "$value")
|
||||
echo "s|{{ ${key}_rgb }}|${rgb}|g" >> "$sed_script"
|
||||
echo "s|{{ ${key}_rgb }}|${rgb}|g"
|
||||
fi
|
||||
done < "$COLORS_FILE"
|
||||
done <"$COLORS_FILE" >"$sed_script"
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
@@ -39,7 +38,7 @@ if [[ -f $COLORS_FILE ]]; then
|
||||
|
||||
# Don't overwrite configs already exists in the output directory (copied from theme specific folder)
|
||||
if [[ ! -f $output_path ]]; then
|
||||
sed -f "$sed_script" "$tpl" > "$output_path"
|
||||
sed -f "$sed_script" "$tpl" >"$output_path"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
@@ -1,45 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments),
|
||||
# which jq doesn’t support.
|
||||
# Sync Omarchy theme to VS Code, VSCodium, and Cursor
|
||||
|
||||
# Parameters: EDITOR_CMD SETTINGS_PATH SKIP_FLAG EDITOR_NAME
|
||||
EDITOR_CMD="${1:-code}"
|
||||
SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}"
|
||||
SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}"
|
||||
VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
|
||||
|
||||
if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then
|
||||
set_theme() {
|
||||
local editor_cmd="$1"
|
||||
local settings_path="$2"
|
||||
local skip_flag="$3"
|
||||
|
||||
omarchy-cmd-present "$editor_cmd" && [[ ! -f "$skip_flag" ]] || return 0
|
||||
|
||||
if [[ -f "$VS_CODE_THEME" ]]; then
|
||||
theme_name=$(jq -r '.name' "$VS_CODE_THEME")
|
||||
extension=$(jq -r '.extension' "$VS_CODE_THEME")
|
||||
|
||||
# Install theme extension
|
||||
if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then
|
||||
"$EDITOR_CMD" --install-extension "$extension" >/dev/null
|
||||
if [[ -n "$extension" ]] && ! "$editor_cmd" --list-extensions | grep -Fxq "$extension"; then
|
||||
"$editor_cmd" --install-extension "$extension" >/dev/null
|
||||
fi
|
||||
|
||||
# Create config file if there isn't already one
|
||||
mkdir -p "$(dirname "$SETTINGS_PATH")"
|
||||
if [[ ! -f "$SETTINGS_PATH" ]]; then
|
||||
printf '{\n}\n' >"$SETTINGS_PATH"
|
||||
mkdir -p "$(dirname "$settings_path")"
|
||||
[[ -f "$settings_path" ]] || printf '{\n}\n' >"$settings_path"
|
||||
|
||||
if ! grep -q '"workbench.colorTheme"' "$settings_path"; then
|
||||
sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$settings_path"
|
||||
fi
|
||||
|
||||
# Create a `workbench.colorTheme` entry in settings.
|
||||
if ! grep -q '"workbench.colorTheme"' "$SETTINGS_PATH"; then
|
||||
# Insert `"workbench.colorTheme": "",` immediately after the first `{`
|
||||
# Use sed's first-match range (0,/{/) to only replace the first `{`
|
||||
sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$SETTINGS_PATH"
|
||||
fi
|
||||
|
||||
# Update theme
|
||||
sed -i --follow-symlinks -E \
|
||||
"s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \
|
||||
"$SETTINGS_PATH"
|
||||
else
|
||||
# Remove theme from settings.json when the theme doesn't have editor support
|
||||
if [[ -f "$SETTINGS_PATH" ]]; then
|
||||
sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH"
|
||||
fi
|
||||
"$settings_path"
|
||||
elif [[ -f "$settings_path" ]]; then
|
||||
sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$settings_path"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
set_theme "code" "$HOME/.config/Code/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes"
|
||||
set_theme "codium" "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes"
|
||||
set_theme "cursor" "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes"
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Call the VSCode theme setter with VSCodium-specific parameters
|
||||
omarchy-theme-set-vscode codium "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes"
|
||||
53
bin/omarchy-toggle-hybrid-gpu
Executable file
53
bin/omarchy-toggle-hybrid-gpu
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Toggle dedicated vs integrated GPU mode via supergfxd (for hybrid gpu laptops, like Asus G14).
|
||||
# Requires reboot to take effect.
|
||||
|
||||
# Ensure supergfxctl has been installed
|
||||
if omarchy-cmd-missing supergfxctl; then
|
||||
omarchy-pkg-add supergfxctl
|
||||
sudo systemctl enable supergfxd
|
||||
|
||||
# Needed to deal with restoring to sleep where going through VFIO first means we don't need to reboot.
|
||||
sudo sed -i "s/\"vfio_enable\": \".*\"/\"vfio_enable\": true/" /etc/supergfxd.conf
|
||||
fi
|
||||
|
||||
gpu_mode=$(supergfxctl -g)
|
||||
|
||||
case "$gpu_mode" in
|
||||
"Integrated")
|
||||
if gum confirm "Enable dedicated GPU and reboot?"; then
|
||||
# Switch to hybrid mode
|
||||
sudo sed -i "s/\"mode\": \".*\"/\"mode\": \"Hybrid\"/" /etc/supergfxd.conf
|
||||
|
||||
# Let hybrid mode be the default after system sleep
|
||||
sudo rm -rf /usr/lib/systemd/system-sleep/force-igpu
|
||||
|
||||
# Remove the startup delay override (not needed for Hybrid mode)
|
||||
sudo rm -rf /etc/systemd/system/supergfxd.service.d/delay-start.conf
|
||||
|
||||
omarchy-cmd-reboot
|
||||
fi
|
||||
;;
|
||||
"Hybrid")
|
||||
if gum confirm "Use only integrated GPU and reboot?"; then
|
||||
# Switch to integrated mode
|
||||
sudo sed -i "s/\"mode\": \".*\"/\"mode\": \"Integrated\"/" /etc/supergfxd.conf
|
||||
|
||||
# Force igpu mode after system sleep (or dgpu could get activated)
|
||||
sudo mkdir -p /usr/lib/systemd/system-sleep
|
||||
sudo cp -p $OMARCHY_PATH/default/systemd/system-sleep/force-igpu /usr/lib/systemd/system-sleep/
|
||||
|
||||
# Delay supergfxd startup to avoid race condition with display manager
|
||||
# that can cause system freeze when booting in Integrated mode
|
||||
sudo mkdir -p /etc/systemd/system/supergfxd.service.d
|
||||
sudo cp -p $OMARCHY_PATH/default/systemd/system/supergfxd.service.d/delay-start.conf /etc/systemd/system/supergfxd.service.d/
|
||||
|
||||
omarchy-cmd-reboot
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Hybrid GPU not found or in unknown mode."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
36
bin/omarchy-tui-remove-all
Executable file
36
bin/omarchy-tui-remove-all
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Remove all TUIs installed via omarchy-tui-install.
|
||||
# Identifies TUIs by their Exec pattern (xdg-terminal-exec --app-id=TUI.).
|
||||
|
||||
set -e
|
||||
|
||||
APP_DIR="${1:-$HOME/.local/share/applications}"
|
||||
ICON_DIR="$HOME/.local/share/applications/icons"
|
||||
|
||||
echo "Scanning for TUIs in $APP_DIR..."
|
||||
|
||||
tui_desktop_files=()
|
||||
while IFS= read -r -d '' file; do
|
||||
if grep -q "Exec=xdg-terminal-exec --app-id=TUI\." "$file" 2>/dev/null; then
|
||||
tui_desktop_files+=("$file")
|
||||
fi
|
||||
done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null)
|
||||
|
||||
if [[ ${#tui_desktop_files[@]} -eq 0 ]]; then
|
||||
echo "No TUIs found."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for file in "${tui_desktop_files[@]}"; do
|
||||
app_name=$(basename "$file" .desktop)
|
||||
echo "Removing TUI: $app_name"
|
||||
rm -f "$file"
|
||||
rm -f "$ICON_DIR/$app_name.png"
|
||||
done
|
||||
|
||||
if command -v update-desktop-database &>/dev/null; then
|
||||
update-desktop-database "$APP_DIR" &>/dev/null || true
|
||||
fi
|
||||
|
||||
echo "TUIs removed successfully."
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m"' ERR
|
||||
trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m";omarchy-snapshot delete' ERR
|
||||
|
||||
if [[ $1 == "-y" ]] || omarchy-update-confirm; then
|
||||
omarchy-snapshot create || [ $? -eq 127 ]
|
||||
|
||||
18
bin/omarchy-update-analyze-logs
Executable file
18
bin/omarchy-update-analyze-logs
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
update_log="/tmp/omarchy-update.log"
|
||||
|
||||
# Check for errors
|
||||
if grep -qi "error" "$update_log"; then
|
||||
echo -e "\e[31mNon-stopping errors detected during update:\e[0m"
|
||||
grep -i "error" "$update_log"
|
||||
echo
|
||||
fi
|
||||
|
||||
# Check for initramfs generation failure
|
||||
if grep -q "Updating linux initcpios" "$update_log"; then
|
||||
if ! grep -q "Initcpio image generation successful" "$update_log"; then
|
||||
echo -e '\e[31mError: Initramfs generation may have failed. Review logs before restart.\e[0m'
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
13
bin/omarchy-update-aur-pkgs
Executable file
13
bin/omarchy-update-aur-pkgs
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Update AUR packages if any are installed
|
||||
if pacman -Qem >/dev/null; then
|
||||
if omarchy-pkg-aur-accessible; then
|
||||
echo -e "\e[32m\nUpdate AUR packages\e[0m"
|
||||
yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs
|
||||
echo
|
||||
else
|
||||
echo -e "\e[31m\nAUR is unavailable (so skipping updates)\e[0m"
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
@@ -7,5 +7,5 @@ if omarchy-cmd-missing fwupdmgr; then
|
||||
omarchy-pkg-add fwupd
|
||||
fi
|
||||
|
||||
fwupdmgr refresh
|
||||
fwupdmgr refresh --force
|
||||
sudo fwupdmgr update
|
||||
|
||||
10
bin/omarchy-update-orphan-pkgs
Executable file
10
bin/omarchy-update-orphan-pkgs
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
orphans=$(pacman -Qtdq || true)
|
||||
if [[ -n $orphans ]]; then
|
||||
echo -e "\e[32m\nRemove orphan system packages\e[0m"
|
||||
for pkg in $orphans; do
|
||||
sudo pacman -Rs --noconfirm "$pkg" || true
|
||||
done
|
||||
echo
|
||||
fi
|
||||
@@ -5,13 +5,21 @@ set -e
|
||||
# Ensure screensaver/sleep doesn't set in during updates
|
||||
hyprctl dispatch tagwindow +noidle &> /dev/null || true
|
||||
|
||||
# Capture update logs
|
||||
exec > >(tee "/tmp/omarchy-update.log") 2>&1
|
||||
|
||||
# Perform all update steps
|
||||
omarchy-update-time
|
||||
omarchy-update-keyring
|
||||
omarchy-update-available-reset
|
||||
omarchy-update-system-pkgs
|
||||
omarchy-migrate
|
||||
omarchy-update-aur-pkgs
|
||||
omarchy-update-orphan-pkgs
|
||||
omarchy-hook post-update
|
||||
|
||||
omarchy-update-analyze-logs
|
||||
|
||||
omarchy-update-restart
|
||||
|
||||
# Re-enable screensaver/sleep after updates
|
||||
|
||||
@@ -4,24 +4,3 @@ set -e
|
||||
|
||||
echo -e "\e[32m\nUpdate system packages\e[0m"
|
||||
sudo pacman -Syyu --noconfirm
|
||||
|
||||
# Update AUR packages if any are installed
|
||||
if pacman -Qem >/dev/null; then
|
||||
if omarchy-pkg-aur-accessible; then
|
||||
echo -e "\e[32m\nUpdate AUR packages\e[0m"
|
||||
yay -Sua --noconfirm
|
||||
echo
|
||||
else
|
||||
echo -e "\e[31m\nAUR is unavailable (so skipping updates)\e[0m"
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
|
||||
orphans=$(pacman -Qtdq || true)
|
||||
if [[ -n $orphans ]]; then
|
||||
echo -e "\e[32m\nRemove orphan system packages\e[0m"
|
||||
for pkg in $orphans; do
|
||||
sudo pacman -Rs --noconfirm "$pkg" || true
|
||||
done
|
||||
echo
|
||||
fi
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
if grep -q "https://stable-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
|
||||
mirror="stable"
|
||||
elif grep -q "https://rc-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
|
||||
mirror="rc"
|
||||
elif grep -q "https://mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
|
||||
mirror="edge"
|
||||
else
|
||||
@@ -12,6 +14,8 @@ if grep -q "https://pkgs.omarchy.org/stable/" /etc/pacman.conf; then
|
||||
pkgs="stable"
|
||||
elif grep -q "https://pkgs.omarchy.org/edge/" /etc/pacman.conf; then
|
||||
pkgs="edge"
|
||||
elif grep -q "https://pkgs.omarchy.org/rc/" /etc/pacman.conf; then
|
||||
pkgs="rc"
|
||||
else
|
||||
pkgs="unknown"
|
||||
fi
|
||||
|
||||
36
bin/omarchy-webapp-remove-all
Executable file
36
bin/omarchy-webapp-remove-all
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Remove all web apps installed via omarchy-webapp-install.
|
||||
# Identifies web apps by their Exec pattern (omarchy-launch-webapp or omarchy-webapp-handler).
|
||||
|
||||
set -e
|
||||
|
||||
APP_DIR="${1:-$HOME/.local/share/applications}"
|
||||
ICON_DIR="$HOME/.local/share/applications/icons"
|
||||
|
||||
echo "Scanning for web apps in $APP_DIR..."
|
||||
|
||||
webapp_desktop_files=()
|
||||
while IFS= read -r -d '' file; do
|
||||
if grep -q "Exec=omarchy-launch-webapp\|Exec=omarchy-webapp-handler" "$file" 2>/dev/null; then
|
||||
webapp_desktop_files+=("$file")
|
||||
fi
|
||||
done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null)
|
||||
|
||||
if [[ ${#webapp_desktop_files[@]} -eq 0 ]]; then
|
||||
echo "No web apps found."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for file in "${webapp_desktop_files[@]}"; do
|
||||
app_name=$(basename "$file" .desktop)
|
||||
echo "Removing web app: $app_name"
|
||||
rm -f "$file"
|
||||
rm -f "$ICON_DIR/$app_name.png"
|
||||
done
|
||||
|
||||
if command -v update-desktop-database &>/dev/null; then
|
||||
update-desktop-database "$APP_DIR" &>/dev/null || true
|
||||
fi
|
||||
|
||||
echo "Web apps removed successfully."
|
||||
5
bin/omarchy-wifi-powersave
Executable file
5
bin/omarchy-wifi-powersave
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
for iface in /sys/class/net/*/wireless; do
|
||||
iface="$(basename "$(dirname "$iface")")"
|
||||
iw dev "$iface" set power_save "$1" 2>/dev/null
|
||||
done
|
||||
@@ -185,6 +185,8 @@ services:
|
||||
DISK_SIZE: "$SELECTED_DISK"
|
||||
USERNAME: "$USERNAME"
|
||||
PASSWORD: "$PASSWORD"
|
||||
TZ: "$(timedatectl show -p Timezone --value 2>/dev/null || echo UTC)"
|
||||
ARGUMENTS: "-rtc base=localtime,clock=host,driftfix=slew"
|
||||
devices:
|
||||
- /dev/kvm
|
||||
- /dev/net/tun
|
||||
@@ -240,6 +242,11 @@ EOF
|
||||
}
|
||||
|
||||
remove_windows() {
|
||||
if ! gum confirm --default=false "Remove Windows VM and delete all associated data?"; then
|
||||
echo "Removal cancelled by user"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Removing Windows VM..."
|
||||
|
||||
docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
||||
@@ -254,25 +261,6 @@ remove_windows() {
|
||||
echo "Windows VM removal completed!"
|
||||
}
|
||||
|
||||
wait_for_rdp_ready() {
|
||||
local WIN_USER="$1"
|
||||
local WIN_PASS="$2"
|
||||
local TIMEOUT=240
|
||||
local SECONDS=0
|
||||
|
||||
echo "Waiting for Windows VM to be ready..."
|
||||
|
||||
while ! timeout 5s xfreerdp3 /auth-only /cert:ignore /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 &>/dev/null; do
|
||||
sleep 2
|
||||
if [ $SECONDS -gt $TIMEOUT ]; then
|
||||
echo "❌ Timeout waiting for RDP!"
|
||||
echo " The VM might still be installing Windows."
|
||||
echo " Check progress at: http://127.0.0.1:8006"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
launch_windows() {
|
||||
KEEP_ALIVE=false
|
||||
if [ "$1" = "--keep-alive" ] || [ "$1" = "-k" ]; then
|
||||
@@ -309,11 +297,19 @@ launch_windows() {
|
||||
notify-send -u critical "Windows VM" "Failed to start Windows VM"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! wait_for_rdp_ready "$WIN_USER" "$WIN_PASS"; then
|
||||
notify-send -u critical "Windows VM" "Did not come alive in time."
|
||||
exit 1
|
||||
echo "Waiting for Windows VM to start..."
|
||||
WAIT_COUNT=0
|
||||
until docker logs omarchy-windows 2>&1 | grep -qi "windows started successfully"; do
|
||||
sleep 2
|
||||
WAIT_COUNT=$((WAIT_COUNT + 1))
|
||||
if [ $WAIT_COUNT -gt 60 ]; then # 2 minutes timeout
|
||||
echo ""
|
||||
echo "❌ Timeout: Windows VM failed to start within 2 minutes"
|
||||
echo " Check logs: docker logs omarchy-windows"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Build the connection info
|
||||
@@ -346,7 +342,7 @@ To stop: omarchy-windows-vm stop"
|
||||
# If scale is less than 130%, don't set any scale (use default 100)
|
||||
|
||||
# Connect with RDP in fullscreen (auto-detects resolution)
|
||||
xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 -grab-keyboard /sound /microphone /cert:ignore /title:"Windows VM - Omarchy" /dynamic-resolution /gfx:AVC444 /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE
|
||||
xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 -grab-keyboard /sound /microphone /clipboard /cert:ignore /title:"Windows VM - Omarchy" /dynamic-resolution /gfx:AVC444 /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE
|
||||
|
||||
# After RDP closes, stop the container unless --keep-alive was specified
|
||||
if [ "$KEEP_ALIVE" = false ]; then
|
||||
|
||||
10
boot.sh
10
boot.sh
@@ -28,12 +28,10 @@ git clone "https://github.com/${OMARCHY_REPO}.git" ~/.local/share/omarchy >/dev/
|
||||
|
||||
# Use custom branch if instructed, otherwise default to master
|
||||
OMARCHY_REF="${OMARCHY_REF:-master}"
|
||||
if [[ $OMARCHY_REF != "master" ]]; then
|
||||
echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m"
|
||||
cd ~/.local/share/omarchy
|
||||
git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}"
|
||||
cd -
|
||||
fi
|
||||
echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m"
|
||||
cd ~/.local/share/omarchy
|
||||
git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}"
|
||||
cd -
|
||||
|
||||
# Set edge mirror for dev installs
|
||||
if [[ $OMARCHY_REF == "dev" ]]; then
|
||||
|
||||
1
config/elephant/symbols.toml
Normal file
1
config/elephant/symbols.toml
Normal file
@@ -0,0 +1 @@
|
||||
command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"'
|
||||
@@ -32,3 +32,6 @@ keybind = super+control+shift+alt+arrow_right=resize_split:right,100
|
||||
|
||||
# Slowdown mouse scrolling
|
||||
mouse-scroll-multiplier = 0.95
|
||||
|
||||
# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)
|
||||
async-backend = epoll
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# Application bindings
|
||||
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)"
|
||||
bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser
|
||||
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
|
||||
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"
|
||||
bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser
|
||||
bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private
|
||||
bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
|
||||
@@ -14,7 +16,6 @@ bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password
|
||||
# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
|
||||
bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
|
||||
bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
|
||||
bindd = SUPER SHIFT CTRL, A, opencode, exec, omarchy-launch-opencode
|
||||
bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
|
||||
bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
|
||||
bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
|
||||
@@ -24,6 +25,9 @@ bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Goo
|
||||
bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/"
|
||||
bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
|
||||
|
||||
# Add extra bindings
|
||||
# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server
|
||||
|
||||
# Overwrite existing bindings, like putting Omarchy Menu on Super + Space
|
||||
# unbind = SUPER, SPACE
|
||||
# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu
|
||||
|
||||
@@ -39,5 +39,5 @@ input-field {
|
||||
}
|
||||
|
||||
auth {
|
||||
fingerprint:enabled = true
|
||||
fingerprint:enabled = false
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
input {
|
||||
# Use multiple keyboard layouts and switch between them with Left Alt + Right Alt
|
||||
# kb_layout = us,dk,eu
|
||||
|
||||
# Use a specific keyboard variant if needed (e.g. intl for international keyboards)
|
||||
# kb_variant = intl
|
||||
|
||||
kb_options = compose:caps # ,grp:alts_toggle
|
||||
|
||||
# Change speed of keyboard repeat
|
||||
|
||||
@@ -19,6 +19,8 @@ allow_remote_control yes
|
||||
|
||||
# Aesthetics
|
||||
cursor_shape block
|
||||
cursor_blink_interval 0
|
||||
shell_integration no-cursor
|
||||
enable_audio_bell no
|
||||
|
||||
# Minimal Tab bar styling
|
||||
|
||||
@@ -12,3 +12,9 @@
|
||||
# *) back_to show_main_menu ;;
|
||||
# esac
|
||||
# }
|
||||
#
|
||||
# Example of overriding just the about menu action: (Using zsh instead of bash (default))
|
||||
#
|
||||
# show_about() {
|
||||
# exec omarchy-launch-or-focus-tui "zsh -c 'fastfetch; read -k 1'"
|
||||
# }
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
# {{ accent }} - Theme accent color
|
||||
# {{ selection_background }} - Selection highlight background
|
||||
# {{ selection_foreground }} - Selection highlight foreground
|
||||
# {{ active_border_color }} - Active window/element border
|
||||
# {{ active_tab_background }} - Active tab background
|
||||
#
|
||||
# {{ color0 }} through {{ color15 }} - Standard 16-color terminal palette
|
||||
# color0-7: Normal colors (black, red, green, yellow, blue, magenta, cyan, white)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[server]
|
||||
show_percentage = true
|
||||
max_volume = 100
|
||||
style = "./style.css"
|
||||
style = "~/.config/swayosd/style.css"
|
||||
|
||||
84
config/tmux/tmux.conf
Normal file
84
config/tmux/tmux.conf
Normal file
@@ -0,0 +1,84 @@
|
||||
# Prefix
|
||||
set -g prefix C-Space
|
||||
set -g prefix2 C-b
|
||||
bind C-Space send-prefix
|
||||
|
||||
# Reload config
|
||||
bind q source-file ~/.config/tmux/tmux.conf
|
||||
|
||||
# Vi mode for copy
|
||||
setw -g mode-keys vi
|
||||
bind -T copy-mode-vi v send -X begin-selection
|
||||
bind -T copy-mode-vi y send -X copy-selection-and-cancel
|
||||
|
||||
# Pane Controls
|
||||
bind h split-window -h -c "#{pane_current_path}"
|
||||
bind v split-window -v -c "#{pane_current_path}"
|
||||
bind -n C-M-PageUp split-window -h -c "#{pane_current_path}"
|
||||
bind -n C-M-PageDown split-window -v -c "#{pane_current_path}"
|
||||
bind -n C-M-Home split-window -h -c "#{pane_current_path}"
|
||||
bind -n C-M-End kill-pane
|
||||
|
||||
bind -n C-M-Left select-pane -L
|
||||
bind -n C-M-Right select-pane -R
|
||||
bind -n C-M-Up select-pane -U
|
||||
bind -n C-M-Down select-pane -D
|
||||
|
||||
bind -n C-M-S-Left resize-pane -L 5
|
||||
bind -n C-M-S-Down resize-pane -D 5
|
||||
bind -n C-M-S-Up resize-pane -U 5
|
||||
bind -n C-M-S-Right resize-pane -R 5
|
||||
|
||||
# Window navigation
|
||||
bind r command-prompt -I "#W" "rename-window -- '%%'"
|
||||
bind c new-window -c "#{pane_current_path}"
|
||||
bind x kill-window
|
||||
bind -n C-S-Home new-window -c "#{pane_current_path}"
|
||||
bind -n C-S-End kill-window
|
||||
|
||||
bind -n C-S-PageUp next-window
|
||||
bind -n C-S-PageDown previous-window
|
||||
|
||||
# Session controls
|
||||
bind R command-prompt -I "#S" "rename-session -- '%%'"
|
||||
bind C new-session
|
||||
bind X kill-session
|
||||
bind -n C-M-S-Home new-session -c "#{pane_current_path}"
|
||||
bind -n C-M-S-End kill-session
|
||||
|
||||
bind -n C-M-S-PageUp switch-client -p
|
||||
bind -n C-M-S-PageDown switch-client -n
|
||||
|
||||
# General
|
||||
set -g default-terminal "tmux-256color"
|
||||
set -ag terminal-overrides ",*:RGB"
|
||||
set -g mouse on
|
||||
set -g base-index 1
|
||||
setw -g pane-base-index 1
|
||||
set -g renumber-windows on
|
||||
set -g history-limit 50000
|
||||
set -g escape-time 0
|
||||
set -g focus-events on
|
||||
set -g set-clipboard on
|
||||
setw -g aggressive-resize on
|
||||
set -g detach-on-destroy off
|
||||
|
||||
# Status bar
|
||||
set -g status-position top
|
||||
set -g status-interval 5
|
||||
set -g status-left-length 30
|
||||
set -g status-right-length 50
|
||||
set -g window-status-separator ""
|
||||
|
||||
# Theme
|
||||
set -g status-style "bg=default,fg=default"
|
||||
set -g status-left "#[fg=black,bg=blue,bold] #S #[bg=default] "
|
||||
set -g status-right "#[fg=blue]#{?client_prefix,PREFIX ,}#[fg=brightblack]#h "
|
||||
set -g window-status-format "#[fg=brightblack] #I:#W "
|
||||
set -g window-status-current-format "#[fg=blue,bold] #I:#W "
|
||||
set -g pane-border-style "fg=brightblack"
|
||||
set -g pane-active-border-style "fg=blue"
|
||||
set -g message-style "bg=default,fg=blue"
|
||||
set -g message-command-style "bg=default,fg=blue"
|
||||
set -g mode-style "bg=blue,fg=black"
|
||||
setw -g clock-mode-colour blue
|
||||
@@ -116,6 +116,7 @@
|
||||
"format-muted": "",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"headset": "",
|
||||
"default": ["", "", ""]
|
||||
}
|
||||
},
|
||||
|
||||
5
config/wiremix/wiremix.toml
Normal file
5
config/wiremix/wiremix.toml
Normal file
@@ -0,0 +1,5 @@
|
||||
# overwrites default wiremix configuration
|
||||
# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml
|
||||
|
||||
[char_sets.default]
|
||||
default_device = "⮞"
|
||||
@@ -21,9 +21,9 @@ if command -v zoxide &> /dev/null; then
|
||||
}
|
||||
fi
|
||||
|
||||
open() {
|
||||
open() (
|
||||
xdg-open "$@" >/dev/null 2>&1 &
|
||||
}
|
||||
)
|
||||
|
||||
# Directories
|
||||
alias ..='cd ..'
|
||||
@@ -34,6 +34,7 @@ alias ....='cd ../../..'
|
||||
alias c='opencode'
|
||||
alias d='docker'
|
||||
alias r='rails'
|
||||
alias t='tmux attach || tmux new -s Work'
|
||||
n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; }
|
||||
|
||||
# Git
|
||||
|
||||
@@ -58,7 +58,7 @@ img2jpg() {
|
||||
img="$1"
|
||||
shift
|
||||
|
||||
magick "$img" $@ -quality 95 -strip ${img%.*}-optimized.jpg
|
||||
magick "$img" $@ -quality 95 -strip ${img%.*}-converted.jpg
|
||||
}
|
||||
|
||||
# Transcode any image to JPG image that's great for sharing online without being too big
|
||||
@@ -66,7 +66,14 @@ img2jpg-small() {
|
||||
img="$1"
|
||||
shift
|
||||
|
||||
magick "$img" $@ -resize 1080x\> -quality 95 -strip ${img%.*}-optimized.jpg
|
||||
magick "$img" $@ -resize 1080x\> -quality 95 -strip ${img%.*}-small.jpg
|
||||
}
|
||||
# Transcode any image to JPG image that's great for sharing online without being too big
|
||||
img2jpg-medium() {
|
||||
img="$1"
|
||||
shift
|
||||
|
||||
magick "$img" $@ -resize 1800x\> -quality 95 -strip ${img%.*}-medium.jpg
|
||||
}
|
||||
|
||||
# Transcode any image to compressed-but-lossless PNG
|
||||
@@ -80,3 +87,24 @@ img2png() {
|
||||
-define png:exclude-chunk=all \
|
||||
"${img%.*}-optimized.png"
|
||||
}
|
||||
|
||||
# SSH Port Forwarding Functions
|
||||
fip() {
|
||||
[[ $# -lt 2 ]] && echo "Usage: fip <host> <port1> [port2] ..." && return 1
|
||||
local host="$1"
|
||||
shift
|
||||
for port in "$@"; do
|
||||
ssh -f -N -L "$port:localhost:$port" "$host" && echo "Forwarding localhost:$port -> $host:$port"
|
||||
done
|
||||
}
|
||||
|
||||
dip() {
|
||||
[[ $# -eq 0 ]] && echo "Usage: dip <port1> [port2] ..." && return 1
|
||||
for port in "$@"; do
|
||||
pkill -f "ssh.*-L $port:localhost:$port" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port"
|
||||
done
|
||||
}
|
||||
|
||||
lip() {
|
||||
pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@ if command -v mise &> /dev/null; then
|
||||
fi
|
||||
|
||||
if command -v starship &> /dev/null; then
|
||||
# clear stale readline state before rendering prompt (prevents artifacts in prompt after abnormal exits like SIGQUIT)
|
||||
__sanitize_prompt() { printf '\r\033[K'; }
|
||||
PROMPT_COMMAND="__sanitize_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
|
||||
eval "$(starship init bash)"
|
||||
fi
|
||||
|
||||
|
||||
@@ -9,3 +9,4 @@ source ~/.local/share/omarchy/default/bash/rc
|
||||
#
|
||||
# Make an alias for invoking commands you use constantly
|
||||
# alias p='python'
|
||||
# alias cx="claude --permission-mode=plan --allow-dangerously-skip-permissions"
|
||||
|
||||
@@ -9,7 +9,9 @@ source = ~/.local/share/omarchy/default/hypr/apps/pip.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/geforce.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/system.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/telegram.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
|
||||
source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
windowrule = no_screen_share on, match:class ^(Bitwarden)$
|
||||
windowrule = tag +floating-window, match:class ^(Bitwarden)$
|
||||
|
||||
# Bitwarden Chrome Extension
|
||||
windowrule = no_screen_share on, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default
|
||||
windowrule = tag +floating-window, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default
|
||||
@@ -1,13 +1,16 @@
|
||||
# Browser types
|
||||
windowrule = tag +chromium-based-browser, match:class ((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)
|
||||
windowrule = tag +firefox-based-browser, match:class ([fF]irefox|zen|librewolf)
|
||||
windowrule = tag -default-opacity, match:tag chromium-based-browser
|
||||
windowrule = tag -default-opacity, match:tag firefox-based-browser
|
||||
|
||||
# Video apps: remove chromium browser tag so they don't get opacity applied
|
||||
windowrule = tag -chromium-based-browser, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)
|
||||
windowrule = tag -default-opacity, match:class (chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)
|
||||
|
||||
# Force chromium-based browsers into a tile to deal with --app bug
|
||||
windowrule = tile on, match:tag chromium-based-browser
|
||||
|
||||
# Only a subtle opacity change, but not for video sites
|
||||
windowrule = opacity 1 0.97, match:tag chromium-based-browser
|
||||
windowrule = opacity 1 0.97, match:tag firefox-based-browser
|
||||
|
||||
# Some video sites should never have opacity applied to them
|
||||
windowrule = opacity 1.0 1.0, match:initial_title ((?i)(?:[a-z0-9-]+\.)*youtube\.com_/|app\.zoom\.us_/wc/home)
|
||||
windowrule = opacity 1.0 0.97, match:tag chromium-based-browser
|
||||
windowrule = opacity 1.0 0.97, match:tag firefox-based-browser
|
||||
|
||||
5
default/hypr/apps/geforce.conf
Normal file
5
default/hypr/apps/geforce.conf
Normal file
@@ -0,0 +1,5 @@
|
||||
windowrule {
|
||||
name = geforce
|
||||
match:class = GeForceNOW
|
||||
idle_inhibit = fullscreen
|
||||
}
|
||||
@@ -1,22 +1,41 @@
|
||||
# Fix splash screen showing in weird places and prevent annoying focus takeovers
|
||||
windowrule = tag +jetbrains-splash, match:class ^(jetbrains-.*)$, match:title ^(splash)$, match:float 1
|
||||
windowrule = center on, match:tag jetbrains-splash
|
||||
windowrule = no_focus on, match:tag jetbrains-splash
|
||||
windowrule = border_size 0, match:tag jetbrains-splash
|
||||
windowrule {
|
||||
name = jetbrains-splash
|
||||
match:class = ^(jetbrains-.*)$
|
||||
match:title = ^(splash)$
|
||||
match:float = 1
|
||||
tag = +jetbrains-splash
|
||||
center = on
|
||||
no_focus = on
|
||||
border_size = 0
|
||||
}
|
||||
|
||||
# Center popups/find windows
|
||||
windowrule = tag +jetbrains, match:class ^(jetbrains-.*), match:title ^()$, match:float 1
|
||||
windowrule = center on, match:tag jetbrains
|
||||
|
||||
# Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.)
|
||||
windowrule = stay_focused on, match:tag jetbrains
|
||||
windowrule = border_size 0, match:tag jetbrains
|
||||
|
||||
# For some reason tag:jetbrains does not work for size rule
|
||||
windowrule = min_size (monitor_w*0.5) (monitor_h*0.5), match:class ^(jetbrains-.*), match:title ^()$, match:float 1
|
||||
windowrule {
|
||||
name = jetbrains-popup
|
||||
match:class = ^(jetbrains-.*)
|
||||
match:title = ^()$
|
||||
match:float = 1
|
||||
tag = +jetbrains
|
||||
center = on
|
||||
# Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.)
|
||||
stay_focused = on
|
||||
border_size = 0
|
||||
min_size = (monitor_w*0.5) (monitor_h*0.5)
|
||||
}
|
||||
|
||||
# Disable window flicker when autocomplete or tooltips appear
|
||||
windowrule = no_initial_focus on, match:class ^(jetbrains-.*)$, match:title ^(win.*)$, match:float 1
|
||||
windowrule {
|
||||
name = jetbrains-tooltip
|
||||
match:class = ^(jetbrains-.*)$
|
||||
match:title = ^(win.*)$
|
||||
match:float = 1
|
||||
no_initial_focus = on
|
||||
}
|
||||
|
||||
# Disable mouse focus
|
||||
windowrule = no_follow_mouse on, match:class ^(jetbrains-.*)$
|
||||
windowrule {
|
||||
name = jetbrains-focus
|
||||
no_follow_mouse = on
|
||||
match:class = ^(jetbrains-.*)$
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# Picture-in-picture overlays
|
||||
windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture)
|
||||
windowrule = tag -default-opacity, match:tag pip
|
||||
windowrule = float on, match:tag pip
|
||||
windowrule = pin on, match:tag pip
|
||||
windowrule = size 600 338, match:tag pip
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
windowrule = tag -default-opacity, match:class qemu
|
||||
windowrule = opacity 1 1, match:class qemu
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
windowrule = fullscreen on, match:class com.libretro.RetroArch
|
||||
windowrule = tag -default-opacity, match:class com.libretro.RetroArch
|
||||
windowrule = opacity 1 1, match:class com.libretro.RetroArch
|
||||
windowrule = idle_inhibit fullscreen, match:class com.libretro.RetroArch
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# Float Steam
|
||||
windowrule = float on, match:class steam
|
||||
windowrule = center on, match:class steam, match:title Steam
|
||||
windowrule = opacity 1 1, match:class steam
|
||||
windowrule = tag -default-opacity, match:class steam.*
|
||||
windowrule = opacity 1 1, match:class steam.*
|
||||
windowrule = size 1100 700, match:class steam, match:title Steam
|
||||
windowrule = size 460 800, match:class steam, match:title Friends List
|
||||
windowrule = idle_inhibit fullscreen, match:class steam
|
||||
|
||||
@@ -12,6 +12,7 @@ windowrule = fullscreen on, match:class org.omarchy.screensaver
|
||||
windowrule = float on, match:class org.omarchy.screensaver
|
||||
|
||||
# No transparency on media windows
|
||||
windowrule = tag -default-opacity, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
|
||||
windowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
|
||||
|
||||
# Popped window rounding
|
||||
|
||||
2
default/hypr/apps/telegram.conf
Normal file
2
default/hypr/apps/telegram.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
# Prevent Telegram from stealing focus on new messages
|
||||
windowrule = focus_on_activate off, match:class org.telegram.desktop
|
||||
@@ -1,2 +1,4 @@
|
||||
# Define terminal tag to style them uniformly
|
||||
windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty)
|
||||
windowrule = tag -default-opacity, match:tag terminal
|
||||
windowrule = opacity 0.97 0.9, match:tag terminal
|
||||
|
||||
@@ -6,14 +6,16 @@ bindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume rai
|
||||
bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower
|
||||
bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle
|
||||
bindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle
|
||||
bindeld = ,XF86MonBrightnessUp, Brightness up, exec, $osdclient --brightness raise
|
||||
bindeld = ,XF86MonBrightnessDown, Brightness down, exec, $osdclient --brightness lower
|
||||
bindeld = ,XF86MonBrightnessUp, Brightness up, exec, omarchy-brightness-display +5%
|
||||
bindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-display 5%-
|
||||
bindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, omarchy-brightness-keyboard up
|
||||
bindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, omarchy-brightness-keyboard down
|
||||
|
||||
# Precise 1% multimedia adjustments with Alt modifier
|
||||
bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1
|
||||
bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1
|
||||
bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, $osdclient --brightness +1
|
||||
bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, $osdclient --brightness -1
|
||||
bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, omarchy-brightness-display +1%
|
||||
bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, omarchy-brightness-display 1%-
|
||||
|
||||
# Requires playerctl
|
||||
bindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Menus
|
||||
bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker
|
||||
bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols
|
||||
bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture
|
||||
bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
|
||||
bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system
|
||||
bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system
|
||||
@@ -28,13 +29,12 @@ bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle
|
||||
bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight
|
||||
|
||||
# Control Apple Display brightness
|
||||
bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-cmd-apple-display-brightness -5000
|
||||
bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-cmd-apple-display-brightness +5000
|
||||
bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-cmd-apple-display-brightness +60000
|
||||
bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000
|
||||
bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-brightness-display-apple +5000
|
||||
bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-brightness-display-apple +60000
|
||||
|
||||
# Captures
|
||||
bindd = , PRINT, Screenshot with editing, exec, omarchy-cmd-screenshot
|
||||
bindd = SHIFT, PRINT, Screenshot to clipboard, exec, omarchy-cmd-screenshot smart clipboard
|
||||
bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot
|
||||
bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord
|
||||
bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ env = HYPRCURSOR_SIZE,24
|
||||
env = GDK_BACKEND,wayland,x11,*
|
||||
env = QT_QPA_PLATFORM,wayland;xcb
|
||||
env = QT_STYLE_OVERRIDE,kvantum
|
||||
env = SDL_VIDEODRIVER,wayland
|
||||
env = SDL_VIDEODRIVER,wayland,x11
|
||||
env = MOZ_ENABLE_WAYLAND,1
|
||||
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
|
||||
env = OZONE_PLATFORM,wayland
|
||||
|
||||
@@ -131,9 +131,14 @@ cursor {
|
||||
hide_on_key_press = true
|
||||
}
|
||||
|
||||
# Auto toggle scratchpad on switching workspace from scratchpad
|
||||
binds {
|
||||
hide_special_on_workspace_change = true
|
||||
}
|
||||
|
||||
# Style Gum confirm to match terminal theme
|
||||
env = GUM_CONFIRM_PROMPT_FOREGROUND,6 # Cyan
|
||||
env = GUM_CONFIRM_SELECTED_FOREGROUND,0 # Black
|
||||
env = GUM_CONFIRM_SELECTED_BACKGROUND,2 # Green
|
||||
env = GUM_CONFIRM_UNSELECTED_FOREGROUND,0 # Black
|
||||
env = GUM_CONFIRM_UNSELECTED_FOREGROUND,7 # White
|
||||
env = GUM_CONFIRM_UNSELECTED_BACKGROUND,8 # Dark grey
|
||||
|
||||
@@ -2,11 +2,14 @@
|
||||
# Hyprland 0.53+ syntax
|
||||
windowrule = suppress_event maximize, match:class .*
|
||||
|
||||
# Just dash of opacity by default
|
||||
windowrule = opacity 0.97 0.9, match:class .*
|
||||
# Tag all windows for default opacity (apps can override with -default-opacity tag)
|
||||
windowrule = tag +default-opacity, match:class .*
|
||||
|
||||
# Fix some dragging issues with XWayland
|
||||
windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0
|
||||
|
||||
# App-specific tweaks
|
||||
# App-specific tweaks (may remove default-opacity tag)
|
||||
source = ~/.local/share/omarchy/default/hypr/apps.conf
|
||||
|
||||
# Apply default opacity after apps have had a chance to opt out
|
||||
windowrule = opacity 0.97 0.9, match:tag default-opacity
|
||||
|
||||
@@ -3,7 +3,7 @@ TARGET_OS_NAME="Omarchy"
|
||||
ESP_PATH="/boot"
|
||||
|
||||
KERNEL_CMDLINE[default]="@@CMDLINE@@"
|
||||
KERNEL_CMDLINE[default]+="quiet splash"
|
||||
KERNEL_CMDLINE[default]+=" quiet splash"
|
||||
|
||||
ENABLE_UKI=yes
|
||||
CUSTOM_UKI_NAME="omarchy"
|
||||
|
||||
@@ -28,3 +28,7 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy
|
||||
|
||||
[summary~="Learn Keybindings"]
|
||||
on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings'
|
||||
|
||||
[summary~="Screenshot copied & saved"]
|
||||
max-icon-size=80
|
||||
format=<b>%s</b>\n%b
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: Omarchy
|
||||
name: omarchy
|
||||
description: >
|
||||
REQUIRED for ANY changes to Linux desktop, window manager, or system config.
|
||||
Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/,
|
||||
|
||||
1
default/pacman/mirrorlist-rc
Normal file
1
default/pacman/mirrorlist-rc
Normal file
@@ -0,0 +1 @@
|
||||
Server = https://rc-mirror.omarchy.org/$repo/os/$arch
|
||||
30
default/pacman/pacman-rc.conf
Normal file
30
default/pacman/pacman-rc.conf
Normal file
@@ -0,0 +1,30 @@
|
||||
# See the pacman.conf(5) manpage for option and repository directives
|
||||
|
||||
[options]
|
||||
Color
|
||||
ILoveCandy
|
||||
VerbosePkgLists
|
||||
HoldPkg = pacman glibc
|
||||
Architecture = auto
|
||||
CheckSpace
|
||||
ParallelDownloads = 5
|
||||
DownloadUser = alpm
|
||||
|
||||
# By default, pacman accepts packages signed by keys that its local keyring
|
||||
# trusts (see pacman-key and its man page), as well as unsigned packages.
|
||||
SigLevel = Required DatabaseOptional
|
||||
LocalFileSigLevel = Optional
|
||||
|
||||
# pacman searches repositories in the order defined here
|
||||
[core]
|
||||
Include = /etc/pacman.d/mirrorlist
|
||||
|
||||
[extra]
|
||||
Include = /etc/pacman.d/mirrorlist
|
||||
|
||||
[multilib]
|
||||
Include = /etc/pacman.d/mirrorlist
|
||||
|
||||
[omarchy]
|
||||
SigLevel = Optional TrustAll
|
||||
Server = https://pkgs.omarchy.org/edge/$arch
|
||||
2
default/systemd/faster-shutdown.conf
Normal file
2
default/systemd/faster-shutdown.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
[Manager]
|
||||
DefaultTimeoutStopSec=5s
|
||||
@@ -1,3 +0,0 @@
|
||||
[Sleep]
|
||||
HibernateDelaySec=30min
|
||||
HibernateOnACPower=no
|
||||
@@ -1,2 +0,0 @@
|
||||
[Login]
|
||||
HandleLidSwitch=suspend-then-hibernate
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user