Un service menu è in sostanza qualcosa a cui possiamo accedere cliccando col tasto destro (gli utenti di Mac OS no
)su un file e che viene attivato in base al mimetype. Ad esempio, se clicco su di un file mp3 potrebbe attivarsi una voce “Codifica” che mi permette di codificare il file con un qualsiasi codec audio. Immagino di non aggiungere nulla di nuovo,ma con questo post faremo insieme un piccolo cammino che ci porterà a scrivere un nostro service menu. Praticamente la conoscenza di programmazione si limita a mettere insieme una riga di comando bash, quindi dovrebbe risultare semplice ai più e comunque è una possibiltà di imparare qualcosa di nuovo per i non addetti al lavoro.
Un service menu parte da un’idea,qualcosa che vorreste tanto avere e non c’è.Un buon posto per cominciare è il sito kde-apps dove alla voce service menus sono raccolti molti script già creati. Adesso ne creeremo uno insieme passo passo.
Passo 1: La necessità
Di necessità virtù e allora arrotoliamoci le maniche. Mi serviva convertire un’immagine di un cdrom dal formato cue a iso. Cinque secondi di ricerca e trovo il programma che fa per me. Si chiama bchunk. E’ presente nei repository di Ubuntu e dunque nessun problema. Quello che voglio adesso è ottenere questo service menu
Come vedete sono presenti tre opzioni di conversione, tanto per sfruttare appieno le potenzialità di bchunk.
Passo 2: L’idea prende forma
Iniziamo a creare il nostro service menu. Prima di tutto date un’occhiata a quest’indirizzo per un wiki su come creare un service menu scritto, ai tempi, da Aaron Seigo.
Creiamo un file con un nome qualsiasi a patto che finisca per “.desktop”. Questo è lo standard introdotto per le desktop entries e quindi io ho creato un file chiamato convertIso.desktop : lo so, un notevole sforzo di fantasia!
Analizziamo il contenuto insieme. La prima riga
[Desktop Entry]
dice a KDE di cosa stiamo parlando.Adesso dobbiamo dire a kde a quali file si deve applicare il nostro service menu, nel senso che se clicco su un file mp3 l’opzione di conversione non deve apparire!Per farlo inseriamo
ServiceTypes=application/x-cue
Per sapere a cosa corrisponde l’estensione basta aprire kcontrol e, in associazione file, cercare l’estensione e riportare il percorso completo che in questo caso è “application/x-cue”. ecco un’immagine autoesplicativa
Se dovete creare un menu per le directory allora inserite “inode/directory”, per crearlo per tutti i file basta “all/all”, se invece deve valere per tutti i file ma non per le directory sarà “all/allfiles” .
Adesso dobbiamo inserire una lista di azioni eseguibili che dovremo esplicitare più avanti. In questo caso la conversione ISO, ISO-PSX e ISO-RAW. Inseriamole separate da un punto e virgola così
Actions=convertSimple;convertPsx;convertRaw
Queste azioni non dicono nulla perchè le svilupperemo a breve.Intanto per pulizia sarebbe più carino raccoglierle tutte in un sottomenù che dica “Converti Immagine” e poi scegliere l’opzione come nell’immagine. Per creare questo sottomenu la riga di codice è “X-KDE-Submenu”. Prima di vedere come scriverla vediamo le possibilità che kde ci offre per la localizzazione. E’ possibile creare voci personalizzate a seconda della lingua del sistema semplicemente inserendo un tag che indica il codice delle lingua. Inserendo queste due righe dunque
X-KDE-Submenu[en]=Convert Image
X-KDE-Submenu[it]=Converti immagine
il sottomenu verrà visualizzato diversamente a seconda della lingua in uso nel sistema.Potremo localizzare il service menu molto facilmente per tutte le lingue che vogliamo.
Adesso viene la parte centrale del service menu,ossia quella che si occupa di far avvenire un’azione.Concentriamoci sulla prima azione (creazione di un ISO normale) e poi le altre saranno una leggera modifica di questa.Prima di tutto dobbiamo creare un riga che indica che tutto quello che viene sotto riguarda l’azione “ISO normale”.Il codice è questo:
[Desktop Action convertSimple]
Come vedete dopo “Desktop Action” ho riportato il nome dell’azione come lo avevo definito nella riga Actions. Questa azione dovrà avere un nome da visualizzare, ad esempio “Converti nel formato ISO” attravero il tag “Name”. Anche qui localizziamo il nostro menu:
Name[it]=Converti nel formato ISO
Name[en]=Convert to ISO format
Un’altra personalizzazione che possiamo dare è quella di associare un’icona al comando attraverso il tag Icon. Per scegliere un’icona riferitevi al nome che ha l’icona ma non mettete l’estensione.Ecco la nostra
Icon=cdimage
Adesso il tag più importante:”Exec”.Questo tag ci permette di avviare un’azione e possiamo metterne quanti ne vogliamo in cascata.Il comando deve essere un comando bash,quindi se per esempio il nostro service menu copiasse il file nella nostra home avremmo
cp %u $HOME
Vediamo cosa abbiamo scritto:cp è il comando classico per la copia. %u invece indica il percorso del file su quale abbiamo cliccato.Potete trovare altri %caratteri speciali in questa pagina. $HOME invece è una variabile di sistema generale che indica il percorso alla cartella home dell’utente attualmente loggato. Un altro consiglio che posso darvi per la scrittura della riga Exec è quella di far man bassa di DCOP. Dcop è il sistema di scambio di messaggi in kde ed è di semplicissimo utilizzo.Ogni applicazione lanciata può avere un’interfaccia dcop con la quale interagire. Per sapere quali applicazioni attualmente avviate hanno quetsa interfaccia basta dare dcop in un terminale o usare il tool grafico kdcop. Mettiamo ad esempio di avere Amarok avviato. Se diamo
dcop
troveremo nella lista amarok. Quindi diamo
dcop amarok
per vedere tutte le possibili opzioni.Alla fine per esempio,per andare alla traccia successiva di Amarok basterà dare
dcop amarok player next
Come vedete dcop è uno strumento dannatamente potente per dare comandi a programmi che rispettano lo standard di KDE. Ultima nota,dcop verrà presto sostituito da dbus che è lo standard odierno,ma il funzionamento resta simile.

