This bundle records the user-level corner customization applied on an Omarchy desktop.
~/.config/hypr/looknfeel.lua
8.rounding_power to 4.0, which Hyprland documents as a squircle.~/.config/hypr/hyprlock.conf
8.No files under /usr/share/omarchy/ were modified.
From a graphical Omarchy session:
./apply.sh
The script creates timestamped .bak.* backups before changing either existing file. It is idempotent and reloads Hyprland plus the Omarchy shell after applying the settings.
hyprctl configerrors
hyprctl getoption decoration:rounding
hyprctl getoption decoration:rounding_power
Expected values:
int: 8
float: 4.000000
Hyprland can render squircle-shaped compositor window corners with rounding_power. The Omarchy shell, GTK, Qt, and individual applications use their own widget renderers. The web CSS corner-shape: squircle property is experimental and is not a system-wide Linux theme API, so this bundle does not claim to convert every application widget.
References:
#!/usr/bin/env bash
set -euo pipefail
CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
LOOKNFEEL="$CONFIG_HOME/hypr/looknfeel.lua"
HYPRLOCK="$CONFIG_HOME/hypr/hyprlock.conf"
[[ -f "$LOOKNFEEL" ]] || { echo "Missing $LOOKNFEEL" >&2; exit 1; }
[[ -f "$HYPRLOCK" ]] || { echo "Missing $HYPRLOCK" >&2; exit 1; }
python3 - "$LOOKNFEEL" "$HYPRLOCK" <<'PY'
from datetime import datetime
from pathlib import Path
import re
import shutil
import sys
looknfeel = Path(sys.argv[1])
hyprlock = Path(sys.argv[2])
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
def backup(path: Path) -> None:
target = path.with_name(f"{path.name}.bak.{timestamp}")
shutil.copy2(path, target)
print(f"Backup: {target}")
def write_if_changed(path: Path, old: str, new: str) -> None:
if old == new:
print(f"Unchanged: {path}")
return
backup(path)
path.write_text(new, encoding="utf-8")
print(f"Updated: {path}")
# Append a marked block when no equivalent setting exists. Re-running the
# script does not add another block.
look_text = looknfeel.read_text(encoding="utf-8")
look_block = """-- BEGIN OMARCHY SQUIRCLE\nhl.config({\n decoration = {\n rounding = 8,\n rounding_power = 4.0,\n },\n})\n-- END OMARCHY SQUIRCLE\n"""
if "rounding_power = 4.0" not in look_text:
separator = "" if look_text.endswith("\n") else "\n"
look_text = look_text + separator + "\n" + look_block
write_if_changed(looknfeel, looknfeel.read_text(encoding="utf-8"), look_text)
# Change only the input-field block, not unrelated future rounding settings.
lock_before = hyprlock.read_text(encoding="utf-8")
match = re.search(r"(?ms)^input-field\s*\{.*?^\}", lock_before)
if not match:
raise SystemExit(f"Could not find input-field block in {hyprlock}")
input_block = match.group(0)
if re.search(r"(?m)^\s*rounding\s*=", input_block):
input_block = re.sub(r"(?m)^(\s*)rounding\s*=.*$", r"\1rounding = 8", input_block, count=1)
else:
input_block = re.sub(r"(?m)^(\s*)shadow_passes\s*=", r"\1rounding = 8\n\1shadow_passes =", input_block, count=1)
lock_after = lock_before[:match.start()] + input_block + lock_before[match.end():]
write_if_changed(hyprlock, lock_before, lock_after)
PY
hyprctl reload
omarchy restart shell
printf '\nActive Hyprland values:\n'
hyprctl configerrors
hyprctl getoption decoration:rounding
hyprctl getoption decoration:rounding_power
printf '\nLock-screen setting is read on the next hyprlock start.\n'
# Add this inside the input-field { ... } block in ~/.config/hypr/hyprlock.conf.
# Hyprlock exposes radius but not Hyprland's rounding_power.
rounding = 8
-- Add this to ~/.config/hypr/looknfeel.lua.
-- Hyprland documents rounding_power = 4.0 as a squircle curve.
hl.config({
decoration = {
rounding = 8,
rounding_power = 4.0,
},
})