504
static cairo_surface_t *cairo_dock_duplicate_inhibator_surface_for_appli (cairo_t *pSourceContext, Icon *pInhibatorIcon, double fMaxScale, double *fWidth, double *fHeight)
536
cairo_surface_t *cairo_dock_duplicate_inhibator_surface_for_appli (cairo_t *pSourceContext, Icon *pInhibatorIcon, double fMaxScale, double *fWidth, double *fHeight)
506
double fIconWidthSaturationFactor, fIconHeightSaturationFactor;
507
cairo_dock_calculate_size_fill (fWidth,
509
g_tIconAuthorizedWidth[CAIRO_DOCK_APPLI],
510
g_tIconAuthorizedHeight[CAIRO_DOCK_APPLI],
512
&fIconWidthSaturationFactor,
513
&fIconHeightSaturationFactor);
538
*fWidth = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI];
539
*fHeight = myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI];
515
CairoContainer *pInhibhatorContainer= cairo_dock_search_container_from_icon (pInhibatorIcon);
516
double fInhibatorMaxScale = (CAIRO_DOCK_IS_DOCK (pInhibhatorContainer) ? (1 + g_fAmplitude) / CAIRO_DOCK (pInhibhatorContainer)->fRatio : 1);
541
CairoContainer *pInhibhatorContainer = cairo_dock_search_container_from_icon (pInhibatorIcon);
542
double fInhibatorMaxScale = (CAIRO_DOCK_IS_DOCK (pInhibhatorContainer) ? fMaxScale : 1);
518
544
cairo_surface_t *pSurface = cairo_dock_duplicate_surface (pInhibatorIcon->pIconBuffer,
520
pInhibatorIcon->fWidth * fInhibatorMaxScale,
521
pInhibatorIcon->fHeight * fInhibatorMaxScale,
546
pInhibatorIcon->fWidth * fInhibatorMaxScale / pInhibhatorContainer->fRatio,
547
pInhibatorIcon->fHeight * fInhibatorMaxScale / pInhibhatorContainer->fRatio,
522
548
*fWidth * fMaxScale,
523
549
*fHeight * fMaxScale);
634
660
cd_message (" %s aussi devient inactive", pInhibatorIcon->acName);
635
661
///pInhibatorIcon->bIsActive = FALSE;
636
662
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
637
if (pParentDock != NULL && pParentDock->iSidShrinkDown == 0)
663
if (pParentDock != NULL && ! pParentDock->bIsShrinkingDown)
664
cairo_dock_redraw_my_icon (pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
670
void cairo_dock_update_name_on_inhibators (gchar *cClass, Window Xid, gchar *cNewName)
672
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass);
673
if (pClassAppli != NULL)
676
Icon *pInhibatorIcon;
677
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
679
pInhibatorIcon = pElement->data;
681
if (pInhibatorIcon->Xid == Xid && ! CAIRO_DOCK_IS_APPLET (pInhibatorIcon))
683
CairoDock *pParentDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName);
684
if (pParentDock != NULL)
686
cd_message (" %s change son nom en %s", pInhibatorIcon->acName, cNewName);
687
if (pInhibatorIcon->cInitialName == NULL)
689
pInhibatorIcon->cInitialName = pInhibatorIcon->acName;
690
cd_debug ("pInhibatorIcon->cInitialName <- %s", pInhibatorIcon->cInitialName);
693
g_free (pInhibatorIcon->acName);
694
pInhibatorIcon->acName = NULL;
696
cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pParentDock));
697
cairo_dock_set_icon_name (pCairoContext, (cNewName != NULL ? cNewName : pInhibatorIcon->cInitialName), pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
698
cairo_destroy (pCairoContext);
700
if (pParentDock != NULL && ! pParentDock->bIsShrinkingDown)
638
701
cairo_dock_redraw_my_icon (pInhibatorIcon, CAIRO_CONTAINER (pParentDock));
644
707
Icon *cairo_dock_get_classmate (Icon *pIcon)
646
709
cd_debug ("%s (%s)", __func__, pIcon->cClass);
647
Icon *pClassMate = NULL;
648
710
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (pIcon->cClass);
649
if (pClassAppli != NULL)
653
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
655
pFriendIcon = pElement->data;
656
if (pFriendIcon != NULL) g_print (" friend : %s (%d)\n", pFriendIcon->acName, pFriendIcon->Xid);
657
if (pFriendIcon != NULL && pFriendIcon->Xid != 0)
711
if (pClassAppli == NULL)
714
Icon *pFriendIcon = NULL;
716
for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next)
718
pFriendIcon = pElement->data;
719
if (pFriendIcon == NULL)
721
cd_debug (" friend : %s (%d)", pFriendIcon->acName, pFriendIcon->Xid);
722
if (pFriendIcon->Xid != 0 || pFriendIcon->pSubDock != NULL)
726
for (pElement = pClassAppli->pAppliOfClass; pElement != NULL; pElement = pElement->next)
728
pFriendIcon = pElement->data;
729
if (pFriendIcon != pIcon && pFriendIcon->cParentDockName != NULL && strcmp (pFriendIcon->cParentDockName, CAIRO_DOCK_MAIN_DOCK_NAME) == 0)
739
gboolean cairo_dock_check_class_subdock_is_empty (CairoDock *pDock, const gchar *cClass)
741
cd_debug ("%s (%s, %d)", __func__, cClass, g_list_length (pDock->icons));
742
if (pDock->iRefCount == 0)
744
if (pDock->icons == NULL) // ne devrait plus arriver.
746
cd_warning ("the %s class sub-dock has no element, which is probably an error !\nit will be destroyed.", cClass);
747
CairoDock *pFakeParentDock = NULL;
748
Icon *pFakeClassIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pFakeParentDock);
749
cairo_dock_destroy_dock (pDock, cClass, NULL, NULL);
750
pFakeClassIcon->pSubDock = NULL;
751
cairo_dock_remove_icon_from_dock (pFakeParentDock, pFakeClassIcon);
752
cairo_dock_free_icon (pFakeClassIcon);
753
cairo_dock_update_dock_size (pFakeParentDock);
756
else if (pDock->icons->next == NULL)
758
cd_debug (" le sous-dock de la classe %s n'a plus que 1 element et va etre vide puis detruit", cClass);
759
Icon *pLastClassIcon = pDock->icons->data;
661
for (pElement = pClassAppli->pAppliOfClass; pElement != NULL; pElement = pElement->next)
663
pFriendIcon = pElement->data;
664
if (pFriendIcon != pIcon && pFriendIcon->cParentDockName != NULL && strcmp (pFriendIcon->cParentDockName, CAIRO_DOCK_MAIN_DOCK_NAME) == 0)
761
CairoDock *pFakeParentDock = NULL;
762
Icon *pFakeClassIcon = cairo_dock_search_icon_pointing_on_dock (pDock, &pFakeParentDock);
763
g_return_val_if_fail (pFakeClassIcon != NULL, TRUE);
764
if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (pFakeClassIcon) || CAIRO_DOCK_IS_APPLET (pFakeClassIcon))
766
cairo_dock_detach_icon_from_dock (pLastClassIcon, pDock, FALSE);
767
g_free (pLastClassIcon->cParentDockName);
768
pLastClassIcon->cParentDockName = NULL;
770
cairo_dock_destroy_dock (pDock, cClass, NULL, NULL);
771
pFakeClassIcon->pSubDock = NULL;
772
cd_debug ("sanity check : pFakeClassIcon->Xid : %d", pFakeClassIcon->Xid);
773
cairo_dock_insert_appli_in_dock (pLastClassIcon, g_pMainDock, ! CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
775
else // le sous-dock est donc pointe par un inhibiteur.
777
cd_debug ("trouve l'icone en papier (%x;%x)", pFakeClassIcon, pFakeParentDock);
778
cairo_dock_detach_icon_from_dock (pLastClassIcon, pDock, FALSE);
779
g_free (pLastClassIcon->cParentDockName);
780
pLastClassIcon->cParentDockName = g_strdup (pFakeClassIcon->cParentDockName);
781
pLastClassIcon->fOrder = pFakeClassIcon->fOrder;
783
cd_debug (" on detruit le sous-dock...");
784
cairo_dock_destroy_dock (pDock, cClass, NULL, NULL);
785
pFakeClassIcon->pSubDock = NULL;
787
cd_debug (" et l'icone de paille");
788
cairo_dock_remove_icon_from_dock (pFakeParentDock, pFakeClassIcon);
789
cairo_dock_free_icon (pFakeClassIcon);
791
cd_debug (" puis on re-insere l'appli restante");
792
cairo_dock_insert_icon_in_dock_full (pLastClassIcon, pFakeParentDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, ! CAIRO_DOCK_INSERT_SEPARATOR, NULL);
793
cairo_dock_redraw_icon (pLastClassIcon, CAIRO_CONTAINER (pFakeParentDock)); // on suppose que les tailles des 2 icones sont identiques.
801
static void _cairo_dock_reset_overwrite_exceptions (gchar *cClass, CairoDockClassAppli *pClassAppli, gpointer data)
803
pClassAppli->bUseXIcon = FALSE;
805
void cairo_dock_set_overwrite_exceptions (const gchar *cExceptions)
807
g_hash_table_foreach (s_hClassTable, (GHFunc) _cairo_dock_reset_overwrite_exceptions, NULL);
809
gchar **cClassList = g_strsplit (cExceptions, ";", -1);
810
if (cClassList == NULL || cClassList[0] == NULL || *cClassList[0] == '\0')
812
g_strfreev (cClassList);
815
CairoDockClassAppli *pClassAppli;
817
for (i = 0; cClassList[i] != NULL; i ++)
819
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClassList[i]);
820
pClassAppli->bUseXIcon = TRUE;
823
g_strfreev (cClassList);
826
static void _cairo_dock_reset_group_exceptions (gchar *cClass, CairoDockClassAppli *pClassAppli, gpointer data)
828
pClassAppli->bExpand = FALSE;
830
void cairo_dock_set_group_exceptions (const gchar *cExceptions)
832
g_hash_table_foreach (s_hClassTable, (GHFunc) _cairo_dock_reset_group_exceptions, NULL);
834
gchar **cClassList = g_strsplit (cExceptions, ";", -1);
835
if (cClassList == NULL || cClassList[0] == NULL || *cClassList[0] == '\0')
837
g_strfreev (cClassList);
840
CairoDockClassAppli *pClassAppli;
842
for (i = 0; cClassList[i] != NULL; i ++)
844
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClassList[i]);
845
pClassAppli->bExpand = TRUE;
848
g_strfreev (cClassList);
852
Icon *cairo_dock_get_prev_next_classmate_icon (Icon *pIcon, gboolean bNext)
854
cd_debug ("%s (%s, %s)", __func__, pIcon->cClass, pIcon->acName);
855
g_return_val_if_fail (pIcon->cClass != NULL, NULL);
857
Icon *pActiveIcon = cairo_dock_get_current_active_icon ();
858
if (pActiveIcon == NULL || pActiveIcon->cClass == NULL || strcmp (pActiveIcon->cClass, pIcon->cClass) != 0) // la fenetre active n'est pas de notre classe, on active l'icone fournies en entree.
860
cd_debug ("on active la classe %s", pIcon->cClass);
864
//\________________ on va chercher dans la classe la fenetre active, et prendre la suivante ou la precedente.
865
Icon *pNextIcon = NULL;
866
CairoDockClassAppli *pClassAppli = cairo_dock_get_class (pIcon->cClass);
867
if (pClassAppli == NULL)
870
//\________________ On cherche dans les icones d'applis.
871
Icon *pClassmateIcon;
872
GList *pElement, *ic;
873
for (pElement = pClassAppli->pAppliOfClass; pElement != NULL && pNextIcon == NULL; pElement = pElement->next)
875
pClassmateIcon = pElement->data;
876
cd_debug (" %s est-elle active ?", pClassmateIcon->acName);
877
if (pClassmateIcon->Xid == pActiveIcon->Xid) // on a trouve la fenetre active.
879
cd_debug (" fenetre active trouvee (%s; %d)", pClassmateIcon->acName, pClassmateIcon->Xid);
880
if (bNext) // on prend la 1ere non nulle qui suit.
885
ic = cairo_dock_get_next_element (ic, pClassAppli->pAppliOfClass);
888
cd_debug (" on a fait le tour sans rien trouve");
891
pClassmateIcon = ic->data;
892
if (pClassmateIcon != NULL && pClassmateIcon->Xid != 0)
894
cd_debug (" ok on prend celle-la (%s; %d)", pClassmateIcon->acName, pClassmateIcon->Xid);
895
pNextIcon = pClassmateIcon;
898
cd_debug ("un coup pour rien");
902
else // on prend la 1ere non nulle qui precede.
907
ic = cairo_dock_get_previous_element (ic, pClassAppli->pAppliOfClass);
910
pClassmateIcon = ic->data;
911
if (pClassmateIcon != NULL && pClassmateIcon->Xid != 0)
913
pNextIcon = pClassmateIcon;