2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
28
#include <glitz-glx.h>
29
#include <cairo-glitz.h>
32
#include <gtk/gtkgl.h>
34
#include "cairo-dock-draw.h"
35
#include "cairo-dock-icons.h"
36
#include "cairo-dock-surface-factory.h"
37
#include "cairo-dock-launcher-factory.h"
38
#include "cairo-dock-application-factory.h"
39
#include "cairo-dock-separator-factory.h"
40
#include "cairo-dock-applet-factory.h"
41
#include "cairo-dock-dock-factory.h"
42
#include "cairo-dock-modules.h"
43
#include "cairo-dock-log.h"
44
#include "cairo-dock-dock-manager.h"
45
#include "cairo-dock-class-manager.h"
46
#include "cairo-dock-X-utilities.h"
47
#include "cairo-dock-draw-opengl.h"
48
#include "cairo-dock-internal-taskbar.h"
49
#include "cairo-dock-internal-indicators.h"
50
#include "cairo-dock-internal-labels.h"
51
#include "cairo-dock-internal-background.h"
52
#include "cairo-dock-internal-icons.h"
53
#include "cairo-dock-container.h"
54
#include "cairo-dock-desklet.h"
55
#include "cairo-dock-dialogs.h"
56
#include "cairo-dock-data-renderer.h"
57
#include "cairo-dock-flying-container.h"
58
#include "cairo-dock-emblem.h"
59
#include "cairo-dock-load.h"
61
extern CairoDock *g_pMainDock;
63
extern gint g_iXScreenWidth[2]; // change tous les g_iScreen par g_iXScreen le 28/07/2009
64
extern gint g_iXScreenHeight[2];
66
extern gchar *g_cCurrentThemePath;
68
extern CairoDockImageBuffer g_pDockBackgroundBuffer;
69
extern CairoDockImageBuffer g_pVisibleZoneBuffer;
70
extern CairoDockImageBuffer g_pIndicatorBuffer;
71
extern CairoDockImageBuffer g_pActiveIndicatorBuffer;
72
extern CairoDockImageBuffer g_pClassIndicatorBuffer;
73
extern CairoDockImageBuffer g_pIconBackgroundBuffer;
74
extern CairoDockImageBuffer g_pBoxAboveBuffer;
75
extern CairoDockImageBuffer g_pBoxBelowBuffer;
77
extern GLuint g_pGradationTexture[2];
79
extern gboolean g_bUseOpenGL;
81
static CairoDockDesktopBackground *s_pDesktopBg = NULL;
82
static cairo_t *s_pSourceContext = NULL;
84
void cairo_dock_free_label_description (CairoDockLabelDescription *pTextDescription)
86
if (pTextDescription == NULL)
88
g_free (pTextDescription->cFont);
89
g_free (pTextDescription);
92
void cairo_dock_copy_label_description (CairoDockLabelDescription *pDestTextDescription, CairoDockLabelDescription *pOrigTextDescription)
94
g_return_if_fail (pOrigTextDescription != NULL && pDestTextDescription != NULL);
95
memcpy (pDestTextDescription, pOrigTextDescription, sizeof (CairoDockLabelDescription));
96
pDestTextDescription->cFont = g_strdup (pOrigTextDescription->cFont);
99
CairoDockLabelDescription *cairo_dock_duplicate_label_description (CairoDockLabelDescription *pOrigTextDescription)
101
g_return_val_if_fail (pOrigTextDescription != NULL, NULL);
102
CairoDockLabelDescription *pTextDescription = g_memdup (pOrigTextDescription, sizeof (CairoDockLabelDescription));
103
pTextDescription->cFont = g_strdup (pOrigTextDescription->cFont);
104
return pTextDescription;
107
gchar *cairo_dock_generate_file_path (const gchar *cImageFile)
109
g_return_val_if_fail (cImageFile != NULL, NULL);
111
if (*cImageFile == '~')
113
cImagePath = g_strdup_printf ("%s%s", getenv("HOME"), cImageFile + 1);
115
else if (*cImageFile == '/')
117
cImagePath = g_strdup (cImageFile);
121
cImagePath = g_strdup_printf ("%s/%s", g_cCurrentThemePath, cImageFile);
127
#define _get_source_context(...) \
129
if (s_pSourceContext == NULL) {\
130
if (g_pMainDock == NULL) return;\
131
s_pSourceContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (g_pMainDock)); }\
133
#define _destroy_source_context(...) do {\
134
if (s_pSourceContext != NULL) {\
135
cairo_destroy (s_pSourceContext);\
136
s_pSourceContext = NULL; } } while (0)
138
void cairo_dock_load_image_buffer_full (CairoDockImageBuffer *pImage, const gchar *cImageFile, int iWidth, int iHeight, CairoDockLoadImageModifier iLoadModifier, double fAlpha)
140
if (cImageFile == NULL)
142
cairo_t *pSourceContext = _get_source_context ();
143
gchar *cImagePath = cairo_dock_generate_file_path (cImageFile);
145
pImage->pSurface = cairo_dock_create_surface_from_image (
160
cairo_surface_t *pNewSurfaceAlpha = _cairo_dock_create_blank_surface (pSourceContext,
163
cairo_t *pCairoContext = cairo_create (pNewSurfaceAlpha);
165
cairo_set_source_surface (pCairoContext, pImage->pSurface, 0, 0);
166
cairo_paint_with_alpha (pCairoContext, fAlpha);
167
cairo_destroy (pCairoContext);
169
cairo_surface_destroy (pImage->pSurface);
170
pImage->pSurface = pNewSurfaceAlpha;
174
pImage->iTexture = cairo_dock_create_texture_from_surface (pImage->pSurface);
179
void cairo_dock_load_image_buffer_from_surface (CairoDockImageBuffer *pImage, cairo_surface_t *pSurface, int iWidth, int iHeight)
181
pImage->pSurface = pSurface;
182
pImage->iWidth = iWidth;
183
pImage->iHeight = iHeight;
185
pImage->iTexture = cairo_dock_create_texture_from_surface (pImage->pSurface);
188
CairoDockImageBuffer *cairo_dock_create_image_buffer (const gchar *cImageFile, int iWidth, int iHeight, CairoDockLoadImageModifier iLoadModifier)
190
CairoDockImageBuffer *pImage = g_new0 (CairoDockImageBuffer, 1);
192
cairo_dock_load_image_buffer (pImage, cImageFile, iWidth, iHeight, iLoadModifier);
197
void cairo_dock_unload_image_buffer (CairoDockImageBuffer *pImage)
199
if (pImage->pSurface != NULL)
201
cairo_surface_destroy (pImage->pSurface);
203
if (pImage->iTexture != 0)
205
_cairo_dock_delete_texture (pImage->iTexture);
207
memset (pImage, 0, sizeof (CairoDockImageBuffer));
210
void cairo_dock_free_image_buffer (CairoDockImageBuffer *pImage)
214
cairo_dock_unload_image_buffer (pImage);
224
void cairo_dock_add_reflection_to_icon (cairo_t *pSourceContext, Icon *pIcon, CairoContainer *pContainer)
228
g_return_if_fail (pIcon != NULL && pContainer!= NULL);
229
if (pIcon->pReflectionBuffer != NULL)
230
cairo_surface_destroy (pIcon->pReflectionBuffer);
233
cairo_dock_get_icon_extent (pIcon, pContainer, &iWidth, &iHeight);
234
pIcon->pReflectionBuffer = cairo_dock_create_reflection_surface (pIcon->pIconBuffer,
238
myIcons.fReflectSize * cairo_dock_get_max_scale (pContainer),
240
pContainer->bIsHorizontal,
241
pContainer->bDirectionUp);
245
void cairo_dock_fill_one_icon_buffer (Icon *icon, cairo_t* pSourceContext, gdouble fMaxScale, gboolean bIsHorizontal, gboolean bDirectionUp)
247
//g_print ("%s (%d, %.2f, %s)\n", __func__, icon->iType, fMaxScale, icon->cFileName);
248
if (cairo_dock_icon_is_being_removed (icon)) // si la fenetre est en train de se faire degager du dock, pas la peine de mettre a jour son icone. /// A voir pour les icones d'appli ...
250
cd_debug ("skip icon reload for %s", icon->cName);
253
// on garde la surface/texture actuelle pour les emblemes.
254
cairo_surface_t *pPrevSurface = icon->pIconBuffer;
255
icon->pIconBuffer = NULL;
256
GLuint iPrevTexture = icon->iIconTexture;
257
icon->iIconTexture = 0;
259
if (icon->pReflectionBuffer != NULL)
261
cairo_surface_destroy (icon->pReflectionBuffer);
262
icon->pReflectionBuffer = NULL;
265
if (icon->fWidth < 0 || icon->fHeight < 0) // on ne veut pas de surface.
267
if (iPrevTexture != 0)
268
_cairo_dock_delete_texture (iPrevTexture);
269
if (pPrevSurface != NULL)
270
cairo_surface_destroy (pPrevSurface);
274
if (CAIRO_DOCK_IS_LAUNCHER (icon)/** || (CAIRO_DOCK_IS_USER_SEPARATOR (icon) && icon->cFileName != NULL)*/) // si c'est un lanceur /*ou un separateur avec une icone.*/
276
/// A FAIRE : verifier qu'on peut enlever le test sur fMaxScale ...
277
if (icon->fWidth == 0 || fMaxScale != 1.)
278
icon->fWidth = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER];
279
if (icon->fHeight == 0 || fMaxScale != 1.)
280
icon->fHeight = myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER];
281
gchar *cIconPath = cairo_dock_search_icon_s_path (icon->cFileName);
283
if (icon->pSubDock != NULL && icon->iSubdockViewType != 0) // icone de sous-dock, on le redessinera lorsque les icones du sous-dock auront ete chargees.
285
icon->pIconBuffer = _cairo_dock_create_blank_surface (pSourceContext, icon->fWidth * fMaxScale, icon->fHeight * fMaxScale);
287
else if (cIconPath != NULL && *cIconPath != '\0') // c'est un lanceur classique.
289
icon->pIconBuffer = cairo_dock_create_surface_from_image (cIconPath,
292
icon->fWidth/*myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER]*/,
293
icon->fHeight/*myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER]*/,
294
CAIRO_DOCK_FILL_SPACE,
295
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
296
(bIsHorizontal ? &icon->fHeight : &icon->fWidth),
299
else if (icon->pSubDock != NULL && icon->cClass != NULL) // c'est un epouvantail
301
//g_print ("c'est un epouvantail\n");
302
icon->pIconBuffer = cairo_dock_create_surface_from_class (icon->cClass,
305
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
306
(bIsHorizontal ? &icon->fHeight : &icon->fWidth));
307
if (icon->pIconBuffer == NULL) // aucun inhibiteur ou aucune image correspondant a cette classe, on cherche a copier une des icones d'appli de cette classe.
309
const GList *pApplis = cairo_dock_list_existing_appli_with_class (icon->cClass);
312
Icon *pOneIcon = (Icon *) (g_list_last ((GList*)pApplis)->data); // on prend le dernier car les applis sont inserees a l'envers, et on veut avoir celle qui etait deja present dans le dock (pour 2 raison : continuite, et la nouvelle (en 1ere position) n'est pas forcement deja dans un dock, ce qui fausse le ratio).
313
icon->pIconBuffer = cairo_dock_duplicate_inhibator_surface_for_appli (pSourceContext,
316
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
317
(bIsHorizontal ? &icon->fHeight : &icon->fWidth));
323
else if (CAIRO_DOCK_IS_APPLET (icon)) // c'est l'icone d'une applet.
325
//g_print (" icon->cFileName : %s\n", icon->cFileName);
326
icon->pIconBuffer = cairo_dock_create_applet_surface (icon->cFileName,
329
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
330
(bIsHorizontal ? &icon->fHeight : &icon->fWidth));
332
else if (CAIRO_DOCK_IS_APPLI (icon)) // c'est l'icone d'une appli valide. Dans cet ordre on n'a pas besoin de verifier que c'est NORMAL_APPLI.
334
icon->fWidth = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI];
335
icon->fHeight = myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI];
336
if (myTaskBar.iMinimizedWindowRenderType == 1 && icon->bIsHidden && icon->iBackingPixmap != 0)
338
// on cree la miniature.
341
icon->iIconTexture = cairo_dock_texture_from_pixmap (icon->Xid, icon->iBackingPixmap);
342
//g_print ("opengl thumbnail : %d\n", icon->iIconTexture);
344
if (icon->iIconTexture == 0)
346
icon->pIconBuffer = cairo_dock_create_surface_from_xpixmap (icon->iBackingPixmap, pSourceContext, fMaxScale, &icon->fWidth, &icon->fHeight);
348
icon->iIconTexture = cairo_dock_create_texture_from_surface (icon->pIconBuffer);
350
// on affiche l'image precedente en embleme.
351
if (icon->iIconTexture != 0 && iPrevTexture != 0)
353
CairoDock *pParentDock = NULL; // cairo_dock_search_dock_from_name (icon->cParentDockName);
354
CairoEmblem *e = cairo_dock_make_emblem_from_texture (iPrevTexture,icon, CAIRO_CONTAINER (pParentDock));
355
cairo_dock_set_emblem_position (e, CAIRO_DOCK_EMBLEM_LOWER_LEFT);
356
cairo_dock_draw_emblem_on_icon (e, icon, CAIRO_CONTAINER (pParentDock));
357
g_free (e); // on n'utilise pas cairo_dock_free_emblem pour ne pas detruire la texture avec.
359
else if (icon->pIconBuffer != NULL && pPrevSurface != NULL)
361
CairoDock *pParentDock = NULL; // cairo_dock_search_dock_from_name (icon->cParentDockName);
362
CairoEmblem *e = cairo_dock_make_emblem_from_surface (pPrevSurface, 0, 0, icon, CAIRO_CONTAINER (pParentDock));
363
cairo_dock_set_emblem_position (e, CAIRO_DOCK_EMBLEM_LOWER_LEFT);
364
cairo_dock_draw_emblem_on_icon (e, icon, CAIRO_CONTAINER (pParentDock));
365
g_free (e); // meme remarque.
368
if (icon->pIconBuffer == NULL && myTaskBar.bOverWriteXIcons && ! cairo_dock_class_is_using_xicon (icon->cClass))
369
icon->pIconBuffer = cairo_dock_create_surface_from_class (icon->cClass, pSourceContext, fMaxScale, &icon->fWidth, &icon->fHeight);
370
if (icon->pIconBuffer == NULL)
371
icon->pIconBuffer = cairo_dock_create_surface_from_xwindow (icon->Xid, pSourceContext, fMaxScale, &icon->fWidth, &icon->fHeight);
372
if (icon->pIconBuffer == NULL) // certaines applis comme xterm ne definissent pas d'icone, on en met une par defaut.
374
g_print ("%s (%ld) doesn't define any icon, we set the default one.\n", icon->cName, icon->Xid);
375
gchar *cIconPath = cairo_dock_generate_file_path (CAIRO_DOCK_DEFAULT_APPLI_ICON_NAME);
376
if (cIconPath == NULL || ! g_file_test (cIconPath, G_FILE_TEST_EXISTS))
379
cIconPath = g_strdup (CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_DEFAULT_APPLI_ICON_NAME);
381
icon->pIconBuffer = cairo_dock_create_surface_from_image (cIconPath,
384
myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI],
385
myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI],
386
CAIRO_DOCK_FILL_SPACE,
387
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
388
(bIsHorizontal ? &icon->fHeight : &icon->fWidth),
393
else // c'est une icone de separation.
395
if (CAIRO_DOCK_IS_USER_SEPARATOR (icon) && icon->cFileName != NULL)
397
/// A FAIRE : verifier qu'on peut enlever le test sur fMaxScale ...
398
if (icon->fWidth == 0 || fMaxScale != 1.)
399
icon->fWidth = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_SEPARATOR12];
400
if (icon->fHeight == 0 || fMaxScale != 1.)
401
icon->fHeight = myIcons.tIconAuthorizedHeight[CAIRO_DOCK_SEPARATOR12];
402
gchar *cIconPath = cairo_dock_search_icon_s_path (icon->cFileName);
404
if (cIconPath != NULL && *cIconPath != '\0')
406
icon->pIconBuffer = cairo_dock_create_surface_from_image (cIconPath,
411
CAIRO_DOCK_FILL_SPACE,
412
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
413
(bIsHorizontal ? &icon->fHeight : &icon->fWidth),
420
icon->pIconBuffer = cairo_dock_create_separator_surface (pSourceContext, fMaxScale, bIsHorizontal, bDirectionUp, &icon->fWidth, &icon->fHeight);
424
if (icon->pIconBuffer == NULL)
426
gchar *cIconPath = cairo_dock_generate_file_path (CAIRO_DOCK_DEFAULT_ICON_NAME);
427
if (cIconPath == NULL || ! g_file_test (cIconPath, G_FILE_TEST_EXISTS))
430
cIconPath = g_strdup (CAIRO_DOCK_SHARE_DATA_DIR"/"CAIRO_DOCK_DEFAULT_ICON_NAME);
432
CairoDockIconType iType = cairo_dock_get_icon_type (icon);
433
/// A FAIRE : verifier qu'on peut enlever le test sur fMaxScale ...
434
if (icon->fWidth == 0 || fMaxScale != 1.)
435
icon->fWidth = myIcons.tIconAuthorizedWidth[iType];
436
if (icon->fHeight == 0 || fMaxScale != 1.)
437
icon->fHeight = myIcons.tIconAuthorizedHeight[iType];
438
icon->pIconBuffer = cairo_dock_create_surface_from_image (cIconPath,
443
CAIRO_DOCK_FILL_SPACE,
444
(bIsHorizontal ? &icon->fWidth : &icon->fHeight),
445
(bIsHorizontal ? &icon->fHeight : &icon->fWidth),
449
cd_debug ("%s (%s) -> %.2fx%.2f", __func__, icon->cName, icon->fWidth, icon->fHeight);
451
//\_____________ On met le background de l'icone si necessaire
452
if (icon->pIconBuffer != NULL &&
453
g_pIconBackgroundBuffer.pSurface != NULL &&
454
(! CAIRO_DOCK_IS_SEPARATOR (icon)/* && (myIcons.bBgForApplets || ! CAIRO_DOCK_IS_APPLET(pIcon))*/))
456
cairo_t *pCairoIconBGContext = cairo_create (icon->pIconBuffer);
457
cairo_scale(pCairoIconBGContext,
458
icon->fWidth / (g_pIconBackgroundBuffer.iWidth / fMaxScale),
459
icon->fHeight / (g_pIconBackgroundBuffer.iHeight / fMaxScale));
460
cairo_set_source_surface (pCairoIconBGContext,
461
g_pIconBackgroundBuffer.pSurface,
464
cairo_set_operator (pCairoIconBGContext, CAIRO_OPERATOR_DEST_OVER);
465
cairo_paint (pCairoIconBGContext);
466
cairo_destroy (pCairoIconBGContext);
469
if (! g_bUseOpenGL && myIcons.fAlbedo > 0 && icon->pIconBuffer != NULL && ! (CAIRO_DOCK_IS_APPLET (icon) && icon->cFileName == NULL))
471
icon->pReflectionBuffer = cairo_dock_create_reflection_surface (icon->pIconBuffer,
473
(bIsHorizontal ? icon->fWidth : icon->fHeight) * fMaxScale,
474
(bIsHorizontal ? icon->fHeight : icon->fWidth) * fMaxScale,
475
myIcons.fReflectSize * fMaxScale,
481
if (g_bUseOpenGL && icon->pIconBuffer != NULL && icon->iIconTexture == 0)
483
icon->iIconTexture = cairo_dock_create_texture_from_surface (icon->pIconBuffer);
485
if (iPrevTexture != 0)
486
_cairo_dock_delete_texture (iPrevTexture);
487
if (pPrevSurface != NULL)
488
cairo_surface_destroy (pPrevSurface);
492
gchar *cairo_dock_cut_string (const gchar *cString, int iNbCaracters) // gere l'UTF-8
494
g_return_val_if_fail (cString != NULL, NULL);
495
gchar *cTruncatedName = NULL;
496
gsize bytes_read, bytes_written;
497
GError *erreur = NULL;
498
gchar *cUtf8Name = g_locale_to_utf8 (cString,
502
&erreur); // inutile sur Ubuntu, qui est nativement UTF8, mais sur les autres on ne sait pas.
505
cd_warning (erreur->message);
506
g_error_free (erreur);
509
if (cUtf8Name == NULL) // une erreur s'est produite, on tente avec la chaine brute.
510
cUtf8Name = g_strdup (cString);
512
const gchar *cEndValidChain = NULL;
514
if (g_utf8_validate (cUtf8Name, -1, &cEndValidChain))
516
iStringLength = g_utf8_strlen (cUtf8Name, -1);
518
if (iNbCaracters < 0)
520
iNbChars = MAX (0, iStringLength + iNbCaracters);
522
else if (iStringLength > iNbCaracters)
524
iNbChars = iNbCaracters;
529
cTruncatedName = g_new0 (gchar, 8 * (iNbChars + 4)); // 8 octets par caractere.
531
g_utf8_strncpy (cTruncatedName, cUtf8Name, iNbChars);
533
gchar *cTruncature = g_utf8_offset_to_pointer (cTruncatedName, iNbChars);
535
*(cTruncature+1) = '.';
536
*(cTruncature+2) = '.';
541
iStringLength = strlen (cString);
543
if (iNbCaracters < 0)
545
iNbChars = MAX (0, iStringLength + iNbCaracters);
547
else if (iStringLength > iNbCaracters)
549
iNbChars = iNbCaracters;
554
cTruncatedName = g_new0 (gchar, iNbCaracters + 4);
556
strncpy (cTruncatedName, cString, iNbChars);
558
cTruncatedName[iNbChars] = '.';
559
cTruncatedName[iNbChars+1] = '.';
560
cTruncatedName[iNbChars+2] = '.';
563
if (cTruncatedName == NULL)
564
cTruncatedName = cUtf8Name;
567
//g_print (" -> etiquette : %s\n", cTruncatedName);
568
return cTruncatedName;
571
void cairo_dock_fill_one_text_buffer (Icon *icon, cairo_t* pSourceContext, CairoDockLabelDescription *pTextDescription)
573
//g_print ("%s (%s, %d)\n", __func__, cLabelPolice, iLabelSize);
574
cairo_surface_destroy (icon->pTextBuffer);
575
icon->pTextBuffer = NULL;
576
if (icon->iLabelTexture != 0)
578
_cairo_dock_delete_texture (icon->iLabelTexture);
579
icon->iLabelTexture = 0;
581
if (icon->cName == NULL || (pTextDescription->iSize == 0))
584
gchar *cTruncatedName = NULL;
585
if (CAIRO_DOCK_IS_APPLI (icon) && myTaskBar.iAppliMaxNameLength > 0)
587
cTruncatedName = cairo_dock_cut_string (icon->cName, myTaskBar.iAppliMaxNameLength);
590
double fTextXOffset, fTextYOffset;
591
cairo_surface_t* pNewSurface = cairo_dock_create_surface_from_text ((cTruncatedName != NULL ? cTruncatedName : icon->cName),
594
&icon->iTextWidth, &icon->iTextHeight);
595
g_free (cTruncatedName);
596
//g_print (" -> %s : (%.2f;%.2f) %dx%d\n", icon->cName, icon->fTextXOffset, icon->fTextYOffset, icon->iTextWidth, icon->iTextHeight);
598
icon->pTextBuffer = pNewSurface;
600
if (g_bUseOpenGL && icon->pTextBuffer != NULL)
602
icon->iLabelTexture = cairo_dock_create_texture_from_surface (icon->pTextBuffer);
606
void cairo_dock_fill_one_quick_info_buffer (Icon *icon, cairo_t* pSourceContext, CairoDockLabelDescription *pTextDescription, double fMaxScale)
608
cairo_surface_destroy (icon->pQuickInfoBuffer);
609
icon->pQuickInfoBuffer = NULL;
610
if (icon->iQuickInfoTexture != 0)
612
_cairo_dock_delete_texture (icon->iQuickInfoTexture);
613
icon->iQuickInfoTexture = 0;
615
if (icon->cQuickInfo == NULL)
618
double fQuickInfoXOffset, fQuickInfoYOffset;
619
icon->pQuickInfoBuffer = cairo_dock_create_surface_from_text_full (icon->cQuickInfo,
623
icon->fWidth * fMaxScale,
624
&icon->iQuickInfoWidth, &icon->iQuickInfoHeight, NULL, NULL);
626
if (g_bUseOpenGL && icon->pQuickInfoBuffer != NULL)
628
icon->iQuickInfoTexture = cairo_dock_create_texture_from_surface (icon->pQuickInfoBuffer);
634
void cairo_dock_fill_icon_buffers (Icon *icon, cairo_t *pSourceContext, double fMaxScale, gboolean bIsHorizontal, gboolean bDirectionUp)
636
cairo_dock_fill_one_icon_buffer (icon, pSourceContext, fMaxScale, bIsHorizontal, bDirectionUp);
638
cairo_dock_fill_one_text_buffer (icon, pSourceContext, &myLabels.iconTextDescription);
640
cairo_dock_fill_one_quick_info_buffer (icon, pSourceContext, &myLabels.quickInfoTextDescription, fMaxScale);
643
void cairo_dock_load_one_icon_from_scratch (Icon *pIcon, CairoContainer *pContainer)
645
g_return_if_fail (pIcon != NULL);
646
cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pContainer));
647
if (CAIRO_DOCK_IS_DOCK (pContainer))
649
CairoDock *pDock = CAIRO_DOCK (pContainer);
650
cairo_dock_fill_icon_buffers_for_dock (pIcon, pCairoContext, pDock);
654
cairo_dock_fill_icon_buffers_for_desklet (pIcon, pCairoContext);
656
cairo_destroy (pCairoContext);
659
void cairo_dock_reload_buffers_in_dock (gchar *cDockName, CairoDock *pDock, gpointer data)
661
gboolean bReloadAppletsToo = GPOINTER_TO_INT (data);
662
cd_message ("%s (%s, %d)", __func__, cDockName, bReloadAppletsToo);
664
double fFlatDockWidth = - myIcons.iIconGap;
665
pDock->iMaxIconHeight = 0;
667
cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDock));
671
for (ic = pDock->icons; ic != NULL; ic = ic->next)
675
if (CAIRO_DOCK_IS_APPLET (icon))
677
if (bReloadAppletsToo) /// modif du 23/05/2009 : utiliser la taille avec ratio ici. les applets doivent faire attention a utiliser la fonction get_icon_extent().
678
cairo_dock_reload_module_instance (icon->pModuleInstance, FALSE);
682
icon->fWidth /= pDock->container.fRatio;
683
icon->fHeight /= pDock->container.fRatio;
684
cairo_dock_fill_icon_buffers_for_dock (icon, pCairoContext, pDock);
685
icon->fWidth *= pDock->container.fRatio;
686
icon->fHeight *= pDock->container.fRatio;
689
//g_print (" =size <- %.2fx%.2f\n", icon->fWidth, icon->fHeight);
690
fFlatDockWidth += myIcons.iIconGap + icon->fWidth;
691
pDock->iMaxIconHeight = MAX (pDock->iMaxIconHeight, icon->fHeight);
693
pDock->fFlatDockWidth = (int) fFlatDockWidth; /// (int) n'est plus tellement necessaire ...
694
cairo_destroy (pCairoContext);
697
void cairo_dock_reload_one_icon_buffer_in_dock (Icon *icon, CairoDock *pDock)
699
cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDock));
700
cairo_dock_reload_one_icon_buffer_in_dock_full (icon, pDock, pCairoContext);
701
cairo_destroy (pCairoContext);
705
///////////////////////
706
/// DOCK BACKGROUND ///
707
///////////////////////
709
void cairo_dock_load_visible_zone (CairoDock *pDock, gchar *cVisibleZoneImageFile, int iVisibleZoneWidth, int iVisibleZoneHeight, double fVisibleZoneAlpha)
711
cairo_dock_unload_image_buffer (&g_pVisibleZoneBuffer);
713
cairo_dock_load_image_buffer (&g_pVisibleZoneBuffer,
714
cVisibleZoneImageFile,
717
CAIRO_DOCK_FILL_SPACE);
721
static cairo_surface_t *_cairo_dock_make_stripes_background (cairo_t* pSourceContext, int iStripesWidth, int iStripesHeight)
723
g_return_val_if_fail (cairo_status (pSourceContext) == CAIRO_STATUS_SUCCESS, NULL);
724
cairo_pattern_t *pStripesPattern;
725
double fWidth = (myBackground.iNbStripes > 0 ? 200. : iStripesWidth);
726
if (fabs (myBackground.fStripesAngle) != 90)
727
pStripesPattern = cairo_pattern_create_linear (0.0f,
730
fWidth * tan (myBackground.fStripesAngle * G_PI/180.));
732
pStripesPattern = cairo_pattern_create_linear (0.0f,
735
(myBackground.fStripesAngle == 90) ? iStripesHeight : - iStripesHeight);
736
g_return_val_if_fail (cairo_pattern_status (pStripesPattern) == CAIRO_STATUS_SUCCESS, NULL);
738
cairo_pattern_set_extend (pStripesPattern, CAIRO_EXTEND_REPEAT);
740
if (myBackground.iNbStripes > 0)
743
double fStripesGap = 1. / (myBackground.iNbStripes); // ecart entre 2 rayures foncees.
744
for (fStep = 0.0f; fStep < 1.0f; fStep += fStripesGap)
746
cairo_pattern_add_color_stop_rgba (pStripesPattern,
747
fStep - myBackground.fStripesWidth / 2,
748
myBackground.fStripesColorBright[0],
749
myBackground.fStripesColorBright[1],
750
myBackground.fStripesColorBright[2],
751
myBackground.fStripesColorBright[3]);
752
cairo_pattern_add_color_stop_rgba (pStripesPattern,
754
myBackground.fStripesColorDark[0],
755
myBackground.fStripesColorDark[1],
756
myBackground.fStripesColorDark[2],
757
myBackground.fStripesColorDark[3]);
758
cairo_pattern_add_color_stop_rgba (pStripesPattern,
759
fStep + myBackground.fStripesWidth / 2,
760
myBackground.fStripesColorBright[0],
761
myBackground.fStripesColorBright[1],
762
myBackground.fStripesColorBright[2],
763
myBackground.fStripesColorBright[3]);
768
cairo_pattern_add_color_stop_rgba (pStripesPattern,
770
myBackground.fStripesColorDark[0],
771
myBackground.fStripesColorDark[1],
772
myBackground.fStripesColorDark[2],
773
myBackground.fStripesColorDark[3]);
774
cairo_pattern_add_color_stop_rgba (pStripesPattern,
776
myBackground.fStripesColorBright[0],
777
myBackground.fStripesColorBright[1],
778
myBackground.fStripesColorBright[2],
779
myBackground.fStripesColorBright[3]);
782
cairo_surface_t *pNewSurface = _cairo_dock_create_blank_surface (pSourceContext,
785
cairo_t *pImageContext = cairo_create (pNewSurface);
786
cairo_set_source (pImageContext, pStripesPattern);
787
cairo_paint (pImageContext);
789
cairo_pattern_destroy (pStripesPattern);
790
cairo_destroy (pImageContext);
794
void cairo_dock_update_background_decorations_if_necessary (CairoDock *pDock, int iNewDecorationsWidth, int iNewDecorationsHeight)
796
//g_print ("%s (%dx%d) [%.2fx%.2f]\n", __func__, iNewDecorationsWidth, iNewDecorationsHeight, g_fBackgroundImageWidth, g_fBackgroundImageHeight);
797
int k = (myBackground.fDecorationSpeed || myBackground.bDecorationsFollowMouse ? 2 : 1);
798
if (k * iNewDecorationsWidth > g_pDockBackgroundBuffer.iWidth || iNewDecorationsHeight > g_pDockBackgroundBuffer.iHeight)
800
cairo_dock_unload_image_buffer (&g_pDockBackgroundBuffer);
801
cairo_t *pCairoContext = _get_source_context ();
803
if (myBackground.cBackgroundImageFile != NULL)
805
if (myBackground.bBackgroundImageRepeat)
807
iWidth = MAX (g_pDockBackgroundBuffer.iWidth, k * iNewDecorationsWidth);
808
iHeight = MAX (g_pDockBackgroundBuffer.iHeight, iNewDecorationsHeight);
809
cairo_surface_t *pBgSurface = cairo_dock_create_surface_from_pattern (myBackground.cBackgroundImageFile,
813
myBackground.fBackgroundImageAlpha);
814
cairo_dock_load_image_buffer_from_surface (&g_pDockBackgroundBuffer,
821
iWidth = MAX (g_pDockBackgroundBuffer.iWidth, iNewDecorationsWidth);
822
iHeight = MAX (g_pDockBackgroundBuffer.iHeight, iNewDecorationsHeight);
823
cairo_dock_load_image_buffer_full (&g_pDockBackgroundBuffer,
824
myBackground.cBackgroundImageFile,
827
CAIRO_DOCK_FILL_SPACE,
828
myBackground.fBackgroundImageAlpha);
833
iWidth = MAX (g_pDockBackgroundBuffer.iWidth, k * iNewDecorationsWidth);
834
iHeight = MAX (g_pDockBackgroundBuffer.iHeight, iNewDecorationsHeight);
835
cairo_surface_t *pBgSurface = _cairo_dock_make_stripes_background (pCairoContext,
838
cairo_dock_load_image_buffer_from_surface (&g_pDockBackgroundBuffer,
843
//cd_debug (" MaJ des decorations du fond -> %dx%d", iWidth, iHeight);
847
void cairo_dock_load_background_decorations (CairoDock *pDock)
850
cairo_dock_search_max_decorations_size (&iWidth, &iHeight);
852
g_pDockBackgroundBuffer.iWidth = 0;
853
g_pDockBackgroundBuffer.iHeight = 0;
854
cairo_dock_update_background_decorations_if_necessary (pDock, iWidth, iHeight);
858
void cairo_dock_load_icons_background_surface (const gchar *cImagePath, double fMaxScale)
860
cairo_dock_unload_image_buffer (&g_pIconBackgroundBuffer);
862
int iSize = MAX (myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER], myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI]);
866
cairo_dock_load_image_buffer (&g_pIconBackgroundBuffer,
870
CAIRO_DOCK_FILL_SPACE);
874
void cairo_dock_load_box_surface (double fMaxScale)
876
/*cairo_dock_unload_image_buffer (&g_pBoxAboveBuffer);
877
cairo_dock_unload_image_buffer (&g_pBoxBelowBuffer);
879
int iSize = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER];
883
cairo_dock_load_image_buffer (&g_pBoxAboveBuffer,
884
CAIRO_DOCK_SHARE_DATA_DIR"/box-front.png",
887
CAIRO_DOCK_FILL_SPACE);
888
cairo_dock_load_image_buffer (&g_pBoxBelowBuffer,
889
CAIRO_DOCK_SHARE_DATA_DIR"/box-back.png",
892
CAIRO_DOCK_FILL_SPACE);*/ // 2.1.4
901
static cairo_surface_t *_cairo_dock_create_surface_from_desktop_bg (void) // attention : fonction lourde.
903
cd_debug ("%s ()", __func__);
904
Pixmap iRootPixmapID = cairo_dock_get_window_background_pixmap (cairo_dock_get_root_id ());
905
g_return_val_if_fail (iRootPixmapID != 0, NULL);
907
cairo_surface_t *pDesktopBgSurface = NULL;
908
GdkPixbuf *pBgPixbuf = cairo_dock_get_pixbuf_from_pixmap (iRootPixmapID, FALSE); // FALSE <=> on n'y ajoute pas de transparence.
909
if (pBgPixbuf != NULL)
911
cairo_t *pSourceContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (g_pMainDock));
913
if (gdk_pixbuf_get_height (pBgPixbuf) == 1 && gdk_pixbuf_get_width (pBgPixbuf) == 1) // couleur unie.
915
guchar *pixels = gdk_pixbuf_get_pixels (pBgPixbuf);
916
cd_debug ("c'est une couleur unie (%.2f, %.2f, %.2f)", (double) pixels[0] / 255, (double) pixels[1] / 255, (double) pixels[2] / 255);
918
pDesktopBgSurface = _cairo_dock_create_blank_surface (pSourceContext,
919
g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL],
920
g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
922
cairo_t *pCairoContext = cairo_create (pDesktopBgSurface);
923
cairo_set_source_rgb (pCairoContext,
924
(double) pixels[0] / 255,
925
(double) pixels[1] / 255,
926
(double) pixels[2] / 255);
927
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
928
cairo_paint (pCairoContext);
929
cairo_destroy (pCairoContext);
933
cairo_t *pSourceContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (g_pMainDock));
934
double fWidth, fHeight;
935
cairo_surface_t *pBgSurface = cairo_dock_create_surface_from_pixbuf (pBgPixbuf,
945
if (fWidth < g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] || fHeight < g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL])
947
cd_debug ("c'est un degrade ou un motif (%dx%d)", (int) fWidth, (int) fHeight);
948
pDesktopBgSurface = _cairo_dock_create_blank_surface (pSourceContext,
949
g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL],
950
g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
951
cairo_t *pCairoContext = cairo_create (pDesktopBgSurface);
953
cairo_pattern_t *pPattern = cairo_pattern_create_for_surface (pBgSurface);
954
g_return_val_if_fail (cairo_pattern_status (pPattern) == CAIRO_STATUS_SUCCESS, NULL);
955
cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_REPEAT);
957
cairo_set_source (pCairoContext, pPattern);
958
cairo_paint (pCairoContext);
960
cairo_destroy (pCairoContext);
961
cairo_pattern_destroy (pPattern);
962
cairo_surface_destroy (pBgSurface);
966
cd_debug ("c'est un fond d'ecran de taille %dx%d", (int) fWidth, (int) fHeight);
967
pDesktopBgSurface = pBgSurface;
971
g_object_unref (pBgPixbuf);
972
cairo_destroy (pSourceContext);
974
return pDesktopBgSurface;
977
CairoDockDesktopBackground *cairo_dock_get_desktop_background (gboolean bWithTextureToo)
979
cd_message ("%s (%d, %d)", __func__, bWithTextureToo, s_pDesktopBg?s_pDesktopBg->iRefCount:-1);
980
if (s_pDesktopBg == NULL)
982
s_pDesktopBg = g_new0 (CairoDockDesktopBackground, 1);
984
if (s_pDesktopBg->iRefCount == 0)
986
s_pDesktopBg->pSurface = _cairo_dock_create_surface_from_desktop_bg ();
988
if (s_pDesktopBg->iTexture == 0 && bWithTextureToo)
990
s_pDesktopBg->iTexture = cairo_dock_create_texture_from_surface (s_pDesktopBg->pSurface);
993
s_pDesktopBg->iRefCount ++;
994
if (s_pDesktopBg->iSidDestroyBg != 0)
996
g_source_remove (s_pDesktopBg->iSidDestroyBg);
997
s_pDesktopBg->iSidDestroyBg = 0;
1002
static gboolean _destroy_bg (CairoDockDesktopBackground *pDesktopBg)
1004
cd_message ("%s ()", __func__);
1005
g_return_val_if_fail (pDesktopBg != NULL, 0);
1006
if (pDesktopBg->pSurface != NULL)
1008
cairo_surface_destroy (pDesktopBg->pSurface);
1009
pDesktopBg->pSurface = NULL;
1011
if (pDesktopBg->iTexture != 0)
1013
_cairo_dock_delete_texture (pDesktopBg->iTexture);
1014
pDesktopBg->iTexture = 0;
1016
pDesktopBg->iSidDestroyBg = 0;
1019
void cairo_dock_destroy_desktop_background (CairoDockDesktopBackground *pDesktopBg)
1021
g_return_if_fail (pDesktopBg != NULL);
1022
pDesktopBg->iRefCount --;
1023
if (pDesktopBg->iRefCount == 0 && pDesktopBg->iSidDestroyBg == 0)
1025
pDesktopBg->iSidDestroyBg = g_timeout_add_seconds (3, (GSourceFunc)_destroy_bg, pDesktopBg);
1029
cairo_surface_t *cairo_dock_get_desktop_bg_surface (CairoDockDesktopBackground *pDesktopBg)
1031
g_return_val_if_fail (pDesktopBg != NULL, NULL);
1032
return pDesktopBg->pSurface;
1035
GLuint cairo_dock_get_desktop_bg_texture (CairoDockDesktopBackground *pDesktopBg)
1037
g_return_val_if_fail (pDesktopBg != NULL, 0);
1038
return pDesktopBg->iTexture;
1041
void cairo_dock_reload_desktop_background (void)
1043
cd_message ("%s ()", __func__);
1044
if (s_pDesktopBg == NULL) // rien a recharger.
1046
if (s_pDesktopBg->pSurface == NULL && s_pDesktopBg->iTexture == 0) // rien a recharger.
1049
if (s_pDesktopBg->pSurface != NULL)
1050
cairo_surface_destroy (s_pDesktopBg->pSurface);
1051
s_pDesktopBg->pSurface = _cairo_dock_create_surface_from_desktop_bg ();
1053
if (s_pDesktopBg->iTexture != 0)
1055
_cairo_dock_delete_texture (s_pDesktopBg->iTexture);
1056
s_pDesktopBg->iTexture = cairo_dock_create_texture_from_surface (s_pDesktopBg->pSurface);
1065
void cairo_dock_load_task_indicator (const gchar *cIndicatorImagePath, double fMaxScale, double fIndicatorRatio)
1067
cairo_dock_unload_image_buffer (&g_pIndicatorBuffer);
1069
double fLauncherWidth = (myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] != 0 ? myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] : 48);
1070
double fLauncherHeight = (myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] != 0 ? myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] : 48);
1071
double fScale = (myIndicators.bLinkIndicatorWithIcon ? fMaxScale : 1.) * fIndicatorRatio;
1073
cairo_dock_load_image_buffer (&g_pIndicatorBuffer,
1074
cIndicatorImagePath,
1075
fLauncherWidth * fScale,
1076
fLauncherHeight * fScale,
1077
CAIRO_DOCK_KEEP_RATIO);
1080
void cairo_dock_load_active_window_indicator (const gchar *cImagePath, double fMaxScale, double fCornerRadius, double fLineWidth, double *fActiveColor)
1082
cairo_dock_unload_image_buffer (&g_pActiveIndicatorBuffer);
1084
int iWidth = MAX (myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER], myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI]);
1085
int iHeight = MAX (myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI], myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI]);
1090
iWidth *= fMaxScale;
1091
iHeight *= fMaxScale;
1093
if (cImagePath != NULL)
1095
cairo_dock_load_image_buffer (&g_pActiveIndicatorBuffer,
1099
CAIRO_DOCK_FILL_SPACE);
1101
else if (fActiveColor[3] > 0)
1103
cairo_t *pSourceContext = _get_source_context ();
1104
cairo_surface_t *pSurface = _cairo_dock_create_blank_surface (pSourceContext,
1107
cairo_t *pCairoContext = cairo_create (pSurface);
1109
fCornerRadius = MIN (fCornerRadius, (iWidth - fLineWidth) / 2);
1110
double fFrameWidth = iWidth - (2 * fCornerRadius + fLineWidth);
1111
double fFrameHeight = iHeight - 2 * fLineWidth;
1112
double fDockOffsetX = fCornerRadius + fLineWidth/2;
1113
double fDockOffsetY = fLineWidth/2;
1114
cairo_dock_draw_frame (pCairoContext, fCornerRadius, fLineWidth, fFrameWidth, fFrameHeight, fDockOffsetX, fDockOffsetY, 1, 0., CAIRO_DOCK_HORIZONTAL);
1116
cairo_set_source_rgba (pCairoContext, fActiveColor[0], fActiveColor[1], fActiveColor[2], fActiveColor[3]);
1119
cairo_set_line_width (pCairoContext, fLineWidth);
1120
cairo_stroke (pCairoContext);
1124
cairo_fill (pCairoContext);
1126
cairo_destroy (pCairoContext);
1128
cairo_dock_load_image_buffer_from_surface (&g_pActiveIndicatorBuffer,
1135
void cairo_dock_load_class_indicator (const gchar *cIndicatorImagePath, double fMaxScale)
1137
cairo_dock_unload_image_buffer (&g_pClassIndicatorBuffer);
1139
double fLauncherWidth = (myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] != 0 ? myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER] : 48);
1140
double fLauncherHeight = (myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] != 0 ? myIcons.tIconAuthorizedHeight[CAIRO_DOCK_LAUNCHER] : 48);
1142
cairo_dock_load_image_buffer (&g_pClassIndicatorBuffer,
1143
cIndicatorImagePath,
1146
CAIRO_DOCK_KEEP_RATIO);
1150
void cairo_dock_unload_additionnal_textures (void)
1153
cairo_dock_unload_image_buffer (&g_pDockBackgroundBuffer);
1154
cairo_dock_unload_image_buffer (&g_pVisibleZoneBuffer);
1155
cairo_dock_unload_image_buffer (&g_pIconBackgroundBuffer);
1156
cairo_dock_unload_image_buffer (&g_pIndicatorBuffer);
1157
cairo_dock_unload_image_buffer (&g_pActiveIndicatorBuffer);
1158
cairo_dock_unload_image_buffer (&g_pClassIndicatorBuffer);
1159
/*cairo_dock_unload_image_buffer (&g_pBoxAboveBuffer);
1160
cairo_dock_unload_image_buffer (&g_pBoxBelowBuffer);*/ // 2.1.4
1161
cairo_dock_unload_desklet_buttons ();
1162
cairo_dock_unload_dialog_buttons ();
1163
if (g_pGradationTexture[0] != 0)
1165
_cairo_dock_delete_texture (g_pGradationTexture[0]);
1166
g_pGradationTexture[0] = 0;
1168
if (g_pGradationTexture[1] != 0)
1170
_cairo_dock_delete_texture (g_pGradationTexture[1]);
1171
g_pGradationTexture[1] = 0;
1173
if (s_pDesktopBg != NULL && s_pDesktopBg->iTexture != 0)
1175
_cairo_dock_delete_texture (s_pDesktopBg->iTexture);
1176
s_pDesktopBg->iTexture = 0;
1178
cairo_dock_destroy_icon_pbuffer ();
1179
cairo_dock_unload_default_data_renderer_font ();
1180
cairo_dock_unload_flying_container_textures ();
1181
_destroy_source_context ();