NixOS ve Hyprland Lua Entegrasyonu: Kusursuz Bir Geçişin Anatomisi
Linux masaüstü dünyası uzun süredir statik konfigürasyon dosyalarına (.conf, .ini) mahkumdu. Hyprland da başlangıçta kendi statik dili olan hyprlang ile yola çıktı. Ancak Mayıs 2026’da yayınlanan v0.55.0 güncellemesiyle Vaxry ve Hyprland ekibi devrim niteliğinde bir adım atarak yerel (native) Lua motorunu pencere yöneticisinin doğrudan içine gömdü ve eski .conf yapısını resmi olarak kullanımdan kaldırma (deprecated) sürecine soktu.
Eski dönemlerde (dms-shell zamanları) konfigürasyonlara “eğer (if)” mantığı katmak veya döngüler kurmak için dışarıdan devasa bash scriptleri yazmak zorundaydık. Şimdi ise çalışma zamanında (runtime) dinamik mizanpaj değişiklikleri yapabildiğimiz tam teşekküllü bir programlama diline sahibiz.
Bu yazıda, kendi inşa ettiğim nixos-hyprland-lua mimarisinin detaylarına inip, bu iki zıt dünyanın (deklaratif NixOS ve dinamik Lua) nasıl kusursuz bir şekilde birlikte çalıştığını inceleyeceğiz.
1. NixOS ve Lua Arasındaki Köprü: mkOutOfStoreSymlink
NixOS kullanıcılarının en büyük çilesi, pencere yöneticilerinde (WM) yaptıkları en ufak bir tuş ataması (keybind) değişikliğinde bile nixos-rebuild switch komutunu çalıştırmak zorunda kalmalarıdır. Çünkü NixOS, her dosyayı salt-okunur (read-only) Nix Store içine gömer.
Bu sorunu çözmek ve Lua dosyalarını anında (live-edit) düzenleyebilmek için Home Manager modülümde (module.nix) şu taktiği kullandım:
xdg.configFile."hypr/hyprland.lua".source =
config.lib.file.mkOutOfStoreSymlink "${cfg.repoPath}/lua/hyprland.lua";
Bu sayede Lua dosyalarım .config/hypr/lua dizinine sembolik link (symlink) olarak bağlanıyor. Herhangi bir dosyada değişiklik yapıp kaydettiğimde, sistemi rebuild etmeme gerek kalmadan hyprctl reload demem yeterli oluyor. NixOS’un o katı yapısını kırmadan, sadece geliştirme konforu sağlayan güvenli bir tünel.
2. Lua’da Çökmeyen Modüler Yapı (pcall)
Eski hyprlang statik dosyalarında yanlış bir satır yazdığınızda genellikle o satır görmezden gelinir veya ufak bir uyarı verilirdi. Lua gibi gerçek bir programlama dilinde ise “Syntax Error” aldığınız an kodun çalışması durur. Tüm WM ayarlarını tek bir Lua dosyasına (spagetti kod) yığsaydık, yapacağımız ufak bir virgül hatası Hyprland’ın çökmesine neden olabilirdi.
Bunu önlemek için lua/hyprland.lua ana giriş noktasında (entry-point) bir Safe Loader fonksiyonu yazdım:
local function load_module(name)
local path = lua_dir .. name .. ".lua"
local f = io.open(path, "r")
if f then
f:close()
-- pcall ile güvenli yükleme
local ok, err = pcall(dofile, path)
if not ok then
io.stderr:write("[hyprland.lua] ERROR loading '" .. name .. "': " .. err .. "\n")
end
end
end
load_module("colors")
load_module("hardware")
load_module("binds")
pcall (Protected Call), modülü çalıştırırken bir hata çıkarsa sistemi çökertmek yerine hatayı bir değişkene (err) aktarır. Böylece klavye kısayollarını düzenlerken hata yapsam bile, ekranım kapanmıyor; sistem sadece hatalı modülü izole edip diğerlerini çalıştırmaya devam ediyor. (Sıfır güven, sıfır çökme!)
3. UWSM ve Servis Yönetimi
Sistemin bir diğer kilit noktası ise Systemd bağımlılıkları ve Wayland servisleri. dms-shell zamanında bu süreçleri yönetmek kaotikti. Şu anki mimarimizde süreci tamamen UWSM (Universal Wayland Session Manager) devralmış durumda:
programs.hyprland = {
enable = true;
withUWSM = true; # login loop sorununu kökten çözer
};
UWSM, Hyprland’ın yaşam döngüsünü Systemd hedef (target) yapılarıyla kusursuz birleştiriyor. Örneğin quickshell, cliphist ve swaync gibi araçlar, graphical-session.target şartına (ConditionEnvironment = "WAYLAND_DISPLAY") bağlanarak sadece Hyprland sorunsuz ayağa kalktığında tetikleniyor.
Sonuç
.conf dosyalarından tam teşekküllü Lua programlamaya geçiş, bir pencere yöneticisini kişiselleştirmenin ötesinde, onu bir masaüstü ortamına dönüştürme felsefesidir.
NixOS ile sistemi deklaratif ve sarsılmaz bir şekilde ayağa kaldırıp; Lua ile çalışma zamanında (runtime) esnek, akıllı ve çökmeyen bir masaüstü inşa ettik. İki farklı dünyanın en güçlü yanlarını kullanmak, gerçek bir sistem mimarisi gerektiriyor ve sonuç gerçekten büyüleyici.
Kaynaklar ve İlgili Dokümantasyon
- Hyprland v0.55 Sürüm Notları (Vaxry): Lua motorunun çekirdeğe entegrasyonu ve
.confformatının kullanımdan kaldırılma (deprecation) duyurusu. - Resmi Hyprland Lua Wiki: Lua ile dinamik konfigürasyon ve Event Hook yapılarının kullanımı.
İlgili Sistem Kayıtları (Related Posts)
- dms-shell’den Hyprland-lua’ya: Konfigürasyon Felsefesi Değişimi
- NixOS 26.05 Systemd-initrd ve Impermanence Mimarisi