77
77
extern int g_tIconAuthorizedWidth[CAIRO_DOCK_NB_TYPES];
78
78
extern int g_tIconAuthorizedHeight[CAIRO_DOCK_NB_TYPES];
79
79
extern gboolean g_bOverWriteXIcons;
81
extern gboolean g_bUseGlitz;
84
gchar *cairo_dock_generate_file_path (gchar *cImageFile)
80
extern gboolean g_bShowThumbnail;
82
extern cairo_surface_t *g_pDropIndicatorSurface;
83
extern double g_fDropIndicatorWidth, g_fDropIndicatorHeight;
84
extern cairo_surface_t *g_pIndicatorSurface[2];
85
extern gboolean g_bLinkIndicatorWithIcon;
86
extern double g_fIndicatorWidth, g_fIndicatorHeight;
88
extern cairo_surface_t *g_pActiveIndicatorSurface;
89
extern double g_fActiveIndicatorWidth, g_fActiveIndicatorHeight;
91
extern cairo_surface_t *g_pDesktopBgSurface;
93
void cairo_dock_free_label_description (CairoDockLabelDescription *pTextDescription)
95
if (pTextDescription == NULL)
97
g_free (pTextDescription->cFont);
98
g_free (pTextDescription);
101
void cairo_dock_copy_label_description (CairoDockLabelDescription *pDestTextDescription, CairoDockLabelDescription *pOrigTextDescription)
103
g_return_if_fail (pOrigTextDescription != NULL && pDestTextDescription != NULL);
104
memcpy (pDestTextDescription, pOrigTextDescription, sizeof (CairoDockLabelDescription));
105
pDestTextDescription->cFont = g_strdup (pOrigTextDescription->cFont);
108
CairoDockLabelDescription *cairo_dock_duplicate_label_description (CairoDockLabelDescription *pOrigTextDescription)
110
g_return_val_if_fail (pOrigTextDescription != NULL, NULL);
111
CairoDockLabelDescription *pTextDescription = g_memdup (pOrigTextDescription, sizeof (CairoDockLabelDescription));
112
pTextDescription->cFont = g_strdup (pOrigTextDescription->cFont);
113
return pTextDescription;
116
gchar *cairo_dock_generate_file_path (const gchar *cImageFile)
86
118
g_return_val_if_fail (cImageFile != NULL, NULL);
87
119
gchar *cImagePath;
173
206
return pNewSurface;
176
cairo_surface_t *cairo_dock_load_image_for_icon (cairo_t *pSourceContext, gchar *cImageFile, double fImageWidth, double fImageHeight)
209
cairo_surface_t *cairo_dock_load_image_for_icon (cairo_t *pSourceContext, const gchar *cImageFile, double fImageWidth, double fImageHeight)
178
211
double fImageWidth_ = fImageWidth, fImageHeight_ = fImageHeight;
179
212
return cairo_dock_load_image (pSourceContext, cImageFile, &fImageWidth_, &fImageHeight_, 0., 1., FALSE);
216
void cairo_dock_load_reflect_on_icon (Icon *icon, cairo_t *pSourceContext, gdouble fMaxScale, gboolean bHorizontalDock, gboolean bDirectionUp)
218
if (g_fAlbedo > 0 && icon->pIconBuffer != NULL && ! (CAIRO_DOCK_IS_APPLET (icon) && icon->acFileName == NULL))
220
icon->pReflectionBuffer = cairo_dock_create_reflection_surface (icon->pIconBuffer,
222
(bHorizontalDock ? icon->fWidth : icon->fHeight) * fMaxScale,
223
(bHorizontalDock ? icon->fHeight : icon->fWidth) * fMaxScale,
228
icon->pFullIconBuffer = cairo_dock_create_icon_surface_with_reflection (icon->pIconBuffer,
229
icon->pReflectionBuffer,
231
(bHorizontalDock ? icon->fWidth : icon->fHeight) * fMaxScale,
232
(bHorizontalDock ? icon->fHeight : icon->fWidth) * fMaxScale,
183
239
void cairo_dock_fill_one_icon_buffer (Icon *icon, cairo_t* pSourceContext, gdouble fMaxScale, gboolean bHorizontalDock, gboolean bApplySizeRestriction, gboolean bDirectionUp)
185
241
//g_print ("%s (%d, %.2f, %s)\n", __func__, icon->iType, fMaxScale, icon->acFileName);
202
258
//\_______________________ On cree la surface cairo a afficher.
203
259
if (cIconPath != NULL && *cIconPath != '\0')
205
//cairo_surface_t *pSurface =cairo_dock_create_surface_from_image (cIconPath,
206
261
icon->pIconBuffer = cairo_dock_create_surface_from_image (cIconPath,
209
264
(bApplySizeRestriction ? g_tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] : icon->fWidth),
210
265
(bApplySizeRestriction ? g_tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] : icon->fHeight),
266
CAIRO_DOCK_FILL_SPACE,
211
267
(bHorizontalDock ? &icon->fWidth : &icon->fHeight),
212
268
(bHorizontalDock ? &icon->fHeight : &icon->fWidth),
214
//g_print (" => %.2fx%.2f\n", icon->fWidth, icon->fHeight);
215
/*int w = (int) icon->fWidth * (1 + g_fAmplitude), h = (int) icon->fHeight * (1 + g_fAmplitude);
216
guchar *pSurfaceData = g_new0 (guchar, w * h * 4);
217
icon->pIconBuffer = cairo_image_surface_create_for_data (pSurfaceData,
222
cd_message (" + (%dx%d)\n", w, h);
224
cairo_t* pCairoContext = cairo_create (icon->pIconBuffer);
225
cairo_set_source_surface (pCairoContext, pSurface, 0.0, 0.0);
226
cairo_paint (pCairoContext);
227
cairo_destroy (pCairoContext);
228
cairo_surface_destroy (pSurface);*/
231
272
g_free (cIconPath);
286
void cairo_dock_fill_one_text_buffer (Icon *icon, cairo_t* pSourceContext, int iLabelSize, gchar *cLabelPolice, gboolean bHorizontalDock, gboolean bDirectionUp)
331
gchar *cairo_dock_cut_string (gchar *cString, int iNbCaracters) // gere l'UTF-8
333
gchar *cTruncatedName = NULL;
334
gsize bytes_read, bytes_written;
335
GError *erreur = NULL;
336
gchar *cUtf8Name = g_locale_to_utf8 (cString,
340
&erreur); // inutile sur Ubuntu, qui est nativement UTF8, mais sur les autres on ne sait pas.
343
cd_warning (erreur->message);
344
g_error_free (erreur);
347
if (cUtf8Name == NULL) // une erreur s'est produite, on tente avec la chaine brute.
348
cUtf8Name = g_strdup (cString);
350
const gchar *cEndValidChain = NULL;
351
if (g_utf8_validate (cUtf8Name, -1, &cEndValidChain))
353
if (g_utf8_strlen (cUtf8Name, -1) > iNbCaracters)
355
cTruncatedName = g_new0 (gchar, 8 * (iNbCaracters + 4)); // 8 octets par caractere.
356
g_utf8_strncpy (cTruncatedName, cUtf8Name, iNbCaracters);
358
gchar *cTruncature = g_utf8_offset_to_pointer (cTruncatedName, iNbCaracters);
360
*(cTruncature+1) = '.';
361
*(cTruncature+2) = '.';
366
if (strlen (cString) > iNbCaracters)
368
cTruncatedName = g_new0 (gchar, iNbCaracters + 4);
369
strncpy (cTruncatedName, cString, iNbCaracters);
371
cTruncatedName[iNbCaracters] = '.';
372
cTruncatedName[iNbCaracters+1] = '.';
373
cTruncatedName[iNbCaracters+2] = '.';
376
if (cTruncatedName == NULL)
377
cTruncatedName = cUtf8Name;
380
//g_print (" -> etiquette : %s\n", cTruncatedName);
381
return cTruncatedName;
384
void cairo_dock_fill_one_text_buffer (Icon *icon, cairo_t* pSourceContext, CairoDockLabelDescription *pTextDescription, gboolean bHorizontalDock, gboolean bDirectionUp)
288
386
//g_print ("%s (%s, %d)\n", __func__, cLabelPolice, iLabelSize);
289
387
cairo_surface_destroy (icon->pTextBuffer);
290
388
icon->pTextBuffer = NULL;
291
if (icon->acName == NULL || (iLabelSize == 0))
389
if (icon->acName == NULL || (pTextDescription->iSize == 0))
294
392
gchar *cTruncatedName = NULL;
295
393
if (CAIRO_DOCK_IS_APPLI (icon) && g_iAppliMaxNameLength > 0)
297
//g_print ("troncature de %s\n", icon->acName);
298
gsize bytes_read, bytes_written;
395
cTruncatedName = cairo_dock_cut_string (icon->acName, g_iAppliMaxNameLength);
396
/**gsize bytes_read, bytes_written;
299
397
GError *erreur = NULL;
300
398
gchar *cUtf8Name = g_locale_to_utf8 (icon->acName,
624
735
g_fBackgroundImageHeight = 0;
625
736
cairo_dock_update_background_decorations_if_necessary (pDock, iWidth, iHeight);
740
void cairo_dock_load_drop_indicator (gchar *cImagePath, cairo_t* pSourceContext, double fMaxScale)
742
if (g_pDropIndicatorSurface != NULL)
743
cairo_surface_destroy (g_pDropIndicatorSurface);
744
g_pDropIndicatorSurface = cairo_dock_create_surface_from_image (cImagePath,
747
g_tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] * fMaxScale,
748
g_tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] * fMaxScale / 2,
749
CAIRO_DOCK_KEEP_RATIO,
750
&g_fDropIndicatorWidth, &g_fDropIndicatorHeight,
755
void cairo_dock_load_task_indicator (const gchar *cIndicatorImagePath, cairo_t* pSourceContext, double fMaxScale, double fIndicatorRatio)
757
cairo_surface_destroy (g_pIndicatorSurface[0]);
758
cairo_surface_destroy (g_pIndicatorSurface[1]);
759
g_pIndicatorSurface[0] = NULL;
760
g_pIndicatorSurface[1] = NULL;
761
if (cIndicatorImagePath != NULL)
763
double fLauncherWidth = (g_tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] != 0 ? g_tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] : 48);
764
double fLauncherHeight = (g_tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] != 0 ? g_tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] : 48);
766
double fScale = (g_bLinkIndicatorWithIcon ? 1 + g_fAmplitude : 1);
767
g_pIndicatorSurface[CAIRO_DOCK_HORIZONTAL] = cairo_dock_create_surface_from_image (
771
fLauncherWidth * fIndicatorRatio,
772
fLauncherHeight * fIndicatorRatio,
773
CAIRO_DOCK_KEEP_RATIO,
777
//g_print ("g_pIndicatorSurface : %.2fx%.2f\n", g_fIndicatorWidth, g_fIndicatorHeight);
778
if (g_pIndicatorSurface[CAIRO_DOCK_HORIZONTAL] != NULL)
779
g_pIndicatorSurface[CAIRO_DOCK_VERTICAL] = cairo_dock_rotate_surface (
780
g_pIndicatorSurface[CAIRO_DOCK_HORIZONTAL],
782
g_fIndicatorWidth * fScale,
783
g_fIndicatorHeight * fScale,
786
cd_warning ("couldn't load image '%s' for indicators", cIndicatorImagePath);
791
void cairo_dock_load_desktop_background_surface (void) // attention : fonction lourde.
793
cairo_surface_destroy (g_pDesktopBgSurface);
794
g_pDesktopBgSurface = NULL;
796
Pixmap iRootPixmapID = cairo_dock_get_window_background_pixmap (cairo_dock_get_root_id ());
797
g_return_if_fail (iRootPixmapID != 0);
799
GdkPixbuf *pBgPixbuf = cairo_dock_get_pixbuf_from_pixmap (iRootPixmapID, FALSE); // on n'y ajoute pas de transparence.
800
if (pBgPixbuf != NULL)
802
cairo_t *pSourceContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (g_pMainDock));
804
if (gdk_pixbuf_get_height (pBgPixbuf) == 1 && gdk_pixbuf_get_width(pBgPixbuf) == 1) // couleur unie.
806
guchar *pixels = gdk_pixbuf_get_pixels (pBgPixbuf);
807
cd_message ("c'est une couleur unie (%.2f, %.2f, %.2f)", (double) pixels[0] / 255, (double) pixels[1] / 255, (double) pixels[2] / 255);
809
g_pDesktopBgSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
810
CAIRO_CONTENT_COLOR_ALPHA,
811
g_iScreenWidth[CAIRO_DOCK_HORIZONTAL],
812
g_iScreenHeight[CAIRO_DOCK_HORIZONTAL]);
814
cairo_t *pCairoContext = cairo_create (g_pDesktopBgSurface);
815
cairo_set_source_rgb (pCairoContext,
816
(double) pixels[0] / 255,
817
(double) pixels[1] / 255,
818
(double) pixels[2] / 255);
819
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
820
cairo_paint (pCairoContext);
821
cairo_destroy (pCairoContext);
825
cairo_t *pSourceContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (g_pMainDock));
826
double fWidth, fHeight;
827
cairo_surface_t *pBgSurface = cairo_dock_create_surface_from_pixbuf (pBgPixbuf,
837
if (fWidth < g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] || fHeight < g_iScreenHeight[CAIRO_DOCK_HORIZONTAL])
839
cd_message ("c'est un degrade ou un motif (%dx%d)", (int) fWidth, (int) fHeight);
840
g_pDesktopBgSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
841
CAIRO_CONTENT_COLOR_ALPHA,
842
g_iScreenWidth[CAIRO_DOCK_HORIZONTAL],
843
g_iScreenHeight[CAIRO_DOCK_HORIZONTAL]);
845
cairo_t *pCairoContext = cairo_create (g_pDesktopBgSurface);
847
cairo_pattern_t *pPattern = cairo_pattern_create_for_surface (pBgSurface);
848
g_return_if_fail (cairo_pattern_status (pPattern) == CAIRO_STATUS_SUCCESS);
849
cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_REPEAT);
851
cairo_set_source (pCairoContext, pPattern);
852
cairo_paint (pCairoContext);
854
cairo_destroy (pCairoContext);
855
cairo_pattern_destroy (pPattern);
856
cairo_surface_destroy (pBgSurface);
860
cd_message ("c'est un fond d'ecran de taille %dx%d", (int) fWidth, (int) fHeight);
861
g_pDesktopBgSurface = pBgSurface;
864
g_object_unref (pBgPixbuf);
867
cairo_destroy (pSourceContext);
871
void cairo_dock_invalidate_desktop_bg_surface (void)
873
if (g_pDesktopBgSurface != NULL)
875
cairo_surface_destroy (g_pDesktopBgSurface);
876
g_pDesktopBgSurface = NULL;
880
cairo_surface_t *cairo_dock_get_desktop_bg_surface (void)
882
if (g_pDesktopBgSurface == NULL)
883
cairo_dock_load_desktop_background_surface ();
884
return g_pDesktopBgSurface;
888
void cairo_dock_load_active_window_indicator (cairo_t* pSourceContext, const gchar *cImagePath, double fMaxScale, double fCornerRadius, double fLineWidth, double *fActiveColor)
890
if (g_pActiveIndicatorSurface != NULL)
891
cairo_surface_destroy (g_pActiveIndicatorSurface);
892
g_fActiveIndicatorWidth = MAX (g_tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER], g_tIconAuthorizedWidth[CAIRO_DOCK_APPLI]);
893
g_fActiveIndicatorHeight = MAX (g_tIconAuthorizedHeight[CAIRO_DOCK_APPLI], g_tIconAuthorizedHeight[CAIRO_DOCK_APPLI]);
894
if (g_fActiveIndicatorWidth == 0)
895
g_fActiveIndicatorWidth = 48;
896
if (g_fActiveIndicatorHeight == 0)
897
g_fActiveIndicatorHeight = 48;
899
if (cImagePath != NULL)
901
g_pActiveIndicatorSurface = cairo_dock_create_surface_for_icon (cImagePath,
903
g_fActiveIndicatorWidth * fMaxScale,
904
g_fActiveIndicatorHeight * fMaxScale);
906
else if (fActiveColor[3] > 0)
908
g_pActiveIndicatorSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
909
CAIRO_CONTENT_COLOR_ALPHA,
910
g_fActiveIndicatorWidth * fMaxScale,
911
g_fActiveIndicatorHeight * fMaxScale);
912
cairo_t *pCairoContext = cairo_create (g_pActiveIndicatorSurface);
914
fCornerRadius = MIN (fCornerRadius, (g_fActiveIndicatorWidth * fMaxScale - fLineWidth) / 2);
915
double fFrameWidth = g_fActiveIndicatorWidth * fMaxScale - (2 * fCornerRadius + fLineWidth);
916
double fFrameHeight = g_fActiveIndicatorHeight * fMaxScale - 2 * fLineWidth;
917
double fDockOffsetX = fCornerRadius + fLineWidth/2;
918
double fDockOffsetY = fLineWidth/2;
919
cairo_dock_draw_frame (pCairoContext, fCornerRadius, fLineWidth, fFrameWidth, fFrameHeight, fDockOffsetX, fDockOffsetY, 1, 0., CAIRO_DOCK_HORIZONTAL);
921
cairo_set_source_rgba (pCairoContext, fActiveColor[0], fActiveColor[1], fActiveColor[2], fActiveColor[3]);
924
cairo_set_line_width (pCairoContext, fLineWidth);
925
cairo_stroke (pCairoContext);
929
cairo_fill (pCairoContext);
931
cairo_destroy (pCairoContext);
935
g_pActiveIndicatorSurface = NULL;