33
34
#include "cairo-dock-config.h"
34
35
#include "cairo-dock-applications-manager.h"
35
36
#include "cairo-dock-draw.h"
36
#include "cairo-dock-load.h"
37
#include "cairo-dock-icon-loader.h"
38
#include "cairo-dock-internal-taskbar.h"
39
#include "cairo-dock-internal-icons.h"
40
#include "cairo-dock-internal-indicators.h"
37
#include "cairo-dock-image-buffer.h"
38
#include "cairo-dock-icon-manager.h"
39
#include "cairo-dock-indicator-manager.h"
41
40
#include "cairo-dock-container.h"
42
41
#include "cairo-dock-animations.h"
43
42
#include "cairo-dock-application-facility.h"
43
#include "cairo-dock-keyfile-utilities.h"
44
#include "cairo-dock-file-manager.h"
44
45
#include "cairo-dock-class-manager.h"
46
47
extern CairoDock *g_pMainDock;
48
extern CairoDockDesktopEnv g_iDesktopEnv;
48
50
static GHashTable *s_hClassTable = NULL;
52
static void cairo_dock_free_class_appli (CairoDockClassAppli *pClassAppli);
51
55
void cairo_dock_initialize_class_manager (void)
68
72
g_return_val_if_fail (cClass != NULL, NULL);
70
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (cClass);
74
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (cClass);
71
75
return (pClassAppli != NULL ? pClassAppli->pAppliOfClass : NULL);
75
static void _cairo_dock_set_same_indicator_on_sub_dock (Icon *pInhibhatorIcon)
77
CairoDock *pInhibhatorDock = cairo_dock_search_dock_from_name (pInhibhatorIcon->cParentDockName);
78
if (pInhibhatorDock != NULL && pInhibhatorDock->iRefCount > 0) // l'inhibiteur est dans un sous-dock.
80
gboolean bSubDockHasIndicator = FALSE;
81
if (pInhibhatorIcon->bHasIndicator)
83
bSubDockHasIndicator = TRUE;
89
for (ic =pInhibhatorDock->icons ; ic != NULL; ic = ic->next)
92
if (icon->bHasIndicator)
94
bSubDockHasIndicator = TRUE;
99
CairoDock *pParentDock = NULL;
100
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pInhibhatorDock, &pParentDock);
101
if (pPointingIcon != NULL && pPointingIcon->bHasIndicator != bSubDockHasIndicator)
103
cd_message (" pour le sous-dock %s : indicateur <- %d", pPointingIcon->cName, bSubDockHasIndicator);
104
pPointingIcon->bHasIndicator = bSubDockHasIndicator;
105
if (pParentDock != NULL)
106
cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pParentDock));
111
void cairo_dock_free_class_appli (CairoDockClassAppli *pClassAppli)
114
Icon *pInhibatorIcon;
115
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
117
pInhibatorIcon = pElement->data;
118
cd_message ("%s perd sa mana", pInhibatorIcon->cName);
119
pInhibatorIcon->Xid = 0;
120
pInhibatorIcon->bHasIndicator = FALSE;
121
_cairo_dock_set_same_indicator_on_sub_dock (pInhibatorIcon);
79
static void cairo_dock_free_class_appli (CairoDockClassAppli *pClassAppli)
123
81
g_list_free (pClassAppli->pIconsOfClass);
124
82
g_list_free (pClassAppli->pAppliOfClass);
83
g_free (pClassAppli->cDesktopFile);
84
if (pClassAppli->pMimeTypes)
85
g_strfreev (pClassAppli->pMimeTypes);
125
86
g_free (pClassAppli);
176
static void _cairo_dock_set_same_indicator_on_sub_dock (Icon *pInhibhatorIcon)
178
CairoDock *pInhibatorDock = cairo_dock_search_dock_from_name (pInhibhatorIcon->cParentDockName);
179
if (pInhibatorDock != NULL && pInhibatorDock->iRefCount > 0) // l'inhibiteur est dans un sous-dock.
181
gboolean bSubDockHasIndicator = FALSE;
182
if (pInhibhatorIcon->bHasIndicator)
184
bSubDockHasIndicator = TRUE;
190
for (ic =pInhibatorDock->icons ; ic != NULL; ic = ic->next)
193
if (icon->bHasIndicator)
195
bSubDockHasIndicator = TRUE;
200
CairoDock *pParentDock = NULL;
201
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pInhibatorDock, &pParentDock);
202
if (pPointingIcon != NULL && pPointingIcon->bHasIndicator != bSubDockHasIndicator)
204
cd_message (" pour le sous-dock %s : indicateur <- %d", pPointingIcon->cName, bSubDockHasIndicator);
205
pPointingIcon->bHasIndicator = bSubDockHasIndicator;
206
if (pParentDock != NULL)
207
cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pParentDock));
215
212
static Window _cairo_dock_detach_appli_of_class (const gchar *cClass, gboolean bDetachAll)
217
214
g_return_val_if_fail (cClass != NULL, 0);
276
273
return XFirstFoundId;
278
gboolean cairo_dock_inhibate_class (const gchar *cClass, Icon *pInhibatorIcon)
275
gboolean cairo_dock_inhibite_class (const gchar *cClass, Icon *pInhibitorIcon)
280
277
g_return_val_if_fail (cClass != NULL, FALSE);
281
278
cd_message ("%s (%s)", __func__, cClass);
283
if (! cairo_dock_add_inhibator_to_class (cClass, pInhibatorIcon)) // on l'insere avant pour que les icones des applis puissent le trouver et prendre sa surface si necessaire.
280
// add inhibitor to class (first, so that applis can find it and take its surface if neccessary)
281
if (! _cairo_dock_add_inhibitor_to_class (cClass, pInhibitorIcon))
286
Window XFirstFoundId = _cairo_dock_detach_appli_of_class (cClass, (TRUE));
287
if (pInhibatorIcon != NULL)
289
pInhibatorIcon->Xid = XFirstFoundId;
290
pInhibatorIcon->bHasIndicator = (XFirstFoundId > 0);
291
_cairo_dock_set_same_indicator_on_sub_dock (pInhibatorIcon);
292
if (pInhibatorIcon->cClass != cClass)
294
g_free (pInhibatorIcon->cClass);
295
pInhibatorIcon->cClass = g_strdup (cClass);
284
// set class name on the inhibitor if not already done.
285
if (pInhibitorIcon && pInhibitorIcon->cClass != cClass)
287
g_free (pInhibitorIcon->cClass);
288
pInhibitorIcon->cClass = g_strdup (cClass);
291
// if launchers are mixed with applis, steal applis icons.
292
if (!myTaskbarParam.bMixLauncherAppli)
294
Window XFirstFoundId = _cairo_dock_detach_appli_of_class (cClass, TRUE); // detach existing applis, and then retach them to the inhibitor.
295
if (pInhibitorIcon != NULL)
297
// inhibitor takes control of the first existing appli of the class.
298
pInhibitorIcon->Xid = XFirstFoundId;
299
pInhibitorIcon->bHasIndicator = (XFirstFoundId > 0);
300
_cairo_dock_set_same_indicator_on_sub_dock (pInhibitorIcon);
302
// other applis icons are retached to the inhibitor.
298
303
const GList *pList = cairo_dock_list_existing_appli_with_class (cClass);
300
305
const GList *pElement;
313
gboolean cairo_dock_class_is_inhibated (const gchar *cClass)
318
gboolean cairo_dock_class_is_inhibited (const gchar *cClass)
315
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (cClass);
320
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (cClass);
316
321
return (pClassAppli != NULL && pClassAppli->pIconsOfClass != NULL);
319
324
gboolean cairo_dock_class_is_using_xicon (const gchar *cClass)
321
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (cClass);
326
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (cClass);
322
327
return (pClassAppli != NULL && pClassAppli->bUseXIcon); // si pClassAppli == NULL, il n'y a pas de lanceur pouvant lui filer son icone, mais on peut en trouver une dans le theme d'icones systeme.
325
330
gboolean cairo_dock_class_is_expanded (const gchar *cClass)
327
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (cClass);
332
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (cClass);
328
333
return (pClassAppli != NULL && pClassAppli->bExpand);
331
gboolean cairo_dock_prevent_inhibated_class (Icon *pIcon)
336
gboolean cairo_dock_prevent_inhibited_class (Icon *pIcon)
333
338
g_return_val_if_fail (pIcon != NULL, FALSE);
334
339
//g_print ("%s (%s)\n", __func__, pIcon->cClass);
336
341
gboolean bToBeInhibited = FALSE;
337
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (pIcon->cClass);
342
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (pIcon->cClass);
338
343
if (pClassAppli != NULL)
340
Icon *pInhibatorIcon;
345
Icon *pInhibitorIcon;
342
347
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
344
pInhibatorIcon = pElement->data;
345
if (pInhibatorIcon != NULL) // un inhibiteur est present.
349
pInhibitorIcon = pElement->data;
350
if (pInhibitorIcon != NULL) // un inhibiteur est present.
347
if (pInhibatorIcon->Xid == 0 && pInhibatorIcon->pSubDock == NULL) // cette icone inhibe cette classe mais ne controle encore aucune appli, on s'y asservit.
352
if (pInhibitorIcon->Xid == 0 && pInhibitorIcon->pSubDock == NULL) // cette icone inhibe cette classe mais ne controle encore aucune appli, on s'y asservit.
349
pInhibatorIcon->Xid = pIcon->Xid;
350
pInhibatorIcon->bIsHidden = pIcon->bIsHidden;
351
cd_message (">>> %s prendra un indicateur au prochain redraw ! (Xid : %d)", pInhibatorIcon->cName, pInhibatorIcon->Xid);
352
pInhibatorIcon->bHasIndicator = TRUE;
353
_cairo_dock_set_same_indicator_on_sub_dock (pInhibatorIcon);
354
pInhibitorIcon->Xid = pIcon->Xid;
355
pInhibitorIcon->bIsHidden = pIcon->bIsHidden;
356
cd_message (">>> %s prendra un indicateur au prochain redraw ! (Xid : %d)", pInhibitorIcon->cName, pInhibitorIcon->Xid);
357
pInhibitorIcon->bHasIndicator = TRUE;
358
_cairo_dock_set_same_indicator_on_sub_dock (pInhibitorIcon);
356
if (pInhibatorIcon->Xid == pIcon->Xid) // cette icone nous controle.
361
if (pInhibitorIcon->Xid == pIcon->Xid) // cette icone nous controle.
358
CairoDock *pInhibhatorDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
363
CairoDock *pInhibatorDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
359
364
//\______________ On place l'icone pour X.
360
365
if (! bToBeInhibited) // on ne met le thumbnail que sur la 1ere.
362
if (pInhibhatorDock != NULL)
367
if (pInhibatorDock != NULL)
364
//g_print ("on positionne la miniature sur l'inhibiteur %s\n", pInhibatorIcon->cName);
365
cairo_dock_set_one_icon_geometry_for_window_manager (pInhibatorIcon, pInhibhatorDock);
369
//g_print ("on positionne la miniature sur l'inhibiteur %s\n", pInhibitorIcon->cName);
370
cairo_dock_set_one_icon_geometry_for_window_manager (pInhibitorIcon, pInhibatorDock);
367
372
bToBeInhibited = TRUE;
369
374
//\______________ On met a jour l'etiquette de l'inhibiteur.
370
if (pInhibhatorDock != NULL && pIcon->cName != NULL)
375
if (pInhibatorDock != NULL && pIcon->cName != NULL)
372
if (pInhibatorIcon->cInitialName == NULL)
373
pInhibatorIcon->cInitialName = pInhibatorIcon->cName;
377
if (pInhibitorIcon->cInitialName == NULL)
378
pInhibitorIcon->cInitialName = pInhibitorIcon->cName;
375
g_free (pInhibatorIcon->cName);
376
pInhibatorIcon->cName = NULL;
377
cairo_dock_set_icon_name (pIcon->cName, pInhibatorIcon, CAIRO_CONTAINER (pInhibhatorDock));
380
g_free (pInhibitorIcon->cName);
381
pInhibitorIcon->cName = NULL;
382
cairo_dock_set_icon_name (pIcon->cName, pInhibitorIcon, CAIRO_CONTAINER (pInhibatorDock));
387
gboolean cairo_dock_remove_icon_from_class (Icon *pInhibatorIcon)
392
static gboolean _cairo_dock_remove_icon_from_class (Icon *pInhibitorIcon)
389
g_return_val_if_fail (pInhibatorIcon != NULL, FALSE);
390
cd_message ("%s (%s)", __func__, pInhibatorIcon->cClass);
394
g_return_val_if_fail (pInhibitorIcon != NULL, FALSE);
395
cd_message ("%s (%s)", __func__, pInhibitorIcon->cClass);
392
gboolean bStillInhibated = FALSE;
393
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (pInhibatorIcon->cClass);
397
gboolean bStillInhibited = FALSE;
398
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (pInhibitorIcon->cClass);
394
399
if (pClassAppli != NULL)
396
pClassAppli->pIconsOfClass = g_list_remove (pClassAppli->pIconsOfClass, pInhibatorIcon);
401
pClassAppli->pIconsOfClass = g_list_remove (pClassAppli->pIconsOfClass, pInhibitorIcon);
397
402
if (pClassAppli->pIconsOfClass == NULL && pClassAppli->pAppliOfClass == NULL && ! pClassAppli->bUseXIcon) // cette classe ne sert plus a rien.
399
404
cd_message (" cette classe n'a plus d'interet");
400
g_hash_table_remove (s_hClassTable, pInhibatorIcon->cClass); // detruit pClassAppli.
401
bStillInhibated = FALSE;
405
g_hash_table_remove (s_hClassTable, pInhibitorIcon->cClass); // detruit pClassAppli.
406
bStillInhibited = FALSE;
404
bStillInhibated = (pClassAppli->pIconsOfClass != NULL);
409
bStillInhibited = (pClassAppli->pIconsOfClass != NULL);
406
return bStillInhibated;
411
return bStillInhibited;
409
void cairo_dock_deinhibate_class (const gchar *cClass, Icon *pInhibatorIcon)
414
void cairo_dock_deinhibite_class (const gchar *cClass, Icon *pInhibitorIcon)
411
416
cd_message ("%s (%s)", __func__, cClass);
412
gboolean bStillInhibated = cairo_dock_remove_icon_from_class (pInhibatorIcon);
413
cd_debug (" bStillInhibated : %d", bStillInhibated);
414
///if (! bStillInhibated) // il n'y a plus personne dans cette classe.
417
gboolean bStillInhibited = _cairo_dock_remove_icon_from_class (pInhibitorIcon);
418
cd_debug (" bStillInhibited : %d", bStillInhibited);
419
///if (! bStillInhibited) // il n'y a plus personne dans cette classe.
417
if (pInhibatorIcon == NULL || pInhibatorIcon->Xid != 0)
422
if (pInhibitorIcon == NULL || pInhibitorIcon->Xid != 0)
419
424
const GList *pList = cairo_dock_list_existing_appli_with_class (cClass);
440
445
if (bNeedsRedraw)
441
446
gtk_widget_queue_draw (g_pMainDock->container.pWidget); /// pDock->pRenderer->calculate_icons (pDock); ?...
443
if (pInhibatorIcon != NULL)
448
if (pInhibitorIcon != NULL)
445
450
cd_message (" l'inhibiteur a perdu toute sa mana");
446
pInhibatorIcon->Xid = 0;
447
pInhibatorIcon->bHasIndicator = FALSE;
448
g_free (pInhibatorIcon->cClass);
449
pInhibatorIcon->cClass = NULL;
451
pInhibitorIcon->Xid = 0;
452
pInhibitorIcon->bHasIndicator = FALSE;
453
g_free (pInhibitorIcon->cClass);
454
pInhibitorIcon->cClass = NULL;
450
455
cd_debug (" plus de classe");
455
void cairo_dock_update_Xid_on_inhibators (Window Xid, const gchar *cClass)
460
void cairo_dock_update_Xid_on_inhibitors (Window Xid, const gchar *cClass)
457
462
cd_message ("%s (%s)", __func__, cClass);
458
CairoDockClassAppli *pClassAppli = cairo_dock_find_class_appli (cClass);
463
CairoDockClassAppli *pClassAppli = _cairo_dock_lookup_class_appli (cClass);
459
464
if (pClassAppli != NULL)
461
466
int iNextXid = -1;
558
Icon *pInhibatorIcon;
563
Icon *pInhibitorIcon;
559
564
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
561
pInhibatorIcon = pElement->data;
562
cd_debug (" %s", pInhibatorIcon->cName);
563
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibatorIcon))
566
pInhibitorIcon = pElement->data;
567
cd_debug (" %s", pInhibitorIcon->cName);
568
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibitorIcon))
565
if (pInhibatorIcon->pSubDock == NULL || myIndicators.bUseClassIndic) // dans le cas d'un lanceur qui aurait deja plusieurs instances de sa classe, et qui les representerait en pile, on ne prend pas son icone.
567
cd_debug ("%s va fournir genereusement sa surface", pInhibatorIcon->cName);
568
return cairo_dock_duplicate_inhibator_surface_for_appli (pInhibatorIcon, iWidth, iHeight);
570
if (pInhibitorIcon->pSubDock == NULL || myIndicatorsParam.bUseClassIndic) // dans le cas d'un lanceur qui aurait deja plusieurs instances de sa classe, et qui les representerait en pile, on ne prend pas son icone.
572
cd_debug ("%s va fournir genereusement sa surface", pInhibitorIcon->cName);
573
return cairo_dock_duplicate_inhibitor_surface_for_appli (pInhibitorIcon, iWidth, iHeight);
575
else if (pInhibitorIcon->cFileName != NULL)
577
gchar *cIconFilePath = cairo_dock_search_icon_s_path (pInhibitorIcon->cFileName);
578
if (cIconFilePath != NULL)
580
cd_debug ("on remplace l'icone X par %s", cIconFilePath);
581
cairo_surface_t *pSurface = cairo_dock_create_surface_from_image_simple (cIconFilePath,
584
g_free (cIconFilePath);
590
void cairo_dock_update_visibility_on_inhibators (const gchar *cClass, Window Xid, gboolean bIsHidden)
608
void cairo_dock_update_visibility_on_inhibitors (const gchar *cClass, Window Xid, gboolean bIsHidden)
592
610
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
593
611
if (pClassAppli != NULL)
596
Icon *pInhibatorIcon;
614
Icon *pInhibitorIcon;
597
615
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
599
pInhibatorIcon = pElement->data;
617
pInhibitorIcon = pElement->data;
601
if (pInhibatorIcon->Xid == Xid)
619
if (pInhibitorIcon->Xid == Xid)
603
cd_debug (" %s aussi se %s", pInhibatorIcon->cName, (bIsHidden ? "cache" : "montre"));
604
pInhibatorIcon->bIsHidden = bIsHidden;
605
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibatorIcon) && myTaskBar.fVisibleAppliAlpha != 0)
621
cd_debug (" %s aussi se %s", pInhibitorIcon->cName, (bIsHidden ? "cache" : "montre"));
622
pInhibitorIcon->bIsHidden = bIsHidden;
623
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibitorIcon) && myTaskbarParam.fVisibleAppliAlpha != 0)
607
CairoDock *pInhibhatorDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
608
pInhibatorIcon->fAlpha = 1; // on triche un peu.
609
cairo_dock_redraw_icon (pInhibatorIcon, CAIRO_CONTAINER (pInhibhatorDock));
625
CairoDock *pInhibatorDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
626
pInhibitorIcon->fAlpha = 1; // on triche un peu.
627
cairo_dock_redraw_icon (pInhibitorIcon, CAIRO_CONTAINER (pInhibatorDock));
616
void cairo_dock_update_activity_on_inhibators (const gchar *cClass, Window Xid)
634
void cairo_dock_update_activity_on_inhibitors (const gchar *cClass, Window Xid)
618
636
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
619
637
if (pClassAppli != NULL)
622
Icon *pInhibatorIcon;
640
Icon *pInhibitorIcon;
623
641
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
625
pInhibatorIcon = pElement->data;
643
pInhibitorIcon = pElement->data;
627
if (pInhibatorIcon->Xid == Xid)
645
if (pInhibitorIcon->Xid == Xid)
629
cd_debug (" %s aussi devient active", pInhibatorIcon->cName);
630
///pInhibatorIcon->bIsActive = TRUE;
631
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
647
cd_debug (" %s aussi devient active", pInhibitorIcon->cName);
648
///pInhibitorIcon->bIsActive = TRUE;
649
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
632
650
if (pParentDock != NULL)
633
cairo_dock_animate_icon_on_active (pInhibatorIcon, pParentDock);
651
cairo_dock_animate_icon_on_active (pInhibitorIcon, pParentDock);
639
void cairo_dock_update_inactivity_on_inhibators (const gchar *cClass, Window Xid)
657
void cairo_dock_update_inactivity_on_inhibitors (const gchar *cClass, Window Xid)
641
659
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
642
660
if (pClassAppli != NULL)
645
Icon *pInhibatorIcon;
663
Icon *pInhibitorIcon;
646
664
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
648
pInhibatorIcon = pElement->data;
666
pInhibitorIcon = pElement->data;
650
if (pInhibatorIcon->Xid == Xid)
668
if (pInhibitorIcon->Xid == Xid)
652
cd_debug (" %s aussi devient inactive", pInhibatorIcon->cName);
653
///pInhibatorIcon->bIsActive = FALSE;
654
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
670
cd_debug (" %s aussi devient inactive", pInhibitorIcon->cName);
671
///pInhibitorIcon->bIsActive = FALSE;
672
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
655
673
if (pParentDock != NULL && ! pParentDock->bIsShrinkingDown)
656
cairo_dock_redraw_icon (pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
674
cairo_dock_redraw_icon (pInhibitorIcon, CAIRO_CONTAINER (pParentDock));
662
void cairo_dock_update_name_on_inhibators (const gchar *cClass, Window Xid, gchar *cNewName)
680
void cairo_dock_update_name_on_inhibitors (const gchar *cClass, Window Xid, gchar *cNewName)
664
682
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
665
683
if (pClassAppli != NULL)
668
Icon *pInhibatorIcon;
686
Icon *pInhibitorIcon;
669
687
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
671
pInhibatorIcon = pElement->data;
689
pInhibitorIcon = pElement->data;
673
if (pInhibatorIcon->Xid == Xid)
691
if (pInhibitorIcon->Xid == Xid)
675
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
693
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
676
694
if (pParentDock != NULL)
678
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibatorIcon))
696
if (! CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibitorIcon))
680
cd_debug (" %s change son nom en %s", pInhibatorIcon->cName, cNewName);
681
if (pInhibatorIcon->cInitialName == NULL)
698
cd_debug (" %s change son nom en %s", pInhibitorIcon->cName, cNewName);
699
if (pInhibitorIcon->cInitialName == NULL)
683
pInhibatorIcon->cInitialName = pInhibatorIcon->cName;
684
cd_debug ("pInhibatorIcon->cInitialName <- %s", pInhibatorIcon->cInitialName);
701
pInhibitorIcon->cInitialName = pInhibitorIcon->cName;
702
cd_debug ("pInhibitorIcon->cInitialName <- %s", pInhibitorIcon->cInitialName);
687
g_free (pInhibatorIcon->cName);
688
pInhibatorIcon->cName = NULL;
705
g_free (pInhibitorIcon->cName);
706
pInhibitorIcon->cName = NULL;
690
cairo_dock_set_icon_name ((cNewName != NULL ? cNewName : pInhibatorIcon->cInitialName), pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
708
cairo_dock_set_icon_name ((cNewName != NULL ? cNewName : pInhibitorIcon->cInitialName), pInhibitorIcon, CAIRO_CONTAINER (pParentDock));
692
710
if (! pParentDock->bIsShrinkingDown)
693
cairo_dock_redraw_icon (pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
711
cairo_dock_redraw_icon (pInhibitorIcon, CAIRO_CONTAINER (pParentDock));
976
996
// on cherche un inhibiteur de cette classe, de preference un lanceur.
977
997
Icon *pSameClassIcon = NULL;
978
998
CairoDock *pDock;
979
Icon *pInhibatorIcon;
999
Icon *pInhibitorIcon;
981
1001
for (ic = pClassAppli->pIconsOfClass; ic != NULL; ic = ic->next)
983
pInhibatorIcon = ic->data;
984
if (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibatorIcon) && myIcons.iSeparateIcons)
1003
pInhibitorIcon = ic->data;
1004
if (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibitorIcon) && myIconsParam.iSeparateIcons)
986
pDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
1006
pDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
987
1007
if (!pDock || !pDock->bIsMainDock)
988
pInhibatorIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
989
pSameClassIcon = pInhibatorIcon;
990
if (CAIRO_DOCK_IS_LAUNCHER (pSameClassIcon)) // on prend les lanceurs de preference.
1008
pInhibitorIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
1009
pSameClassIcon = pInhibitorIcon;
1010
if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pSameClassIcon)) // on prend les lanceurs de preference.
1085
1105
// on touve un inhibiteur par rapport auquel se placer.
1086
1106
Icon *pSameClassIcon = NULL;
1087
Icon *pInhibatorIcon;
1107
Icon *pInhibitorIcon;
1088
1108
CairoDock *pParentDock;
1090
1110
for (ic = pClassAppli->pIconsOfClass; ic != NULL; ic = ic->next)
1092
pInhibatorIcon = ic->data;
1093
if (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibatorIcon) && myIcons.iSeparateIcons)
1112
pInhibitorIcon = ic->data;
1113
if (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pInhibitorIcon) && myIconsParam.iSeparateIcons)
1096
pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
1116
pParentDock = cairo_dock_search_dock_from_name (pInhibitorIcon->cParentDockName);
1097
1117
CairoDock *pDock;
1098
1118
while (pParentDock && pParentDock->iRefCount != 0)
1100
1120
pDock = pParentDock;
1101
pInhibatorIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pParentDock);
1121
pInhibitorIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pParentDock);
1103
1123
if (!pParentDock || !pParentDock->bIsMainDock) // on place les icones d'applis dans le main dock.
1105
pSameClassIcon = pInhibatorIcon;
1106
if (CAIRO_DOCK_IS_LAUNCHER (pSameClassIcon)) // on prend les lanceurs de preference aux applets.
1125
pSameClassIcon = pInhibitorIcon;
1126
if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pSameClassIcon)) // on prend les lanceurs de preference aux applets.
1162
1182
int iMaxOrder = (pLastIcon ? pLastIcon->fOrder + 1 : 1);
1163
1183
g_hash_table_foreach (s_hClassTable, (GHFunc) _cairo_dock_reorder_one_class, &iMaxOrder);
1186
static gchar *_search_class_desktop_file (const gchar *cClass)
1188
gboolean bFound = TRUE;
1189
GString *sDesktopFilePath = g_string_new ("");
1190
g_string_printf (sDesktopFilePath, "/usr/share/applications/%s.desktop", cClass);
1191
if (! g_file_test (sDesktopFilePath->str, G_FILE_TEST_EXISTS))
1193
g_string_printf (sDesktopFilePath, "/usr/share/applications/xfce4/%s.desktop", cClass);
1194
if (! g_file_test (sDesktopFilePath->str, G_FILE_TEST_EXISTS))
1196
g_string_printf (sDesktopFilePath, "/usr/share/applications/kde4/%s.desktop", cClass);
1197
if (! g_file_test (sDesktopFilePath->str, G_FILE_TEST_EXISTS))
1204
gchar *cDesktopFile;
1207
cDesktopFile = sDesktopFilePath->str;
1208
g_string_free (sDesktopFilePath, FALSE);
1212
cDesktopFile = NULL;
1213
g_string_free (sDesktopFilePath, TRUE);
1214
cd_debug ("couldn't find the .desktop for %s", cClass);
1216
return cDesktopFile;
1219
static void _cairo_dock_find_class_attributes (const gchar *cClass)
1221
g_return_if_fail (cClass != NULL);
1222
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
1224
// if we already searched the attributes beforehand, quit.
1225
if (pClassAppli->bSearchedAttributes)
1227
pClassAppli->bSearchedAttributes = TRUE;
1229
// look for the .desktop file in the common locations.
1230
pClassAppli->cDesktopFile = _search_class_desktop_file (cClass);
1232
// if found, get the attributes.
1233
if (pClassAppli->cDesktopFile != NULL)
1235
GKeyFile *pKeyFile = cairo_dock_open_key_file (pClassAppli->cDesktopFile);
1239
pClassAppli->pMimeTypes = g_key_file_get_string_list (pKeyFile, "Desktop Entry", "MimeType", &length, NULL);
1240
pClassAppli->cCommand = g_key_file_get_string (pKeyFile, "Desktop Entry", "Exec", NULL);
1241
if (pClassAppli->cCommand != NULL)
1243
gchar *str = strchr (pClassAppli->cCommand, '%');
1245
*str = '\0'; // il peut rester un espace en fin de chaine, ce n'est pas grave.
1247
cd_debug ("check: set command '%s' to class %s", pClassAppli->cCommand, cClass);
1248
g_key_file_free (pKeyFile);
1254
static inline CairoDockClassAppli *_get_class_appli_with_attributes (const gchar *cClass)
1256
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
1257
if (! pClassAppli->bSearchedAttributes)
1259
_cairo_dock_find_class_attributes (cClass);
1263
const gchar *cairo_dock_get_class_command (const gchar *cClass)
1265
g_return_val_if_fail (cClass != NULL, NULL);
1266
CairoDockClassAppli *pClassAppli = _get_class_appli_with_attributes (cClass);
1267
return pClassAppli->cCommand;
1270
const gchar **cairo_dock_get_class_mimetypes (const gchar *cClass)
1272
g_return_val_if_fail (cClass != NULL, NULL);
1273
CairoDockClassAppli *pClassAppli = _get_class_appli_with_attributes (cClass);
1274
return (const gchar **)pClassAppli->pMimeTypes;
1277
const gchar *cairo_dock_get_class_desktop_file (const gchar *cClass)
1279
g_return_val_if_fail (cClass != NULL, NULL);
1280
CairoDockClassAppli *pClassAppli = _get_class_appli_with_attributes (cClass);
1281
return pClassAppli->cDesktopFile;
1285
void cairo_dock_get_class_attributes (const gchar *cClass, GKeyFile *pKeyFile)
1287
g_return_if_fail (cClass != NULL && pKeyFile != NULL);
1288
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
1292
pClassAppli->pMimeTypes = g_key_file_get_string_list (pKeyFile, "Desktop Entry", "MimeType", &length, NULL);
1295
gchar *cCommand = g_key_file_get_string (pKeyFile, "Desktop Entry", "Exec", NULL);
1296
if (cCommand != NULL)
1298
gchar *str = strchr (cCommand, '%');
1300
*str = '\0'; // il peut rester un espace en fin de chaine, ce n'est pas grave.
1302
cd_debug ("check: set command '%s' to class %s", pClassAppli->cCommand, cClass);
1304
// modify the command if it should be launched in a terminal.
1305
gchar *cCommandFull = NULL;
1306
gboolean bExecInTerminal = g_key_file_get_boolean (pKeyFile, "Desktop Entry", "Terminal", NULL);
1307
if (bExecInTerminal)
1309
const gchar *cTerm = g_getenv ("COLORTERM");
1310
if (cTerm != NULL && strlen (cTerm) > 1) // on filtre les cas COLORTERM=1 ou COLORTERM=y. ce qu'on veut c'est le nom d'un terminal.
1311
cCommandFull = g_strdup_printf ("%s -e \"%s\"", cTerm, cCommand);
1312
else if (g_iDesktopEnv == CAIRO_DOCK_GNOME)
1313
cCommandFull = g_strdup_printf ("gnome-terminal -e \"%s\"", cCommand);
1314
else if (g_iDesktopEnv == CAIRO_DOCK_XFCE)
1315
cCommandFull = g_strdup_printf ("xfce4-terminal -e \"%s\"", cCommand);
1316
else if (g_iDesktopEnv == CAIRO_DOCK_KDE)
1317
cCommandFull = g_strdup_printf ("konsole -e \"%s\"", cCommand);
1318
else if (g_getenv ("TERM") != NULL)
1319
cCommandFull = g_strdup_printf ("%s -e \"%s\"", g_getenv ("TERM"), cCommand);
1321
cCommandFull = g_strdup_printf ("xterm -e \"%s\"", cCommand);
1324
// get the working directory.
1325
gchar *cWorkingDirectory = g_key_file_get_string (pKeyFile, "Desktop Entry", "Path", NULL);
1326
if (cWorkingDirectory != NULL && *cWorkingDirectory == '\0')
1328
g_free (cWorkingDirectory);
1329
cWorkingDirectory = NULL;
1332
pClassAppli->cCommand = cCommand;