From 2f36270369c1f3a07c7a919274826d4421fca8f8 Mon Sep 17 00:00:00 2001 From: danflood94 Date: Fri, 6 Mar 2026 21:10:47 +0000 Subject: [PATCH 01/51] Add battery identifier to Waybar config fix(waybar): pin battery to BAT0 to prevent crash on HID disconnect --- config/waybar/config.jsonc | 1 + 1 file changed, 1 insertion(+) diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index 9049f00e..13caaf30 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -80,6 +80,7 @@ "on-click": "omarchy-launch-wifi" }, "battery": { + "bat": "BAT0", "format": "{capacity}% {icon}", "format-discharging": "{icon}", "format-charging": "{icon}", From 8912bcb81c4f3a3cc929f71c658b700846ff0c06 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 09:37:58 +0200 Subject: [PATCH 02/51] Add mako restart to Update > Process --- bin/omarchy-menu | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 3ee0ea5e..0535302e 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -529,9 +529,10 @@ show_update_channel_menu() { esac } show_update_process_menu() { - case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in + case $(menu "Restart" " Hypridle\n Hyprsunset\n󰎟 Mako\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in *Hypridle*) omarchy-restart-hypridle ;; *Hyprsunset*) omarchy-restart-hyprsunset ;; + *Mako*) omarchy-restart-mako ;; *Swayosd*) omarchy-restart-swayosd ;; *Walker*) omarchy-restart-walker ;; *Waybar*) omarchy-restart-waybar ;; From 79d3b8cec641f94d0f133eb94184e347e4872d00 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 14:16:47 +0200 Subject: [PATCH 03/51] Move flags to persistent setup so hyprctl reload doesn't reset them --- bin/omarchy-hyprland-flag-missing | 5 +++ bin/omarchy-hyprland-flag-present | 5 +++ bin/omarchy-hyprland-flag-toggle | 31 +++++++++++++++++++ bin/omarchy-hyprland-monitor-internal-toggle | 27 +++++----------- ...yprland-window-single-square-aspect-toggle | 15 +++------ config/hypr/hyprland.conf | 3 ++ default/hypr/flags/flags.conf | 2 ++ .../hypr/flags/internal-monitor-disable.conf | 2 ++ .../flags/single-window-aspect-ratio.conf | 5 +++ install/config/all.sh | 1 + install/config/omarchy-config-flags.sh | 3 ++ migrations/1776410469.sh | 9 ++++++ 12 files changed, 78 insertions(+), 30 deletions(-) create mode 100755 bin/omarchy-hyprland-flag-missing create mode 100755 bin/omarchy-hyprland-flag-present create mode 100755 bin/omarchy-hyprland-flag-toggle create mode 100644 default/hypr/flags/flags.conf create mode 100644 default/hypr/flags/internal-monitor-disable.conf create mode 100644 default/hypr/flags/single-window-aspect-ratio.conf create mode 100644 install/config/omarchy-config-flags.sh create mode 100644 migrations/1776410469.sh diff --git a/bin/omarchy-hyprland-flag-missing b/bin/omarchy-hyprland-flag-missing new file mode 100755 index 00000000..e99c6a66 --- /dev/null +++ b/bin/omarchy-hyprland-flag-missing @@ -0,0 +1,5 @@ +#!/bin/bash + +# Check if a Hyprland flag is currently disabled (missing). + +[[ ! -f "$HOME/.local/state/omarchy/flags/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-flag-present b/bin/omarchy-hyprland-flag-present new file mode 100755 index 00000000..ea66c717 --- /dev/null +++ b/bin/omarchy-hyprland-flag-present @@ -0,0 +1,5 @@ +#!/bin/bash + +# Check if a Hyprland flag is currently enabled. + +[[ -f "$HOME/.local/state/omarchy/flags/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-flag-toggle b/bin/omarchy-hyprland-flag-toggle new file mode 100755 index 00000000..6900bdf7 --- /dev/null +++ b/bin/omarchy-hyprland-flag-toggle @@ -0,0 +1,31 @@ +#!/bin/bash + +# Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely. + +ENABLED_NOTIFICATION="" +DISABLED_NOTIFICATION="" + +while [[ $# -gt 1 ]]; do + case $1 in + --enabled-notification) ENABLED_NOTIFICATION="$2"; shift 2 ;; + --disabled-notification) DISABLED_NOTIFICATION="$2"; shift 2 ;; + *) break ;; + esac +done + +FLAG_NAME="$1" +flag="$HOME/.local/state/omarchy/flags/hypr/$FLAG_NAME.conf" +flag_source="$OMARCHY_PATH/default/hypr/flags/$FLAG_NAME.conf" + +if [[ -f $flag ]]; then + rm $flag + [[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION" +elif [[ -f $flag_source ]]; then + cp $flag_source $flag + [[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION" +else + echo "Flag not found" + exit 1 +fi + +hyprctl reload diff --git a/bin/omarchy-hyprland-monitor-internal-toggle b/bin/omarchy-hyprland-monitor-internal-toggle index 6e06d81b..3296adb4 100755 --- a/bin/omarchy-hyprland-monitor-internal-toggle +++ b/bin/omarchy-hyprland-monitor-internal-toggle @@ -1,29 +1,16 @@ #!/bin/bash -# Toggle the internal laptop display on/off. -# Useful when connected to an external monitor and you want to close the lid -# or just use the external display only. +# Toggle the internal laptop display on/off using the flag system. -INTERNAL=$(hyprctl monitors all -j | jq -r '.[] | select(.name | startswith("eDP")) | .name') - -if [[ -z $INTERNAL ]]; then - notify-send -u low "󰍹 No internal display found" - exit 1 -fi - -DISABLED=$(hyprctl monitors all -j | jq -r --arg m "$INTERNAL" '.[] | select(.name == $m) | .disabled') - -if [[ $DISABLED == "true" ]]; then - hyprctl keyword monitor "$INTERNAL,preferred,auto,auto" - hyprctl dispatch movecursor 0 0 - notify-send -u low "󰍹 Internal display on" -else +if omarchy-hyprland-flag-missing internal-monitor-disable; then ACTIVE_COUNT=$(hyprctl monitors -j | jq 'length') if [[ $ACTIVE_COUNT -le 1 ]]; then notify-send -u low "󰍹 Can't disable the only active display" exit 1 fi - - hyprctl keyword monitor "$INTERNAL,disable" - notify-send -u low "󰍹 Internal display off" fi + +omarchy-hyprland-flag-toggle \ + --enabled-notification "󰍹 Internal display off" \ + --disabled-notification "󰍹 Internal display on" \ + internal-monitor-disable diff --git a/bin/omarchy-hyprland-window-single-square-aspect-toggle b/bin/omarchy-hyprland-window-single-square-aspect-toggle index 50ccdac9..b933643b 100755 --- a/bin/omarchy-hyprland-window-single-square-aspect-toggle +++ b/bin/omarchy-hyprland-window-single-square-aspect-toggle @@ -1,13 +1,8 @@ #!/bin/bash -# Check current single_window_aspect_ratio setting -CURRENT_VALUE=$(hyprctl getoption "layout:single_window_aspect_ratio" 2>/dev/null | head -1) +# Toggle single-window square aspect ratio using the flag system. -# Parse vec2 output: "vec2: [1, 1]" or "vec2: [0, 0]" -if [[ $CURRENT_VALUE == *"[1, 1]"* ]]; then - hyprctl keyword layout:single_window_aspect_ratio "0 0" - notify-send -u low " Disable single-window square aspect ratio" -else - hyprctl keyword layout:single_window_aspect_ratio "1 1" - notify-send -u low " Enable single-window square aspect" -fi +omarchy-hyprland-flag-toggle \ + --enabled-notification " Enable single-window square aspect ratio" \ + --disabled-notification " Disable single-window square aspect ratio" \ + single-window-aspect-ratio diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf index 6478d1be..6866a136 100644 --- a/config/hypr/hyprland.conf +++ b/config/hypr/hyprland.conf @@ -19,5 +19,8 @@ source = ~/.config/hypr/bindings.conf source = ~/.config/hypr/looknfeel.conf source = ~/.config/hypr/autostart.conf +# Toggle config flags dynamically +source = ~/.local/state/omarchy/flags/hypr/*.conf + # Add any other personal Hyprland configuration below # windowrule = workspace 5, match:class qemu diff --git a/default/hypr/flags/flags.conf b/default/hypr/flags/flags.conf new file mode 100644 index 00000000..a6334225 --- /dev/null +++ b/default/hypr/flags/flags.conf @@ -0,0 +1,2 @@ +# This directory is intended for permanent config toggle flags. +# Do not remove this file (as the directory always needs at least one file). diff --git a/default/hypr/flags/internal-monitor-disable.conf b/default/hypr/flags/internal-monitor-disable.conf new file mode 100644 index 00000000..f5458f94 --- /dev/null +++ b/default/hypr/flags/internal-monitor-disable.conf @@ -0,0 +1,2 @@ +# Disable the internal laptop monitor +monitor=eDP-1,disable diff --git a/default/hypr/flags/single-window-aspect-ratio.conf b/default/hypr/flags/single-window-aspect-ratio.conf new file mode 100644 index 00000000..b51d0e41 --- /dev/null +++ b/default/hypr/flags/single-window-aspect-ratio.conf @@ -0,0 +1,5 @@ +# Avoid overly wide single-window layouts on wide screens +layout { + single_window_aspect_ratio = 1 1 +} + diff --git a/install/config/all.sh b/install/config/all.sh index b09332e6..5ec74701 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -22,6 +22,7 @@ run_logged $OMARCHY_INSTALL/config/unmount-fuse.sh run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh run_logged $OMARCHY_INSTALL/config/input-group.sh run_logged $OMARCHY_INSTALL/config/omarchy-ai-skill.sh +run_logged $OMARCHY_INSTALL/config/omarchy-config-flags.sh run_logged $OMARCHY_INSTALL/config/kernel-modules-hook.sh run_logged $OMARCHY_INSTALL/config/powerprofilesctl-rules.sh run_logged $OMARCHY_INSTALL/config/wifi-powersave-rules.sh diff --git a/install/config/omarchy-config-flags.sh b/install/config/omarchy-config-flags.sh new file mode 100644 index 00000000..c5a46909 --- /dev/null +++ b/install/config/omarchy-config-flags.sh @@ -0,0 +1,3 @@ +# Flags are used to toggle certain features on/off in a persistent way +mkdir -p ~/.local/state/omarchy/flags/hypr +cp $OMARCHY_PATH/default/hypr/flags/flags.conf ~/.local/state/omarchy/flags/hypr/ diff --git a/migrations/1776410469.sh b/migrations/1776410469.sh new file mode 100644 index 00000000..a0e4d962 --- /dev/null +++ b/migrations/1776410469.sh @@ -0,0 +1,9 @@ +echo "Add flags sourcing to hyprland.conf" + +HYPR_CONF=~/.config/hypr/hyprland.conf + +source $OMARCHY_PATH/install/config/omarchy-config-flags.sh + +if [[ -f $HYPR_CONF ]] && ! grep -q "flags/hypr/\*\.conf" "$HYPR_CONF"; then + echo -e "\n# Toggle config flags dynamically\nsource = ~/.local/state/omarchy/flags/hypr/*.conf" >> "$HYPR_CONF" +fi From 1b898b862c24ffa2a9b19fbc3d7793eeae2eb4a4 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 14:22:59 +0200 Subject: [PATCH 04/51] Make the window no-gaps flag permanent --- bin/omarchy-hyprland-window-gaps-toggle | 14 ++------------ default/hypr/flags/window-no-gaps.conf | 6 ++++++ 2 files changed, 8 insertions(+), 12 deletions(-) create mode 100644 default/hypr/flags/window-no-gaps.conf diff --git a/bin/omarchy-hyprland-window-gaps-toggle b/bin/omarchy-hyprland-window-gaps-toggle index d2cf2ffd..7b93530c 100755 --- a/bin/omarchy-hyprland-window-gaps-toggle +++ b/bin/omarchy-hyprland-window-gaps-toggle @@ -1,15 +1,5 @@ #!/bin/bash -# Toggles the window gaps globally between no gaps and the default 10/5/2. +# Toggles the window gaps globally between no gaps and the default. -gaps=$(hyprctl getoption general:gaps_out -j | jq -r '.custom' | awk '{print $1}') - -if [[ $gaps == "0" ]]; then - hyprctl keyword general:gaps_out 10 - hyprctl keyword general:gaps_in 5 - hyprctl keyword general:border_size 2 -else - hyprctl keyword general:gaps_out 0 - hyprctl keyword general:gaps_in 0 - hyprctl keyword general:border_size 0 -fi +omarchy-hyprland-flag-toggle window-no-gaps diff --git a/default/hypr/flags/window-no-gaps.conf b/default/hypr/flags/window-no-gaps.conf new file mode 100644 index 00000000..a9b6c578 --- /dev/null +++ b/default/hypr/flags/window-no-gaps.conf @@ -0,0 +1,6 @@ +# Remove all window gaps and borders +general { + gaps_out = 0 + gaps_in = 0 + border_size = 0 +} From 7db0ee9314ed5d25d1f07a54912da0535da4d1e1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 15:35:36 +0200 Subject: [PATCH 05/51] Use shared toggle feaeture --- bin/omarchy-toggle | 26 ++++++++++++++++++++++++++ bin/omarchy-toggle-suspend | 14 ++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) create mode 100755 bin/omarchy-toggle diff --git a/bin/omarchy-toggle b/bin/omarchy-toggle new file mode 100755 index 00000000..7db467fa --- /dev/null +++ b/bin/omarchy-toggle @@ -0,0 +1,26 @@ +#!/bin/bash + +# Toggle Omarchy features between enabled and disabled + +ENABLED_NOTIFICATION="" +DISABLED_NOTIFICATION="" + +while [[ $# -gt 1 ]]; do + case $1 in + --enabled-notification) ENABLED_NOTIFICATION="$2"; shift 2 ;; + --disabled-notification) DISABLED_NOTIFICATION="$2"; shift 2 ;; + *) break ;; + esac +done + +FLAG_NAME="$1" +FLAG="$HOME/.local/state/omarchy/toggles/$FLAG_NAME" + +if [[ -f $FLAG ]]; then + rm $FLAG + [[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION" +else + mkdir -p "$(dirname $FLAG)" + touch $FLAG + [[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION" +fi diff --git a/bin/omarchy-toggle-suspend b/bin/omarchy-toggle-suspend index ab7d9e76..cd0d2191 100755 --- a/bin/omarchy-toggle-suspend +++ b/bin/omarchy-toggle-suspend @@ -1,12 +1,6 @@ #!/bin/bash -STATE_FILE=~/.local/state/omarchy/toggles/suspend-off - -if [[ -f $STATE_FILE ]]; then - rm -f $STATE_FILE - notify-send -u low "󰒲 Suspend now available in system menu" -else - mkdir -p "$(dirname $STATE_FILE)" - touch $STATE_FILE - notify-send -u low "󰒲 Suspend removed from system menu" -fi +omarchy-toggle \ + --enabled-notification "󰒲 Suspend removed from system menu" \ + --disabled-notification "󰒲 Suspend now available in system menu" \ + suspend-off From 71bbcc8adc4472e577d081f6d51b2d6f8e254823 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 15:37:36 +0200 Subject: [PATCH 06/51] Use new shared omarchy-toggle --- bin/omarchy-toggle-screensaver | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/bin/omarchy-toggle-screensaver b/bin/omarchy-toggle-screensaver index 9a36ab5e..33e8d1bc 100755 --- a/bin/omarchy-toggle-screensaver +++ b/bin/omarchy-toggle-screensaver @@ -1,12 +1,6 @@ #!/bin/bash -STATE_FILE=~/.local/state/omarchy/toggles/screensaver-off - -if [[ -f $STATE_FILE ]]; then - rm -f $STATE_FILE - notify-send -u low "󱄄 Screensaver enabled" -else - mkdir -p "$(dirname $STATE_FILE)" - touch $STATE_FILE - notify-send -u low "󱄄 Screensaver disabled" -fi +omarchy-toggle \ + --enabled-notification "󱄄 Screensaver disabled" \ + --disabled-notification "󱄄 Screensaver enabled" \ + screensaver-off From db52ba346cb47625e6935df413e1b4c170785da5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 15:45:44 +0200 Subject: [PATCH 07/51] Extract omarchy-toggle-enabled and use this with the waybar to persist --- bin/omarchy-launch-screensaver | 2 +- bin/omarchy-menu | 4 ++-- bin/omarchy-theme-set-vscode | 11 +++++------ bin/omarchy-toggle-enabled | 4 ++++ bin/omarchy-toggle-waybar | 5 +++++ default/hypr/autostart.conf | 2 +- 6 files changed, 18 insertions(+), 10 deletions(-) create mode 100755 bin/omarchy-toggle-enabled diff --git a/bin/omarchy-launch-screensaver b/bin/omarchy-launch-screensaver index aab3cb0e..b672c3e5 100755 --- a/bin/omarchy-launch-screensaver +++ b/bin/omarchy-launch-screensaver @@ -11,7 +11,7 @@ fi pgrep -f org.omarchy.screensaver && exit 0 # Allow screensaver to be turned off but also force started -if [[ -f ~/.local/state/omarchy/toggles/screensaver-off ]] && [[ $1 != "force" ]]; then +if omarchy-toggle-enabled screensaver-off && [[ $1 != "force" ]]; then exit 1 fi diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 0535302e..91e5331a 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -277,7 +277,7 @@ show_setup_config_menu() { show_setup_system_menu() { local options="" - if [[ -f ~/.local/state/omarchy/toggles/suspend-off ]]; then + if omarchy-toggle-enabled suspend-off; then options="$options󰒲 Enable Suspend" else options="$options󰒲 Disable Suspend" @@ -579,7 +579,7 @@ show_about() { show_system_menu() { local options="󱄄 Screensaver\n Lock" - [[ ! -f ~/.local/state/omarchy/toggles/suspend-off ]] && options="$options\n󰒲 Suspend" + ! omarchy-toggle-enabled suspend-off && options="$options\n󰒲 Suspend" omarchy-hibernation-available && options="$options\n󰤁 Hibernate" options="$options\n󰍃 Logout\n󰜉 Restart\n󰐥 Shutdown" diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index ee8ad37d..bc9b5716 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -7,9 +7,8 @@ VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" set_theme() { local editor_cmd="$1" local settings_path="$2" - local skip_flag="$3" - omarchy-cmd-present "$editor_cmd" && [[ ! -f $skip_flag ]] || return 0 + omarchy-cmd-present "$editor_cmd" || return 0 if [[ -f $VS_CODE_THEME ]]; then theme_name=$(jq -r '.name' "$VS_CODE_THEME") @@ -34,7 +33,7 @@ set_theme() { fi } -set_theme "code" "$HOME/.config/Code/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes" -set_theme "code-insiders" "$HOME/.config/Code - Insiders/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-vscode-insiders-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" +! omarchy-toggle-enabled skip-vscode-theme-changes && set_theme "code" "$HOME/.config/Code/User/settings.json" +! omarchy-toggle-enabled skip-vscode-insiders-theme-changes && set_theme "code-insiders" "$HOME/.config/Code - Insiders/User/settings.json" +! omarchy-toggle-enabled skip-codium-theme-changes && set_theme "codium" "$HOME/.config/VSCodium/User/settings.json" +! omarchy-toggle-enabled skip-cursor-theme-changes && set_theme "cursor" "$HOME/.config/Cursor/User/settings.json" diff --git a/bin/omarchy-toggle-enabled b/bin/omarchy-toggle-enabled new file mode 100755 index 00000000..dd37c881 --- /dev/null +++ b/bin/omarchy-toggle-enabled @@ -0,0 +1,4 @@ +#!/bin/bash + +# Check if a toggle is enabled (flag file exists) +[[ -f "$HOME/.local/state/omarchy/toggles/$1" ]] diff --git a/bin/omarchy-toggle-waybar b/bin/omarchy-toggle-waybar index 71387827..3e3337a8 100755 --- a/bin/omarchy-toggle-waybar +++ b/bin/omarchy-toggle-waybar @@ -1,5 +1,10 @@ #!/bin/bash +omarchy-toggle \ + --enabled-notification " Bar hidden" \ + --disabled-notification " Bar visible" \ + waybar-off + if pgrep -x waybar >/dev/null; then pkill -x waybar else diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index b9d1b491..d6e1e4c8 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -1,6 +1,6 @@ exec-once = uwsm-app -- hypridle exec-once = uwsm-app -- mako -exec-once = uwsm-app -- waybar +exec-once = ! omarchy-toggle-enabled waybar-off && uwsm-app -- waybar exec-once = uwsm-app -- fcitx5 --disable notificationitem exec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill exec-once = uwsm-app -- swayosd-server From adb8d01d5767daa28fb853bde6d1c453b9b3b62d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 15:47:54 +0200 Subject: [PATCH 08/51] Hint for disabling the ghost monitor on the 6K XDR --- config/hypr/monitors.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/hypr/monitors.conf b/config/hypr/monitors.conf index 019bc925..99695e1c 100644 --- a/config/hypr/monitors.conf +++ b/config/hypr/monitors.conf @@ -21,3 +21,6 @@ monitor=,preferred,auto,auto,vrr,1 # Example for Framework 13 w/ 6K XDR Apple display # monitor = DP-5, 6016x3384@60, auto, 2 # monitor = eDP-1, 2880x1920@120, auto, 2 + +# Disable the second ghost monitor on an Apple 6K XDR over Thunderbolt +# monitor=DP-2,disable From e852895e5c2810350dff48ced51df6eca3fdec1c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 17 Apr 2026 16:03:06 +0200 Subject: [PATCH 09/51] Use preexisting toggles setup --- bin/omarchy-hyprland-flag-missing | 5 ----- bin/omarchy-hyprland-flag-present | 5 ----- bin/omarchy-hyprland-monitor-internal-toggle | 6 +++--- ...-hyprland-flag-toggle => omarchy-hyprland-toggle} | 12 ++++++------ bin/omarchy-hyprland-toggle-disabled | 5 +++++ bin/omarchy-hyprland-toggle-enabled | 5 +++++ bin/omarchy-hyprland-window-gaps-toggle | 2 +- ...archy-hyprland-window-single-square-aspect-toggle | 4 ++-- config/hypr/hyprland.conf | 2 +- default/hypr/{flags => toggles}/flags.conf | 0 .../{flags => toggles}/internal-monitor-disable.conf | 0 .../single-window-aspect-ratio.conf | 0 default/hypr/{flags => toggles}/window-no-gaps.conf | 0 install/config/all.sh | 2 +- install/config/omarchy-config-flags.sh | 3 --- install/config/omarchy-toggles.sh | 3 +++ migrations/1776410469.sh | 6 +++--- 17 files changed, 30 insertions(+), 30 deletions(-) delete mode 100755 bin/omarchy-hyprland-flag-missing delete mode 100755 bin/omarchy-hyprland-flag-present rename bin/{omarchy-hyprland-flag-toggle => omarchy-hyprland-toggle} (72%) create mode 100755 bin/omarchy-hyprland-toggle-disabled create mode 100755 bin/omarchy-hyprland-toggle-enabled rename default/hypr/{flags => toggles}/flags.conf (100%) rename default/hypr/{flags => toggles}/internal-monitor-disable.conf (100%) rename default/hypr/{flags => toggles}/single-window-aspect-ratio.conf (100%) rename default/hypr/{flags => toggles}/window-no-gaps.conf (100%) delete mode 100644 install/config/omarchy-config-flags.sh create mode 100644 install/config/omarchy-toggles.sh diff --git a/bin/omarchy-hyprland-flag-missing b/bin/omarchy-hyprland-flag-missing deleted file mode 100755 index e99c6a66..00000000 --- a/bin/omarchy-hyprland-flag-missing +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Check if a Hyprland flag is currently disabled (missing). - -[[ ! -f "$HOME/.local/state/omarchy/flags/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-flag-present b/bin/omarchy-hyprland-flag-present deleted file mode 100755 index ea66c717..00000000 --- a/bin/omarchy-hyprland-flag-present +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Check if a Hyprland flag is currently enabled. - -[[ -f "$HOME/.local/state/omarchy/flags/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-monitor-internal-toggle b/bin/omarchy-hyprland-monitor-internal-toggle index 3296adb4..6cacea09 100755 --- a/bin/omarchy-hyprland-monitor-internal-toggle +++ b/bin/omarchy-hyprland-monitor-internal-toggle @@ -1,8 +1,8 @@ #!/bin/bash -# Toggle the internal laptop display on/off using the flag system. +# Toggle the internal laptop display on/off. -if omarchy-hyprland-flag-missing internal-monitor-disable; then +if omarchy-hyprland-toggle-disabled internal-monitor-disable; then ACTIVE_COUNT=$(hyprctl monitors -j | jq 'length') if [[ $ACTIVE_COUNT -le 1 ]]; then notify-send -u low "󰍹 Can't disable the only active display" @@ -10,7 +10,7 @@ if omarchy-hyprland-flag-missing internal-monitor-disable; then fi fi -omarchy-hyprland-flag-toggle \ +omarchy-hyprland-toggle \ --enabled-notification "󰍹 Internal display off" \ --disabled-notification "󰍹 Internal display on" \ internal-monitor-disable diff --git a/bin/omarchy-hyprland-flag-toggle b/bin/omarchy-hyprland-toggle similarity index 72% rename from bin/omarchy-hyprland-flag-toggle rename to bin/omarchy-hyprland-toggle index 6900bdf7..deda1cb3 100755 --- a/bin/omarchy-hyprland-flag-toggle +++ b/bin/omarchy-hyprland-toggle @@ -14,14 +14,14 @@ while [[ $# -gt 1 ]]; do done FLAG_NAME="$1" -flag="$HOME/.local/state/omarchy/flags/hypr/$FLAG_NAME.conf" -flag_source="$OMARCHY_PATH/default/hypr/flags/$FLAG_NAME.conf" +FLAG="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.conf" +FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.conf" -if [[ -f $flag ]]; then - rm $flag +if [[ -f $FLAG ]]; then + rm $FLAG [[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION" -elif [[ -f $flag_source ]]; then - cp $flag_source $flag +elif [[ -f $FLAG_SOURCE ]]; then + cp $FLAG_SOURCE $FLAG [[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION" else echo "Flag not found" diff --git a/bin/omarchy-hyprland-toggle-disabled b/bin/omarchy-hyprland-toggle-disabled new file mode 100755 index 00000000..4e526d09 --- /dev/null +++ b/bin/omarchy-hyprland-toggle-disabled @@ -0,0 +1,5 @@ +#!/bin/bash + +# Check if a Hyprland toggle is currently disabled (missing). + +[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-toggle-enabled b/bin/omarchy-hyprland-toggle-enabled new file mode 100755 index 00000000..59a273a4 --- /dev/null +++ b/bin/omarchy-hyprland-toggle-enabled @@ -0,0 +1,5 @@ +#!/bin/bash + +# Check if a Hyprland toggle is currently enabled. + +[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]] diff --git a/bin/omarchy-hyprland-window-gaps-toggle b/bin/omarchy-hyprland-window-gaps-toggle index 7b93530c..082e4574 100755 --- a/bin/omarchy-hyprland-window-gaps-toggle +++ b/bin/omarchy-hyprland-window-gaps-toggle @@ -2,4 +2,4 @@ # Toggles the window gaps globally between no gaps and the default. -omarchy-hyprland-flag-toggle window-no-gaps +omarchy-hyprland-toggle window-no-gaps diff --git a/bin/omarchy-hyprland-window-single-square-aspect-toggle b/bin/omarchy-hyprland-window-single-square-aspect-toggle index b933643b..70615793 100755 --- a/bin/omarchy-hyprland-window-single-square-aspect-toggle +++ b/bin/omarchy-hyprland-window-single-square-aspect-toggle @@ -1,8 +1,8 @@ #!/bin/bash -# Toggle single-window square aspect ratio using the flag system. +# Toggle single-window square aspect ratio. -omarchy-hyprland-flag-toggle \ +omarchy-hyprland-toggle \ --enabled-notification " Enable single-window square aspect ratio" \ --disabled-notification " Disable single-window square aspect ratio" \ single-window-aspect-ratio diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf index 6866a136..ff272f9a 100644 --- a/config/hypr/hyprland.conf +++ b/config/hypr/hyprland.conf @@ -20,7 +20,7 @@ source = ~/.config/hypr/looknfeel.conf source = ~/.config/hypr/autostart.conf # Toggle config flags dynamically -source = ~/.local/state/omarchy/flags/hypr/*.conf +source = ~/.local/state/omarchy/toggles/hypr/*.conf # Add any other personal Hyprland configuration below # windowrule = workspace 5, match:class qemu diff --git a/default/hypr/flags/flags.conf b/default/hypr/toggles/flags.conf similarity index 100% rename from default/hypr/flags/flags.conf rename to default/hypr/toggles/flags.conf diff --git a/default/hypr/flags/internal-monitor-disable.conf b/default/hypr/toggles/internal-monitor-disable.conf similarity index 100% rename from default/hypr/flags/internal-monitor-disable.conf rename to default/hypr/toggles/internal-monitor-disable.conf diff --git a/default/hypr/flags/single-window-aspect-ratio.conf b/default/hypr/toggles/single-window-aspect-ratio.conf similarity index 100% rename from default/hypr/flags/single-window-aspect-ratio.conf rename to default/hypr/toggles/single-window-aspect-ratio.conf diff --git a/default/hypr/flags/window-no-gaps.conf b/default/hypr/toggles/window-no-gaps.conf similarity index 100% rename from default/hypr/flags/window-no-gaps.conf rename to default/hypr/toggles/window-no-gaps.conf diff --git a/install/config/all.sh b/install/config/all.sh index 5ec74701..3a9eaabb 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -22,7 +22,7 @@ run_logged $OMARCHY_INSTALL/config/unmount-fuse.sh run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh run_logged $OMARCHY_INSTALL/config/input-group.sh run_logged $OMARCHY_INSTALL/config/omarchy-ai-skill.sh -run_logged $OMARCHY_INSTALL/config/omarchy-config-flags.sh +run_logged $OMARCHY_INSTALL/config/omarchy-toggles.sh run_logged $OMARCHY_INSTALL/config/kernel-modules-hook.sh run_logged $OMARCHY_INSTALL/config/powerprofilesctl-rules.sh run_logged $OMARCHY_INSTALL/config/wifi-powersave-rules.sh diff --git a/install/config/omarchy-config-flags.sh b/install/config/omarchy-config-flags.sh deleted file mode 100644 index c5a46909..00000000 --- a/install/config/omarchy-config-flags.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Flags are used to toggle certain features on/off in a persistent way -mkdir -p ~/.local/state/omarchy/flags/hypr -cp $OMARCHY_PATH/default/hypr/flags/flags.conf ~/.local/state/omarchy/flags/hypr/ diff --git a/install/config/omarchy-toggles.sh b/install/config/omarchy-toggles.sh new file mode 100644 index 00000000..b4b5ea93 --- /dev/null +++ b/install/config/omarchy-toggles.sh @@ -0,0 +1,3 @@ +# Toggles are used to turn certain features on/off in a persistent way +mkdir -p ~/.local/state/omarchy/toggles/hypr +cp $OMARCHY_PATH/default/hypr/toggles/flags.conf ~/.local/state/omarchy/toggles/hypr/ diff --git a/migrations/1776410469.sh b/migrations/1776410469.sh index a0e4d962..24aab0d6 100644 --- a/migrations/1776410469.sh +++ b/migrations/1776410469.sh @@ -2,8 +2,8 @@ echo "Add flags sourcing to hyprland.conf" HYPR_CONF=~/.config/hypr/hyprland.conf -source $OMARCHY_PATH/install/config/omarchy-config-flags.sh +source $OMARCHY_PATH/install/config/omarchy-toggles.sh -if [[ -f $HYPR_CONF ]] && ! grep -q "flags/hypr/\*\.conf" "$HYPR_CONF"; then - echo -e "\n# Toggle config flags dynamically\nsource = ~/.local/state/omarchy/flags/hypr/*.conf" >> "$HYPR_CONF" +if [[ -f $HYPR_CONF ]] && ! grep -q "toggles/hypr/\*\.conf" "$HYPR_CONF"; then + echo -e "\n# Toggle config flags dynamically\nsource = ~/.local/state/omarchy/toggles/hypr/*.conf" >> "$HYPR_CONF" fi From bdead4a3d1c3f119afac17191ca3989765c217e6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 18 Apr 2026 20:13:27 +0200 Subject: [PATCH 10/51] Don't need any notifications for this when the consequences are visible --- bin/omarchy-toggle-waybar | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bin/omarchy-toggle-waybar b/bin/omarchy-toggle-waybar index 3e3337a8..25762820 100755 --- a/bin/omarchy-toggle-waybar +++ b/bin/omarchy-toggle-waybar @@ -1,9 +1,6 @@ #!/bin/bash -omarchy-toggle \ - --enabled-notification " Bar hidden" \ - --disabled-notification " Bar visible" \ - waybar-off +omarchy-toggle waybar-off if pgrep -x waybar >/dev/null; then pkill -x waybar From d6aaf30e43686aebbfb1f9ae8e5bf9986c4d7731 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:11:48 +0200 Subject: [PATCH 11/51] Ensure internal display is turned back on if the external one is disconnected --- bin/omarchy-hyprland-monitor-internal-recover | 14 ++++++++++++++ bin/omarchy-hyprland-monitor-watch | 14 ++++++++++++++ default/hypr/autostart.conf | 2 ++ install/omarchy-base.packages | 1 + migrations/1776611242.sh | 2 ++ 5 files changed, 33 insertions(+) create mode 100755 bin/omarchy-hyprland-monitor-internal-recover create mode 100755 bin/omarchy-hyprland-monitor-watch create mode 100644 migrations/1776611242.sh diff --git a/bin/omarchy-hyprland-monitor-internal-recover b/bin/omarchy-hyprland-monitor-internal-recover new file mode 100755 index 00000000..54df8099 --- /dev/null +++ b/bin/omarchy-hyprland-monitor-internal-recover @@ -0,0 +1,14 @@ +#!/bin/bash + +# Re-enable the internal display if it was toggled off and no external monitors +# are currently active (e.g. external got disconnected live, during sleep, or +# wasn't present on boot). + +if omarchy-hyprland-toggle-enabled internal-monitor-disable; then + ACTIVE_COUNT=$(hyprctl monitors -j 2>/dev/null | jq 'length') + if [[ ${ACTIVE_COUNT:-0} -eq 0 ]]; then + omarchy-hyprland-toggle \ + --disabled-notification "󰍹 Internal display restored (no external connected)" \ + internal-monitor-disable + fi +fi diff --git a/bin/omarchy-hyprland-monitor-watch b/bin/omarchy-hyprland-monitor-watch new file mode 100755 index 00000000..0dce58cb --- /dev/null +++ b/bin/omarchy-hyprland-monitor-watch @@ -0,0 +1,14 @@ +#!/bin/bash + +# Listen on Hyprland's event socket and recover the internal display whenever +# a monitor is removed. + +SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" + +socat -U - "UNIX-CONNECT:$SOCKET" | while read -r event; do + case "$event" in + monitorremoved\>\>*|monitorremovedv2\>\>*) + omarchy-hyprland-monitor-internal-recover + ;; + esac +done diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index d6e1e4c8..f4a2f392 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -7,6 +7,8 @@ exec-once = uwsm-app -- swayosd-server exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = omarchy-cmd-first-run exec-once = omarchy-powerprofiles-init +exec-once = omarchy-hyprland-monitor-internal-recover +exec-once = uwsm-app -- omarchy-hyprland-monitor-watch # Slow app launch fix -- set systemd vars exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1) diff --git a/install/omarchy-base.packages b/install/omarchy-base.packages index d8dd7f55..c04547bf 100644 --- a/install/omarchy-base.packages +++ b/install/omarchy-base.packages @@ -112,6 +112,7 @@ sddm signal-desktop slurp spotify +socat starship sushi swaybg diff --git a/migrations/1776611242.sh b/migrations/1776611242.sh new file mode 100644 index 00000000..8e0fddca --- /dev/null +++ b/migrations/1776611242.sh @@ -0,0 +1,2 @@ +echo "Install socat for the Hyprland monitor event watcher" +omarchy-pkg-add socat From 96a08f91a5373c26397003a5e48fb629e7dc9e72 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:12:53 +0200 Subject: [PATCH 12/51] Start the monitor watch so the feature is active right away --- migrations/1776611242.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/migrations/1776611242.sh b/migrations/1776611242.sh index 8e0fddca..83e00a4f 100644 --- a/migrations/1776611242.sh +++ b/migrations/1776611242.sh @@ -1,2 +1,4 @@ echo "Install socat for the Hyprland monitor event watcher" + omarchy-pkg-add socat +uwsm-app -- omarchy-hyprland-monitor-watch & From fa48d2398b4a54deffda5cfda35b0ab16b482626 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:13:28 +0200 Subject: [PATCH 13/51] Better description --- migrations/1776611242.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/1776611242.sh b/migrations/1776611242.sh index 83e00a4f..aa7e42bf 100644 --- a/migrations/1776611242.sh +++ b/migrations/1776611242.sh @@ -1,4 +1,4 @@ -echo "Install socat for the Hyprland monitor event watcher" +echo "Install socat so we can reactivate internal display when external display is removed" omarchy-pkg-add socat uwsm-app -- omarchy-hyprland-monitor-watch & From 2b323459df17dbc8fa733cebff8e54aa9b81e987 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:34:34 +0200 Subject: [PATCH 14/51] Closing/opening lid will toggle internal monitor on/off --- bin/omarchy-hyprland-monitor-internal-disable | 13 +++++++++++++ bin/omarchy-hyprland-monitor-internal-enable | 7 +++++++ bin/omarchy-hyprland-monitor-internal-recover | 9 ++------- bin/omarchy-hyprland-monitor-internal-toggle | 15 ++++----------- bin/omarchy-hyprland-monitors-many | 5 +++++ bin/omarchy-hyprland-monitors-none | 5 +++++ default/hypr/bindings/utilities.conf | 2 ++ 7 files changed, 38 insertions(+), 18 deletions(-) create mode 100755 bin/omarchy-hyprland-monitor-internal-disable create mode 100755 bin/omarchy-hyprland-monitor-internal-enable create mode 100755 bin/omarchy-hyprland-monitors-many create mode 100755 bin/omarchy-hyprland-monitors-none diff --git a/bin/omarchy-hyprland-monitor-internal-disable b/bin/omarchy-hyprland-monitor-internal-disable new file mode 100755 index 00000000..ab26d34e --- /dev/null +++ b/bin/omarchy-hyprland-monitor-internal-disable @@ -0,0 +1,13 @@ +#!/bin/bash + +# Disable the internal laptop display. No-op if already disabled or if it +# would leave no active display. + +if omarchy-hyprland-monitors-many; then + if omarchy-hyprland-toggle-disabled internal-monitor-disable; then + omarchy-hyprland-toggle internal-monitor-disable --enabled-notification "󰍹 Internal display off" + fi +else + notify-send -u low "󰍹 Can't disable the only active display" + exit 1 +fi diff --git a/bin/omarchy-hyprland-monitor-internal-enable b/bin/omarchy-hyprland-monitor-internal-enable new file mode 100755 index 00000000..8f326bad --- /dev/null +++ b/bin/omarchy-hyprland-monitor-internal-enable @@ -0,0 +1,7 @@ +#!/bin/bash + +# Enable the internal laptop display. No-op if already enabled. + +if omarchy-hyprland-toggle-enabled internal-monitor-disable; then + omarchy-hyprland-toggle internal-monitor-disable --disabled-notification "󰍹 Internal display on" +fi diff --git a/bin/omarchy-hyprland-monitor-internal-recover b/bin/omarchy-hyprland-monitor-internal-recover index 54df8099..41a81d4f 100755 --- a/bin/omarchy-hyprland-monitor-internal-recover +++ b/bin/omarchy-hyprland-monitor-internal-recover @@ -4,11 +4,6 @@ # are currently active (e.g. external got disconnected live, during sleep, or # wasn't present on boot). -if omarchy-hyprland-toggle-enabled internal-monitor-disable; then - ACTIVE_COUNT=$(hyprctl monitors -j 2>/dev/null | jq 'length') - if [[ ${ACTIVE_COUNT:-0} -eq 0 ]]; then - omarchy-hyprland-toggle \ - --disabled-notification "󰍹 Internal display restored (no external connected)" \ - internal-monitor-disable - fi +if omarchy-hyprland-monitors-none && omarchy-hyprland-toggle-enabled internal-monitor-disable; then + omarchy-hyprland-monitor-internal-enable fi diff --git a/bin/omarchy-hyprland-monitor-internal-toggle b/bin/omarchy-hyprland-monitor-internal-toggle index 6cacea09..61316ce0 100755 --- a/bin/omarchy-hyprland-monitor-internal-toggle +++ b/bin/omarchy-hyprland-monitor-internal-toggle @@ -2,15 +2,8 @@ # Toggle the internal laptop display on/off. -if omarchy-hyprland-toggle-disabled internal-monitor-disable; then - ACTIVE_COUNT=$(hyprctl monitors -j | jq 'length') - if [[ $ACTIVE_COUNT -le 1 ]]; then - notify-send -u low "󰍹 Can't disable the only active display" - exit 1 - fi +if omarchy-hyprland-toggle-enabled internal-monitor-disable; then + omarchy-hyprland-monitor-internal-enable +else + omarchy-hyprland-monitor-internal-disable fi - -omarchy-hyprland-toggle \ - --enabled-notification "󰍹 Internal display off" \ - --disabled-notification "󰍹 Internal display on" \ - internal-monitor-disable diff --git a/bin/omarchy-hyprland-monitors-many b/bin/omarchy-hyprland-monitors-many new file mode 100755 index 00000000..50035c3f --- /dev/null +++ b/bin/omarchy-hyprland-monitors-many @@ -0,0 +1,5 @@ +#!/bin/bash + +# Returns true when there are multiple monitors connected (so we can disable the internal one) + +(( $(hyprctl monitors -j 2>/dev/null | jq length) > 1 )) diff --git a/bin/omarchy-hyprland-monitors-none b/bin/omarchy-hyprland-monitors-none new file mode 100755 index 00000000..e5061f63 --- /dev/null +++ b/bin/omarchy-hyprland-monitors-none @@ -0,0 +1,5 @@ +#!/bin/bash + +# Returns true when no monitors are connected + +(( $(hyprctl monitors -j 2>/dev/null | jq length) == 0 )) diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index 7de79d6b..e3256a6e 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -29,6 +29,8 @@ bindd = SUPER SHIFT ALT, COMMA, Restore last notification, exec, makoctl restore bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight bindd = SUPER CTRL, Delete, Toggle laptop display, exec, omarchy-hyprland-monitor-internal-toggle +bindl = , switch:on:Lid Switch, exec, omarchy-hyprland-monitor-internal-disable +bindl = , switch:off:Lid Switch, exec, omarchy-hyprland-monitor-internal-enable # Control Apple Display brightness bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000 From aa35454ddaf0fc432013362de79b447a7dd7732a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:44:24 +0200 Subject: [PATCH 15/51] Fix ordering --- bin/omarchy-hyprland-monitor-internal-disable | 2 +- bin/omarchy-hyprland-monitor-internal-enable | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-hyprland-monitor-internal-disable b/bin/omarchy-hyprland-monitor-internal-disable index ab26d34e..4d09fa61 100755 --- a/bin/omarchy-hyprland-monitor-internal-disable +++ b/bin/omarchy-hyprland-monitor-internal-disable @@ -5,7 +5,7 @@ if omarchy-hyprland-monitors-many; then if omarchy-hyprland-toggle-disabled internal-monitor-disable; then - omarchy-hyprland-toggle internal-monitor-disable --enabled-notification "󰍹 Internal display off" + omarchy-hyprland-toggle --enabled-notification "󰍹 Internal display off" internal-monitor-disable fi else notify-send -u low "󰍹 Can't disable the only active display" diff --git a/bin/omarchy-hyprland-monitor-internal-enable b/bin/omarchy-hyprland-monitor-internal-enable index 8f326bad..ef7c2fdd 100755 --- a/bin/omarchy-hyprland-monitor-internal-enable +++ b/bin/omarchy-hyprland-monitor-internal-enable @@ -3,5 +3,5 @@ # Enable the internal laptop display. No-op if already enabled. if omarchy-hyprland-toggle-enabled internal-monitor-disable; then - omarchy-hyprland-toggle internal-monitor-disable --disabled-notification "󰍹 Internal display on" + omarchy-hyprland-toggle --disabled-notification "󰍹 Internal display on" internal-monitor-disable fi From 7f9f0c25ed8add8229453b7aa6004188200c69d5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:44:32 +0200 Subject: [PATCH 16/51] Reveal which flag wasn't working --- bin/omarchy-hyprland-toggle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-hyprland-toggle b/bin/omarchy-hyprland-toggle index deda1cb3..e272beed 100755 --- a/bin/omarchy-hyprland-toggle +++ b/bin/omarchy-hyprland-toggle @@ -24,7 +24,7 @@ elif [[ -f $FLAG_SOURCE ]]; then cp $FLAG_SOURCE $FLAG [[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION" else - echo "Flag not found" + echo "Flag not found: $FLAG_NAME" exit 1 fi From 0344348ff01059bb6fd35b34fef7306b24eb8888 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 17:45:50 +0200 Subject: [PATCH 17/51] Better naming --- bin/omarchy-hyprland-monitor-internal-disable | 2 +- bin/omarchy-hyprland-monitor-internal-enable | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-hyprland-monitor-internal-disable b/bin/omarchy-hyprland-monitor-internal-disable index 4d09fa61..55ae0faf 100755 --- a/bin/omarchy-hyprland-monitor-internal-disable +++ b/bin/omarchy-hyprland-monitor-internal-disable @@ -5,7 +5,7 @@ if omarchy-hyprland-monitors-many; then if omarchy-hyprland-toggle-disabled internal-monitor-disable; then - omarchy-hyprland-toggle --enabled-notification "󰍹 Internal display off" internal-monitor-disable + omarchy-hyprland-toggle --enabled-notification "󰍹 Laptop display disabled" internal-monitor-disable fi else notify-send -u low "󰍹 Can't disable the only active display" diff --git a/bin/omarchy-hyprland-monitor-internal-enable b/bin/omarchy-hyprland-monitor-internal-enable index ef7c2fdd..8f90b30e 100755 --- a/bin/omarchy-hyprland-monitor-internal-enable +++ b/bin/omarchy-hyprland-monitor-internal-enable @@ -3,5 +3,5 @@ # Enable the internal laptop display. No-op if already enabled. if omarchy-hyprland-toggle-enabled internal-monitor-disable; then - omarchy-hyprland-toggle --disabled-notification "󰍹 Internal display on" internal-monitor-disable + omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" internal-monitor-disable fi From c74c0ccf9793944e1305bfb3381bc8e50091629a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 18:24:10 +0200 Subject: [PATCH 18/51] Speed up the window movements ever so slightly --- default/hypr/looknfeel.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index b73c9548..2bfb3f77 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -91,7 +91,7 @@ animations { animation = global, 1, 10, default animation = border, 1, 5.39, easeOutQuint - animation = windows, 1, 4.79, easeOutQuint + animation = windows, 1, 3.79, easeOutQuint animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% animation = windowsOut, 1, 1.49, linear, popin 87% animation = fadeIn, 1, 1.73, almostLinear From a71916794c9ec69c87aafa0b6156c8f61a225361 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Apr 2026 18:26:16 +0200 Subject: [PATCH 19/51] Speed up the special workspace a little too --- default/hypr/looknfeel.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index 2bfb3f77..f735abda 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -103,7 +103,7 @@ animations { animation = fadeLayersIn, 1, 1.79, almostLinear animation = fadeLayersOut, 1, 1.39, almostLinear animation = workspaces, 0, 0, ease - animation = specialWorkspace, 1, 4, easeOutQuint, slidevert + animation = specialWorkspace, 1, 3, easeOutQuint, slidevert } # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more From a9baa8f45f5814478915ac36814de942bb76f5f1 Mon Sep 17 00:00:00 2001 From: Lewis Buckley Date: Mon, 20 Apr 2026 12:52:04 +0100 Subject: [PATCH 20/51] Migrate existing waybar configs to pin battery to BAT0 (#5369) * Migrate existing waybar configs to pin battery to BAT0 Follow-up to #4918: that PR updated the default template, but existing users keep their copy at ~/.config/waybar/config.jsonc and won't pick up the fix without running omarchy-refresh-waybar (which wipes local customizations). Patch the existing file in place and restart waybar. * Make battery-pin migration tolerant of whitespace variants Per Copilot review: grep/sed patterns now match "battery" : {, "battery":{, and "bat" : "..." variants that hand-edited configs may use. Also only restart waybar when a battery block actually exists to edit. --- migrations/1776674079.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 migrations/1776674079.sh diff --git a/migrations/1776674079.sh b/migrations/1776674079.sh new file mode 100644 index 00000000..6d233599 --- /dev/null +++ b/migrations/1776674079.sh @@ -0,0 +1,10 @@ +echo "Pin waybar battery module to BAT0 to prevent crash on HID battery disconnect" + +CONFIG_FILE=~/.config/waybar/config.jsonc + +if [[ -f "$CONFIG_FILE" ]] \ + && ! grep -Eq '"bat"[[:space:]]*:' "$CONFIG_FILE" \ + && grep -Eq '"battery"[[:space:]]*:[[:space:]]*\{' "$CONFIG_FILE"; then + sed -i -E '/"battery"[[:space:]]*:[[:space:]]*\{/a\ "bat": "BAT0",' "$CONFIG_FILE" + omarchy-restart-waybar +fi From b317bd5358686fa6fd61e0e6ff54a43a963012b8 Mon Sep 17 00:00:00 2001 From: Pete Jackson Date: Mon, 20 Apr 2026 07:53:22 -0400 Subject: [PATCH 21/51] Enable pause_media for voxtype by default (#5364) Pauses MPRIS media players when recording starts so music doesn't bleed into dictation. Adds the setting to the default config for new installs and a migration for existing users. --- default/voxtype/config.toml | 3 +++ migrations/1776617403.sh | 14 ++++++++++++++ 2 files changed, 17 insertions(+) create mode 100755 migrations/1776617403.sh diff --git a/default/voxtype/config.toml b/default/voxtype/config.toml index 59d1f943..ca80e7ee 100644 --- a/default/voxtype/config.toml +++ b/default/voxtype/config.toml @@ -25,6 +25,9 @@ sample_rate = 16000 # Maximum recording duration in seconds (safety limit) max_duration_secs = 60 +# Pause MPRIS media players during recording +pause_media = true + # [audio.feedback] # Enable audio feedback sounds (beeps when recording starts/stops) # enabled = true diff --git a/migrations/1776617403.sh b/migrations/1776617403.sh new file mode 100755 index 00000000..236d02ec --- /dev/null +++ b/migrations/1776617403.sh @@ -0,0 +1,14 @@ +echo "Enable pause_media in voxtype config" + +VOXTYPE_CONF=~/.config/voxtype/config.toml + +if [[ -f $VOXTYPE_CONF ]] && ! grep -q 'pause_media' "$VOXTYPE_CONF"; then + if grep -q '^\[audio\]' "$VOXTYPE_CONF"; then + sed -i '/^\[audio\]/a\ +\ +# Pause MPRIS media players during recording\ +pause_media = true' "$VOXTYPE_CONF" + else + printf '\n[audio]\n# Pause MPRIS media players during recording\npause_media = true\n' >> "$VOXTYPE_CONF" + fi +fi From 9306f5ef299e14f49239715ccd30536df881ba4c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 11:43:34 +0200 Subject: [PATCH 22/51] Install video encoding processors for modern Intel CPU/GPU combos by default Allows the use of Quick Sync Intel H264/265 exports in Kdenlive without crashing! --- install/config/hardware/intel/video-acceleration.sh | 4 ++-- install/omarchy-other.packages | 4 ++++ migrations/1776615976.sh | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 migrations/1776615976.sh diff --git a/install/config/hardware/intel/video-acceleration.sh b/install/config/hardware/intel/video-acceleration.sh index b8ce4f80..33cc6fbe 100644 --- a/install/config/hardware/intel/video-acceleration.sh +++ b/install/config/hardware/intel/video-acceleration.sh @@ -1,9 +1,9 @@ # This installs hardware video acceleration for Intel GPUs if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then - # HD Graphics / Iris / Xe / Arc use intel-media-driver + # HD Graphics / Iris / Xe / Arc use intel-media-driver + VPL if [[ ${INTEL_GPU,,} =~ (hd\ graphics|uhd\ graphics|xe|iris|arc) ]]; then - omarchy-pkg-add intel-media-driver + omarchy-pkg-add intel-media-driver libvpl vpl-gpu-rt elif [[ ${INTEL_GPU,,} =~ "gma" ]]; then # Older generations from 2008 to ~2014-2017 use libva-intel-driver omarchy-pkg-add libva-intel-driver diff --git a/install/omarchy-other.packages b/install/omarchy-other.packages index b75c3685..47a3537f 100644 --- a/install/omarchy-other.packages +++ b/install/omarchy-other.packages @@ -55,6 +55,10 @@ tuxedo-drivers-nocompatcheck-dkms yt6801-dkms zram-generator +# Intel encoding processing +libvpl +vpl-gpu-rt + # Vulkan drivers (auto-detected by hardware) vulkan-intel vulkan-radeon diff --git a/migrations/1776615976.sh b/migrations/1776615976.sh new file mode 100644 index 00000000..32bebb60 --- /dev/null +++ b/migrations/1776615976.sh @@ -0,0 +1,3 @@ +echo "Install missing Intel VPL drivers (libvpl, vpl-gpu-rt) on systems with Intel GPUs" + +bash "$OMARCHY_PATH/install/config/hardware/intel/video-acceleration.sh" From a70b05e8f32c239879ef9718085eba27a3405951 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 16:41:07 +0200 Subject: [PATCH 23/51] New kernel patches mean we don't need to turn off the display features --- install/config/all.sh | 1 - .../hardware/dell/fix-xps-ptl-display.sh | 20 ------------------- migrations/1776099290.sh | 8 -------- migrations/1776781956.sh | 8 ++++++++ 4 files changed, 8 insertions(+), 29 deletions(-) delete mode 100644 install/config/hardware/dell/fix-xps-ptl-display.sh delete mode 100644 migrations/1776099290.sh create mode 100644 migrations/1776781956.sh diff --git a/install/config/all.sh b/install/config/all.sh index 3a9eaabb..0f8f3d6d 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -47,7 +47,6 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/fix-wifi7-eht.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/resume-boost.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.sh -run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-ptl-display.sh run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-audio-mixer.sh run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-mic.sh diff --git a/install/config/hardware/dell/fix-xps-ptl-display.sh b/install/config/hardware/dell/fix-xps-ptl-display.sh deleted file mode 100644 index 3c66e47e..00000000 --- a/install/config/hardware/dell/fix-xps-ptl-display.sh +++ /dev/null @@ -1,20 +0,0 @@ -# Fix display issues on Dell XPS Panther Lake (Xe3) systems. -# Xe PSR causes freezes and display glitches on both OLED and IPS panels. -# LG OLED panels also need Panel Replay disabled. -if omarchy-hw-match "XPS" && omarchy-hw-intel-ptl; then - echo "Detected Dell XPS on Panther Lake, applying display power-saving fixes..." - - if omarchy-hw-dell-xps-oled; then - CMDLINE='KERNEL_CMDLINE[default]+=" xe.enable_psr=0 xe.enable_panel_replay=0"' - COMMENT='Disable Xe PSR and Panel Replay on Dell XPS Panther Lake OLED systems' - else - CMDLINE='KERNEL_CMDLINE[default]+=" xe.enable_psr=0"' - COMMENT='Disable Xe PSR on Dell XPS Panther Lake systems' - fi - - sudo mkdir -p /etc/limine-entry-tool.d - cat </dev/null -# $COMMENT -$CMDLINE -EOF -fi diff --git a/migrations/1776099290.sh b/migrations/1776099290.sh deleted file mode 100644 index 1d060533..00000000 --- a/migrations/1776099290.sh +++ /dev/null @@ -1,8 +0,0 @@ -echo "Ensure xe.enable_psr=0 is set in CMDLINE for XPS Panther Lake systems" - -if omarchy-hw-match "XPS" && omarchy-hw-intel-ptl && [[ -f /etc/default/limine ]]; then - if ! grep -Fq 'xe.enable_psr=0' /etc/default/limine; then - echo 'KERNEL_CMDLINE[default]+=" xe.enable_psr=0"' | sudo tee -a /etc/default/limine >/dev/null - sudo limine-mkinitcpio - fi -fi diff --git a/migrations/1776781956.sh b/migrations/1776781956.sh new file mode 100644 index 00000000..8bf32ac0 --- /dev/null +++ b/migrations/1776781956.sh @@ -0,0 +1,8 @@ +echo "Dell XPS Panther Lake display kernel cmdline drop-in is no longer necessary" + +DROP_IN="/etc/limine-entry-tool.d/dell-xps-ptl-display.conf" + +if [[ -f $DROP_IN ]]; then + sudo rm -f "$DROP_IN" + sudo limine-update +fi From 58443c82c04390b27eef0e180e598c9be4579f2f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 16:43:53 +0200 Subject: [PATCH 24/51] Remove default vrr on --- config/hypr/monitors.conf | 2 +- migrations/1776781957.sh | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 migrations/1776781957.sh diff --git a/config/hypr/monitors.conf b/config/hypr/monitors.conf index 99695e1c..01c9cde1 100644 --- a/config/hypr/monitors.conf +++ b/config/hypr/monitors.conf @@ -4,7 +4,7 @@ # Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K. env = GDK_SCALE,2 -monitor=,preferred,auto,auto,vrr,1 +monitor=,preferred,auto,auto # Good compromise for 27" or 32" 4K monitors (but fractional!) # env = GDK_SCALE,1.75 diff --git a/migrations/1776781957.sh b/migrations/1776781957.sh new file mode 100644 index 00000000..806d9dab --- /dev/null +++ b/migrations/1776781957.sh @@ -0,0 +1,7 @@ +echo "Drop vrr,1 from default monitor line as it creates a small lag" + +MONITORS_CONF=~/.config/hypr/monitors.conf + +if [[ -f $MONITORS_CONF ]]; then + sed -i 's/^monitor=,preferred,auto,auto,vrr,1$/monitor=,preferred,auto,auto/' "$MONITORS_CONF" +fi From 5d2cdb53171d5bcca7dcbe82197237aaeb4636c3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 17:01:03 +0200 Subject: [PATCH 25/51] Remove xe cmdline args from limine conf too --- migrations/1776781956.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/migrations/1776781956.sh b/migrations/1776781956.sh index 8bf32ac0..4c9e7406 100644 --- a/migrations/1776781956.sh +++ b/migrations/1776781956.sh @@ -1,8 +1,19 @@ -echo "Dell XPS Panther Lake display kernel cmdline drop-in is no longer necessary" +echo "Dell XPS Panther Lake display kernel cmdline is no longer necessary" DROP_IN="/etc/limine-entry-tool.d/dell-xps-ptl-display.conf" +DEFAULT_LIMINE="/etc/default/limine" +NEEDS_UPDATE=0 if [[ -f $DROP_IN ]]; then sudo rm -f "$DROP_IN" + NEEDS_UPDATE=1 +fi + +if [[ -f $DEFAULT_LIMINE ]] && grep -q 'xe\.enable_psr' "$DEFAULT_LIMINE"; then + sudo sed -i -E '/^KERNEL_CMDLINE.*xe\.enable_psr/d; /^# .*(Dell XPS|Xe PSR|Panel Replay)/d' "$DEFAULT_LIMINE" + NEEDS_UPDATE=1 +fi + +if (( NEEDS_UPDATE )); then sudo limine-update fi From ac08aaf834817d170742b6846b153a10f9530c2d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 17:19:34 +0200 Subject: [PATCH 26/51] Resume boosting didn't actually solve the real underlying problem But a bios update to the XPS should. --- default/systemd/system-sleep/resume-boost | 16 ---------------- install/config/all.sh | 1 - install/config/hardware/intel/resume-boost.sh | 8 -------- migrations/1776784497.sh | 5 +++++ 4 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 default/systemd/system-sleep/resume-boost delete mode 100644 install/config/hardware/intel/resume-boost.sh create mode 100644 migrations/1776784497.sh diff --git a/default/systemd/system-sleep/resume-boost b/default/systemd/system-sleep/resume-boost deleted file mode 100644 index 318519e8..00000000 --- a/default/systemd/system-sleep/resume-boost +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Temporarily switch to performance power profile on resume -# to avoid sluggishness while the system catches up, then -# restore the previous profile after 10 seconds. - -if [[ $1 == "pre" ]]; then - mkdir -p /run/omarchy - powerprofilesctl get > /run/omarchy/power-profile-before-sleep -fi - -if [[ $1 == "post" ]]; then - previous=$(cat /run/omarchy/power-profile-before-sleep 2>/dev/null || echo "balanced") - powerprofilesctl set performance - systemd-run --on-active=10 --timer-property=AccuracySec=1 powerprofilesctl set "$previous" -fi diff --git a/install/config/all.sh b/install/config/all.sh index 0f8f3d6d..69267195 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -44,7 +44,6 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/thermald.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/ipu7-camera.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/ptl-kernel.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/fix-wifi7-eht.sh -run_logged $OMARCHY_INSTALL/config/hardware/intel/resume-boost.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.sh diff --git a/install/config/hardware/intel/resume-boost.sh b/install/config/hardware/intel/resume-boost.sh deleted file mode 100644 index 3d177cfd..00000000 --- a/install/config/hardware/intel/resume-boost.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Boost CPU performance for 10 seconds after resume on Intel systems. -# The powersave governor with balance_power EPP is slow to ramp frequency -# after long suspends, causing noticeable sluggishness on wake. - -if omarchy-hw-intel; then - sudo mkdir -p /usr/lib/systemd/system-sleep - sudo install -m 0755 -o root -g root "$OMARCHY_PATH/default/systemd/system-sleep/resume-boost" /usr/lib/systemd/system-sleep/ -fi diff --git a/migrations/1776784497.sh b/migrations/1776784497.sh new file mode 100644 index 00000000..ef03e32d --- /dev/null +++ b/migrations/1776784497.sh @@ -0,0 +1,5 @@ +echo "Remove resume boost feature" + +if [[ -f /usr/lib/systemd/system-sleep/resume-boost ]]; then + sudo rm /usr/lib/systemd/system-sleep/resume-boost +fi From a3b7c41b9bb6f4972bdf0395c01f35590e121202 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 21 Apr 2026 21:22:37 +0200 Subject: [PATCH 27/51] Make iA writer theme fully back to work better on OLEDs --- config/Typora/themes/ia_typora_night.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/Typora/themes/ia_typora_night.css b/config/Typora/themes/ia_typora_night.css index d783d203..ac0b6c04 100644 --- a/config/Typora/themes/ia_typora_night.css +++ b/config/Typora/themes/ia_typora_night.css @@ -8,7 +8,7 @@ --light-header-color: #dbdbdb; /* H1-H3 */ --select-text-bg-color: #186a9a; --accent-color: #4f525a; - --background-color: #101010; + --background-color: #000000; --font-color: #bbbcbc; --header-color: #bebebe; /* H4-H6 */ --border-color: #232629; From bff5e843e06591ca16c75512ede6c61c15128fc6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 07:52:40 +0200 Subject: [PATCH 28/51] Revert "Add battery identifier to Waybar config" (#5386) * Revert "Add battery identifier to Waybar config" * Remove the migration too --- config/waybar/config.jsonc | 1 - migrations/1776674079.sh | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 migrations/1776674079.sh diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index b20fcdf5..8d857c69 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -80,7 +80,6 @@ "on-click": "omarchy-launch-wifi" }, "battery": { - "bat": "BAT0", "format": "{capacity}% {icon}", "format-discharging": "{icon}", "format-charging": "{icon}", diff --git a/migrations/1776674079.sh b/migrations/1776674079.sh deleted file mode 100644 index 6d233599..00000000 --- a/migrations/1776674079.sh +++ /dev/null @@ -1,10 +0,0 @@ -echo "Pin waybar battery module to BAT0 to prevent crash on HID battery disconnect" - -CONFIG_FILE=~/.config/waybar/config.jsonc - -if [[ -f "$CONFIG_FILE" ]] \ - && ! grep -Eq '"bat"[[:space:]]*:' "$CONFIG_FILE" \ - && grep -Eq '"battery"[[:space:]]*:[[:space:]]*\{' "$CONFIG_FILE"; then - sed -i -E '/"battery"[[:space:]]*:[[:space:]]*\{/a\ "bat": "BAT0",' "$CONFIG_FILE" - omarchy-restart-waybar -fi From ac3c60228e596ef9c46f0c281188c7f6dc505e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Gr=C3=BCndel?= Date: Wed, 22 Apr 2026 12:38:45 +0200 Subject: [PATCH 29/51] Add keybindings to cycle through monitors (#5359) * Add keybindings to cycle through monitors * Unified language around focus * Group focus keybindings * More natural sounding --------- Co-authored-by: David Heinemeier Hansson --- bin/omarchy-menu-keybindings | 2 +- default/hypr/bindings/tiling-v2.conf | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/bin/omarchy-menu-keybindings b/bin/omarchy-menu-keybindings index 34486206..7aa0490a 100755 --- a/bin/omarchy-menu-keybindings +++ b/bin/omarchy-menu-keybindings @@ -202,7 +202,7 @@ prioritize_entries() { if (match(line, /Move window to workspace/)) prio = 28 if (match(line, /Move window silently to workspace/)) prio = 29 if (match(line, /Swap window/)) prio = 30 - if (match(line, /Move window focus/)) prio = 31 + if (match(line, /Focus/)) prio = 31 if (match(line, /Move window$/)) prio = 32 if (match(line, /Resize window/)) prio = 33 if (match(line, /Expand window/)) prio = 34 diff --git a/default/hypr/bindings/tiling-v2.conf b/default/hypr/bindings/tiling-v2.conf index 6b8da1dd..e0c74eb4 100644 --- a/default/hypr/bindings/tiling-v2.conf +++ b/default/hypr/bindings/tiling-v2.conf @@ -13,10 +13,10 @@ bindd = SUPER, O, Pop window out (float & pin), exec, omarchy-hyprland-window-po bindd = SUPER, L, Toggle workspace layout, exec, omarchy-hyprland-workspace-layout-toggle # Move focus with SUPER + arrow keys -bindd = SUPER, LEFT, Move window focus left, movefocus, l -bindd = SUPER, RIGHT, Move window focus right, movefocus, r -bindd = SUPER, UP, Move window focus up, movefocus, u -bindd = SUPER, DOWN, Move window focus down, movefocus, d +bindd = SUPER, LEFT, Focus on left window, movefocus, l +bindd = SUPER, RIGHT, Focus on right window, movefocus, r +bindd = SUPER, UP, Focus on above window, movefocus, u +bindd = SUPER, DOWN, Focus on below window, movefocus, d # Switch workspaces with SUPER + [1-9; 0] bindd = SUPER, code:10, Switch to workspace 1, workspace, 1 @@ -76,11 +76,15 @@ bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d # Cycle through applications on active workspace -bindd = ALT, TAB, Cycle to next window, cyclenext -bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev +bindd = ALT, TAB, Focus on next window, cyclenext +bindd = ALT SHIFT, TAB, Focus on previous window, cyclenext, prev bindd = ALT, TAB, Reveal active window on top, bringactivetotop bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop +# Cycle through monitors +bindd = CTRL ALT, TAB, Focus on next monitor, focusmonitor, +1 +bindd = CTRL ALT SHIFT, TAB, Focus on previous monitor, focusmonitor, -1 + # Resize active window bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key bindd = SUPER, code:21, Shrink window left, resizeactive, 100 0 # = key From 37189368fbde62f4bbb8d1ecc86f4ec9851c6004 Mon Sep 17 00:00:00 2001 From: Pete Jackson Date: Wed, 22 Apr 2026 06:56:37 -0400 Subject: [PATCH 30/51] Clean up orphaned voxtype status processes on exit (#5345) * Clean up orphaned voxtype status processes on exit Waybar's custom/voxtype module runs omarchy-voxtype-status, which spawns a long-lived `voxtype status --follow` child. When Waybar reloads (config change, display hotplug, Hyprland reload), it kills the wrapper but the child survives as an orphan. Over time dozens accumulate. `trap 'kill 0' EXIT` signals the entire process group when the wrapper exits, ensuring the voxtype child is cleaned up. * Explain purpose of trap --------- Co-authored-by: David Heinemeier Hansson --- bin/omarchy-voxtype-status | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/omarchy-voxtype-status b/bin/omarchy-voxtype-status index 039ebca7..acab6f30 100755 --- a/bin/omarchy-voxtype-status +++ b/bin/omarchy-voxtype-status @@ -1,5 +1,8 @@ #!/bin/bash +# Clean up the voxtype --follow child when Waybar reloads +trap 'kill 0' EXIT + if omarchy-cmd-present voxtype; then voxtype status --follow --extended --format json | while read -r line; do echo "$line" | jq -c '. + {alt: .class}' From d00b3ea24bc116de9c1abf8f897f1d870ee291d0 Mon Sep 17 00:00:00 2001 From: DrunkLeen Date: Wed, 22 Apr 2026 12:59:43 +0200 Subject: [PATCH 31/51] feat: Add Touchpad toggle/on/off support (#5353) * feat: add touchpad toggle keybinding and script Binds XF86TouchpadToggle/On/Off to a new leenium-toggle-touchpad script that enables/disables the touchpad via hyprctl and shows OSD feedback. * fix: make XF86TouchpadOn/Off enforce state instead of toggling Add on/off/toggle argument support to omarchy-toggle-touchpad. XF86TouchpadOn now always enables and XF86TouchpadOff always disables, so firmware that emits separate On/Off keysyms behaves correctly regardless of current state. XF86TouchpadToggle retains the invert behavior. * feat: add touchpad toggle to menu and persist state as hyprland config - Show touchpad option in toggle menu only when a touchpad/trackpad device is detected - Replace /tmp state file with a persistent hyprland device config at ~/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf * fix: avoid unsafe && || toggle logic for Touchpad state Replace `[[ -f $STATE_CONF ]] && enable || disable` with an explicit if/else. The previous logic was not a true ternary: if `enable` failed (e.g. OSD command error), `disable` would run unintentionally, causing unreliable toggle behavior. --- bin/omarchy-menu | 9 ++++++- bin/omarchy-toggle-touchpad | 42 ++++++++++++++++++++++++++++++++ default/hypr/bindings/media.conf | 3 +++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100755 bin/omarchy-toggle-touchpad diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 91e5331a..972b6e15 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -168,7 +168,13 @@ show_share_menu() { } show_toggle_menu() { - case $(menu "Toggle" "󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n󰛧 Laptop Display") in + local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n󰛧 Laptop Display" + + if hyprctl devices -j 2>/dev/null | jq -e '[.mice[] | select(.name | test("touchpad|trackpad"; "i"))] | length > 0' >/dev/null; then + options="$options\n󰟸 Touchpad" + fi + + case $(menu "Toggle" "$options") in *Screensaver*) omarchy-toggle-screensaver ;; *Nightlight*) omarchy-toggle-nightlight ;; @@ -179,6 +185,7 @@ show_toggle_menu() { *Gaps*) omarchy-hyprland-window-gaps-toggle ;; *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;; *Laptop*) omarchy-hyprland-monitor-internal-toggle ;; + *Touchpad*) omarchy-toggle-touchpad ;; *) back_to show_trigger_menu ;; esac } diff --git a/bin/omarchy-toggle-touchpad b/bin/omarchy-toggle-touchpad new file mode 100755 index 00000000..13611a6f --- /dev/null +++ b/bin/omarchy-toggle-touchpad @@ -0,0 +1,42 @@ +#!/bin/bash + +STATE_CONF="$HOME/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf" +osdclient="swayosd-client --monitor $(omarchy-hyprland-monitor-focused)" + +device="$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty')" + +if [[ -z $device ]]; then + echo "No touchpad device found" >&2 + exit 1 +fi + +enable() { + hyprctl keyword "device[$device]:enabled" true >/dev/null + rm -f "$STATE_CONF" + $osdclient --custom-icon input-touchpad-symbolic --custom-message "Enabled" +} + +disable() { + hyprctl keyword "device[$device]:enabled" false >/dev/null + mkdir -p "$(dirname "$STATE_CONF")" + printf 'device {\n name = %s\n enabled = false\n}\n' "$device" > "$STATE_CONF" + $osdclient --custom-icon touchpad-disabled-symbolic --custom-message "Disabled" +} + +case "${1:-toggle}" in + on) enable ;; + off) disable ;; + toggle) + if [[ -f $STATE_CONF ]]; then + enable || { + echo "enable failed" >&2 + exit 1 + } + else + disable || { + echo "disable failed" >&2 + exit 1 + } + fi + ;; +esac diff --git a/default/hypr/bindings/media.conf b/default/hypr/bindings/media.conf index 88763037..c4f78b2c 100644 --- a/default/hypr/bindings/media.conf +++ b/default/hypr/bindings/media.conf @@ -11,6 +11,9 @@ bindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-disp bindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, omarchy-brightness-keyboard up bindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, omarchy-brightness-keyboard down bindld = ,XF86KbdLightOnOff, Keyboard backlight cycle, exec, omarchy-brightness-keyboard cycle +bindld = ,XF86TouchpadToggle, Toggle touchpad, exec, omarchy-toggle-touchpad +bindld = ,XF86TouchpadOn, Enable touchpad, exec, omarchy-toggle-touchpad on +bindld = ,XF86TouchpadOff, Disable touchpad, exec, omarchy-toggle-touchpad off # Precise 1% multimedia adjustments with Alt modifier bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1 From 843ee8ff491cb7866c89364021fefbbc05ebc409 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 12:59:11 +0200 Subject: [PATCH 32/51] Extract omarchy-hw-touchpad and simplify conditionals --- bin/omarchy-hw-touchpad | 3 +++ bin/omarchy-menu | 2 +- bin/omarchy-toggle-touchpad | 20 ++++---------------- 3 files changed, 8 insertions(+), 17 deletions(-) create mode 100755 bin/omarchy-hw-touchpad diff --git a/bin/omarchy-hw-touchpad b/bin/omarchy-hw-touchpad new file mode 100755 index 00000000..4bea4a68 --- /dev/null +++ b/bin/omarchy-hw-touchpad @@ -0,0 +1,3 @@ +#!/bin/bash + +hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty' diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 972b6e15..25cf71c2 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -170,7 +170,7 @@ show_share_menu() { show_toggle_menu() { local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n󰛧 Laptop Display" - if hyprctl devices -j 2>/dev/null | jq -e '[.mice[] | select(.name | test("touchpad|trackpad"; "i"))] | length > 0' >/dev/null; then + if [[ -n "$(omarchy-hw-touchpad)" ]]; then options="$options\n󰟸 Touchpad" fi diff --git a/bin/omarchy-toggle-touchpad b/bin/omarchy-toggle-touchpad index 13611a6f..d2ef6876 100755 --- a/bin/omarchy-toggle-touchpad +++ b/bin/omarchy-toggle-touchpad @@ -3,7 +3,7 @@ STATE_CONF="$HOME/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf" osdclient="swayosd-client --monitor $(omarchy-hyprland-monitor-focused)" -device="$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty')" +device="$(omarchy-hw-touchpad)" if [[ -z $device ]]; then echo "No touchpad device found" >&2 @@ -24,19 +24,7 @@ disable() { } case "${1:-toggle}" in - on) enable ;; - off) disable ;; - toggle) - if [[ -f $STATE_CONF ]]; then - enable || { - echo "enable failed" >&2 - exit 1 - } - else - disable || { - echo "disable failed" >&2 - exit 1 - } - fi - ;; + on) enable ;; + off) disable ;; + toggle) if [[ -f $STATE_CONF ]]; then enable; else disable; fi ;; esac From ed9ecccb21c0f5f5ff15649c65496d7724834291 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 13:04:01 +0200 Subject: [PATCH 33/51] Better notification message --- bin/omarchy-toggle-touchpad | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-toggle-touchpad b/bin/omarchy-toggle-touchpad index d2ef6876..fbbea79a 100755 --- a/bin/omarchy-toggle-touchpad +++ b/bin/omarchy-toggle-touchpad @@ -13,14 +13,14 @@ fi enable() { hyprctl keyword "device[$device]:enabled" true >/dev/null rm -f "$STATE_CONF" - $osdclient --custom-icon input-touchpad-symbolic --custom-message "Enabled" + omarchy-swayosd-client --custom-icon input-touchpad-symbolic --custom-message "Enabled Touchpad" } disable() { hyprctl keyword "device[$device]:enabled" false >/dev/null mkdir -p "$(dirname "$STATE_CONF")" printf 'device {\n name = %s\n enabled = false\n}\n' "$device" > "$STATE_CONF" - $osdclient --custom-icon touchpad-disabled-symbolic --custom-message "Disabled" + omarchy-swayosd-client --custom-icon touchpad-disabled-symbolic --custom-message "Disabled Touchpad" } case "${1:-toggle}" in From edf7067797ef10117c11079d6d08422f014fda13 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 13:04:30 +0200 Subject: [PATCH 34/51] Extract omarchy-swayosd-client So we don't have to manually compose it every time --- bin/omarchy-cmd-audio-switch | 9 ++------- bin/omarchy-cmd-mic-mute | 2 +- bin/omarchy-cmd-mic-mute-xps | 3 +-- bin/omarchy-swayosd-brightness | 3 +-- bin/omarchy-swayosd-client | 5 +++++ bin/omarchy-swayosd-kbd-brightness | 3 +-- bin/omarchy-toggle-touchpad | 1 - default/hypr/bindings/media.conf | 21 +++++++++------------ 8 files changed, 20 insertions(+), 27 deletions(-) create mode 100755 bin/omarchy-swayosd-client diff --git a/bin/omarchy-cmd-audio-switch b/bin/omarchy-cmd-audio-switch index de81cc3f..a0d7ef85 100755 --- a/bin/omarchy-cmd-audio-switch +++ b/bin/omarchy-cmd-audio-switch @@ -2,15 +2,11 @@ # Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute. -focused_monitor=$(omarchy-hyprland-monitor-focused) - sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]') sinks_count=$(echo "$sinks" | jq '. | length') if (( sinks_count == 0 )); then - swayosd-client \ - --monitor "$focused_monitor" \ - --custom-message "No audio devices found" + omarchy-swayosd-client --custom-message "No audio devices found" exit 1 fi @@ -60,7 +56,6 @@ if [[ $next_sink_name != $current_sink_name ]]; then pactl set-default-sink "$next_sink_name" fi -swayosd-client \ - --monitor "$focused_monitor" \ +omarchy-swayosd-client \ --custom-message "$next_sink_description" \ --custom-icon "$next_sink_volume_icon" diff --git a/bin/omarchy-cmd-mic-mute b/bin/omarchy-cmd-mic-mute index 7f10fa94..a1a76cec 100755 --- a/bin/omarchy-cmd-mic-mute +++ b/bin/omarchy-cmd-mic-mute @@ -5,5 +5,5 @@ if omarchy-hw-match "XPS"; then omarchy-cmd-mic-mute-xps else - swayosd-client --monitor "$(omarchy-hyprland-monitor-focused)" --input-volume mute-toggle + omarchy-swayosd-client --input-volume mute-toggle fi diff --git a/bin/omarchy-cmd-mic-mute-xps b/bin/omarchy-cmd-mic-mute-xps index 8e7ca135..16b2da19 100755 --- a/bin/omarchy-cmd-mic-mute-xps +++ b/bin/omarchy-cmd-mic-mute-xps @@ -38,7 +38,6 @@ if [[ -e /sys/class/leds/platform::micmute/brightness ]]; then done fi -swayosd-client \ - --monitor "$(omarchy-hyprland-monitor-focused)" \ +omarchy-swayosd-client \ --custom-message "$osd_message" \ --custom-icon "$osd_icon" diff --git a/bin/omarchy-swayosd-brightness b/bin/omarchy-swayosd-brightness index 0dbe44d2..c65f52a6 100755 --- a/bin/omarchy-swayosd-brightness +++ b/bin/omarchy-swayosd-brightness @@ -8,8 +8,7 @@ percent="$1" progress="$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')" [[ $progress == "0.00" ]] && progress="0.01" -swayosd-client \ - --monitor "$(omarchy-hyprland-monitor-focused)" \ +omarchy-swayosd-client \ --custom-icon display-brightness \ --custom-progress "$progress" \ --custom-progress-text "${percent}%" diff --git a/bin/omarchy-swayosd-client b/bin/omarchy-swayosd-client new file mode 100755 index 00000000..e05beb4f --- /dev/null +++ b/bin/omarchy-swayosd-client @@ -0,0 +1,5 @@ +#!/bin/bash + +# Wrapper for swayosd-client that targets the currently focused monitor. + +exec swayosd-client --monitor "$(omarchy-hyprland-monitor-focused)" "$@" diff --git a/bin/omarchy-swayosd-kbd-brightness b/bin/omarchy-swayosd-kbd-brightness index bf51d749..1925ae34 100755 --- a/bin/omarchy-swayosd-kbd-brightness +++ b/bin/omarchy-swayosd-kbd-brightness @@ -8,8 +8,7 @@ percent="$1" progress="$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')" [[ $progress == "0.00" ]] && progress="0.01" -swayosd-client \ - --monitor "$(omarchy-hyprland-monitor-focused)" \ +omarchy-swayosd-client \ --custom-icon keyboard-brightness \ --custom-progress "$progress" \ --custom-progress-text "${percent}%" diff --git a/bin/omarchy-toggle-touchpad b/bin/omarchy-toggle-touchpad index fbbea79a..cc1ce7ba 100755 --- a/bin/omarchy-toggle-touchpad +++ b/bin/omarchy-toggle-touchpad @@ -1,7 +1,6 @@ #!/bin/bash STATE_CONF="$HOME/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf" -osdclient="swayosd-client --monitor $(omarchy-hyprland-monitor-focused)" device="$(omarchy-hw-touchpad)" diff --git a/default/hypr/bindings/media.conf b/default/hypr/bindings/media.conf index c4f78b2c..c02872dc 100644 --- a/default/hypr/bindings/media.conf +++ b/default/hypr/bindings/media.conf @@ -1,10 +1,7 @@ -# Only display the OSD on the currently focused monitor -$osdclient = swayosd-client --monitor "$(omarchy-hyprland-monitor-focused)" - # Laptop multimedia keys for volume and LCD brightness (with OSD) -bindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume raise -bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower -bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle +bindeld = ,XF86AudioRaiseVolume, Volume up, exec, omarchy-swayosd-client --output-volume raise +bindeld = ,XF86AudioLowerVolume, Volume down, exec, omarchy-swayosd-client --output-volume lower +bindeld = ,XF86AudioMute, Mute, exec, omarchy-swayosd-client --output-volume mute-toggle bindeld = ,XF86AudioMicMute, Mute microphone, exec, omarchy-cmd-mic-mute bindeld = ,XF86MonBrightnessUp, Brightness up, exec, omarchy-brightness-display +5% bindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-display 5%- @@ -16,16 +13,16 @@ bindld = ,XF86TouchpadOn, Enable touchpad, exec, omarchy-toggle-touchpad on bindld = ,XF86TouchpadOff, Disable touchpad, exec, omarchy-toggle-touchpad off # 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, XF86AudioRaiseVolume, Volume up precise, exec, omarchy-swayosd-client --output-volume +1 +bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, omarchy-swayosd-client --output-volume -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 -bindld = , XF86AudioPause, Pause, exec, $osdclient --playerctl play-pause -bindld = , XF86AudioPlay, Play, exec, $osdclient --playerctl play-pause -bindld = , XF86AudioPrev, Previous track, exec, $osdclient --playerctl previous +bindld = , XF86AudioNext, Next track, exec, omarchy-swayosd-client --playerctl next +bindld = , XF86AudioPause, Pause, exec, omarchy-swayosd-client --playerctl play-pause +bindld = , XF86AudioPlay, Play, exec, omarchy-swayosd-client --playerctl play-pause +bindld = , XF86AudioPrev, Previous track, exec, omarchy-swayosd-client --playerctl previous # Switch audio output with Super + Mute bindld = SUPER, XF86AudioMute, Switch audio output, exec, omarchy-cmd-audio-switch From 0a4490a1f1e6419ee50c40c8e73a02c5ee727b7b Mon Sep 17 00:00:00 2001 From: Pete Jackson Date: Wed, 22 Apr 2026 07:24:59 -0400 Subject: [PATCH 35/51] Restore keyboard layout after hyprland config refresh (#5319) omarchy-refresh-hyprland overwrites input.conf with the default template, which has kb_layout and kb_variant commented out. Non-US users lose their keyboard layout with no obvious recovery path. Re-run detect-keyboard-layout.sh after the refresh so the system layout from /etc/vconsole.conf is re-applied, matching what the initial install does. Closes #2507 --- bin/omarchy-refresh-hyprland | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/omarchy-refresh-hyprland b/bin/omarchy-refresh-hyprland index 10e02674..d9c360ee 100755 --- a/bin/omarchy-refresh-hyprland +++ b/bin/omarchy-refresh-hyprland @@ -7,3 +7,4 @@ omarchy-refresh-config hypr/bindings.conf omarchy-refresh-config hypr/input.conf omarchy-refresh-config hypr/looknfeel.conf omarchy-refresh-config hypr/hyprland.conf +bash "$OMARCHY_PATH/install/config/detect-keyboard-layout.sh" From 1ca9c7ea0d7e0338ee0564ce5b84fa8c0149e801 Mon Sep 17 00:00:00 2001 From: Pete Jackson Date: Wed, 22 Apr 2026 07:26:26 -0400 Subject: [PATCH 36/51] Skip browser policy refresh when browser is not running (#5321) chromium/brave --refresh-platform-policy blocks forever when the browser is not already running, hanging omarchy-update entirely. Guard both calls with pgrep so the policy file is still written (picked up on next launch) but the blocking refresh is skipped. Closes #4772 --- bin/omarchy-theme-set-browser | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index a069c167..05c8fc96 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -14,11 +14,11 @@ if omarchy-cmd-present chromium || omarchy-cmd-present brave; then if omarchy-cmd-present chromium; then echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null - chromium --refresh-platform-policy --no-startup-window &>/dev/null + pgrep -x chromium >/dev/null && chromium --refresh-platform-policy --no-startup-window &>/dev/null fi if omarchy-cmd-present brave; then echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/brave/policies/managed/color.json" >/dev/null - brave --refresh-platform-policy --no-startup-window &>/dev/null + pgrep -x brave >/dev/null && brave --refresh-platform-policy --no-startup-window &>/dev/null fi fi From cd3e683fefdffc497131d23dd1185174673d9e6f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 13:35:20 +0200 Subject: [PATCH 37/51] Combine into one script with options --- bin/omarchy-hyprland-monitor-internal | 37 +++++++++++++++++++ bin/omarchy-hyprland-monitor-internal-disable | 13 ------- bin/omarchy-hyprland-monitor-internal-enable | 7 ---- bin/omarchy-hyprland-monitor-internal-recover | 9 ----- bin/omarchy-hyprland-monitor-internal-toggle | 9 ----- bin/omarchy-hyprland-monitor-watch | 2 +- bin/omarchy-menu | 2 +- default/hypr/autostart.conf | 2 +- default/hypr/bindings/utilities.conf | 6 +-- 9 files changed, 43 insertions(+), 44 deletions(-) create mode 100755 bin/omarchy-hyprland-monitor-internal delete mode 100755 bin/omarchy-hyprland-monitor-internal-disable delete mode 100755 bin/omarchy-hyprland-monitor-internal-enable delete mode 100755 bin/omarchy-hyprland-monitor-internal-recover delete mode 100755 bin/omarchy-hyprland-monitor-internal-toggle diff --git a/bin/omarchy-hyprland-monitor-internal b/bin/omarchy-hyprland-monitor-internal new file mode 100755 index 00000000..74e6f491 --- /dev/null +++ b/bin/omarchy-hyprland-monitor-internal @@ -0,0 +1,37 @@ +#!/bin/bash + +TOGGLE="internal-monitor-disable" + +enable() { + if omarchy-hyprland-toggle-enabled "$TOGGLE"; then + omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" "$TOGGLE" + fi +} + +disable() { + if omarchy-hyprland-monitors-many; then + if omarchy-hyprland-toggle-disabled "$TOGGLE"; then + omarchy-hyprland-toggle --enabled-notification "󰍹 Laptop display disabled" "$TOGGLE" + fi + else + notify-send -u low "󰍹 Can't disable the only active display" + exit 1 + fi +} + +recover() { + if omarchy-hyprland-monitors-none && omarchy-hyprland-toggle-enabled "$TOGGLE"; then + enable + fi +} + +case "$1" in + on) enable ;; + off) disable ;; + toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then enable; else disable; fi ;; + recover) recover ;; + *) + echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2 + exit 1 + ;; +esac diff --git a/bin/omarchy-hyprland-monitor-internal-disable b/bin/omarchy-hyprland-monitor-internal-disable deleted file mode 100755 index 55ae0faf..00000000 --- a/bin/omarchy-hyprland-monitor-internal-disable +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Disable the internal laptop display. No-op if already disabled or if it -# would leave no active display. - -if omarchy-hyprland-monitors-many; then - if omarchy-hyprland-toggle-disabled internal-monitor-disable; then - omarchy-hyprland-toggle --enabled-notification "󰍹 Laptop display disabled" internal-monitor-disable - fi -else - notify-send -u low "󰍹 Can't disable the only active display" - exit 1 -fi diff --git a/bin/omarchy-hyprland-monitor-internal-enable b/bin/omarchy-hyprland-monitor-internal-enable deleted file mode 100755 index 8f90b30e..00000000 --- a/bin/omarchy-hyprland-monitor-internal-enable +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Enable the internal laptop display. No-op if already enabled. - -if omarchy-hyprland-toggle-enabled internal-monitor-disable; then - omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" internal-monitor-disable -fi diff --git a/bin/omarchy-hyprland-monitor-internal-recover b/bin/omarchy-hyprland-monitor-internal-recover deleted file mode 100755 index 41a81d4f..00000000 --- a/bin/omarchy-hyprland-monitor-internal-recover +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Re-enable the internal display if it was toggled off and no external monitors -# are currently active (e.g. external got disconnected live, during sleep, or -# wasn't present on boot). - -if omarchy-hyprland-monitors-none && omarchy-hyprland-toggle-enabled internal-monitor-disable; then - omarchy-hyprland-monitor-internal-enable -fi diff --git a/bin/omarchy-hyprland-monitor-internal-toggle b/bin/omarchy-hyprland-monitor-internal-toggle deleted file mode 100755 index 61316ce0..00000000 --- a/bin/omarchy-hyprland-monitor-internal-toggle +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Toggle the internal laptop display on/off. - -if omarchy-hyprland-toggle-enabled internal-monitor-disable; then - omarchy-hyprland-monitor-internal-enable -else - omarchy-hyprland-monitor-internal-disable -fi diff --git a/bin/omarchy-hyprland-monitor-watch b/bin/omarchy-hyprland-monitor-watch index 0dce58cb..470bf3de 100755 --- a/bin/omarchy-hyprland-monitor-watch +++ b/bin/omarchy-hyprland-monitor-watch @@ -8,7 +8,7 @@ SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" socat -U - "UNIX-CONNECT:$SOCKET" | while read -r event; do case "$event" in monitorremoved\>\>*|monitorremovedv2\>\>*) - omarchy-hyprland-monitor-internal-recover + omarchy-hyprland-monitor-internal recover ;; esac done diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 25cf71c2..4d524497 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -184,7 +184,7 @@ show_toggle_menu() { *Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;; *Gaps*) omarchy-hyprland-window-gaps-toggle ;; *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;; - *Laptop*) omarchy-hyprland-monitor-internal-toggle ;; + *Laptop*) omarchy-hyprland-monitor-internal toggle ;; *Touchpad*) omarchy-toggle-touchpad ;; *) back_to show_trigger_menu ;; esac diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index f4a2f392..f34aa49f 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -7,7 +7,7 @@ exec-once = uwsm-app -- swayosd-server exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = omarchy-cmd-first-run exec-once = omarchy-powerprofiles-init -exec-once = omarchy-hyprland-monitor-internal-recover +exec-once = omarchy-hyprland-monitor-internal recover exec-once = uwsm-app -- omarchy-hyprland-monitor-watch # Slow app launch fix -- set systemd vars diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index e3256a6e..70730368 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -28,9 +28,9 @@ bindd = SUPER SHIFT ALT, COMMA, Restore last notification, exec, makoctl restore # Toggles bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight -bindd = SUPER CTRL, Delete, Toggle laptop display, exec, omarchy-hyprland-monitor-internal-toggle -bindl = , switch:on:Lid Switch, exec, omarchy-hyprland-monitor-internal-disable -bindl = , switch:off:Lid Switch, exec, omarchy-hyprland-monitor-internal-enable +bindd = SUPER CTRL, Delete, Toggle laptop display, exec, omarchy-hyprland-monitor-internal toggle +bindl = , switch:on:Lid Switch, exec, omarchy-hyprland-monitor-internal off +bindl = , switch:off:Lid Switch, exec, omarchy-hyprland-monitor-internal on # Control Apple Display brightness bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000 From 73641f721d889714527b26c36898aff4c7449832 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 13:36:29 +0200 Subject: [PATCH 38/51] Match order from elsewhere --- bin/omarchy-toggle-touchpad | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-toggle-touchpad b/bin/omarchy-toggle-touchpad index cc1ce7ba..6c8428ca 100755 --- a/bin/omarchy-toggle-touchpad +++ b/bin/omarchy-toggle-touchpad @@ -12,14 +12,14 @@ fi enable() { hyprctl keyword "device[$device]:enabled" true >/dev/null rm -f "$STATE_CONF" - omarchy-swayosd-client --custom-icon input-touchpad-symbolic --custom-message "Enabled Touchpad" + omarchy-swayosd-client --custom-icon input-touchpad-symbolic --custom-message "Touchpad enabled" } disable() { hyprctl keyword "device[$device]:enabled" false >/dev/null mkdir -p "$(dirname "$STATE_CONF")" printf 'device {\n name = %s\n enabled = false\n}\n' "$device" > "$STATE_CONF" - omarchy-swayosd-client --custom-icon touchpad-disabled-symbolic --custom-message "Disabled Touchpad" + omarchy-swayosd-client --custom-icon touchpad-disabled-symbolic --custom-message "Touchpad disabled" } case "${1:-toggle}" in From e757ae98ea4ed65f91a7fc6e0c0120885251ef4f Mon Sep 17 00:00:00 2001 From: Waleed Hassan Date: Wed, 22 Apr 2026 16:40:10 +0500 Subject: [PATCH 39/51] Lumon color.toml updated for better visibility of selected text (#5269) --- themes/lumon/colors.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/lumon/colors.toml b/themes/lumon/colors.toml index b94e758e..1ddfcb14 100644 --- a/themes/lumon/colors.toml +++ b/themes/lumon/colors.toml @@ -1,5 +1,5 @@ # Accent and UI colors -accent = "#f2fcff" +accent = "#8bc9eb" active_border_color = "#f2fcff" active_tab_background = "#6fb8e3" From 14a599ab9d99050a5a01cd5f6da303e35a68dc57 Mon Sep 17 00:00:00 2001 From: Rob Zolkos Date: Wed, 22 Apr 2026 07:50:05 -0400 Subject: [PATCH 40/51] Normalize screen recording audio levels (#5244) * Normalize screen recording audio Screen recordings capture audio at whatever the system level is set to, which often results in very quiet audio. Add a post-processing step that normalizes audio to -14 LUFS using ffmpeg loudnorm after the first-frame trim. Video is copied without re-encoding. Silently skipped for recordings with no audio track. * Do both trimming and normalizing in a single step so we don't have to process the video twice * Simplify conditional --------- Co-authored-by: David Heinemeier Hansson --- bin/omarchy-cmd-screenrecord | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord index 8c730cbb..1e45d4ab 100755 --- a/bin/omarchy-cmd-screenrecord +++ b/bin/omarchy-cmd-screenrecord @@ -134,7 +134,7 @@ stop_screenrecording() { pkill -9 -f "^gpu-screen-recorder" notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000 else - trim_first_frame + finalize_recording local filename=$(cat "$RECORDING_FILE" 2>/dev/null) local preview="${filename%.mp4}-preview.png" @@ -159,17 +159,24 @@ screenrecording_active() { pgrep -f "^gpu-screen-recorder" >/dev/null } -trim_first_frame() { +finalize_recording() { local latest latest=$(cat "$RECORDING_FILE" 2>/dev/null) + [[ -f $latest ]] || return - if [[ -n $latest && -f $latest ]]; then - local trimmed="${latest%.mp4}-trimmed.mp4" - if ffmpeg -y -ss 0.1 -i "$latest" -c copy "$trimmed" -loglevel quiet 2>/dev/null; then - mv "$trimmed" "$latest" - else - rm -f "$trimmed" - fi + # Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass + local args=(-y -ss 0.1 -i "$latest") + if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then + args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11 -c:v copy) + else + args+=(-c copy) + fi + + local processed="${latest%.mp4}-processed.mp4" + if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then + mv "$processed" "$latest" + else + rm -f "$processed" fi } From 4e7c51b3bc9839eeef1692ed67083bbdfc1749c4 Mon Sep 17 00:00:00 2001 From: pontino Date: Wed, 22 Apr 2026 13:50:47 +0200 Subject: [PATCH 41/51] Update cx alias to use new --permission-mode flag (#5233) The `--allow-dangerously-skip-permissions` flag has been replaced by `--permission-mode bypassPermissions` in Claude Code. --- default/bash/aliases | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default/bash/aliases b/default/bash/aliases index 8e281d02..b8d9cb75 100644 --- a/default/bash/aliases +++ b/default/bash/aliases @@ -44,7 +44,7 @@ alias ....='cd ../../..' # Tools alias c='opencode' -alias cx='printf "\033[2J\033[3J\033[H" && claude --allow-dangerously-skip-permissions' +alias cx='printf "\033[2J\033[3J\033[H" && claude --permission-mode bypassPermissions' alias d='docker' alias r='rails' alias t='tmux attach || tmux new -s Work' From d4f4592dd2d487d698fa65073b56c4244f0e1394 Mon Sep 17 00:00:00 2001 From: Nicolas Dorier Date: Wed, 22 Apr 2026 20:52:39 +0900 Subject: [PATCH 42/51] Make Typora's print dialog float (#5208) --- default/hypr/apps.conf | 1 + default/hypr/apps/typora.conf | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 default/hypr/apps/typora.conf diff --git a/default/hypr/apps.conf b/default/hypr/apps.conf index 64a9567d..777692cd 100644 --- a/default/hypr/apps.conf +++ b/default/hypr/apps.conf @@ -12,6 +12,7 @@ source = ~/.local/share/omarchy/default/hypr/apps/geforce.conf source = ~/.local/share/omarchy/default/hypr/apps/moonlight.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/typora.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 diff --git a/default/hypr/apps/typora.conf b/default/hypr/apps/typora.conf new file mode 100644 index 00000000..873c82e6 --- /dev/null +++ b/default/hypr/apps/typora.conf @@ -0,0 +1,2 @@ +# Float Typora print dialog +windowrule = match:class ^Typora$, match:title ^Print$, float on, center on From 1c65d1db0fc337add4cd0164fc6d093b8952ada9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Gr=C3=BCndel?= Date: Wed, 22 Apr 2026 13:53:52 +0200 Subject: [PATCH 43/51] Add migration script to enable GPU in voxtype if Vulkan is available (#5203) --- migrations/1775241210.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 migrations/1775241210.sh diff --git a/migrations/1775241210.sh b/migrations/1775241210.sh new file mode 100644 index 00000000..f6e45eeb --- /dev/null +++ b/migrations/1775241210.sh @@ -0,0 +1,16 @@ +echo "Enable GPU in voxtype if Vulkan is available" + +if omarchy-cmd-present voxtype; then + if omarchy-hw-vulkan; then + echo "Vulkan is available, enabling GPU in voxtype" + sudo voxtype setup gpu --enable || true + fi + + # see https://github.com/peteonrails/voxtype/commit/ce6e9919cbe54cb8808dcb3cdd3bcb3260d7b900 + # earlier versions of voxtype hard-coded the non-GPU backend in the systemd service file, + # so we need to re-run setup to update it to use /usr/bin/voxtype (the symlink) + voxtype setup systemd + + systemctl --user restart voxtype + omarchy-restart-waybar +fi From bde1537f6e1c1a98c29d8b97294ad6483f13390e Mon Sep 17 00:00:00 2001 From: Sergio Jr Date: Wed, 22 Apr 2026 08:56:15 -0300 Subject: [PATCH 44/51] Use wpctl instead of pactl to switch default audio sink (#5236) pactl set-default-sink only updates PipeWire's default.audio.sink metadata, but WirePlumber immediately overrides it back because default.configured.audio.sink remains unchanged. wpctl set-default updates both, making the switch actually persist. Co-authored-by: Claude Opus 4.6 (1M context) --- bin/omarchy-cmd-audio-switch | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-cmd-audio-switch b/bin/omarchy-cmd-audio-switch index a0d7ef85..7d1ea015 100755 --- a/bin/omarchy-cmd-audio-switch +++ b/bin/omarchy-cmd-audio-switch @@ -53,7 +53,8 @@ fi next_sink_volume_icon="sink-volume-${icon_state}-symbolic" if [[ $next_sink_name != $current_sink_name ]]; then - pactl set-default-sink "$next_sink_name" + next_sink_wpid=$(echo "$next_sink" | jq -r '.properties."object.id"') + wpctl set-default "$next_sink_wpid" fi omarchy-swayosd-client \ From b275ec50be6d2156cb25c8ec7f194068ae78afb7 Mon Sep 17 00:00:00 2001 From: innerviewer Date: Wed, 22 Apr 2026 14:02:53 +0200 Subject: [PATCH 45/51] (Bash) Add lazy initialization of `try` command. (#5179) * (Bash) Add lazy initialization of `try` and `mise` commands. * (Bash) Removed lazy-loading for `mise` --- default/bash/init | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/default/bash/init b/default/bash/init index 2d363fa7..d2baba50 100644 --- a/default/bash/init +++ b/default/bash/init @@ -11,7 +11,11 @@ if command -v zoxide &> /dev/null; then fi if command -v try &> /dev/null; then - eval "$(SHELL=/bin/bash command try init ~/Work/tries)" + try() { + unset -f try + eval "$(SHELL=/bin/bash command try init ~/Work/tries)" + try "$@" + } fi if command -v fzf &> /dev/null; then From 57b779e2497743d6f88b706985083c55b51ed23c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 15:00:09 +0200 Subject: [PATCH 46/51] Extract hardware toggles into their own menu and hotkey --- bin/omarchy-menu | 22 ++++++++++++---------- default/hypr/bindings/utilities.conf | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 4d524497..c929755b 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -168,14 +168,9 @@ show_share_menu() { } show_toggle_menu() { - local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n󰛧 Laptop Display" - - if [[ -n "$(omarchy-hw-touchpad)" ]]; then - options="$options\n󰟸 Touchpad" - fi + local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n" case $(menu "Toggle" "$options") in - *Screensaver*) omarchy-toggle-screensaver ;; *Nightlight*) omarchy-toggle-nightlight ;; *Idle*) omarchy-toggle-idle ;; @@ -184,16 +179,22 @@ show_toggle_menu() { *Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;; *Gaps*) omarchy-hyprland-window-gaps-toggle ;; *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;; - *Laptop*) omarchy-hyprland-monitor-internal toggle ;; - *Touchpad*) omarchy-toggle-touchpad ;; *) back_to show_trigger_menu ;; esac } show_hardware_menu() { - case $(menu "Toggle" " Hybrid GPU") in + local options="󰛧 Laptop Display\n Hybrid GPU" + + if [[ -n "$(omarchy-hw-touchpad)" ]]; then + options="$options\n󰟸 Touchpad" + fi + + case $(menu "Toggle" "$options") in + *Laptop*) omarchy-hyprland-monitor-internal toggle ;; + *Touchpad*) omarchy-toggle-touchpad ;; *"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;; - *) show_trigger_menu ;; + *) back_to show_trigger_menu ;; esac } @@ -612,6 +613,7 @@ go_to_menu() { *learn*) show_learn_menu ;; *trigger*) show_trigger_menu ;; *toggle*) show_toggle_menu ;; + *hardware*) show_hardware_menu ;; *share*) show_share_menu ;; *background*) show_background_menu ;; *capture*) show_capture_menu ;; diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index 70730368..628a0aec 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -3,6 +3,7 @@ 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 CTRL, O, Toggle menu, exec, omarchy-menu toggle +bindd = SUPER CTRL, H, Hardware menu, exec, omarchy-menu hardware bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu bindd = SUPER SHIFT, code:201, Omarchy menu, exec, omarchy-menu bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system From 8953ee822ac8993cfc7fc5705d23bfc38b2d4c61 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 15:05:26 +0200 Subject: [PATCH 47/51] Only show hybrid gpu toggle if hardware is available --- bin/omarchy-hw-hybrid-gpu | 3 +++ bin/omarchy-hw-touchpad | 3 ++- bin/omarchy-menu | 8 ++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100755 bin/omarchy-hw-hybrid-gpu diff --git a/bin/omarchy-hw-hybrid-gpu b/bin/omarchy-hw-hybrid-gpu new file mode 100755 index 00000000..dcd0a8fd --- /dev/null +++ b/bin/omarchy-hw-hybrid-gpu @@ -0,0 +1,3 @@ +#!/bin/bash + +(($(lspci | grep -cE 'VGA|3D|Display') >= 2)) diff --git a/bin/omarchy-hw-touchpad b/bin/omarchy-hw-touchpad index 4bea4a68..a4d813e0 100755 --- a/bin/omarchy-hw-touchpad +++ b/bin/omarchy-hw-touchpad @@ -1,3 +1,4 @@ #!/bin/bash -hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty' +device=$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty') +[[ -n $device ]] && echo "$device" diff --git a/bin/omarchy-menu b/bin/omarchy-menu index c929755b..4cd677c2 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -184,9 +184,13 @@ show_toggle_menu() { } show_hardware_menu() { - local options="󰛧 Laptop Display\n Hybrid GPU" + local options="󰛧 Laptop Display" - if [[ -n "$(omarchy-hw-touchpad)" ]]; then + if omarchy-hw-hybrid-gpu; then + options="$options\n Hybrid GPU" + fi + + if omarchy-hw-touchpad; then options="$options\n󰟸 Touchpad" fi From 4223cd9922c794c36cbe2b50eb034b86e78f3f73 Mon Sep 17 00:00:00 2001 From: Pierre Olivier Martel Date: Wed, 22 Apr 2026 09:40:30 -0400 Subject: [PATCH 48/51] Use OMARCHY_PATH in omarchy-migrate (#4937) --- bin/omarchy-migrate | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-migrate b/bin/omarchy-migrate index a60cba74..0e1ec2cc 100755 --- a/bin/omarchy-migrate +++ b/bin/omarchy-migrate @@ -10,7 +10,7 @@ mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR/skipped" # Run any pending migrations -for file in ~/.local/share/omarchy/migrations/*.sh; do +for file in $OMARCHY_PATH/migrations/*.sh; do filename=$(basename "$file") if [[ ! -f $STATE_DIR/$filename && ! -f $STATE_DIR/skipped/$filename ]]; then From fc258fa8b2eb6052f7668e30eda43b2640c714f3 Mon Sep 17 00:00:00 2001 From: Stitch <60798723+maxwell7774@users.noreply.github.com> Date: Wed, 22 Apr 2026 07:52:49 -0600 Subject: [PATCH 49/51] Elephant menu fix when using customized default themes (#4953) * Adds a check to see if the default theme has a preview if the user customized default theme lacks one. * Update default/elephant/omarchy_themes.lua Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Reduce duplication --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: David Heinemeier Hansson --- default/elephant/omarchy_themes.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/default/elephant/omarchy_themes.lua b/default/elephant/omarchy_themes.lua index 945f4e60..e892f3e4 100644 --- a/default/elephant/omarchy_themes.lua +++ b/default/elephant/omarchy_themes.lua @@ -28,6 +28,15 @@ local function first_image_in_dir(dir) return nil end +-- Find preview.png, preview.jpg, or first backgrounds/ image in a theme dir +local function find_preview_path(dir) + local png = dir .. "/preview.png" + local jpg = dir .. "/preview.jpg" + if file_exists(png) then return png end + if file_exists(jpg) then return jpg end + return first_image_in_dir(dir .. "/backgrounds") +end + -- The main function elephant will call function GetEntries() local entries = {} @@ -51,19 +60,10 @@ function GetEntries() if theme_name and not seen_themes[theme_name] then seen_themes[theme_name] = true - -- Check for preview images directly (no subprocess) - local preview_path = nil - local preview_png = theme_path .. "/preview.png" - local preview_jpg = theme_path .. "/preview.jpg" - - if file_exists(preview_png) then - preview_path = preview_png - elseif file_exists(preview_jpg) then - preview_path = preview_jpg - else - -- Fallback: get first image from backgrounds (one ls call) - preview_path = first_image_in_dir(theme_path .. "/backgrounds") - end + -- Check the theme dir, then fall back to the default theme dir + -- (for partial user customizations that don't ship a preview) + local preview_path = find_preview_path(theme_path) + or find_preview_path(default_theme_dir .. "/" .. theme_name) if preview_path and preview_path ~= "" then local display_name = theme_name:gsub("_", " "):gsub("%-", " ") From 0d5b680c2aff8189c6ee9553835c34bc22b588e5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 16:15:28 +0200 Subject: [PATCH 50/51] Make it possible to travel backwards on the resolution scaling --- bin/omarchy-hyprland-monitor-scaling-cycle | 23 +++++++++++++++------- default/hypr/bindings/tiling-v2.conf | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/bin/omarchy-hyprland-monitor-scaling-cycle b/bin/omarchy-hyprland-monitor-scaling-cycle index 233ec06c..77924f76 100755 --- a/bin/omarchy-hyprland-monitor-scaling-cycle +++ b/bin/omarchy-hyprland-monitor-scaling-cycle @@ -8,15 +8,24 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width') HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height') REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate') -# Cycle through scales: 1 → 1.6 → 2 → 3 → 1 +# Cycle through scales: 1 → 1.6 → 2 → 3 → 1 (or reverse with --reverse) CURRENT_INT=$(awk -v s="$CURRENT_SCALE" 'BEGIN { printf "%.0f", s * 10 }') -case "$CURRENT_INT" in -10) NEW_SCALE=1.6 ;; -16) NEW_SCALE=2 ;; -20) NEW_SCALE=3 ;; -*) NEW_SCALE=1 ;; -esac +if [[ "$1" == "--reverse" ]]; then + case "$CURRENT_INT" in + 10) NEW_SCALE=3 ;; + 16) NEW_SCALE=1 ;; + 20) NEW_SCALE=1.6 ;; + *) NEW_SCALE=2 ;; + esac +else + case "$CURRENT_INT" in + 10) NEW_SCALE=1.6 ;; + 16) NEW_SCALE=2 ;; + 20) NEW_SCALE=3 ;; + *) NEW_SCALE=1 ;; + esac +fi hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE" notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x" diff --git a/default/hypr/bindings/tiling-v2.conf b/default/hypr/bindings/tiling-v2.conf index e0c74eb4..4560c521 100644 --- a/default/hypr/bindings/tiling-v2.conf +++ b/default/hypr/bindings/tiling-v2.conf @@ -130,3 +130,4 @@ bindd = SUPER ALT, code:14, Switch to group window 5, changegroupactive, 5 # Cycle monitor scaling bindd = SUPER, Slash, Cycle monitor scaling, exec, omarchy-hyprland-monitor-scaling-cycle +bindd = SUPER ALT, Slash, Cycle monitor scaling backwards, exec, omarchy-hyprland-monitor-scaling-cycle --reverse From 0e335a17917897d6d23b925a66c4ea8a300f37aa Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 22 Apr 2026 16:20:26 +0200 Subject: [PATCH 51/51] Add 1.25 as a scaling option too and rewrite the matching --- bin/omarchy-hyprland-monitor-scaling-cycle | 32 ++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/bin/omarchy-hyprland-monitor-scaling-cycle b/bin/omarchy-hyprland-monitor-scaling-cycle index 77924f76..008dc864 100755 --- a/bin/omarchy-hyprland-monitor-scaling-cycle +++ b/bin/omarchy-hyprland-monitor-scaling-cycle @@ -8,24 +8,28 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width') HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height') REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate') -# Cycle through scales: 1 → 1.6 → 2 → 3 → 1 (or reverse with --reverse) -CURRENT_INT=$(awk -v s="$CURRENT_SCALE" 'BEGIN { printf "%.0f", s * 10 }') +# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse) +SCALES=(1 1.25 1.6 2 3) + +# Find the index of the scale closest to the current one (Hyprland may +# snap fractional scales to nearby values, so we can't match exactly) +CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN { + n = split(list, arr, " ") + best = 0; best_diff = 1e9 + for (i = 1; i <= n; i++) { + d = s - arr[i]; if (d < 0) d = -d + if (d < best_diff) { best_diff = d; best = i - 1 } + } + print best +}') if [[ "$1" == "--reverse" ]]; then - case "$CURRENT_INT" in - 10) NEW_SCALE=3 ;; - 16) NEW_SCALE=1 ;; - 20) NEW_SCALE=1.6 ;; - *) NEW_SCALE=2 ;; - esac + NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} )) else - case "$CURRENT_INT" in - 10) NEW_SCALE=1.6 ;; - 16) NEW_SCALE=2 ;; - 20) NEW_SCALE=3 ;; - *) NEW_SCALE=1 ;; - esac + NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} )) fi +NEW_SCALE=${SCALES[$NEW_IDX]} + hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE" notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x"