Merge branch 'dev' into rc

This commit is contained in:
David Heinemeier Hansson
2026-02-21 09:22:23 +01:00
8 changed files with 118 additions and 81 deletions
+16 -2
View File
@@ -43,9 +43,23 @@ open_editor() {
MODE="${1:-smart}" MODE="${1:-smart}"
PROCESSING="${2:-slurp}" PROCESSING="${2:-slurp}"
# accounting for portrait/transformed displays
JQ_MONITOR_GEO='
def format_geo:
.x as $x | .y as $y |
(.width / .scale | floor) as $w |
(.height / .scale | floor) as $h |
.transform as $t |
if $t == 1 or $t == 3 then
"\($x),\($y) \($h)x\($w)"
else
"\($x),\($y) \($w)x\($h)"
end;
'
get_rectangles() { get_rectangles() {
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id') local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"' hyprctl monitors -j | jq -r --arg ws "$active_workspace" "${JQ_MONITOR_GEO} .[] | select(.activeWorkspace.id == (\$ws | tonumber)) | format_geo"
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
} }
@@ -64,7 +78,7 @@ case "$MODE" in
kill $PID 2>/dev/null kill $PID 2>/dev/null
;; ;;
fullscreen) fullscreen)
SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"') SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
;; ;;
smart|*) smart|*)
RECTS=$(get_rectangles) RECTS=$(get_rectangles)
+12
View File
@@ -62,6 +62,18 @@ echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null
# Ensure keyboard backlight doesn't prevent sleep # Ensure keyboard backlight doesn't prevent sleep
sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/ sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
# Add resume= kernel parameters so the initramfs resume hook knows where to find the
# hibernation image. Without these, resume happens late (after GPU drivers load) and fails.
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
if [[ ! -f "$RESUME_DROP_IN" ]]; then
echo "Adding resume kernel parameters"
sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null
RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//')
RESUME_OFFSET=$(btrfs inspect-internal map-swapfile -r "$SWAP_FILE")
sudo mkdir -p /etc/limine-entry-tool.d
echo "KERNEL_CMDLINE[default]+=\"resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null
fi
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate) # Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf" LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf"
+5 -3
View File
@@ -2,8 +2,8 @@
# Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu. # Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu.
if [[ -z "$1" ]]; then if [[ -z $1 ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure>" >&2 echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>" >&2
exit 1 exit 1
fi fi
@@ -52,7 +52,8 @@ ruby)
omarchy-pkg-add libyaml omarchy-pkg-add libyaml
mise use --global ruby@latest mise use --global ruby@latest
mise settings add idiomatic_version_file_enable_tools ruby mise settings add idiomatic_version_file_enable_tools ruby
echo "gem: --no-document" > ~/.gemrc mise settings add ruby.compile false
echo "gem: --no-document" >~/.gemrc
mise x ruby -- gem install rails --no-document mise x ruby -- gem install rails --no-document
echo -e "\nYou can now run: rails new myproject" echo -e "\nYou can now run: rails new myproject"
;; ;;
@@ -143,6 +144,7 @@ clojure)
;; ;;
scala) scala)
echo -e "Installing Scala...\n" echo -e "Installing Scala...\n"
mise use --global java@latest
mise use --global scala@latest mise use --global scala@latest
mise use --global scala-cli@latest mise use --global scala-cli@latest
;; ;;
+2 -1
View File
@@ -25,5 +25,6 @@ if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI w
pinta \ pinta \
obsidian \ obsidian \
obs-studio \ obs-studio \
kdenlive kdenlive \
lazydocker
fi fi
+39 -47
View File
@@ -1,7 +1,30 @@
#!/bin/bash #!/bin/bash
lock_dns_to_resolved() {
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
}
unlock_dns_to_dhcp() {
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
sudo sed -i '/^\[DHCPv4\]/{n;/^UseDNS=no$/d}' "$file"
sudo sed -i '/^\[IPv6AcceptRA\]/{n;/^UseDNS=no$/d}' "$file"
done
}
if [[ -z $1 ]]; then if [[ -z $1 ]]; then
dns=$(gum choose --height 5 --header "Select DNS provider" Cloudflare DHCP Custom) dns=$(gum choose --height 6 --header "Select DNS provider" Cloudflare Google DHCP Custom)
else else
dns=$1 dns=$1
fi fi
@@ -14,24 +37,17 @@ DNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com
FallbackDNS=9.9.9.9 149.112.112.112 FallbackDNS=9.9.9.9 149.112.112.112
DNSOverTLS=opportunistic DNSOverTLS=opportunistic
EOF EOF
lock_dns_to_resolved
# Ensure network interfaces don't override our DNS settings ;;
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue Google)
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'
[Resolve]
# Add UseDNS=no to DHCPv4 section if not present DNS=8.8.8.8#dns.google 8.8.4.4#dns.google
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then FallbackDNS=9.9.9.9 149.112.112.112
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file" DNSOverTLS=opportunistic
fi EOF
lock_dns_to_resolved
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
;; ;;
DHCP) DHCP)
@@ -39,21 +55,14 @@ DHCP)
[Resolve] [Resolve]
DNSOverTLS=no DNSOverTLS=no
EOF EOF
unlock_dns_to_dhcp
# Allow network interfaces to use DHCP DNS
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
sudo sed -i '/^UseDNS=no/d' "$file"
done
sudo systemctl restart systemd-networkd systemd-resolved
;; ;;
Custom) Custom)
echo "Enter your DNS servers (space-separated, e.g. '192.168.1.1 1.1.1.1'):" echo "Enter your DNS servers (space-separated, e.g. '192.168.1.1 1.1.1.1'):"
read -r dns_servers read -r dns_servers
if [[ -z "$dns_servers" ]]; then if [[ -z $dns_servers ]]; then
echo "Error: No DNS servers provided." echo "Error: No DNS servers provided."
exit 1 exit 1
fi fi
@@ -63,25 +72,8 @@ Custom)
DNS=$dns_servers DNS=$dns_servers
FallbackDNS=9.9.9.9 149.112.112.112 FallbackDNS=9.9.9.9 149.112.112.112
EOF EOF
lock_dns_to_resolved
# Ensure network interfaces don't override our DNS settings
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
# Add UseDNS=no to DHCPv4 section if not present
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
;; ;;
esac esac
sudo systemctl restart systemd-networkd systemd-resolved
+24 -18
View File
@@ -2,11 +2,22 @@
set -e set -e
if [ "$#" -lt 3 ]; then ICON_DIR="$HOME/.local/share/applications/icons"
if [[ $# -lt 3 ]]; then
echo -e "\e[32mLet's create a new web app you can start with the app launcher.\n\e[0m" echo -e "\e[32mLet's create a new web app you can start with the app launcher.\n\e[0m"
APP_NAME=$(gum input --prompt "Name> " --placeholder "My favorite web app") APP_NAME=$(gum input --prompt "Name> " --placeholder "My favorite web app")
APP_URL=$(gum input --prompt "URL> " --placeholder "https://example.com") APP_URL=$(gum input --prompt "URL> " --placeholder "https://example.com")
ICON_REF=$(gum input --prompt "Icon URL> " --placeholder "Leave blank to use favicon or see https://dashboardicons.com (must be PNG!)")
# Try to fetch favicon automatically first.
FAVICON_URL="https://www.google.com/s2/favicons?domain=${APP_URL}&sz=128"
mkdir -p "$ICON_DIR"
if curl -fsSL -o "$ICON_DIR/$APP_NAME.png" "$FAVICON_URL" && [[ -s $ICON_DIR/$APP_NAME.png ]]; then
ICON_REF="$APP_NAME.png"
else
ICON_REF=$(gum input --prompt "Icon URL> " --placeholder "Could not fetch favicon automatically. Enter PNG icon URL (see https://dashboardicons.com)")
fi
CUSTOM_EXEC="" CUSTOM_EXEC=""
MIME_TYPES="" MIME_TYPES=""
INTERACTIVE_MODE=true INTERACTIVE_MODE=true
@@ -19,23 +30,22 @@ else
INTERACTIVE_MODE=false INTERACTIVE_MODE=false
fi fi
if [[ -z "$ICON_REF" ]]; then
ICON_REF="https://www.google.com/s2/favicons?domain=${APP_URL}&sz=128"
fi
# Ensure valid execution # Ensure valid execution
if [[ -z "$APP_NAME" || -z "$APP_URL" || -z "$ICON_REF" ]]; then if [[ -z $APP_NAME || -z $APP_URL ]]; then
echo "You must set app name, app URL, and icon URL!" echo "You must set app name and app URL!"
exit 1 exit 1
fi fi
# Refer to local icon or fetch remotely from URL # Resolve icon from URL or from a local icon name.
ICON_DIR="$HOME/.local/share/applications/icons" mkdir -p "$ICON_DIR"
if [[ -z $ICON_REF ]]; then
ICON_REF="https://www.google.com/s2/favicons?domain=${APP_URL}&sz=128"
fi
if [[ $ICON_REF =~ ^https?:// ]]; then if [[ $ICON_REF =~ ^https?:// ]]; then
ICON_PATH="$ICON_DIR/$APP_NAME.png" ICON_PATH="$ICON_DIR/$APP_NAME.png"
if curl -sL -o "$ICON_PATH" "$ICON_REF"; then if ! curl -fsSL -o "$ICON_PATH" "$ICON_REF" || [[ ! -s $ICON_PATH ]]; then
ICON_PATH="$ICON_DIR/$APP_NAME.png"
else
echo "Error: Failed to download icon." echo "Error: Failed to download icon."
exit 1 exit 1
fi fi
@@ -44,11 +54,7 @@ else
fi fi
# Use custom exec if provided, otherwise default behavior # Use custom exec if provided, otherwise default behavior
if [[ -n $CUSTOM_EXEC ]]; then EXEC_COMMAND="${CUSTOM_EXEC:-omarchy-launch-webapp $APP_URL}"
EXEC_COMMAND="$CUSTOM_EXEC"
else
EXEC_COMMAND="omarchy-launch-webapp $APP_URL"
fi
# Create application .desktop file # Create application .desktop file
DESKTOP_FILE="$HOME/.local/share/applications/$APP_NAME.desktop" DESKTOP_FILE="$HOME/.local/share/applications/$APP_NAME.desktop"
-1
View File
@@ -6,7 +6,6 @@ bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new
bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser
bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private
bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor
bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker
# Add extra bindings # Add extra bindings
# bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" # bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
+20 -9
View File
@@ -5,14 +5,25 @@
# will wake after suspend in Hybrid mode, even if the system was in Integrated mode before # will wake after suspend in Hybrid mode, even if the system was in Integrated mode before
# suspending. # suspending.
if [[ $1 == "post" ]]; then case "$1" in
# small delay so the device is fully re-enumerated pre)
sleep 4 # Before hibernating, switch to Vfio so the nvidia driver is detached from the dGPU.
# Without this, hibernate resume fails because the nvidia driver can't freeze a
# powered-off dGPU (returns -EIO), which aborts the entire resume.
if [[ $2 == "hibernate" ]]; then
/usr/bin/supergfxctl -m Vfio
sleep 1
fi
;;
post)
# small delay so the device is fully re-enumerated
sleep 4
# force-bind dGPU to vfio (fully detached from nvidia) # force-bind dGPU to vfio (fully detached from nvidia)
/usr/bin/supergfxctl -m Vfio /usr/bin/supergfxctl -m Vfio
sleep 1 sleep 1
# then go back to Integrated, which powers it off again # then go back to Integrated, which powers it off again
/usr/bin/supergfxctl -m Integrated /usr/bin/supergfxctl -m Integrated
fi ;;
esac