Ich bin vor kurzem in die Hyprland-0.55-Migration gestolpert.
Und mit „gestolpert“ meine ich: Ich wollte eigentlich nur mein System weiter benutzen, und plötzlich guckte mich Hyprland an wie:
„Schöne Config hast du da. Wäre schade, wenn sie jetzt Legacy wäre.“
Kurzfassung: Hyprland kann jetzt Lua-Config. Das ist mächtig, flexibel und vermutlich langfristig ziemlich cool. Am Anfang fühlt es sich aber ein bisschen so an, als hätte jemand aus einer angenehm lesbaren hyprland.conf ein kleines Softwareprojekt mit Nebenquests gemacht.
Ausgangslage
Mein Setup sah ungefähr so aus:
- Hyprland 0.55
- vorher klassische
hyprland.conf - Noctalia Shell / Quickshell
- eigene Windowrules
- Dwindle, Master und Scrolling Layout
- viele Keybinds
- Desktop Widgets
- Hyprexpo
- eine gewisse emotionale Bindung an „es lief doch gerade noch“
Die alte Config war schön direkt:
bind = $mainMod, Q, exec, ghostty
general {
gaps_in = 4
gaps_out = 8
layout = dwindle
}
Lua dagegen sagt eher:
hl.bind(mainMod .. " + Q", exec("ghostty"))
Nicht schlimm. Nur anders. Und „anders“ ist unter Linux bekanntlich der kleine Bruder von „wo ist mein Kaffee?“.
Der neue Aufbau: aus Config wird Architektur
Damit die neue Config nicht komplett zum unheiligen Lua-Klumpen wird, habe ich sie in Module zerlegt.
~/.config/hypr/hyprland.lua
~/.config/hypr/modules/environment.lua
~/.config/hypr/modules/monitor.lua
~/.config/hypr/modules/autostart.lua
~/.config/hypr/modules/options.lua
~/.config/hypr/modules/animations.lua
~/.config/hypr/modules/binds.lua
~/.config/hypr/modules/rules.lua
Die hyprland.lua ist damit nur noch der Einstiegspunkt und lädt die einzelnen Module:
local module_dir = (os.getenv("HOME") or "/home/kiru") .. "/.config/hypr/modules/"
local modules = {
"environment",
"monitor",
"autostart",
"options",
"animations",
"binds",
"rules"
}
for _, name in ipairs(modules) do
dofile(module_dir .. name .. ".lua")(ctx)
end
Das macht Lua nicht automatisch hübsch, aber wenigstens findet man später wieder, wo man sich selbst wehgetan hat.
Und genau das ist bei Lua wichtig: Sobald alles in einer einzigen Datei landet, hat man keine Config mehr, sondern eine Suppe mit Semikolon-Aroma.
Was direkt kaputtging
Ein paar alte Optionen waren nicht mehr gültig oder mussten anders gesetzt werden.
Aus:
misc:vfr
wurde:
debug = {
vfr = true,
}
Außerdem flog dwindle:pseudotile raus, weil Hyprland damit nicht mehr glücklich war.
Auch alte Layout-Binds über hyprctl keyword waren plötzlich beleidigt:
hyprctl keyword general:layout master
Hyprland sagte sinngemäß:
keyword can't work with non-legacy parsers. Use eval.
Also wurde daraus Lua:
local function set_layout(name)
return function()
hl.config({
general = {
layout = name,
},
})
end
end
hl.bind(mainMod .. " + CTRL + 8", set_layout("master"))
hl.bind(mainMod .. " + CTRL + 7", set_layout("dwindle"))
hl.bind(mainMod .. " + CTRL + 9", set_layout("scrolling"))
Funktioniert. Sieht nur plötzlich nach echter Programmierung aus. Frechheit.
Mouse-Binds waren auch beleidigt
Fenster mit Super + linker Maustaste bewegen ging nicht mehr wie vorher.
Alt:
bindm = $mainMod, mouse:272, movewindow
Neu:
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
Kleine Änderung, große Wirkung.
Ohne funktionierende Mouse-Binds fühlt sich der Desktop sofort an, als hätte jemand die Möbel am Boden festgeschraubt.
Noctalia wollte auch mitspielen
Der fiesere Teil war bei mir Noctalia.
Der App Launcher startete Programme intern noch ungefähr so:
hyprctl dispatch -- exec ...
Mit Lua-Config wurde daraus plötzlich Murks. Apps wie Vivaldi, Thunar oder der Texteditor wollten nicht mehr sauber starten.
Gefixt wurde es bei mir in:
/etc/xdg/quickshell/noctalia-shell/Services/Compositor/HyprlandService.qml
Statt altem Dispatch musste Noctalia Lua-kompatibel starten:
hl.dsp.exec_cmd(...)
Das ist vermutlich etwas, was Noctalia selbst irgendwann upstream sauber patcht. Aber bis dahin: einmal kurz mit dem Schraubendreher rein.
Natürlich mit Backup.
Wir sind ja chaotisch, aber nicht lebensmüde.
Hyprexpo: da war doch was
Hyprexpo war per hyprpm noch als enabled markiert.
Aber:
hyprctl plugin list
sagte trocken:
no plugins loaded
Sehr hilfreich. Danke für nichts.
Also habe ich Expo erstmal auskommentiert und warte, bis die Plugins sauber zu Hyprland 0.55 passen.
Manchmal ist die beste Lösung nicht „noch fünf Stunden debuggen“, sondern:
„Upstream atmen lassen.“
Der Dwindle-Rand des Grauens
Nach der Migration hatte ich noch ein richtig nerviges Problem: Im Dwindle-Layout gingen Fenster minimal über den rechten Bildschirmrand.
Nur ein Stückchen.
Nicht dramatisch.
Aber genug, um das Auge jeden Tag anzuschreien.
Erster Verdacht: Gaps.
War es aber nicht.
Der eigentliche Übeltäter war mein Monitor-Scale:
scale = 1.07
Bei 3440 Pixel Breite ergibt das eine krumme logische Breite:
3440 / 1.07 = 3214.95
Hyprland musste also runden, und Dwindle hat rechts Restpixel produziert.
Die Lösung war überraschend simpel:
scale = 1.075
Denn:
3440 / 1.075 = 3200
Glatt. Sauber. Kein abgeschnittener rechter Rand mehr.
Das war so ein klassischer Kiru-Moment:
„Stop!“
„Moment, es hat geholfen.“
Linux in einer Nussschale.
Was ich aus der Migration gelernt habe
Die Lua-Migration ist nicht schlimm, aber sie ist auch nicht einfach nur „alte Config mit anderer Dateiendung“.
Man muss ein bisschen umdenken.
Meine wichtigsten Erkenntnisse:
- Backups machen. Immer.
- Lua-Config modularisieren, sonst wird sie schnell Suppe.
- Alte
hyprctl keyword-Tricks funktionieren nicht immer. - Mouse-Binds müssen anders gesetzt werden.
- Externe Tools wie Noctalia müssen eventuell angepasst werden.
- Plugins können nach großen Hyprland-Releases hinterherhinken.
- Fractional Scaling kann richtig frech sein.
- Wenn ein Desktop „nur ein paar Pixel“ falsch ist, wird man wahnsinnig. Wissenschaftlich bewiesen.
Mein Fazit
Am Ende läuft alles wieder.
Sogar besser strukturiert als vorher.
Aber ja, ein Teil von mir vermisst trotzdem die alte hyprland.conf, diese kleine, direkte, unschuldige Datei.
Lua ist mächtig.
Lua ist flexibel.
Lua ist auch ein bisschen:
„Herzlichen Glückwunsch, deine Desktop-Config hat jetzt Architektur.“
Und damit:
Backup machen, Kaffee holen, nicht direkt weinen.
Außer kurz.
Kurz ist erlaubt.