Hyprland Eklenti Kırılmaları: Neden Tüm C++ Pluginlerini Silip Native Lua'ya Geçtik?

Özetle (TL;DR): Hyprland ekosistemindeki C++ eklentileri (hyprtasking vb.) her majör güncellemede “Plugin version mismatch” hatası vererek sistemi kırar. Bu bakım yükünden kurtulmak için tüm eklentileri yapılandırmadan tamamen silip, doğrudan hyprctl soketlerini okuyan Native Lua IPC ve Quickshell mimarisiyle kendi izole “Görev Kontrol” arayüzümüzü kurduk. Sonuç: Sıfır çökme, sıfır gecikme.

Birkaç gün önce, Hyprland v0.55 güncellemeleri ve yeni Native Lua API olanakları üzerine bazı değerlendirmelerde bulunmuştum. Bu yeni yapılandırma sürecinde, sistemin kararlılığını sağlamak adına masaüstü bileşenlerini yeniden gözden geçirmem gerekti.

Bu yazıda, cazip görünmesine rağmen uzun vadede sorun yaratan C++ eklentilerinden neden vazgeçtiğimi ve yerine Native Lua üzerinden çalışan, çok daha izole bir Görev Kontrolü arayüzüne nasıl geçtiğimi anlatacağım.

”Version Mismatch” Çıkmazı ve ABI Kırılmaları

Hyprland ekosisteminde yer alan hyprtasking gibi C++ tabanlı eklentiler, çalışma alanlarını macOS akıcılığında yönetmek ve pencereleri sürükle-bırak ile taşımak gibi son derece pratik özellikler sunuyor. Ancak işin teknik arka planında oldukça yıpratıcı bir döngü mevcut: ABI kırılmaları.

Hyprland, hızlı geliştirilen ve çekirdek yapısı sık değişen bir proje. C++ ile yazılan eklentiler, compositor’ın iç yapısıyla doğrudan bağlantılı çalışıyor. Bu durum, her majör ve bazen minör güncellemede eklentilerin kırılmasına yol açıyor. Güncelleme sonrası ekranda beliren “Plugin version mismatch” hataları ve ardından mecburen çalıştırılan hyprpm update komutlarıyla sistemi yeniden derleme zorunluluğu, masaüstünün bakım maliyetini inanılmaz derecede artırıyor.

Bu durum, kendi sistem mimarimde aradığım “Zero Bloat” ve kararlılık prensibiyle açıkça ters düşüyordu. Sürekli bakım gerektiren havalı özellikler ile sessiz ve hatasız çalışan temel bir işlevsellik arasında seçim yapılması gerekiyordu. Tercihimi sistemin kararlılığından yana kullandım.

Quickshell ve Native Lua Geçişi

Sistemin bütünlüğünü bozan dış C++ eklentilerini yapılandırmadan tamamen kaldırdım. Bunun yerine, Waybar’dan geçerken altyapısını hazırladığım Quickshell motorunu ve Hyprland’in sunduğu UNIX soket tabanlı Native Lua IPC yeteneklerini merkeze aldım.

Mevcut yapıda, dışarıdan müdahale eden ve çökmeye meyilli bir eklenti katmanı bulunmuyor:

Nasıl Çalışıyor? (Örnek IPC Dinleyicisi)

C++ eklentisine güvenmek yerine, Hyprland’in olaylarını (event) doğrudan Lua ile dinliyoruz. Sadece bir soket bağlantısı her şeyi çözüyor:

-- Quickshell üzerinden Hyprland çalışma alanı değişimlerini dinleyen basit bir IPC kurgusu
local io = require("io")
local handle = io.popen("socat -U - UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock")

for line in handle:lines() do
    if line:match("workspace>>") then
        local ws_id = line:match(">>(%d+)")
        print("Aktif Çalışma Alanı: " .. ws_id)
        -- Quickshell arayüzüne (Görev Kontrolü) anında sinyal gönder
    end
end

Bu kadar basit. Sisteme dışarıdan müdahale eden, API’leri bozan karmaşık bir C++ kodu yerine, işletim sisteminin sunduğu temel soket okuma yeteneğini kullandık.

Sonuç: Sistem Kararlılığı

Elde edilen en büyük avantaj, sistemin Hyprland güncellemelerinden artık etkilenmemesi oldu. İşlemciyi yormayan, “version mismatch” sorunu üretmeyen ve her açılışta aynı tepkiselliği koruyan bir masaüstü düzenine ulaşıldı.

Masaüstü ortamlarını özelleştirirken özelliklerin cazibesine kapılıp sistemin temel görevi olan “çalışma kararlılığını” riske atmak sık düşülen bir tuzaktır. Kendi ihtiyacını karşılayan, dış bağımlılıklardan arındırılmış bağımsız bir yapı kurmak, teknik istikrarın en önemli anahtarıdır. İlerleyen süreçte Quickshell üzerinden donanım tetikleyicilerini yönettiğim panellerin detaylarını da paylaşıyor olacağım.

Kaynaklar ve İleri Okuma

EOF.