Move stock Hyprland bindings into defaults

This commit is contained in:
Ryan Hughes
2026-06-16 01:25:04 -04:00
parent fd5063dc30
commit 2fdc6f0573
16 changed files with 477 additions and 158 deletions
+1 -17
View File
@@ -12,7 +12,7 @@ Usage: omarchy finalize user [--force] [--first-install]
Runs the per-user setup steps that /etc/skel can't seed: Runs the per-user setup steps that /etc/skel can't seed:
dev-aware skill symlinks, xdg-user-dirs + gtk bookmarks (need \$HOME), dev-aware skill symlinks, xdg-user-dirs + gtk bookmarks (need \$HOME),
vconsole→hypr keyboard sync, default browser/mailto, and install/user/all.sh. default browser/mailto, and install/user/all.sh.
For shipped configs see /etc/skel (new users) and omarchy-reinstall-configs For shipped configs see /etc/skel (new users) and omarchy-reinstall-configs
(existing users explicitly resyncing). (existing users explicitly resyncing).
@@ -100,22 +100,6 @@ for dir in Downloads Projects Pictures Videos; do
grep -qxF "$bookmark" ~/.config/gtk-3.0/bookmarks || echo "$bookmark" >>~/.config/gtk-3.0/bookmarks grep -qxF "$bookmark" ~/.config/gtk-3.0/bookmarks || echo "$bookmark" >>~/.config/gtk-3.0/bookmarks
done done
conf=/etc/vconsole.conf
hyprlua="$HOME/.config/hypr/input.lua"
if [[ -f $conf && -f $hyprlua ]]; then
sed -i '/^[[:space:]]*kb_layout[[:space:]]*=/d' "$hyprlua"
sed -i '/^[[:space:]]*kb_variant[[:space:]]*=/d' "$hyprlua"
if grep -q '^XKBLAYOUT=' "$conf"; then
layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_layout = \"$layout\"," "$hyprlua"
fi
if grep -q '^XKBVARIANT=' "$conf"; then
variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_variant = \"$variant\"," "$hyprlua"
fi
fi
source "$OMARCHY_INSTALL/user/all.sh" source "$OMARCHY_INSTALL/user/all.sh"
omarchy-refresh-applications omarchy-refresh-applications
-17
View File
@@ -12,20 +12,3 @@ omarchy-refresh-config hypr/monitors.lua
mkdir -p ~/.local/state/omarchy/toggles/hypr mkdir -p ~/.local/state/omarchy/toggles/hypr
cp "$OMARCHY_PATH/default/hypr/toggles/flags.lua" ~/.local/state/omarchy/toggles/hypr/ cp "$OMARCHY_PATH/default/hypr/toggles/flags.lua" ~/.local/state/omarchy/toggles/hypr/
conf=/etc/vconsole.conf
hyprlua="$HOME/.config/hypr/input.lua"
if [[ -f $conf && -f $hyprlua ]]; then
sed -i '/^[[:space:]]*kb_layout[[:space:]]*=/d' "$hyprlua"
sed -i '/^[[:space:]]*kb_variant[[:space:]]*=/d' "$hyprlua"
if grep -q '^XKBLAYOUT=' "$conf"; then
layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_layout = \"$layout\"," "$hyprlua"
fi
if grep -q '^XKBVARIANT=' "$conf"; then
variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_variant = \"$variant\"," "$hyprlua"
fi
fi
+2 -2
View File
@@ -8,8 +8,8 @@ if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI w
omarchy-webapp-remove-all omarchy-webapp-remove-all
omarchy-tui-remove-all omarchy-tui-remove-all
[[ -f ~/.config/hypr/bindings.lua ]] && cp ~/.config/hypr/bindings.lua ~/.config/hypr/bindings.lua.bak mkdir -p ~/.local/state/omarchy
cp "$OMARCHY_PATH/default/hypr/plain-bindings.lua" ~/.config/hypr/bindings.lua touch ~/.local/state/omarchy/preinstalls-removed
hyprctl reload hyprctl reload
# Remove mise stubs # Remove mise stubs
+13 -16
View File
@@ -1613,6 +1613,17 @@ refresh_known_config_defaults() {
done < <(default_hash_paths refresh) done < <(default_hash_paths refresh)
} }
mark_removed_preinstalls_from_legacy_bindings() {
local bindings_file="$HOME/.config/hypr/bindings.lua"
local plain_bindings_sha="5d92d4008b04848256445da3cf5c10422a8d537baad499a4e63f60daecaefc6f"
[[ -f $bindings_file ]] || return 0
[[ $(file_sha256 "$bindings_file") == "$plain_bindings_sha" ]] || return 0
mkdir -p "$state_dir"
touch "$state_dir/preinstalls-removed"
}
copy_always_config_defaults() { copy_always_config_defaults() {
local rel local rel
for rel in "${always_copy_config_files[@]}"; do for rel in "${always_copy_config_files[@]}"; do
@@ -1754,6 +1765,7 @@ done
# and always write the v4-only entry points that older installs cannot have. # and always write the v4-only entry points that older installs cannot have.
refresh_known_config_defaults refresh_known_config_defaults
copy_missing_config_defaults "$root/config" "$HOME/.config" copy_missing_config_defaults "$root/config" "$HOME/.config"
mark_removed_preinstalls_from_legacy_bindings
copy_always_config_defaults copy_always_config_defaults
repair_chromium_copy_url_extension_flags repair_chromium_copy_url_extension_flags
@@ -1821,7 +1833,7 @@ repair_sleep_lock_unit_override
install_bash_startup install_bash_startup
unset rel file backup retired_config_files always_copy_config_files uwsm_env known_config_default_hashes_by_key unset rel file backup retired_config_files always_copy_config_files uwsm_env known_config_default_hashes_by_key
unset -f file_sha256 known_config_default_hashes default_hash_paths is_known_default_hash backup_config_file migrate_uwsm_env_customizations is_retired_config_file copy_config_default copy_missing_config_defaults refresh_known_config_defaults copy_always_config_defaults repair_chromium_copy_url_extension_flags repair_sleep_lock_unit_override is_known_bashrc_default install_bash_startup unset -f file_sha256 known_config_default_hashes default_hash_paths is_known_default_hash backup_config_file migrate_uwsm_env_customizations is_retired_config_file copy_config_default copy_missing_config_defaults refresh_known_config_defaults mark_removed_preinstalls_from_legacy_bindings copy_always_config_defaults repair_chromium_copy_url_extension_flags repair_sleep_lock_unit_override is_known_bashrc_default install_bash_startup
mkdir -p "$HOME/.agents/skills" "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.pi/agent/skills" mkdir -p "$HOME/.agents/skills" "$HOME/.claude/skills" "$HOME/.codex/skills" "$HOME/.pi/agent/skills"
if [[ -d $root/default/omarchy-skill ]]; then if [[ -d $root/default/omarchy-skill ]]; then
@@ -1865,21 +1877,6 @@ for dir in Downloads Projects Pictures Videos; do
grep -qxF "$bookmark" "$HOME/.config/gtk-3.0/bookmarks" || echo "$bookmark" >>"$HOME/.config/gtk-3.0/bookmarks" grep -qxF "$bookmark" "$HOME/.config/gtk-3.0/bookmarks" || echo "$bookmark" >>"$HOME/.config/gtk-3.0/bookmarks"
done done
conf=/etc/vconsole.conf
hyprlua="$HOME/.config/hypr/input.lua"
if [[ -f $conf && -f $hyprlua ]]; then
sed -i '/^[[:space:]]*kb_layout[[:space:]]*=/d' "$hyprlua"
sed -i '/^[[:space:]]*kb_variant[[:space:]]*=/d' "$hyprlua"
if grep -q '^XKBLAYOUT=' "$conf"; then
layout=$(grep '^XKBLAYOUT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_layout = \"$layout\"," "$hyprlua"
fi
if grep -q '^XKBVARIANT=' "$conf"; then
variant=$(grep '^XKBVARIANT=' "$conf" | cut -d= -f2 | tr -d '"')
sed -i "/^[[:space:]]*kb_options *=/i\ kb_variant = \"$variant\"," "$hyprlua"
fi
fi
if [[ -n ${OMARCHY_USER_NAME//[[:space:]]/} ]]; then if [[ -n ${OMARCHY_USER_NAME//[[:space:]]/} ]]; then
git config --global user.name "$OMARCHY_USER_NAME" || true git config --global user.name "$OMARCHY_USER_NAME" || true
fi fi
+19 -36
View File
@@ -1,44 +1,27 @@
-- Application bindings. -- Keep only your personal keybinding overrides here. Add new bindings or
o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" }) -- unbind defaults before replacing them.
o.bind("SUPER + ALT + RETURN", "Tmux", { omarchy = "terminal-tmux" })
o.bind("SUPER + SHIFT + RETURN", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + F", "File manager", { omarchy = "nautilus" })
o.bind("SUPER + ALT + SHIFT + F", "File manager (cwd)", { omarchy = "nautilus-cwd" })
o.bind("SUPER + SHIFT + B", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + ALT + B", "Browser (private)", { omarchy = "browser --private" })
o.bind("SUPER + SHIFT + M", "Music", { omarchy = "spotify" })
o.bind("SUPER + SHIFT + ALT + M", "Music TUI", { tui = "cliamp", focus = true })
o.bind("SUPER + SHIFT + N", "Editor", { omarchy = "editor" })
o.bind("SUPER + SHIFT + D", "Docker", { tui = "lazydocker" })
o.bind("SUPER + SHIFT + G", "Signal", { omarchy = "signal" })
o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })
o.bind("SUPER + SHIFT + W", "Typora", { launch = "typora --enable-wayland-ime" })
o.bind("SUPER + SHIFT + SLASH", "Passwords", { launch = "1password" })
-- Web app bindings. -- See current bindings and descriptions:
o.bind("SUPER + SHIFT + A", "ChatGPT", { webapp = "https://chatgpt.com" }) -- omarchy menu keybindings --print
o.bind("SUPER + SHIFT + ALT + A", "Grok", { webapp = "https://grok.com" })
o.bind("SUPER + SHIFT + C", "Calendar", { webapp = "https://app.hey.com/calendar/weeks/" })
o.bind("SUPER + SHIFT + E", "Email", { webapp = "https://app.hey.com" })
o.bind("SUPER + SHIFT + ALT + E", "New email", { webapp = "https://app.hey.com/messages/new?display=standalone&new_window=true" })
o.bind("SUPER + SHIFT + Y", "YouTube", { webapp = "https://youtube.com/" })
o.bind("SUPER + SHIFT + ALT + G", "WhatsApp", { webapp = "https://web.whatsapp.com/", focus = true })
o.bind(
"SUPER + SHIFT + CTRL + G",
"Google Messages",
{ webapp = "https://messages.google.com/web/conversations", focus = true }
)
o.bind("SUPER + SHIFT + P", "Google Photos", { webapp = "https://photos.google.com/", focus = true })
o.bind("SUPER + SHIFT + S", "Google Maps", { webapp = "https://maps.google.com/", focus = true })
o.bind("SUPER + SHIFT + X", "X", { webapp = "https://x.com/" })
o.bind("SUPER + SHIFT + ALT + X", "X Post", { webapp = "https://x.com/compose/post" })
-- Add extra bindings below. -- To disable every Omarchy default binding, set this in
-- ~/.config/hypr/hyprland.lua before require("default.hypr.omarchy"), then add
-- only the bindings you want below:
-- omarchy_default_bindings = false
-- To disable all preinstalled app/webapp bindings, set:
-- omarchy_preinstalled_bindings = false
-- Add a new binding.
-- o.bind("SUPER + SHIFT + R", "SSH", "alacritty -e ssh your-server") -- o.bind("SUPER + SHIFT + R", "SSH", "alacritty -e ssh your-server")
-- Overwrite existing bindings with hl.unbind() first if needed. -- Change an existing binding by unbinding it first, then binding the key again.
-- This example changes SUPER+SPACE from the launcher to the Omarchy root menu.
-- hl.unbind("SUPER + SPACE") -- hl.unbind("SUPER + SPACE")
-- o.bind("SUPER + SPACE", "Omarchy menu", "omarchy-menu") -- o.bind("SUPER + SPACE", "Omarchy menu", "omarchy-menu toggle root")
-- Disable a default binding without replacing it.
-- hl.unbind("SUPER + SHIFT + B")
-- Logitech MX Keys examples: -- Logitech MX Keys examples:
-- o.bind("SUPER + SHIFT + S", nil, "omarchy-capture-screenshot") -- o.bind("SUPER + SHIFT + S", nil, "omarchy-capture-screenshot")
+11 -2
View File
@@ -3,10 +3,19 @@
-- Omarchy's bootstrap keeps path setup out of this user config. -- Omarchy's bootstrap keeps path setup out of this user config.
dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua") dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua")
-- All Omarchy default setups -- Disable all Omarchy default bindings. Add your own in hypr/bindings.lua.
-- omarchy_default_bindings = false
--
-- Or disable only bindings for Omarchy's preinstalled apps/web apps while
-- keeping core window-manager bindings:
-- omarchy_preinstalled_bindings = false
-- Load Omarchy defaults.
require("default.hypr.omarchy") require("default.hypr.omarchy")
-- Change your own setup in these files and override defaults. -- Put your personal overrides in these files. They're loaded after Omarchy's
-- defaults so package updates can improve the defaults without rewriting your
-- ~/.config/hypr files.
require("hypr.monitors") require("hypr.monitors")
require("hypr.input") require("hypr.input")
require("hypr.bindings") require("hypr.bindings")
+47 -45
View File
@@ -1,50 +1,52 @@
-- Control your input devices. -- Keep only your personal input overrides here. Uncommented settings below
-- replace Omarchy's defaults.
-- Keyboard layout and options.
-- See https://wiki.hypr.land/Configuring/Basics/Variables/#input -- See https://wiki.hypr.land/Configuring/Basics/Variables/#input
hl.config({ -- hl.config({
input = { -- input = {
-- Use multiple keyboard layouts and switch between them with Left Alt + Right Alt. -- -- Use multiple keyboard layouts and switch between them with Left Alt + Right Alt.
-- kb_layout = "us,dk,eu", -- kb_layout = "us,dk,eu",
-- kb_options = "compose:caps,grp:alts_toggle",
--
-- -- Use a specific keyboard variant if needed (e.g. intl for international keyboards).
-- kb_variant = "intl",
--
-- -- Change speed of keyboard repeat.
-- repeat_rate = 40,
-- repeat_delay = 250,
--
-- -- Start with numlock on by default.
-- numlock_by_default = true,
--
-- -- Increase sensitivity for mouse/trackpad (default: 0).
-- sensitivity = 0.35,
--
-- -- Turn off mouse acceleration (default: adaptive).
-- accel_profile = "flat",
--
-- touchpad = {
-- -- Use natural (inverse) scrolling.
-- natural_scroll = true,
--
-- -- Use two-finger clicks for right-click instead of lower-right corner.
-- clickfinger_behavior = true,
--
-- -- Control the speed of your scrolling.
-- scroll_factor = 0.4,
--
-- -- Enable the touchpad while typing.
-- disable_while_typing = false,
--
-- -- Left-click-and-drag with three fingers.
-- drag_3fg = 1,
-- },
-- },
-- })
-- Use a specific keyboard variant if needed (e.g. intl for international keyboards). -- App-specific touchpad scroll speeds.
-- kb_variant = "intl", -- o.window("(Alacritty|kitty|foot)", { scroll_touchpad = 1.5 })
-- o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 })
kb_options = "compose:caps", -- ,grp:alts_toggle
-- Change speed of keyboard repeat.
repeat_rate = 40,
repeat_delay = 250,
-- Start with numlock on by default.
numlock_by_default = true,
-- Increase sensitivity for mouse/trackpad (default: 0).
-- sensitivity = 0.35,
-- Turn off mouse acceleration (default: adaptive).
-- accel_profile = "flat",
touchpad = {
-- Use natural (inverse) scrolling.
-- natural_scroll = true,
-- Use two-finger clicks for right-click instead of lower-right corner.
clickfinger_behavior = true,
-- Control the speed of your scrolling.
scroll_factor = 0.4,
-- Enable the touchpad while typing.
-- disable_while_typing = false,
-- Left-click-and-drag with three fingers.
-- drag_3fg = 1,
},
},
})
-- Scroll nicely in the terminal.
o.window("(Alacritty|kitty|foot)", { scroll_touchpad = 1.5 })
o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 })
-- Enable touchpad gestures for changing workspaces. -- Enable touchpad gestures for changing workspaces.
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/ -- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/
+5 -2
View File
@@ -1,5 +1,5 @@
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ -- See https://wiki.hypr.land/Configuring/Basics/Monitors/
-- List current monitors and resolutions possible: hyprctl monitors all -- List current monitors and supported resolutions with: hyprctl monitors all
local omarchy_gdk_scale = 2 local omarchy_gdk_scale = 2
local omarchy_monitor_scale = "auto" local omarchy_monitor_scale = "auto"
@@ -7,5 +7,8 @@ local omarchy_monitor_scale = "auto"
hl.env("GDK_SCALE", tostring(omarchy_gdk_scale)) hl.env("GDK_SCALE", tostring(omarchy_gdk_scale))
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale }) hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
-- Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°) -- Configure a specific monitor.
-- hl.monitor({ output = "DP-2", mode = "2560x1440@144", position = "0x0", scale = 1 })
-- Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°).
-- hl.monitor({ output = "DP-2", mode = "preferred", position = "auto", scale = 1, transform = 1 }) -- hl.monitor({ output = "DP-2", mode = "preferred", position = "auto", scale = 1, transform = 1 })
+39
View File
@@ -0,0 +1,39 @@
-- Essential application bindings.
o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" })
o.bind("SUPER + SHIFT + RETURN", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + F", "File manager", { omarchy = "nautilus" })
o.bind("SUPER + ALT + SHIFT + F", "File manager (cwd)", { omarchy = "nautilus-cwd" })
o.bind("SUPER + SHIFT + B", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + ALT + B", "Browser (private)", { omarchy = "browser --private" })
o.bind("SUPER + SHIFT + N", "Editor", { omarchy = "editor" })
if not o.preinstalled_bindings_enabled() then
return
end
-- Bindings for preinstalled Omarchy applications, TUIs, and web apps.
o.bind("SUPER + ALT + RETURN", "Tmux", { omarchy = "terminal-tmux" })
o.bind("SUPER + SHIFT + M", "Music", { omarchy = "spotify" })
o.bind("SUPER + SHIFT + ALT + M", "Music TUI", { tui = "cliamp", focus = true })
o.bind("SUPER + SHIFT + D", "Docker", { tui = "lazydocker" })
o.bind("SUPER + SHIFT + G", "Signal", { omarchy = "signal" })
o.bind("SUPER + SHIFT + O", "Obsidian", { launch = "obsidian", focus = "^obsidian$" })
o.bind("SUPER + SHIFT + W", "Typora", { launch = "typora --enable-wayland-ime" })
o.bind("SUPER + SHIFT + SLASH", "Passwords", { launch = "1password" })
o.bind("SUPER + SHIFT + A", "ChatGPT", { webapp = "https://chatgpt.com" })
o.bind("SUPER + SHIFT + ALT + A", "Grok", { webapp = "https://grok.com" })
o.bind("SUPER + SHIFT + C", "Calendar", { webapp = "https://app.hey.com/calendar/weeks/" })
o.bind("SUPER + SHIFT + E", "Email", { webapp = "https://app.hey.com" })
o.bind("SUPER + SHIFT + ALT + E", "New email", { webapp = "https://app.hey.com/messages/new?display=standalone&new_window=true" })
o.bind("SUPER + SHIFT + Y", "YouTube", { webapp = "https://youtube.com/" })
o.bind("SUPER + SHIFT + ALT + G", "WhatsApp", { webapp = "https://web.whatsapp.com/", focus = true })
o.bind(
"SUPER + SHIFT + CTRL + G",
"Google Messages",
{ webapp = "https://messages.google.com/web/conversations", focus = true }
)
o.bind("SUPER + SHIFT + P", "Google Photos", { webapp = "https://photos.google.com/", focus = true })
o.bind("SUPER + SHIFT + S", "Google Maps", { webapp = "https://maps.google.com/", focus = true })
o.bind("SUPER + SHIFT + X", "X", { webapp = "https://x.com/" })
o.bind("SUPER + SHIFT + ALT + X", "X Post", { webapp = "https://x.com/compose/post" })
+18
View File
@@ -49,6 +49,24 @@ local function command_from(value, description)
return value return value
end end
local function file_exists(path)
local file = io.open(path, "r")
if file then
file:close()
return true
end
return false
end
function o.preinstalled_bindings_enabled()
if _G.omarchy_preinstalled_bindings ~= nil then
return _G.omarchy_preinstalled_bindings == true
end
return not file_exists((os.getenv("HOME") or "") .. "/.local/state/omarchy/preinstalls-removed")
end
function o.bind(keys, description, dispatcher, options) function o.bind(keys, description, dispatcher, options)
local opts = options or {} local opts = options or {}
+36 -2
View File
@@ -1,16 +1,46 @@
-- https://wiki.hypr.land/Configuring/Basics/Variables/#input -- https://wiki.hypr.land/Configuring/Basics/Variables/#input
local function read_vconsole()
local values = {}
local file = io.open("/etc/vconsole.conf", "r")
if not file then
return values
end
for line in file:lines() do
local key, value = line:match("^%s*([%w_]+)%s*=%s*(.-)%s*$")
if key and value then
value = value:gsub("%s+#.*$", "")
value = value:gsub('^"(.*)"$', "%1")
value = value:gsub("^'(.*)'$", "%1")
values[key] = value
end
end
file:close()
return values
end
local vconsole = read_vconsole()
hl.config({ hl.config({
input = { input = {
kb_layout = "us", kb_layout = vconsole.XKBLAYOUT or "us",
kb_variant = "", kb_variant = vconsole.XKBVARIANT or "",
kb_model = "", kb_model = "",
kb_options = "compose:caps", kb_options = "compose:caps",
kb_rules = "", kb_rules = "",
follow_mouse = 1, follow_mouse = 1,
sensitivity = 0, sensitivity = 0,
repeat_rate = 40,
repeat_delay = 250,
numlock_by_default = true,
touchpad = { touchpad = {
natural_scroll = false, natural_scroll = false,
clickfinger_behavior = true,
scroll_factor = 0.4,
}, },
}, },
@@ -19,3 +49,7 @@ hl.config({
mouse_move_enables_dpms = true, mouse_move_enables_dpms = true,
}, },
}) })
-- Scroll nicely in the terminal.
o.window("(Alacritty|kitty|foot)", { scroll_touchpad = 1.5 })
o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 })
+7 -4
View File
@@ -4,10 +4,13 @@ require("default.hypr.helpers")
-- Use Omarchy defaults, but don't edit these directly. -- Use Omarchy defaults, but don't edit these directly.
require("default.hypr.autostart") require("default.hypr.autostart")
require("default.hypr.bindings.media") if _G.omarchy_default_bindings ~= false then
require("default.hypr.bindings.clipboard") require("default.hypr.bindings.media")
require("default.hypr.bindings.tiling-v2") require("default.hypr.bindings.clipboard")
require("default.hypr.bindings.utilities") require("default.hypr.bindings.tiling-v2")
require("default.hypr.bindings.utilities")
require("default.hypr.bindings.applications")
end
require("default.hypr.envs") require("default.hypr.envs")
require("default.hypr.looknfeel") require("default.hypr.looknfeel")
require("default.hypr.input") require("default.hypr.input")
-13
View File
@@ -1,13 +0,0 @@
require("default.hypr.bindings.media")
require("default.hypr.bindings.clipboard")
require("default.hypr.bindings.tiling-v2")
require("default.hypr.bindings.utilities")
-- Application bindings without Omarchy's preinstalled web apps, TUIs, or desktop apps.
o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" })
o.bind("SUPER + SHIFT + RETURN", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + F", "File manager", { omarchy = "nautilus" })
o.bind("SUPER + ALT + SHIFT + F", "File manager (cwd)", { omarchy = "nautilus-cwd" })
o.bind("SUPER + SHIFT + B", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + ALT + B", "Browser (private)", { omarchy = "browser --private" })
o.bind("SUPER + SHIFT + N", "Editor", { omarchy = "editor" })
+2 -2
View File
@@ -163,8 +163,8 @@ It only does the things `/etc/skel` can't:
`omarchy dev link` against a dev checkout repoints them correctly. `omarchy dev link` against a dev checkout repoints them correctly.
- `xdg-user-dirs-update` (Templates/Public/Desktop folded back into `$HOME`) - `xdg-user-dirs-update` (Templates/Public/Desktop folded back into `$HOME`)
and `~/.config/gtk-3.0/bookmarks` (needs `$HOME` expansion). and `~/.config/gtk-3.0/bookmarks` (needs `$HOME` expansion).
- Sync `XKBLAYOUT` / `XKBVARIANT` from `/etc/vconsole.conf` into - Hyprland's package-owned default input reads `XKBLAYOUT` / `XKBVARIANT`
`~/.config/hypr/input.lua`. from `/etc/vconsole.conf`; no per-user Hyprland config rewrite is needed.
- `xdg-settings set default-web-browser chromium.desktop` and - `xdg-settings set default-web-browser chromium.desktop` and
`xdg-mime default HEY.desktop x-scheme-handler/mailto` (XDG-aware paths). `xdg-mime default HEY.desktop x-scheme-handler/mailto` (XDG-aware paths).
- `omarchy-refresh-applications` (composes generated `.desktop` launchers). - `omarchy-refresh-applications` (composes generated `.desktop` launchers).
+109
View File
@@ -0,0 +1,109 @@
echo "Move stock Hyprland user overrides into package defaults"
stock_input_sha="bf7602d679a31da028528d9b7dac64463217a9df42b254d3baefb7ce35674be5"
stock_bindings_sha="932d647b07d24907d46c0b7752bb81ad87276ccd057670be6c3a5c5e950c19aa"
plain_bindings_sha="5d92d4008b04848256445da3cf5c10422a8d537baad499a4e63f60daecaefc6f"
file_sha() {
sha256sum "$1" | awk '{ print $1 }'
}
packaged_hypr_config() {
local omarchy_config="$OMARCHY_PATH/config/hypr/$1"
if [[ -f $omarchy_config ]]; then
printf '%s\n' "$omarchy_config"
else
printf '/etc/skel/.config/hypr/%s\n' "$1"
fi
}
replace_with_packaged_config() {
local name="$1"
local user_file="$HOME/.config/hypr/$name"
local packaged_file
packaged_file=$(packaged_hypr_config "$name")
[[ -f $user_file && -f $packaged_file ]] || return 0
cp "$packaged_file" "$user_file"
}
vconsole_value() {
local key="$1"
[[ -f /etc/vconsole.conf ]] || return 0
awk -F= -v key="$key" '
$1 == key {
value = $2
sub(/^[[:space:]]*/, "", value)
sub(/[[:space:]]*$/, "", value)
gsub(/^"/, "", value)
gsub(/"$/, "", value)
print value
exit
}
' /etc/vconsole.conf
}
active_lua_string_value() {
local key="$1"
local file="$2"
awk -F= -v key="$key" '
$0 ~ "^[[:space:]]*" key "[[:space:]]*=" {
value = $2
sub(/^[[:space:]]*/, "", value)
sub(/[[:space:]]*,?[[:space:]]*$/, "", value)
gsub(/^"/, "", value)
gsub(/"$/, "", value)
print value
exit
}
' "$file"
}
normalized_input_sha() {
sed \
-e '/^[[:space:]]*kb_layout[[:space:]]*=/d' \
-e '/^[[:space:]]*kb_variant[[:space:]]*=/d' \
"$1" | sha256sum | awk '{ print $1 }'
}
input_is_stock_or_installer_synced() {
local input_file="$1"
local layout variant vconsole_layout vconsole_variant
[[ $(normalized_input_sha "$input_file") == $stock_input_sha ]] || return 1
layout=$(active_lua_string_value kb_layout "$input_file")
variant=$(active_lua_string_value kb_variant "$input_file")
vconsole_layout=$(vconsole_value XKBLAYOUT)
vconsole_variant=$(vconsole_value XKBVARIANT)
[[ -n $layout && $layout != $vconsole_layout ]] && return 1
[[ -n $variant && $variant != $vconsole_variant ]] && return 1
return 0
}
input_file="$HOME/.config/hypr/input.lua"
if [[ -f $input_file ]] && input_is_stock_or_installer_synced "$input_file"; then
replace_with_packaged_config input.lua
fi
bindings_file="$HOME/.config/hypr/bindings.lua"
if [[ -f $bindings_file ]]; then
case "$(file_sha "$bindings_file")" in
"$stock_bindings_sha")
replace_with_packaged_config bindings.lua
;;
"$plain_bindings_sha")
mkdir -p "$HOME/.local/state/omarchy"
touch "$HOME/.local/state/omarchy/preinstalls-removed"
replace_with_packaged_config bindings.lua
;;
esac
fi
@@ -0,0 +1,168 @@
#!/bin/bash
source "$(dirname "${BASH_SOURCE[0]}")/base-test.sh"
require_command lua
run_application_bindings() {
local home="$1"
local prelude="${2:-}"
HOME="$home" XDG_CONFIG_HOME="$home/.config" XDG_STATE_HOME="$home/.local/state" OMARCHY_PATH="$ROOT" OMARCHY_BINDING_PRELUDE="$prelude" lua <<'LUA'
package.path = os.getenv("HOME") .. "/.config/?.lua;" .. os.getenv("OMARCHY_PATH") .. "/?.lua;" .. package.path
local prelude = os.getenv("OMARCHY_BINDING_PRELUDE") or ""
if prelude ~= "" then
assert(load(prelude))()
end
hl = {
dsp = {
exec_cmd = function(command)
return { kind = "exec", arg = command }
end,
},
bind = function(keys, dispatcher, opts)
opts = opts or {}
if opts.description then
print(keys .. "\t" .. opts.description)
end
end,
}
require("default.hypr.helpers")
require("default.hypr.bindings.applications")
LUA
}
run_omarchy_bindings() {
local home="$1"
local prelude="${2:-}"
HOME="$home" XDG_CONFIG_HOME="$home/.config" XDG_STATE_HOME="$home/.local/state" OMARCHY_PATH="$ROOT" OMARCHY_BINDING_PRELUDE="$prelude" lua <<'LUA'
package.path = os.getenv("HOME") .. "/.config/?.lua;" .. os.getenv("OMARCHY_PATH") .. "/?.lua;" .. package.path
local function proxy()
return setmetatable({}, {
__index = function(self, key)
local value = proxy()
rawset(self, key, value)
return value
end,
__call = function()
return {}
end,
})
end
local prelude = os.getenv("OMARCHY_BINDING_PRELUDE") or ""
if prelude ~= "" then
assert(load(prelude))()
end
hl = setmetatable({
dsp = proxy(),
bind = function(keys, dispatcher, opts)
opts = opts or {}
if opts.description then
print(keys .. "\t" .. opts.description)
end
end,
config = function() end,
env = function() end,
monitor = function() end,
window_rule = function() end,
workspace_rule = function() end,
layer_rule = function() end,
gesture = function() end,
animation = function() end,
curve = function() end,
exec_cmd = function() end,
dispatch = function() end,
on = function() end,
timer = function() end,
get_config = function() return nil end,
get_active_window = function() return nil end,
}, {
__index = function()
return function()
return {}
end
end,
})
require("default.hypr.omarchy")
LUA
}
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
fresh_home="$tmpdir/fresh-home"
mkdir -p "$fresh_home"
fresh_output=$(run_application_bindings "$fresh_home")
grep -Fq $'SUPER + RETURN Terminal' <<<"$fresh_output" || fail "default application bindings include essentials"
grep -Fq $'SUPER + SHIFT + A ChatGPT' <<<"$fresh_output" || fail "default application bindings include preinstalled web apps"
pass "default application bindings load from package defaults"
removed_home="$tmpdir/removed-home"
mkdir -p "$removed_home/.local/state/omarchy"
touch "$removed_home/.local/state/omarchy/preinstalls-removed"
removed_output=$(run_application_bindings "$removed_home")
grep -Fq $'SUPER + RETURN Terminal' <<<"$removed_output" || fail "preinstall removal keeps essential bindings"
if grep -Fq $'SUPER + SHIFT + A ChatGPT' <<<"$removed_output"; then
fail "preinstall removal skips preinstalled web app bindings"
fi
pass "preinstall removal flag skips optional application bindings"
variable_home="$tmpdir/variable-home"
mkdir -p "$variable_home"
variable_output=$(run_application_bindings "$variable_home" 'omarchy_preinstalled_bindings = false')
grep -Fq $'SUPER + RETURN Terminal' <<<"$variable_output" || fail "preinstalled binding variable keeps essential bindings"
if grep -Fq $'SUPER + SHIFT + A ChatGPT' <<<"$variable_output"; then
fail "preinstalled binding variable skips optional application bindings"
fi
pass "preinstalled binding variable skips optional application bindings"
no_bindings_home="$tmpdir/no-bindings-home"
mkdir -p "$no_bindings_home"
no_bindings_output=$(run_omarchy_bindings "$no_bindings_home" 'omarchy_default_bindings = false')
[[ -z $no_bindings_output ]] || fail "default binding variable disables all Omarchy bindings" "$no_bindings_output"
pass "default binding variable disables all Omarchy bindings"
migration=$(grep -rl 'Move stock Hyprland user overrides into package defaults' "$ROOT/migrations" | head -n 1 || true)
[[ -n $migration ]] || fail "Hyprland default config migration exists"
migration_home="$tmpdir/migration-home"
mkdir -p "$migration_home/.config/hypr"
cat >"$migration_home/.config/hypr/bindings.lua" <<'LUA'
require("default.hypr.bindings.media")
require("default.hypr.bindings.clipboard")
require("default.hypr.bindings.tiling-v2")
require("default.hypr.bindings.utilities")
-- Application bindings without Omarchy's preinstalled web apps, TUIs, or desktop apps.
o.bind("SUPER + RETURN", "Terminal", { omarchy = "terminal" })
o.bind("SUPER + SHIFT + RETURN", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + F", "File manager", { omarchy = "nautilus" })
o.bind("SUPER + ALT + SHIFT + F", "File manager (cwd)", { omarchy = "nautilus-cwd" })
o.bind("SUPER + SHIFT + B", "Browser", { omarchy = "browser" })
o.bind("SUPER + SHIFT + ALT + B", "Browser (private)", { omarchy = "browser --private" })
o.bind("SUPER + SHIFT + N", "Editor", { omarchy = "editor" })
LUA
HOME="$migration_home" OMARCHY_PATH="$ROOT" bash -euo pipefail "$migration" >/dev/null
cmp -s "$ROOT/config/hypr/bindings.lua" "$migration_home/.config/hypr/bindings.lua" ||
fail "plain legacy bindings migrate to the user override stub"
[[ -f $migration_home/.local/state/omarchy/preinstalls-removed ]] ||
fail "plain legacy bindings preserve preinstall removal state"
pass "migration converts plain legacy bindings to package-owned defaults"
upgrade_script="$ROOT/bin/omarchy-upgrade-to-4"
grep -Fq 'touch "$state_dir/preinstalls-removed"' "$upgrade_script" ||
fail "upgrade-to-4 preserves preinstall removal state"
mark_line=$(awk '/^mark_removed_preinstalls_from_legacy_bindings$/ { print NR; exit }' "$upgrade_script")
copy_line=$(awk '/^copy_always_config_defaults$/ { print NR; exit }' "$upgrade_script")
[[ -n $mark_line && -n $copy_line ]] || fail "upgrade-to-4 preinstall marker and config refresh calls exist"
(( mark_line < copy_line )) || fail "upgrade-to-4 detects plain legacy bindings before overwriting Hyprland bindings"
pass "upgrade-to-4 preserves preinstall removal before refreshing Hyprland bindings"