CapsLock is the compose key, so Caps Lock has to live somewhere else, and both Shifts together is where it went. That combination is easy to hit by accident while typing, and the lock then sticks until you notice it and hit both Shifts again. shift:both_capslock_cancel sets the lock exactly the same way, but types the Shift keys as ALPHABETIC rather than TWO_LEVEL, so the next lone Shift releases it. Since a misfire happens while reaching for Shift anyway, it clears itself almost immediately. Compose is untouched: <CAPS> stays [Multi_key, Multi_key], so the ~/.XCompose emoji sequences work as before. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
86 lines
2.5 KiB
Bash
86 lines
2.5 KiB
Bash
#!/bin/bash
|
|
|
|
source "$(dirname "${BASH_SOURCE[0]}")/base-test.sh"
|
|
|
|
require_command lua
|
|
|
|
resolved_input() {
|
|
OMARCHY_PATH="$ROOT" OMARCHY_VCONSOLE="${1-}" lua <<'LUA'
|
|
package.path = os.getenv("OMARCHY_PATH") .. "/?.lua;" .. package.path
|
|
|
|
local vconsole = os.getenv("OMARCHY_VCONSOLE")
|
|
local real_open = io.open
|
|
|
|
io.open = function(path, mode)
|
|
if path ~= "/etc/vconsole.conf" then
|
|
return real_open(path, mode)
|
|
end
|
|
|
|
if not vconsole then
|
|
return nil
|
|
end
|
|
|
|
local file = io.tmpfile()
|
|
file:write(vconsole)
|
|
file:seek("set")
|
|
return file
|
|
end
|
|
|
|
hl = {
|
|
config = function(config)
|
|
local input = config.input
|
|
print(("[%s] [%s] [%s]"):format(input.kb_layout, input.kb_variant, input.kb_options))
|
|
end,
|
|
}
|
|
|
|
o = { window = function() end }
|
|
|
|
require("default.hypr.input")
|
|
LUA
|
|
}
|
|
|
|
assert_input() {
|
|
local description="$1"
|
|
local expected="$2"
|
|
local actual
|
|
|
|
if (( $# > 2 )); then
|
|
actual=$(resolved_input "$3")
|
|
else
|
|
actual=$(resolved_input)
|
|
fi
|
|
|
|
[[ $actual == "$expected" ]] ||
|
|
fail "$description" "expected: $expected"$'\n'"actual: $actual"
|
|
pass "$description"
|
|
}
|
|
|
|
base_options="compose:caps,shift:both_capslock_cancel"
|
|
toggle_options="$base_options,grp:alts_toggle"
|
|
|
|
assert_input "missing vconsole.conf falls back to us" "[us] [] [$base_options]"
|
|
assert_input "us layout passes through" "[us] [intl] [$base_options]" 'XKBLAYOUT=us
|
|
XKBVARIANT=intl
|
|
'
|
|
assert_input "latin layouts are left alone" "[de] [nodeadkeys] [$base_options]" 'XKBLAYOUT=de
|
|
XKBVARIANT=nodeadkeys
|
|
'
|
|
assert_input "non-latin layout gains us in front" "[us,ara] [,] [$toggle_options]" 'XKBLAYOUT=ara
|
|
'
|
|
assert_input "prepended us keeps variants aligned" "[us,ru] [,phonetic] [$toggle_options]" 'XKBLAYOUT=ru
|
|
XKBVARIANT=phonetic
|
|
'
|
|
assert_input "non-latin layout in front gains us even when us trails" "[us,il,us] [,] [$toggle_options]" 'XKBLAYOUT=il,us
|
|
'
|
|
|
|
hooks_conf="$ROOT/etc/mkinitcpio.conf.d/omarchy_hooks.conf"
|
|
input_lua="$ROOT/default/hypr/input.lua"
|
|
|
|
hooks_layouts=$(awk -F')' '/\) ;;$/ { gsub(/[[:space:]|]+/, "\n", $1); print $1 }' "$hooks_conf" | grep '^[a-z]\+$' | sort)
|
|
lua_layouts=$(sed -n '/^local non_latin_layouts =/,+1p' "$input_lua" | grep -o '"[^"]*"' | tr -d '"' | tr ' ' '\n' | grep '^[a-z]\+$' | sort)
|
|
|
|
[[ -n $hooks_layouts ]] || fail "non-latin layout list is readable from omarchy_hooks.conf"
|
|
[[ $hooks_layouts == "$lua_layouts" ]] ||
|
|
fail "non-latin layout lists stay in sync" "$(diff <(echo "$hooks_layouts") <(echo "$lua_layouts"))"
|
|
pass "non-latin layout lists stay in sync with the initramfs hook"
|