La mia prima applet per Cinnamon

Da quando ho aggiornato il PC alle ultime versioni di Ubuntu sono rimasto inorridito sia da Unity che da Gnome 3.2. Per questo motivo ho scelto la strada di Cinnamon, che mi sembra un buon compromesso tra il vecchio gnome 2 e il nuovo che inevitabilmente avanza.

Una delle cose che apprezzo maggiormente di gnome shell e cinnamon è la possibilità di scrivere facilmente delle applet, utilizzando Javascript. La cosa mi torna proprio a fagiolo perché usando fetchmail in modalità daemon per scaricare la posta ogni 2 minuti, mi capita spesso di dover forzare lo scaricamento immediato delle mail. Normalmente dovrei lanciare fetchmail da un terminale, ma non sarebbe più semplice cliccare su un’applet nel pannello? Vediamo come fare..

Per prima cosa bisogna scegliere un identificativo univoco (UUID) per la nostra applet, che sia nella forma nome@qualcosa. Questo qualcosa può essere un nome di dominio oppure un termine inventato, nel mio caso l’uuid che ho scelto è fetchmail@grimmo

Una volta scelto l’identificativo, andiamo a creare una cartella con lo stesso nome sotto
~/.local/share/cinnamon/applets

(oppure in /usr/share/cinnamon/applets se vogliamo che l’applet sia visibile da tutti gli utenti del sistema)

Nel mio caso la cartella si chiamerà: ~/.local/share/cinnamon/applets/fetchmail@grimmo/

All’interno di questa cartella dovremo creare 2 file

Il primo file si chiama metadata.json e come dice il nome stesso, contiene i metadati che descrivono la nostra applet.

 

{
"uuid": "fetchmail@grimmo",
"name": "Scarica posta",
"description": "Clicca sull'icona per scaricare
immediatamente la posta",
"icon": "mail-unread"
}

 

    • uuid è l’identificativo univoco che abbiamo scelto per la nostra applet
    • name è il nome che comparirà nell’elenco delle applet
    • description è la descrizione leggibile sempre nell’elenco delle applet
    • icon è l’icona che compare nell’elenco delle applet.

Ora, non ci crederete, ma capire come funziona il parametro icon è stata la cosa più difficile di tutto il lavoro! Il file con l’icona non è incluso nella cartella dell’applet, il nome non contiene l’estensione del file e guardando i sorgenti delle altre applet o leggendo la documentazione, non si capisce affatto dove diavolo si trovino i file con le icone e in base a quale criterio si possa usare un’icona piuttosto che un’altra. Né come crearsene una propria. Inoltre, questo parametro servirà anche nel prossimo file, quello che rappresenta l’applet vera e propria e sarà fondamentale per scegliere con quale icona verrà visualizzata la nostra applet nel pannello di cinnamon. Ragion per cui non si tratta di un dettaglio trascurabile, eppure il tutorial che ho seguito non ne parla, lo da per scontato.

Dopo lungo rovistare, ho capito che le icone in questione possono essere legate al tema grafico, ma anche no. Io ho “rubato” un’icona da /usr/share/icons/gnome che si chiama mail-unread.png. Questa icona rappresenta una busta da lettere con sopra una stellina gialla. E’ probabile che, volendo perderci tempo, avrei potuto disegnare la mia icona e buttarla nei vari formati dentro /usr/share/icons/gnome e magari sarebbe anche stata riconosciuta, ma sinceramente al momento non ne valeva la pena. Proseguiamo.

Il secondo file che va creato nella cartella della nostra applet si chiama, manco a dirlo, applet.js ed è l’applet vera e propria.

const Lang = imports.lang;
const Applet = imports.ui.applet;
const GLib = imports.gi.GLib;
const Gettext = imports.gettext.domain('cinnamon-applets');
const _ = Gettext.gettext;
function MyApplet(orientation) {
this._init(orientation);
}
MyApplet.prototype = {
__proto__: Applet.IconApplet.prototype,
_init: function(orientation) {
Applet.IconApplet.prototype._init.call(this, orientation);
try {
this.set_applet_icon_name("mail-unread");
this.set_applet_tooltip(_("Clicca qui per scaricare immediatamente la posta"));
}
catch (e) {
global.logError(e);
}
},
on_applet_clicked: function(event) {
GLib.spawn_command_line_async('fetchmail');
}
};
function main(metadata, orientation) {
let myApplet = new MyApplet(orientation);
return myApplet;
}

 

Potete trovare la spiegazione dettagliata, in inglese, sul significato di ogni riga sul blog di Cinnamon, ma quello che ci interessa sapere è:

try { this.set_applet_icon_name("mail-unread"); this.set_applet_tooltip(_("Clicca qui per scaricare immediatamente la posta")); }

 

Questo blocco di codice imposta, ancora una volta, l’icona da visualizzare e il testo del tooltip che compare quando si posiziona il puntatore del mouse sulla stessa.
L’altro costrutto importante è

on_applet_clicked: function(event) { GLib.spawn_command_line_async('fetchmail'); }

 

Questo dice a Glib di lanciare il comando fetchmail ogni qualvolta verrà cliccata l’icona della nostra applet. Ovvero tutto ciò che ci serve! Naturalmente non c’è nessun feedback visivo sul fatto che il comando sia andato a buon fine e sia realmente successo qualcosa. Eppure funziona! Potete iniziare da subito ad utilizzare la vostra nuova applet, basta andare su “aggiungi applet” e sceglierla dall’elenco delle applet esistenti. Se avete seguito correttamente le istruzioni la troverete lì, in bella mostra, con l’icona che avrete scelto. Come primo tentativo penso che sia sufficiente. Tutto il resto è stato preso da How to make a Cinnamon applet (Force quit applet tutorial) nel blog di Cinnamon, che vi invito a leggere.