177
182
g_return_if_fail (keyfile != NULL);
179
184
icon->iType = CAIRO_DOCK_LAUNCHER;
180
g_free (icon->acDesktopFileName);
181
icon->acDesktopFileName = g_strdup (cDesktopFileName);
183
g_free (icon->acFileName);
184
icon->acFileName = g_key_file_get_string (keyfile, "Desktop Entry", "Icon", &erreur);
187
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
188
g_error_free (erreur);
191
if (icon->acFileName != NULL && *icon->acFileName == '\0')
193
g_free (icon->acFileName);
194
icon->acFileName = NULL;
198
g_free (icon->acName);
199
icon->acName = g_key_file_get_locale_string (keyfile, "Desktop Entry", "Name", NULL, &erreur);
202
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
203
g_error_free (erreur);
206
if (icon->acName != NULL && *icon->acName == '\0')
208
g_free (icon->acName);
212
g_free (icon->acCommand);
213
icon->acCommand = g_key_file_get_string (keyfile, "Desktop Entry", "Exec", &erreur);
216
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
217
g_error_free (erreur);
220
if (icon->acCommand != NULL && *icon->acCommand == '\0')
222
g_free (icon->acCommand);
223
icon->acCommand = NULL;
185
g_free (icon->cDesktopFileName);
186
icon->cDesktopFileName = g_strdup (cDesktopFileName);
188
g_free (icon->cFileName);
189
icon->cFileName = g_key_file_get_string (keyfile, "Desktop Entry", "Icon", &erreur);
192
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
193
g_error_free (erreur);
196
if (icon->cFileName != NULL && *icon->cFileName == '\0')
198
g_free (icon->cFileName);
199
icon->cFileName = NULL;
203
g_free (icon->cName);
204
icon->cName = g_key_file_get_locale_string (keyfile, "Desktop Entry", "Name", NULL, &erreur);
207
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
208
g_error_free (erreur);
211
if (icon->cName != NULL && *icon->cName == '\0')
213
g_free (icon->cName);
217
g_free (icon->cCommand);
218
icon->cCommand = g_key_file_get_string (keyfile, "Desktop Entry", "Exec", &erreur);
221
cd_warning ("while trying to load %s : %s", cDesktopFileName, erreur->message);
222
g_error_free (erreur);
225
if (icon->cCommand != NULL && *icon->cCommand == '\0')
227
g_free (icon->cCommand);
228
icon->cCommand = NULL;
226
if (icon->acCommand != NULL)
231
if (icon->cCommand != NULL)
228
233
g_free (icon->cWorkingDirectory);
229
234
icon->cWorkingDirectory = g_key_file_get_string (keyfile, "Desktop Entry", "Path", NULL);
334
339
gboolean bPreventFromInhibating = g_key_file_get_boolean (keyfile, "Desktop Entry", "prevent inhibate", NULL); // FALSE si la cle n'existe pas.
336
341
g_free (icon->cClass);
337
if (icon->acCommand != NULL && icon->cBaseURI == NULL) /// ! bPreventFromInhibating &&
342
if (icon->cCommand != NULL && icon->cBaseURI == NULL) /// ! bPreventFromInhibating &&
339
344
gchar *cStartupWMClass = g_key_file_get_string (keyfile, "Desktop Entry", "StartupWMClass", NULL);
340
345
if (cStartupWMClass == NULL || *cStartupWMClass == '\0')
347
// plusieurs cas sont possibles :
350
// Exec=/path/to/toto -x -y
352
// Exec=gksu --description /usr/share/applications/synaptic.desktop /usr/sbin/synaptic
342
353
g_free (cStartupWMClass);
343
cStartupWMClass = g_ascii_strdown (icon->acCommand, -1);
344
gchar *str = strchr (cStartupWMClass, ' ');
347
if (strcmp (cStartupWMClass, "gksu") == 0 || strcmp (cStartupWMClass, "kdesu") == 0)
348
icon->cClass = str + 1;
354
cStartupWMClass = g_ascii_strdown (icon->cCommand, -1);
355
gchar *str, *cClass = cStartupWMClass;
357
if (strncmp (cClass, "gksu", 4) == 0 || strncmp (cClass, "kdesu", 4) == 0) // on prend la fin .
359
while (cClass[strlen(cClass)-1] == ' ') // par securite on enleve les espaces en fin de ligne.
360
cClass[strlen(cClass)-1] = '\0';
361
str = strrchr (cClass, ' '); // on cherche le dernier espace.
362
if (str != NULL) // on prend apres.
364
str = strrchr (cClass, '/'); // on cherche le dernier '/'.
365
if (str != NULL) // on prend apres.
350
icon->cClass = cStartupWMClass;
352
while (*icon->cClass == ' ')
355
if (*icon->cClass == '/')
357
str = strrchr (icon->cClass, '/'); // forcement non NULL.
358
icon->cClass = str + 1;
370
while (*cClass == ' ') // par securite on enleve les espaces en debut de ligne.
372
str = strchr (cClass, ' '); // on cherche le premier espace.
373
if (str != NULL) // on vire apres.
375
str = strrchr (cClass, '/'); // on cherche le dernier '/'.
376
if (str != NULL) // on prend apres.
361
if (*icon->cClass != '\0')
362
icon->cClass = g_strdup (icon->cClass);
381
icon->cClass = g_strdup (cClass);
364
383
icon->cClass = NULL;
365
384
cd_message ("no class defined for the launcher %s\n we will assume that its class is '%s'", cDesktopFileName, icon->cClass);
401
419
Icon *icon = g_new0 (Icon, 1);
402
420
cairo_dock_load_icon_info_from_desktop_file (cDesktopFileName, icon);
403
g_return_val_if_fail (icon->acDesktopFileName != NULL, NULL);
421
g_return_val_if_fail (icon->cDesktopFileName != NULL, NULL);
405
423
CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
406
424
cairo_dock_fill_icon_buffers_for_dock (icon, pSourceContext, pParentDock)
408
cd_message ("+ %s/%s", icon->acName, icon->cClass);
409
if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon) && icon->acCommand != NULL && icon->cClass != NULL) // pas un lanceur de sous-dock.
426
cd_message ("+ %s/%s", icon->cName, icon->cClass);
427
if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon) && icon->cClass != NULL)
410
428
cairo_dock_inhibate_class (icon->cClass, icon);
415
void cairo_dock_reload_icon_from_desktop_file (const gchar *cDesktopFileName, cairo_t *pSourceContext, Icon *icon)
435
void cairo_dock_reload_launcher (Icon *icon)
437
if (icon->cDesktopFileName == NULL || strcmp (icon->cDesktopFileName, "none") == 0)
439
cd_warning ("tried to reload a launcher whereas this icon (%s) is obviously not a launcher", icon->cName);
442
GError *erreur = NULL;
444
//\_____________ On assure la coherence du nouveau fichier de conf.
445
if (CAIRO_DOCK_IS_LAUNCHER (icon))
447
gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
448
GKeyFile* pKeyFile = cairo_dock_open_key_file (cDesktopFilePath);
449
g_return_if_fail (pKeyFile != NULL);
451
if (icon->pSubDock != NULL) // on assure l'unicite du nom du sous-dock ici, car cela n'est volontairement pas fait dans la fonction de creation de l'icone.
453
gchar *cName = g_key_file_get_string (pKeyFile, "Desktop Entry", "Name", NULL);
454
if (cName == NULL || *cName == '\0')
455
cName = g_strdup ("dock");
456
if (icon->cName == NULL || strcmp (icon->cName, cName) != 0) // le nom a change.
458
gchar *cUniqueName = cairo_dock_get_unique_dock_name (cName);
459
if (strcmp (cName, cUniqueName) != 0)
461
g_key_file_set_string (pKeyFile, "Desktop Entry", "Name", cUniqueName);
462
cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
464
g_free (cUniqueName);
468
if (icon->cCommand != NULL) // on assure que ca reste un lanceur.
470
gchar *cCommand = g_key_file_get_string (pKeyFile, "Desktop Entry", "Exec", NULL);
471
if (cCommand == NULL || *cCommand == '\0')
473
cCommand = g_strdup ("no command");
474
g_key_file_set_string (pKeyFile, "Desktop Entry", "Exec", cCommand);
475
cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
479
if (icon->cBaseURI != NULL) // on assure que ca reste un fichier.
481
gchar *cBaseURI = g_key_file_get_string (pKeyFile, "Desktop Entry", "Base URI", NULL);
482
if (cBaseURI == NULL || *cBaseURI == '\0')
484
cBaseURI = g_strdup (icon->cBaseURI);
485
g_key_file_set_string (pKeyFile, "Desktop Entry", "Base URI", cBaseURI);
486
cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath);
491
g_key_file_free (pKeyFile);
492
g_free (cDesktopFilePath);
495
//\_____________ On memorise son etat.
496
gchar *cPrevDockName = icon->cParentDockName;
497
icon->cParentDockName = NULL;
498
CairoDock *pDock = cairo_dock_search_dock_from_name (cPrevDockName); // changement de l'ordre ou du container.
499
double fOrder = icon->fOrder;
500
///Window Xid = icon->Xid;
501
CairoDock *pSubDock = icon->pSubDock;
502
icon->pSubDock = NULL;
503
gchar *cClass = icon->cClass;
505
gchar *cDesktopFileName = icon->cDesktopFileName;
506
icon->cDesktopFileName = NULL;
507
gchar *cName = icon->cName;
509
gchar *cRendererName = NULL;
510
if (pSubDock != NULL)
512
cRendererName = pSubDock->cRendererName;
513
pSubDock->cRendererName = NULL;
516
//\_____________ On recharge l'icone.
517
cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
417
518
cairo_dock_load_icon_info_from_desktop_file (cDesktopFileName, icon);
418
g_return_if_fail (icon->acDesktopFileName != NULL);
519
g_return_if_fail (icon->cDesktopFileName != NULL);
420
521
CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
421
cairo_dock_fill_icon_buffers_for_dock (icon, pSourceContext, pParentDock)
522
cairo_dock_fill_icon_buffers_for_dock (icon, pCairoContext, pParentDock)
524
if (cName && ! icon->cName)
525
icon->cName = g_strdup (" ");
529
//\_____________ On gere le sous-dock.
532
if (icon->pSubDock == NULL)
533
icon->pSubDock = pSubDock;
534
else // ne devrait pas arriver (une icone de container n'est pas un lanceur pouvant prendre un Xid).
535
cairo_dock_destroy_dock (pSubDock, cName, g_pMainDock, CAIRO_DOCK_MAIN_DOCK_NAME);
539
if (pSubDock != icon->pSubDock) // ca n'est plus le meme container, on transvase ou on detruit.
541
cairo_dock_destroy_dock (pSubDock, cName, icon->pSubDock, icon->cName);
545
if (icon->pSubDock != NULL && pSubDock == icon->pSubDock) // c'est le meme sous-dock, son rendu a pu changer.
547
if (cairo_dock_strings_differ (cRendererName, icon->pSubDock->cRendererName))
548
cairo_dock_update_dock_size (icon->pSubDock);
551
//\_____________ On gere le changement de container ou d'ordre.
552
CairoDock *pNewDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
553
g_return_if_fail (pNewDock != NULL);
555
if (pDock != pNewDock) // on la detache de son container actuel et on l'insere dans le nouveau.
557
cairo_dock_detach_icon_from_dock (icon, pDock, TRUE);
558
if (pDock->icons == NULL && pDock->iRefCount == 0 && ! pDock->bIsMainDock) // on supprime les docks principaux vides.
560
cd_message ("dock %s vide => a la poubelle", cPrevDockName);
561
cairo_dock_destroy_dock (pDock, cPrevDockName, NULL, NULL);
566
cairo_dock_update_dock_size (pDock);
567
cairo_dock_calculate_dock_icons (pDock);
568
gtk_widget_queue_draw (pDock->container.pWidget);
570
cairo_dock_insert_icon_in_dock (icon, pNewDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
574
icon->fWidth *= pNewDock->container.fRatio;
575
icon->fHeight *= pNewDock->container.fRatio;
576
cairo_dock_refresh_launcher_gui ();
577
if (icon->fOrder != fOrder) // On gere le changement d'ordre.
579
pNewDock->pFirstDrawnElement = NULL;
580
pNewDock->icons = g_list_remove (pNewDock->icons, icon);
581
pNewDock->icons = g_list_insert_sorted (pNewDock->icons,
583
(GCompareFunc) cairo_dock_compare_icons_order);
584
cairo_dock_update_dock_size (pDock); // la largeur max peut avoir ete influencee par le changement d'ordre.
588
//\_____________ On gere l'inhibition de sa classe.
589
gchar *cNowClass = icon->cClass;
590
if (cClass != NULL && (cNowClass == NULL || strcmp (cNowClass, cClass) != 0))
592
icon->cClass = cClass;
593
cairo_dock_deinhibate_class (cClass, icon);
594
cClass = NULL; // libere par la fonction precedente.
595
icon->cClass = cNowClass;
597
if (cNowClass != NULL && (cClass == NULL || strcmp (cNowClass, cClass) != 0))
598
cairo_dock_inhibate_class (cNowClass, icon);
600
//\_____________ On redessine les docks impactes.
601
cairo_dock_calculate_dock_icons (pNewDock);
602
cairo_dock_redraw_container (CAIRO_CONTAINER (pNewDock));
604
g_free (cPrevDockName);
606
g_free (cDesktopFileName);
608
g_free (cRendererName);
609
cairo_destroy (pCairoContext);
610
cairo_dock_mark_theme_as_modified (TRUE);