2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "applet-struct.h"
24
#include "applet-notifications.h"
25
#include "applet-load-icons.h"
27
static void _cd_folders_remove_all_icons (CairoDockModuleInstance *myApplet);
29
void cd_shortcuts_set_icon_order (Icon *pNewIcon, GList *pIconsList, GCompareFunc comp)
33
g_print ("%s (%s)\n", __func__, pNewIcon->cName);
34
// on cherche la 1ere icone du meme type.
37
for (ic = pIconsList; ic != NULL; ic = ic->next)
40
if (pIcon->iType == pNewIcon->iType)
44
if (! ic0) // si non trouve, on arrete la.
51
if (comp (pNewIcon, pIcon) <= 0)
53
pNewIcon->fOrder = pIcon->fOrder - 1;
54
g_print ("name : %s <= %s -> %.2f\n", pNewIcon->cName, pIcon->cName, pNewIcon->fOrder);
59
for (ic = ic0; ic != NULL; ic = ic->next)
62
g_print (" compare with %s (%.2f)\n", pIcon->cName, pIcon->fOrder);
63
if (pIcon->iType != pNewIcon->iType)
65
g_print (" type differ, break\n");
68
if (comp (pNewIcon, pIcon) < 0)
71
pNewIcon->fOrder = pIcon->fOrder - 1;
74
Icon *pPrevIcon = ic->prev->data;
75
pNewIcon->fOrder = (pIcon->fOrder + pPrevIcon->fOrder) / 2;
77
g_print (" name : %s < %s -> %.2f\n", pNewIcon->cName, pIcon->cName, pNewIcon->fOrder);
80
pNewIcon->fOrder = pIcon->fOrder + 1;
81
g_print (" fOrder <- %.2f\n", pNewIcon->fOrder);
86
static void _manage_event_on_file (CairoDockFMEventType iEventType, const gchar *cBaseURI, GList *pIconsList, CairoContainer *pContainer, CairoDockModuleInstance *myApplet)
88
gchar *cURI = (g_strdup (cBaseURI));
89
cairo_dock_remove_html_spaces (cURI);
90
g_print (" * event %d on '%s'\n", iEventType, cURI);
94
case CAIRO_DOCK_FILE_DELETED : // un fichier a ete supprime (ce peut etre du a un renommage).
96
if (strcmp (myConfig.cDirPath, cBaseURI) == 0)
98
g_print ("our folder has been removed\n");
99
_cd_folders_remove_all_icons (myApplet);
103
Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList/**myData.pAllFiles*/, cURI);
104
if (pConcernedIcon == NULL) // on cherche par nom.
106
pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList/**myData.pAllFiles*/, cURI);
108
if (pConcernedIcon == NULL)
110
cd_warning (" an unknown file was removed");
113
g_print (" %s will be removed\n", pConcernedIcon->cName);
115
// on l'enleve de la liste.
116
///myData.pAllFiles = g_list_remove (myData.pAllFiles, pConcernedIcon);
118
// on l'enleve du container.
119
gboolean bInContainer = CD_APPLET_REMOVE_ICON_FROM_MY_ICONS_LIST (pConcernedIcon); // detruit l'icone.
121
// on la remplace par la 1ere sur la liste d'attente.
124
Icon *pNextIcon = g_list_nth_data (myData.pAllFiles, myConfig.iNbIcons - 1);
125
g_print (" insert next icon : %s\n", pNextIcon?pNextIcon->cBaseURI:"none");
127
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNextIcon);
132
case CAIRO_DOCK_FILE_CREATED : // un point de montage a ete connecte.
134
if (strcmp (myConfig.cDirPath, cBaseURI) == 0)
136
g_print ("our folder has been re-created\n");
137
cairo_dock_launch_task (myData.pTask);
141
//\_______________________ on verifie qu'elle n'existe pas deja.
142
Icon *pSameIcon = cairo_dock_get_icon_with_base_uri (pIconsList/**myData.pAllFiles*/, cURI);
143
if (pSameIcon != NULL)
145
cd_warning ("this file (%s) already exists", pSameIcon->cName);
146
return; // on decide de ne rien faire, c'est surement un signal inutile.
149
//\_______________________ on cree une icone pour cette nouvelle URI.
150
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, myConfig.iSortType);
151
if (pNewIcon == NULL)
153
cd_warning ("couldn't create an icon for this file");
156
pNewIcon->iType = (myConfig.bFoldersFirst && pNewIcon->iVolumeID == -1 ? 6 : 8);
158
//\_______________________ on la place au bon endroit suivant son nom.
159
cd_shortcuts_set_icon_order (pNewIcon, pIconsList/**myData.pAllFiles*/, myData.comp);
160
g_print (" new file : %s, order = %.2f\n", pNewIcon->cName, pNewIcon->fOrder);
162
//\_______________________ on l'insere dans la liste.
163
///myData.pAllFiles = g_list_insert_sorted (myData.pAllFiles, pNewIcon, (GCompareFunc)cairo_dock_compare_icons_order);
165
//\_______________________ si l'ordre est < la derniere icone du container, on l'insere dans celui-ci.
166
/**Icon *pLastIcon = cairo_dock_get_last_icon (pIconsList);
167
if (pLastIcon) // container non vide.
169
guint iCurrentNbIcons = g_list_length (pIconsList);
170
if (pNewIcon->fOrder < pLastIcon->fOrder || iCurrentNbIcons+1 <= myConfig.iNbIcons)
172
g_print (" on l'affiche\n");
173
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
174
pIconsList = CD_APPLET_MY_ICONS_LIST;
176
if (iCurrentNbIcons + 1 > myConfig.iNbIcons) // trop d'icones, on enleve la derniere.
178
g_print ("trop d'icones, on enleve la derniere (%s)\n", pLastIcon->cName);
179
CD_APPLET_DETACH_ICON_FROM_MY_ICONS_LIST (pLastIcon);
183
g_print ("ordre >= %.2f => on ne l'affiche pas\n", pLastIcon->fOrder);
185
else*/ // container vide, on l'insere juste.
187
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pNewIcon);
192
case CAIRO_DOCK_FILE_MODIFIED : // un point de montage a ete (de)monte
194
Icon *pConcernedIcon = cairo_dock_get_icon_with_base_uri (pIconsList, cURI);
195
if (pConcernedIcon == NULL) // on cherche par nom.
197
pConcernedIcon = cairo_dock_get_icon_with_name (pIconsList, cURI);
199
if (pConcernedIcon == NULL)
201
cd_warning (" an unknown file was modified");
204
g_print (" %s is modified\n", pConcernedIcon->cName);
206
//\_______________________ on recupere les infos actuelles.
207
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pContainer, myConfig.iSortType);
208
if (pNewIcon == NULL)
210
cd_warning ("couldn't create an icon for this file");
213
pNewIcon->iType = (myConfig.bFoldersFirst && pNewIcon->iVolumeID == -1 ? 6 : 8);
214
double fCurrentOrder = pConcernedIcon->fOrder;
215
if (myConfig.iSortType == 1 || myConfig.iSortType == 2) // sort by date or size.
216
pConcernedIcon->fOrder = pNewIcon->fOrder;
218
//\_______________________ on gere le changement de nom.
219
if (cairo_dock_strings_differ (pConcernedIcon->cName, pNewIcon->cName)) // le nom a change.
221
g_print (" name changed : '%s' -> '%s'\n", pConcernedIcon->cName, pNewIcon->cName);
222
cairo_dock_set_icon_name (pNewIcon->cName, pConcernedIcon, pContainer);
223
cd_shortcuts_set_icon_order (pConcernedIcon, pIconsList/**myData.pAllFiles*/, myData.comp);
226
//\_______________________ on gere le changement d'image.
227
if (cairo_dock_strings_differ (pConcernedIcon->cFileName, pNewIcon->cFileName))
229
g_print (" image changed : '%s' -> '%s'\n", pConcernedIcon->cFileName, pNewIcon->cFileName);
230
g_free (pConcernedIcon->cFileName);
231
pConcernedIcon->cFileName = g_strdup (pNewIcon->cFileName);
233
if (pConcernedIcon->pIconBuffer != NULL)
234
cairo_dock_load_icon_image (pConcernedIcon, pContainer);
237
//\_______________________ on gere le changement d'ordre (du au changement de nom, d'extension, ou de taille, suivant le classement utilise).
238
if (pConcernedIcon->fOrder != fCurrentOrder)
240
g_print (" order changed : %.2f -> %.2f\n", fCurrentOrder, pConcernedIcon->fOrder);
243
///myData.pAllFiles = g_list_remove (myData.pAllFiles, pConcernedIcon);
244
gboolean bInContainer = CD_APPLET_DETACH_ICON_FROM_MY_ICONS_LIST (pConcernedIcon);
245
pIconsList = CD_APPLET_MY_ICONS_LIST;
249
Icon *pNextIcon = g_list_nth_data (myData.pAllFiles, myConfig.iNbIcons);
250
if (!pNextIcon || pConcernedIcon->fOrder < pNextIcon->fOrder)
252
g_print (" on reinsere l'icone\n");
253
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pConcernedIcon);
258
Icon *pLastIcon = cairo_dock_get_last_icon (pIconsList);
259
if (!pLastIcon || pConcernedIcon->fOrder < pLastIcon->fOrder || g_list_length (pIconsList) < myConfig.iNbIcons)
261
g_print (" on reinsere l'icone\n");
262
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pConcernedIcon);
265
myData.pAllFiles = g_list_insert_sorted (myData.pAllFiles, pConcernedIcon, (GCompareFunc)cairo_dock_compare_icons_order);*/
266
CD_APPLET_ADD_ICON_IN_MY_ICONS_LIST (pConcernedIcon);
268
cairo_dock_free_icon (pNewIcon);
275
static void _cd_folders_on_file_event (CairoDockFMEventType iEventType, const gchar *cURI, CairoDockModuleInstance *myApplet)
277
g_return_if_fail (cURI != NULL);
280
//\________________ On gere l'evenement sur le fichier.
281
GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
282
CairoContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER;
283
CD_APPLET_LEAVE_IF_FAIL (pContainer != NULL);
285
_manage_event_on_file (iEventType, cURI, pIconsList, pContainer, myApplet);
291
void cd_folders_get_data (CairoDockModuleInstance *myApplet)
293
//\_______________________ On recupere les fichiers.
294
gchar *cCommand = NULL;
295
myData.pIconList = cairo_dock_fm_list_directory (myConfig.cDirPath, myConfig.iSortType, 8, myConfig.bShowHiddenFiles, 1e4, &cCommand);
298
//\_______________________ on classe les icones.
299
if (myConfig.bFoldersFirst)
303
for (ic = myData.pIconList; ic != NULL; ic = ic->next)
306
if (pIcon->iVolumeID != 0) // repertoire
311
if (myConfig.iSortType == 0) // sort by name
313
myData.pIconList = g_list_sort (myData.pIconList, (GCompareFunc) cairo_dock_compare_icons_name);
315
else if (myConfig.iSortType == 3) // sort by type
317
myData.pIconList = g_list_sort (myData.pIconList, (GCompareFunc) cairo_dock_compare_icons_extension);
319
else // sort by date or size
321
myData.pIconList = g_list_sort (myData.pIconList, (GCompareFunc) cairo_dock_compare_icons_order);
324
//g_print ("=== files to display: ===\n");
328
for (ic = myData.pIconList; ic != NULL; ic = ic->next)
331
//g_print (" %s (%d)\n", pIcon->cName, pIcon->iVolumeID);
332
pIcon->fOrder = iOrder ++;
337
gboolean cd_folders_load_icons_from_data (CairoDockModuleInstance *myApplet)
339
g_return_val_if_fail (myIcon != NULL, FALSE); // paranoia
342
//\_______________________ On efface l'ancienne liste.
343
CD_APPLET_DELETE_MY_ICONS_LIST;
345
//\_______________________ On charge la nouvelle liste.
346
/**myData.pAllFiles = myData.pIconList;
347
myData.pIconList = NULL;
351
GList *ic, *pList = NULL;
352
for (i = 0, ic = myData.pAllFiles; i < myConfig.iNbIcons && ic != NULL; i++, ic = ic->next)
355
pList = g_list_prepend (pList, pIcon);
357
pList = g_list_reverse (pList);*/
358
CD_APPLET_LOAD_MY_ICONS_LIST (myData.pIconList/**pList*/, myConfig.cRenderer, "Viewport", NULL);
359
///myData.iNbIcons = myConfig.iNbIcons;
360
myData.pIconList = NULL;
362
//\_______________________ On se place en ecoute.
363
cairo_dock_fm_add_monitor_full (myConfig.cDirPath, TRUE, NULL, (CairoDockFMMonitorCallback) _cd_folders_on_file_event, myApplet);
365
CD_APPLET_LEAVE (TRUE);
369
static void _cd_folders_remove_all_icons (CairoDockModuleInstance *myApplet)
371
//\_______________________ On stoppe la tache.
372
cairo_dock_stop_task (myData.pTask);
374
if (myData.pIconList != NULL) // des donnees ont ete recuperees et non utilisees, on les libere.
376
g_list_foreach (myData.pIconList, (GFunc)g_free, NULL);
377
g_list_free (myData.pIconList);
378
myData.pIconList = NULL;
381
//\_______________________ On detruit d'abord les icones non chargees dans le container.
383
GList *ic = g_list_nth (myData.pAllFiles, myData.iNbIcons);
384
for (;ic != NULL; ic = ic->next)
387
g_print (" remove %s\n", pIcon->cName);
388
cairo_dock_free_icon (pIcon);
391
g_list_free (myData.pAllFiles);
392
myData.pAllFiles = NULL;*/
394
//\_______________________ On detruit ensuite les icones chargees dans le container.
395
CD_APPLET_DELETE_MY_ICONS_LIST; // si le container a change entre-temps, le ModuleManager se chargera de nettoyer derriere nous.
396
///myData.iNbIcons = 0;
398
void cd_folders_free_all_data (CairoDockModuleInstance *myApplet)
400
//\_______________________ On arrete de surveiller le repertoire.
401
cairo_dock_fm_remove_monitor_full (myConfig.cDirPath, TRUE, NULL);
403
_cd_folders_remove_all_icons (myApplet);
405
cairo_dock_free_task (myData.pTask);
408
cd_folders_free_apps_list (myApplet);
412
void cd_folders_sort_icons (CairoDockModuleInstance *myApplet, CairoDockFMSortType iSortType)
414
GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
418
case CAIRO_DOCK_FM_SORT_BY_NAME:
421
case CAIRO_DOCK_FM_SORT_BY_DATE:
424
case CAIRO_DOCK_FM_SORT_BY_SIZE:
427
case CAIRO_DOCK_FM_SORT_BY_TYPE: