15
15
#include "cairo-dock-dialogs.h"
16
16
#include "cairo-dock-log.h"
17
17
#include "cairo-dock-dock-manager.h"
18
#include "cairo-dock-desklet.h"
19
#include "cairo-dock-desktop-file-factory.h"
18
20
#include "cairo-dock-file-manager.h"
20
22
extern CairoDockDesktopEnv g_iDesktopEnv;
72
static gpointer _cairo_dock_fm_launch_uri_threaded (gchar *cURI)
74
s_pVFSBackend->launch_uri (cURI);
70
76
gboolean cairo_dock_fm_launch_uri (const gchar *cURI)
72
78
if (s_pVFSBackend != NULL && s_pVFSBackend->launch_uri != NULL)
74
s_pVFSBackend->launch_uri (cURI);
80
//s_pVFSBackend->launch_uri (cURI);
81
GError *erreur = NULL;
82
GThread* pThread = g_thread_create ((GThreadFunc) _cairo_dock_fm_launch_uri_threaded, (gpointer) cURI, FALSE, &erreur);
85
cd_warning ("Attention : %s", erreur->message);
86
g_error_free (erreur);
120
gboolean cairo_dock_fm_mount_full (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoDock *pDock)
133
gboolean cairo_dock_fm_mount_full (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
122
135
if (s_pVFSBackend != NULL && s_pVFSBackend->mount != NULL && iVolumeID > 0)
124
s_pVFSBackend->mount (cURI, iVolumeID, pCallback, icon, pDock);
137
s_pVFSBackend->mount (cURI, iVolumeID, pCallback, icon, pContainer);
131
gboolean cairo_dock_fm_unmount_full (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoDock *pDock)
144
gboolean cairo_dock_fm_unmount_full (const gchar *cURI, int iVolumeID, CairoDockFMMountCallback pCallback, Icon *icon, CairoContainer *pContainer)
133
146
if (s_pVFSBackend != NULL && s_pVFSBackend->unmount != NULL && iVolumeID > 0)
135
s_pVFSBackend->unmount (cURI, iVolumeID, pCallback, icon, pDock);
148
s_pVFSBackend->unmount (cURI, iVolumeID, pCallback, icon, pContainer);
163
gboolean cairo_dock_fm_can_eject (const gchar *cURI)
165
if (s_pVFSBackend != NULL && s_pVFSBackend->can_eject != NULL)
166
return s_pVFSBackend->can_eject (cURI);
171
gboolean cairo_dock_fm_eject_drive (const gchar *cURI)
173
if (s_pVFSBackend != NULL && s_pVFSBackend->eject != NULL)
174
return s_pVFSBackend->eject (cURI);
150
180
gboolean cairo_dock_fm_delete_file (const gchar *cURI)
152
if (s_pVFSBackend != NULL && s_pVFSBackend->delete != NULL)
182
if (s_pVFSBackend != NULL && s_pVFSBackend->delete_file != NULL)
154
return s_pVFSBackend->delete (cURI);
184
return s_pVFSBackend->delete_file (cURI);
181
gchar *cairo_dock_fm_get_trash_path (const gchar *cNearURI, gboolean bCreateIfNecessary)
211
gchar *cairo_dock_fm_get_trash_path (const gchar *cNearURI, gchar **cFileInfoPath)
183
213
if (s_pVFSBackend != NULL && s_pVFSBackend->get_trash_path != NULL)
185
return s_pVFSBackend->get_trash_path (cNearURI, bCreateIfNecessary);
215
return s_pVFSBackend->get_trash_path (cNearURI, cFileInfoPath);
223
Icon *cairo_dock_fm_create_icon_from_URI (const gchar *cURI, CairoDock *pDock)
253
Icon *cairo_dock_fm_create_icon_from_URI (const gchar *cURI, CairoContainer *pContainer)
225
255
if (s_pVFSBackend == NULL || s_pVFSBackend->get_file_info == NULL)
243
273
if (g_iFileSortType == CAIRO_DOCK_FM_SORT_BY_NAME)
275
GList *pList = (CAIRO_DOCK_IS_DOCK (pContainer) ? CAIRO_DOCK (pContainer)->icons : CAIRO_DESKLET (pContainer)->icons);
247
for (ic = pDock->icons; ic != NULL; ic = ic->next)
278
for (ic = pList; ic != NULL; ic = ic->next)
250
if (strcmp (pNewIcon->acName, icon->acName) < 0)
281
if (icon->acName != NULL && strcmp (pNewIcon->acName, icon->acName) < 0)
252
283
if (ic->prev != NULL)
267
cairo_dock_load_one_icon_from_scratch (pNewIcon, CAIRO_CONTAINER (pDock));
298
cairo_dock_load_one_icon_from_scratch (pNewIcon, pContainer);
272
void cairo_dock_fm_create_dock_from_directory (Icon *pIcon)
303
void cairo_dock_fm_create_dock_from_directory (Icon *pIcon, CairoDock *pParentDock)
274
305
if (s_pVFSBackend == NULL)
277
308
g_free (pIcon->acCommand);
278
309
GList *pIconList = cairo_dock_fm_list_directory (pIcon->cBaseURI, g_iFileSortType, CAIRO_DOCK_LAUNCHER, g_bShowHiddenFiles, &pIcon->acCommand);
279
pIcon->pSubDock = cairo_dock_create_subdock_from_scratch (pIconList, pIcon->acName);
310
pIcon->pSubDock = cairo_dock_create_subdock_from_scratch (pIconList, pIcon->acName, pParentDock);
281
312
cairo_dock_update_dock_size (pIcon->pSubDock); // le 'load_buffer' ne le fait pas.
288
static Icon *cairo_dock_fm_alter_icon_if_necessary (Icon *pIcon, CairoDock *pDock)
319
static Icon *cairo_dock_fm_alter_icon_if_necessary (Icon *pIcon, CairoContainer *pContainer)
290
321
if (s_pVFSBackend == NULL)
292
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (pIcon->cBaseURI, pDock);
323
cd_debug ("%s (%s)", __func__, pIcon->cBaseURI);
324
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (pIcon->cBaseURI, pContainer);
293
325
g_return_val_if_fail (pNewIcon != NULL && pNewIcon->acName != NULL, NULL);
295
if (strcmp (pIcon->acName, pNewIcon->acName) != 0 || strcmp (pIcon->acFileName, pNewIcon->acFileName) != 0 || pIcon->fOrder != pNewIcon->fOrder)
327
//g_print ("%s <-> %s (%s <-> <%s)\n", pIcon->acName, pNewIcon->acName, pIcon->acFileName, pNewIcon->acFileName);
328
if (pIcon->acName == NULL || strcmp (pIcon->acName, pNewIcon->acName) != 0 || pNewIcon->acFileName == NULL || strcmp (pIcon->acFileName, pNewIcon->acFileName) != 0 || pIcon->fOrder != pNewIcon->fOrder)
297
330
cd_message (" on remplace %s", pIcon->acName);
298
cairo_dock_remove_one_icon_from_dock (pDock, pIcon);
331
if (CAIRO_DOCK_IS_DOCK (pContainer))
332
cairo_dock_remove_one_icon_from_dock (CAIRO_DOCK (pContainer), pIcon);
335
CAIRO_DESKLET (pContainer)->icons = g_list_remove (CAIRO_DESKLET (pContainer)->icons, pIcon);
299
337
if (pIcon->acDesktopFileName != NULL)
300
338
cairo_dock_fm_remove_monitor (pIcon);
315
353
pNewIcon->fXAtRest = pIcon->fXAtRest;
316
354
pNewIcon->fDrawX = pIcon->fDrawX;
318
cairo_dock_insert_icon_in_dock (pNewIcon, pDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, CAIRO_DOCK_APPLY_RATIO, ! CAIRO_DOCK_INSERT_SEPARATOR); // on met a jour la taille du dock pour le fXMin/fXMax, et eventuellement la taille de l'icone peut aussi avoir change.
320
cairo_dock_redraw_my_icon (pNewIcon, CAIRO_CONTAINER (pDock));
356
if (CAIRO_DOCK_IS_DOCK (pContainer))
357
cairo_dock_insert_icon_in_dock (pNewIcon, CAIRO_DOCK (pContainer), CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, CAIRO_DOCK_APPLY_RATIO, ! CAIRO_DOCK_INSERT_SEPARATOR); // on met a jour la taille du dock pour le fXMin/fXMax, et eventuellement la taille de l'icone peut aussi avoir change.
359
CAIRO_DESKLET (pContainer)->icons = g_list_insert_sorted (CAIRO_DESKLET (pContainer)->icons,
361
(GCompareFunc) cairo_dock_compare_icons_order); // on n'utilise pas le pDesklet->pRenderer->load_icons, car on remplace juste une icone par une autre quasi identique, et on ne sait pas si load_icons a ete utilisee.
362
cairo_dock_redraw_my_icon (pNewIcon, pContainer);
322
364
if (pNewIcon->acDesktopFileName != NULL)
323
365
cairo_dock_fm_add_monitor (pNewIcon);
334
void cairo_dock_fm_manage_event_on_file (CairoDockFMEventType iEventType, const gchar *cURI, Icon *pIcon, CairoDockIconType iTypeOnCreation)
376
void cairo_dock_fm_manage_event_on_file (CairoDockFMEventType iEventType, const gchar *cBaseURI, Icon *pIcon, CairoDockIconType iTypeOnCreation)
336
g_return_if_fail (cURI != NULL && pIcon != NULL);
378
g_return_if_fail (cBaseURI != NULL && pIcon != NULL);
379
gchar *cURI = (g_strdup (cBaseURI));
380
cairo_dock_remove_html_spaces (cURI);
337
381
cd_message ("%s (%d sur %s)", __func__, iEventType, cURI);
339
383
switch (iEventType)
341
385
case CAIRO_DOCK_FILE_DELETED :
343
387
Icon *pConcernedIcon;
344
CairoDock *pParentDock;
388
CairoContainer *pParentContainer;
345
389
if (pIcon->cBaseURI != NULL && strcmp (cURI, pIcon->cBaseURI) == 0)
347
391
pConcernedIcon = pIcon;
348
pParentDock = cairo_dock_search_container_from_icon (pIcon);
392
pParentContainer = cairo_dock_search_container_from_icon (pIcon);
350
394
else if (pIcon->pSubDock != NULL)
366
410
cd_message (" %s sera supprimee", pConcernedIcon->acName);
368
if (CAIRO_DOCK_IS_DOCK (pParentDock))
412
if (CAIRO_DOCK_IS_DOCK (pParentContainer))
370
cairo_dock_remove_one_icon_from_dock (pParentDock, pConcernedIcon); // enleve aussi son moniteur.
371
cairo_dock_update_dock_size (pParentDock);
414
cairo_dock_remove_one_icon_from_dock (CAIRO_DOCK (pParentContainer), pConcernedIcon); // enleve aussi son moniteur.
415
cairo_dock_update_dock_size (CAIRO_DOCK (pParentContainer));
373
417
else if (pConcernedIcon->acDesktopFileName != NULL) // alors elle a un moniteur.
374
418
cairo_dock_fm_remove_monitor (pConcernedIcon);
382
426
if ((pIcon->cBaseURI == NULL || strcmp (cURI, pIcon->cBaseURI) != 0) && pIcon->pSubDock != NULL) // dans des cas foirreux, il se peut que le fichier soit cree alors qu'il existait deja dans le dock.
384
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, pIcon->pSubDock);
428
CairoContainer *pParentContainer = cairo_dock_search_container_from_icon (pIcon);
429
Icon *pNewIcon = cairo_dock_fm_create_icon_from_URI (cURI, (CAIRO_DOCK_IS_DOCK (pParentContainer) ? CAIRO_CONTAINER (pIcon->pSubDock) : pParentContainer));
385
430
if (pNewIcon == NULL)
387
432
pNewIcon->iType = iTypeOnCreation;
389
cairo_dock_insert_icon_in_dock (pNewIcon, pIcon->pSubDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, CAIRO_DOCK_APPLY_RATIO, ! CAIRO_DOCK_INSERT_SEPARATOR);
434
if (CAIRO_DOCK_IS_DOCK (pParentContainer))
435
cairo_dock_insert_icon_in_dock (pNewIcon, pIcon->pSubDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, CAIRO_DOCK_APPLY_RATIO, ! CAIRO_DOCK_INSERT_SEPARATOR);
437
CAIRO_DESKLET (pParentContainer)->icons = g_list_insert_sorted (CAIRO_DESKLET (pParentContainer)->icons,
439
(GCompareFunc) cairo_dock_compare_icons_order);
390
440
cd_message (" %s a ete insere(e)", (pNewIcon != NULL ? pNewIcon->acName : "aucune icone n'"));
392
442
if (pNewIcon->iVolumeID > 0)
398
448
cd_message (" c'est un volume, on considere qu'il vient de se faire (de)monter");
399
449
gchar *cMessage = g_strdup_printf (_("%s is now %s"), pNewIcon->acName, (bIsMounted ? _("mounted") : _("unmounted")));
400
cairo_dock_show_temporary_dialog (cMessage, pNewIcon, pIcon->pSubDock, 4000);
450
cairo_dock_show_temporary_dialog (cMessage, pNewIcon, CAIRO_DOCK_IS_DOCK (pParentContainer) ? CAIRO_CONTAINER (pIcon->pSubDock) : pParentContainer, 4000);
401
451
g_free (cMessage);
407
457
case CAIRO_DOCK_FILE_MODIFIED :
409
459
Icon *pConcernedIcon;
410
CairoDock *pParentDock;
460
CairoContainer *pParentContainer;
411
461
if (pIcon->cBaseURI != NULL && strcmp (pIcon->cBaseURI, cURI) == 0) // c'est l'icone elle-meme.
413
463
pConcernedIcon = pIcon;
414
pParentDock = cairo_dock_search_container_from_icon (pIcon);
415
g_return_if_fail (pParentDock != NULL);
464
pParentContainer = cairo_dock_search_container_from_icon (pIcon);
465
g_return_if_fail (pParentContainer != NULL);
417
467
else if (pIcon->pSubDock != NULL) // c'est a l'interieur du repertoire qu'elle represente.
423
473
pConcernedIcon = cairo_dock_get_icon_with_name (pIcon->pSubDock->icons, cURI);
425
475
g_return_if_fail (pConcernedIcon != NULL);
426
pParentDock = pIcon->pSubDock;
476
pParentContainer = CAIRO_CONTAINER (pIcon->pSubDock);
430
480
cd_warning (" on n'aurait pas du arriver la !");
433
cd_message (" %s est modifiee (iRefCount:%d)", pConcernedIcon->acName, pParentDock->iRefCount);
435
Icon *pNewIcon = cairo_dock_fm_alter_icon_if_necessary (pConcernedIcon, pParentDock);
437
if (pNewIcon != NULL && pNewIcon != pConcernedIcon && pNewIcon->iVolumeID > 0)
483
cd_message (" %s est modifiee", pConcernedIcon->acName);
485
Icon *pNewIcon = cairo_dock_fm_alter_icon_if_necessary (pConcernedIcon, pParentContainer);
487
if (pNewIcon != NULL && pNewIcon->iVolumeID > 0) // && pNewIcon != pConcernedIcon
439
cd_message ("ce volume a change\n");
489
cd_message ("ce volume a change");
440
490
gboolean bIsMounted = FALSE;
441
491
if (s_pVFSBackend->is_mounted != NULL)
446
496
gchar *cMessage = g_strdup_printf (_("%s is now %s"), pNewIcon->acName, (bIsMounted ? _("mounted") : _("unmounted")));
448
cairo_dock_show_temporary_dialog (cMessage, pNewIcon, pParentDock, 4000);
498
cairo_dock_show_temporary_dialog (cMessage, pNewIcon, pParentContainer, 4000);
449
499
g_free (cMessage);
456
507
void cairo_dock_fm_action_on_file_event (CairoDockFMEventType iEventType, const gchar *cURI, Icon *pIcon)
458
509
cairo_dock_fm_manage_event_on_file (iEventType, cURI, pIcon, CAIRO_DOCK_LAUNCHER);
461
void cairo_dock_fm_action_after_mounting (gboolean bMounting, gboolean bSuccess, const gchar *cName, Icon *icon, CairoDock *pDock)
512
void cairo_dock_fm_action_after_mounting (gboolean bMounting, gboolean bSuccess, const gchar *cName, Icon *icon, CairoContainer *pContainer)
463
514
cd_message ("%s (%s) : %d\n", __func__, (bMounting ? "mount" : "unmount"), bSuccess); // en cas de demontage effectif, l'icone n'est plus valide !
464
if ((! bSuccess && pDock != NULL) || icon == NULL) // dans l'autre cas (succes), l'icone peut ne plus etre valide ! mais on s'en fout, puisqu'en cas de succes, il y'aura rechargement de l'icone, et donc on pourra balancer le message a ce moment-la.
515
if ((! bSuccess && pContainer != NULL) || icon == NULL) // dans l'autre cas (succes), l'icone peut ne plus etre valide ! mais on s'en fout, puisqu'en cas de succes, il y'aura rechargement de l'icone, et donc on pourra balancer le message a ce moment-la.
466
517
gchar *cMessage = g_strdup_printf (_("failed to %s %s"), (bMounting ? _("mount") : _("unmount")), cName);
467
518
if (icon != NULL)
468
cairo_dock_show_temporary_dialog (cMessage, icon, pDock, 4000);
519
cairo_dock_show_temporary_dialog (cMessage, icon, pContainer, 4000);
471
522
cairo_dock_show_general_message (cMessage, 4000);
474
524
g_free (cMessage);
480
gboolean cairo_dock_fm_move_into_directory (const gchar *cURI, Icon *icon, CairoDock *pDock)
530
gboolean cairo_dock_fm_move_into_directory (const gchar *cURI, Icon *icon, CairoContainer *pContainer)
482
532
g_return_val_if_fail (cURI != NULL && icon != NULL, FALSE);
483
533
cd_message (" -> copie de %s dans %s", cURI, icon->cBaseURI);
487
537
cd_warning ("Attention : couldn't copy this file.\nCheck that you have writing rights, and that the new does not already exist.");
488
538
gchar *cMessage = g_strdup_printf ("Attention : couldn't copy %s into %s.\nCheck that you have writing rights, and that the name does not already exist.", cURI, icon->cBaseURI);
489
cairo_dock_show_temporary_dialog (cMessage, icon, pDock, 4000);
539
cairo_dock_show_temporary_dialog (cMessage, icon, pContainer, 4000);
490
540
g_free (cMessage);