Continuiamo col nostro service menu. Abbiamo detto che dobbiamo trasformare la nostra immagine .cue in .iso attraverso il comando dato in Exec. Qui sorge un problema; siccome dobbiamo avvalerci di bchunk, ma questo accetta il formato dei parametri
bcunk immagine.bin immagine.cue immagine.iso
dobbiamo operare sulla stringa ritornata da %u per togliere ogni volta l’estensione del file e metterci rispettivamente “.cue”, “.bin” e “.iso”. Il proplema è che a quanto pare non riesco a fare un minimo di gestione delle espressioni regolari attraverso Exec. Di cosa sto parlando?Nel bash-scripting, uno dei modi di ottenere il nome del file senza estensione è quello di valutarne il nome così
${NAME%.*}
dove NAME è il nome del file.Ad esempio se diamo questi comandi in una shell
export NAME=Immagine.cue
echo ${NAME%.*}
> Immagine
Ma questo strataggemma non sembra proprio funzionare attraverso Exec..oppure sono stupido io,cosa perfettamente plausibile!Questo però ci da lo spunto per introdurre un nuovo argomento. Per rendere i nostri servicemenu molto più performanti, possiamo far puntare la riga Exec ad uno script bash scritto direttamente da noi. In questa maniera sarà molto più facile scrivere operazioni complesse che vanno oltre poche righe.Così messo di buona lena ho scritto un piccolo script bash che ci permette di scegliere la cartella di destinazione e il nome del file.iso attraverso una comoda interfaccia grafica in stile kde. Lo scripting non è l’obiettivo di questa guida quindi vi mostro il codice ma non lo commenterò,vi basti sapere che risolve il problema della sostituzione delle estensioni e che, a seconda del parametro passato, faccia ognuna delle tre conversioni preventivate.
#!/bin/bash #version 0.1 #License=GPL3 #Author=Fabrizio "Ramiel" Ruggeri #Mail=ramiel@cheapnet.it #Site=ramielinux.wordpress.comstringa=$1 mode=$2 FIRST=${stringa%.*}.bin SECOND=${stringa%.*}.cue DIRECTORY=`kdialog --getexistingdirectory $PWD` NAME=`kdialog --inputbox "Converter" "Insert here the .iso filename destination"` echo $stringa echo $FIRST echo $SECOND echo $NAMEif [ $mode = 0 ] then bchunk $FIRST $SECOND $DIRECTORY/$NAME kdialog --msgbox "All done,ISO Image created" fiif [ $mode = 1 ] then bchunk $FIRST $SECOND $DIRECTORY/$NAME -p kdialog --msgbox "All done,ISO-PSX Image Created" fiif [ $mode = 2 ] then bchunk $FIRST $SECOND $DIRECTORY/$NAME -r kdialog --msgbox "All done,ISO-RAW image created" fi
Oppure scaricatelo da qui.
Dallo script,per convertire nel formato iso la sintassi che ho scelto è “cue2iso nomefile 0″,quindi la nostra riga Exec sarà
Exec=cue2iso %u 0
Per le altre due voci basterà sostituire 0 con 1 o 2.Ecco il service menu nella sua interezza.
Quest’inclusione di uno script esterno però ci obbliga a scriverne uno anche per l’installazione, e visto che ci siamo facciamo in modo che questo copi il service menu nella cartella corretta che, perl’utente corrente è
/home/utente/.kde/share/apps/konqueror/servicemenus/
ma possono anche essere messi in
/opt/kde3/share/apps/konqueror/servicemenus/
/usr/share/apps/konqueror/servicemenus/
Non parleremo qui dello script di installazione, ma potete trovare tutto su kde-apps a questo indirizzo. Sentitevi pure liberi di scaricare il service menu,dargli un’occhiata e migliorarlo,è pur sempre in GPL!Mi raccomando ogni volta che create qualcosa del genere condividetelo con la comunità,sarà di aiuto anche a voi per migliorarvi sempre.
Adesso largo alla fantasia…create,create,CREATE!
Ultima nota:
Per creare degli script semplici ma che si avvalgono di piccole interfacce grafiche in kde basta usare il comando kdialog. Lanciate
kdialog –help
per avere una lista di finestre che potete creare. Se per esempio volete creare una finestra che vi proponga una scelta del tipo si/no basta dare
kdialog –yesno “Scegliete fra il si e il no”

Se poi volete sapere cosa ha scelto l’utente sappiate che si ottiene il valore di ritorno dalla variabile $? .Quindi se scegli si avrete
echo $?
>0
Avrete un 1 in caso abbia scelto no!Semplice no?!



[...] da NRG (quello di Nero) a CUE (per cui ho scritto un service menu per la conversione ed una guida su come realizzarlo). In realtà per masterizzare tutte queste immagini il problema non si pone [...]