Magazine Tecnologia

Creare link di cartelle nel desktop di Kde 4

Creato il 03 settembre 2010 da Faster

kde-logo

L'argomento di cui sto per parlarvi in questo articolo non è altro che un mio complesso nato quando uscirono le prime versioni di Kde4. Tutto iniziò un paio di anni or sono, credo, quando mi accorsi che il collegamento alla cartella Home nel desktop di kde (mi riferisco a Folder View eh!) altro non è che un file .ini (per provare basta cliccare col tasto destro del mouse ed aprirlo con kwrite). In effetti non è una novità, dopotutto il funzionamento è piuttosto simile a quello dei collegamenti alle applicazioni nel menu. Ma non sarebbe bastato creare un collegamento vecchio stile come in Windows invece di usare un macchinoso file ini? Ovviamente si, è possibilissimo collegare qualsiasi cartella al desktop semplicemente trascinandola col mouse. Il collegamento creato funzionerà tranquillamente, porterà alla cartella alla quale questo punta, ma

guardando nella barra degli indirizzi si noterà, con orribile orrore, l'innotabile! Facciamo un esempio esplicativo: mettiamo il caso che io volessi collegare la cartella /home/utente/Documents/Giochi/ al desktop. La trascinerò nel desktop, la rilascerò come collegamento ed essa apparirà in tutto il suo splendore con tanto di freccetta incorporata nel Folder View. Tutto sembrerà filare liscio fin quando non noteremo che questa porterà a /home/utente/Desktop/Giochi/ e non a /home/utente/Documents/Giochi/. Questo è orribile per dinci bacco! Sante sfere celesti, non che il contenuto della cartella punterà chissà dove, infatti il collegamento, anche se nella barra degli indirizzi l'url non sarà esattamente uguale a quello originale, porterà sempre alla cartella d'origine! Però i miei fragili sentimenti non possono reggere tutto questo e dunque sarebbe meglio, secondo me, creare un semplice ma allo stesso tempo elegante file ini che mi permette di accedere alla cartella dei giochi portandomi all'indirizzo originale senza quell'antiestetica freccia che continua a ripetere “sono un collegamento”!

Dunque, dopo circa due anni mi sono ripromesso di ricreare uno script che in automatico, mi creasse l'ini della cartella da mettere comodamente sul desktop. Ripromesso perché due anni fa ne feci uno in python che persi in una sciagurata formattazione! Siccome a me piace complicarmi la vita, ho riscritto il tutto in C (quindi adesso non è più uno script ma un programma).

In pratica il programma chiede come parametri

  • la cartella che vogliamo collegare al desktop

  • la cartella in cui salvare il file (che presumibilmente sarà /home/utente/Desktop)

In poche parole il programma, internamente, estrae, dall'url passato, il nome della cartella di cui si vuole fare il collegamento. Per esempio, se la cartella è /home/utente/Cartella, questi estrarrà la parola Cartella. In secondo luogo, se la cartella usa un'icona personalizzata, verrà analizzato il file .directory al suo interno per estrarne il nome dell'icona.

Alla fine il file Cartella.desktop verrà creato nella cartella di destinazione.

Ecco il codice:

/*
============================================================================
Name : makedesktopfile.c
Author : Faster
Version : 0.1
Copyright : GNU - GPL
Description : Programma che permette di creare file desktop di cartelle
============================================================================
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
 
char *dirName(char *src);
int makeDesktopFile(char *name, char *icon, char *url, char *dest);
void printHelp();
char *folderIcon(char *dir);
 
int main(int argc, char **argv) {
// Parametri: percorso cartella, percorso in cui salvare
 
if (argc == 3) {
char *icon = folderIcon(argv[1]);
char *currentDirName = dirName(argv[1]);
 
if (!makeDesktopFile(currentDirName, icon, argv[1], argv[2])) {
printf("Errore: Impossibile scrivere il file.\n");
exit(1);
}
}
else if (argc == 2)
printf("Inserire 2 argomenti.\n");
else
printHelp();
 
return 0;
}
 
char *folderIcon(char *dir)
{
char fileName[strlen(dir) + strlen("/.directory") - 1];
strcpy(fileName, dir);
strcat(fileName, "/.directory");
char *icon = "folder";
 
FILE *fp;
fp = fopen(fileName, "r");
 
char buffer[255];
 
if (fp != NULL) {
while (fscanf(fp, "%s", buffer) > 0) {
if (strncmp(buffer, "Icon", 4) == 0) {
/*
* Cerca la stringa del tipo "Icon=mia-icona"
* e ricava la sottostringa mia-icona
*/
 
icon = (char *)malloc(sizeof(buffer+5));
strcpy(icon, buffer+5);
 
break;
}
}
fclose(fp);
}
 
return icon;
}
 
/* Restituisce il nome di una cartella */
char *dirName(char *src)
{
char *src2 = (char *)malloc(strlen(src));    // Copia di src per evitare che argv[1] venga sovrascritto
strcpy(src2, src);
 
char *pch = strtok(src2, "/");
 
while (pch != NULL) {
strcpy(src2, pch);
pch = strtok(NULL, "/");
}
 
src2 = (char *)realloc(src2, strlen(src2));
 
return src2;
}
 
int makeDesktopFile(char *name, char *icon, char *url, char *dest)
{
int len = strlen(dest)+strlen(name)+strlen(".desktop")+1;
char *fileName = (char *)malloc(len);
 
strcpy(fileName, dest);
strcat(fileName, "/");
strcat(fileName, name);
strcat(fileName, ".desktop");
 
FILE *fp = fopen(fileName, "w");
free(fileName);
 
if (fp) {
fprintf(fp, "[Desktop Entry]\n");
fprintf(fp, "Encoding=UTF-8\n");
fprintf(fp, "Name=%s\n", name);
fprintf(fp, "URL[$e]=%s\n", url);
fprintf(fp, "Icon=%s\n", icon);
fprintf(fp, "Type=Link\n");
fprintf(fp, "OnlyShowIn=KDE");
 
fclose(fp);
 
return 1;
}
else
return 0;
 
return 1;
}
 
void printHelp()
{
printf("Questo programma permette di creare file per il desktop di Kde partendo da una cartella.\n");
printf("Uso:\n");
printf(" makedesktopfile \"/home/user/my src folder\" \"/home/user/my dest folder\"\n");
printf("\n");
}

Per compilare il programma basta dare

gcc makedesktopfile.c -o makedesktop file

ed usarlo con la sintassi

./ makedesktop /cartella/di/partenza /cartella/di/destinazione

Tengo a precisare che il programma in questione non è nulla di ufficiale o di ufficioso. Piuttosto è un modo per esercitarmi in C! Sealed



Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :

Dossier Paperblog

Magazine