Kafayı yiyecektim! Şaka gibi ama, tek bir amacım vardı: "Görev çubuğunda simge olsun, tıklayınca menü açılsın, bazen de bildirim göndersin." Basit gibi değil mi? Meğerse her işletim sistemi kendi bildirim dünyasında yaşıyormuş. Cross-platform bir uygulama yazarken, bu üçlü arasında köprü kurmak, tam bir API sirkine dönüştü.
Windows: Balloon Tips'ten Tost Notification'a
Windows'ta işler win32api ve ctypes ile başlıyor. Eskiden NOTIFYICONDATA ile `NIM_MODIFY` yapıp `szInfo`'ya yazdığın o küçük balon bildirimleri (balloon tips) vardı. Windows 8/10 sonrası ise yepyeni bir canavar: Windows Runtime (WinRT) API ve `ToastNotificationManager`. Yani aynı iş için iki farklı, devasa kütüphane öğrenmen gerekebilir. Ve tabii, ikisini de çalıştırmak için...
...evet, pywin32 gibi dev bir bağımlılık. Sadece bir bildirim için!
macOS: NSUserNotification'ın Acılı Mirası
Mac tarafına geçelim. Burada hikaye PyObjC ile AppKit framework'üne dalıp `NSUserNotification` ve `NSUserNotificationCenter` objeleriyle uğraşmak. Catalina (10.15) öncesi nispeten "kolaydı". Ama sonra? User Notifications framework ve onun `UNUserNotificationCenter`'ı devreye girdi. İzin isteme (`requestAuthorizationWithOptions`), kategori tanımlama... Terminalden çıkıp tamamen Xcode dünyasına adım atıyorsun. Ve tüm bunları Python'dan `rubicon-objc` gibi araçlarla sarmalamaya çalışmak... İnanılmaz!
Linux: DBus, Freedesktop ve Notify-Send
Linux dünyası ise tam bir özgürlük (ve kaos) alanı. Standart, Freedesktop.org spesifikasyonu ve onun taşıyıcısı: DBus. `notify-send` komutunu arka planda çalıştırabilirsin ya da doğrudan dbus-python ile `org.freedesktop.Notifications` arayüzüne bağlanıp `Notify` metodunu çağırabilirsin. Ama hangi desktop environment? GNOME, KDE, XFCE hepsinin bildirim sunucusu (notification server) biraz farklı çalışabilir. Biri bildirimi gösterir, diğeri göstermez. Test etmek için 3 farklı VM açtığım günleri unutamıyorum.
Sonuç: Pythondaki Kütüphaneler Bir Umut Mu?
Neyse ki Python camiası bu çılgınlığı biraz olsun dindirmek için pystray, plyer veya desktop-notifier gibi kütüphaneler sunuyor. Ama onların altında da yine bu bahsettiğim platform-spesifik kodlar yatıyor. Sadece bir abstraction layer. Bazen öyle derin bug'lara denk geliyorsun ki, "StackOverflow'da bile bulamadım" deyip kütüphanenin kaynak koduna dalıyorsun. Meğerse sorun, macOS'ta bir delegate metodunu implemente etmemekmiş!
Siz de böyle cross-platform bir kabus yaşadınız mı? System tray ve bildirimler için sizin tercih ettiğiniz, daha az sinir bozucu bir kütüphane veya yöntem var mı? Yoksa hepimiz aynı gemide, bu üç ayrı dünyanın kod denizlerinde sallanıp duruyor muyuz?
Windows'ta işler win32api ve ctypes ile başlıyor. Eskiden NOTIFYICONDATA ile `NIM_MODIFY` yapıp `szInfo`'ya yazdığın o küçük balon bildirimleri (balloon tips) vardı. Windows 8/10 sonrası ise yepyeni bir canavar: Windows Runtime (WinRT) API ve `ToastNotificationManager`. Yani aynı iş için iki farklı, devasa kütüphane öğrenmen gerekebilir. Ve tabii, ikisini de çalıştırmak için...
Python:
# Windows Toast için (pythoncom gerekiyor!)
import win32api, win32gui, win32con
...evet, pywin32 gibi dev bir bağımlılık. Sadece bir bildirim için!
Mac tarafına geçelim. Burada hikaye PyObjC ile AppKit framework'üne dalıp `NSUserNotification` ve `NSUserNotificationCenter` objeleriyle uğraşmak. Catalina (10.15) öncesi nispeten "kolaydı". Ama sonra? User Notifications framework ve onun `UNUserNotificationCenter`'ı devreye girdi. İzin isteme (`requestAuthorizationWithOptions`), kategori tanımlama... Terminalden çıkıp tamamen Xcode dünyasına adım atıyorsun. Ve tüm bunları Python'dan `rubicon-objc` gibi araçlarla sarmalamaya çalışmak... İnanılmaz!
Linux dünyası ise tam bir özgürlük (ve kaos) alanı. Standart, Freedesktop.org spesifikasyonu ve onun taşıyıcısı: DBus. `notify-send` komutunu arka planda çalıştırabilirsin ya da doğrudan dbus-python ile `org.freedesktop.Notifications` arayüzüne bağlanıp `Notify` metodunu çağırabilirsin. Ama hangi desktop environment? GNOME, KDE, XFCE hepsinin bildirim sunucusu (notification server) biraz farklı çalışabilir. Biri bildirimi gösterir, diğeri göstermez. Test etmek için 3 farklı VM açtığım günleri unutamıyorum.
Neyse ki Python camiası bu çılgınlığı biraz olsun dindirmek için pystray, plyer veya desktop-notifier gibi kütüphaneler sunuyor. Ama onların altında da yine bu bahsettiğim platform-spesifik kodlar yatıyor. Sadece bir abstraction layer. Bazen öyle derin bug'lara denk geliyorsun ki, "StackOverflow'da bile bulamadım" deyip kütüphanenin kaynak koduna dalıyorsun. Meğerse sorun, macOS'ta bir delegate metodunu implemente etmemekmiş!
Siz de böyle cross-platform bir kabus yaşadınız mı? System tray ve bildirimler için sizin tercih ettiğiniz, daha az sinir bozucu bir kütüphane veya yöntem var mı? Yoksa hepimiz aynı gemide, bu üç ayrı dünyanın kod denizlerinde sallanıp duruyor muyuz?