Lavoro duro su F-Spot. Non il solito, banale, “noioso” lavoro si bug-fixing, che in comunque nasconde non poche difficoltà per coloro che, come me, non conoscono a fondo ne il C# ne il codice di F-Spot.
Il gran lavoro di questi giorni è legato al tentativo di fix del bug #427478, che può apparire estremamente semplice a prima vista, ma nasconde una serie di insidie da non sottovalutare.
Scovare il punto del codice di F-Spot dove andare a mettere le mani e lanciare messaggi di “inibizione” e “deinibizione”, è stato piuttosto semplice. Il codice è ben scritto, e con un po’ di ricerche si trova tutto.
Il problema si è posto nel tentativo di comprendere come si potesse parlare con DBus, da Mono. L’unica implementazione di cui ho notizia, è DBus-sharp a cui si fa riferimento anche come “managed D-Bus” in quanto si tratta di una completa riscrittura della libreria, che mal si adattava all’interazione con Mono.
Innanzi tutto sembra che non esistano esempi comprensibili a disposizione. Pullula di casi di test, ma un pezzo di codice d’esempio che faccia la classica cosa stupidissima, non c’è verso di trovarlo. Ci ho bestemmiato dietro per 2 giorni, finché il buon Stephane Delcroix non se n’è uscito con questo sample:
using NDesk.DBus; using System; public class ScreenSaver { [Interface ("org.gnome.ScreenSaver")] public interface IScreenSaver { uint Inhibit (string appname, string reason); void Lock (); } public static void Main () { IScreenSaver screensaver = Bus.Session.GetObject<IScreenSaver>("org.gnome.ScreenSaver", new ObjectPath ("/org/gnome/ScreenSaver")); screensaver.Lock (); } }
da compilare tramite il comando gmcs ScreenSaver.cs -r:NDesk.DBus.dll per ottenere uno stupidissimo programmino che richiede, tramite DBus, l’attivazione dello screensaver di Gnome. Era davvero cosi difficile da ottenere?
Una volta capito il meccanismo, inviare la chiamata di inhibit e dehinibit allo screensaver è stato piuttosto semplice, con l’unica difficoltà di dover suddividere il codice in due files, e doverli quindi mettere insieme, inserendo in entrambi tutte le condizioni a contorno per il relativo funzionamento.