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 "../config.h"
35
#include "cairo-dock-load.h"
36
#include "cairo-dock-log.h"
37
#include "cairo-dock-draw.h"
38
#include "cairo-dock-draw-opengl.h"
39
#include "cairo-dock-internal-icons.h"
40
#include "cairo-dock-emblem.h"
41
#include "cairo-dock-backends-manager.h"
42
#include "cairo-dock-icon-container.h"
44
#define CAIRO_DOCK_DEFAULT_APPLI_ICON_NAME "default-icon-appli.svg"
46
CairoDockImageBuffer g_pBoxAboveBuffer;
47
CairoDockImageBuffer g_pBoxBelowBuffer;
49
extern CairoDock *g_pMainDock;
50
extern CairoDockDesktopGeometry g_desktopGeometry;
52
extern gchar *g_cCurrentThemePath;
54
extern CairoDockImageBuffer g_pIconBackgroundBuffer;
56
extern gboolean g_bUseOpenGL;
59
static void _cairo_dock_draw_subdock_content_as_emblem (Icon *pIcon, CairoContainer *pContainer, int w, int h, cairo_t *pCairoContext)
61
//\______________ On dessine les 4 premieres icones du sous-dock en embleme.
63
memset (&e, 0, sizeof (CairoEmblem));
68
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 4; ic = ic->next, i++)
71
if (CAIRO_DOCK_IS_SEPARATOR (icon))
77
e.pSurface = icon->pIconBuffer;
78
cairo_dock_get_icon_extent (icon, CAIRO_CONTAINER (pIcon->pSubDock), &e.iWidth, &e.iHeight);
80
cairo_save (pCairoContext);
81
_cairo_dock_apply_emblem_surface (&e, w, h, pCairoContext);
82
cairo_restore (pCairoContext);
86
static void _cairo_dock_draw_subdock_content_as_emblem_opengl (Icon *pIcon, CairoContainer *pContainer, int w, int h)
88
//\______________ On dessine les 4 premieres icones du sous-dock en embleme.
90
memset (&e, 0, sizeof (CairoEmblem));
95
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 4; ic = ic->next, i++)
98
if (CAIRO_DOCK_IS_SEPARATOR (icon))
104
e.iTexture = icon->iIconTexture;
105
_cairo_dock_apply_emblem_texture (&e, w, h);
109
static void _cairo_dock_draw_subdock_content_as_stack (Icon *pIcon, CairoContainer *pContainer, int w, int h, cairo_t *pCairoContext)
111
//\______________ On dessine les 4 premieres icones du sous-dock en pile.
113
memset (&e, 0, sizeof (CairoEmblem));
118
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 3; ic = ic->next, i++)
121
if (CAIRO_DOCK_IS_SEPARATOR (icon))
129
e.iPosition = CAIRO_DOCK_EMBLEM_UPPER_RIGHT;
132
if (ic->next == NULL)
133
e.iPosition = CAIRO_DOCK_EMBLEM_LOWER_LEFT;
135
e.iPosition = CAIRO_DOCK_EMBLEM_MIDDLE;
138
e.iPosition = CAIRO_DOCK_EMBLEM_LOWER_LEFT;
143
e.pSurface = icon->pIconBuffer;
144
cairo_dock_get_icon_extent (icon, CAIRO_CONTAINER (pIcon->pSubDock), &e.iWidth, &e.iHeight);
146
cairo_save (pCairoContext);
147
_cairo_dock_apply_emblem_surface (&e, w, h, pCairoContext);
148
cairo_restore (pCairoContext);
152
static void _cairo_dock_draw_subdock_content_as_stack_opengl (Icon *pIcon, CairoContainer *pContainer, int w, int h)
154
//\______________ On dessine les 4 premieres icones du sous-dock en pile.
156
memset (&e, 0, sizeof (CairoEmblem));
161
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 3; ic = ic->next, i++)
164
if (CAIRO_DOCK_IS_SEPARATOR (icon))
172
e.iPosition = CAIRO_DOCK_EMBLEM_UPPER_RIGHT;
175
if (ic->next == NULL)
176
e.iPosition = CAIRO_DOCK_EMBLEM_LOWER_LEFT;
178
e.iPosition = CAIRO_DOCK_EMBLEM_MIDDLE;
181
e.iPosition = CAIRO_DOCK_EMBLEM_LOWER_LEFT;
185
e.iTexture = icon->iIconTexture;
186
_cairo_dock_apply_emblem_texture (&e, w, h);
191
static void _cairo_dock_load_box_surface (void)
193
double fMaxScale = cairo_dock_get_max_scale (g_pMainDock);
195
cairo_dock_unload_image_buffer (&g_pBoxAboveBuffer);
196
cairo_dock_unload_image_buffer (&g_pBoxBelowBuffer);
198
int iSize = myIcons.tIconAuthorizedWidth[CAIRO_DOCK_LAUNCHER];
203
gchar *cUserPath = cairo_dock_generate_file_path ("box-front.png");
204
if (! g_file_test (cUserPath, G_FILE_TEST_EXISTS))
209
cairo_dock_load_image_buffer (&g_pBoxAboveBuffer,
210
cUserPath ? cUserPath : CAIRO_DOCK_SHARE_DATA_DIR"/box-front.png",
213
CAIRO_DOCK_FILL_SPACE);
215
cUserPath = cairo_dock_generate_file_path ("box-back.png");
216
if (! g_file_test (cUserPath, G_FILE_TEST_EXISTS))
221
cairo_dock_load_image_buffer (&g_pBoxBelowBuffer,
222
CAIRO_DOCK_SHARE_DATA_DIR"/box-back.png",
225
CAIRO_DOCK_FILL_SPACE);
228
static void _cairo_dock_unload_box_surface (void)
230
cairo_dock_unload_image_buffer (&g_pBoxAboveBuffer);
231
cairo_dock_unload_image_buffer (&g_pBoxBelowBuffer);
234
static void _cairo_dock_draw_subdock_content_as_box (Icon *pIcon, CairoContainer *pContainer, int w, int h, cairo_t *pCairoContext)
236
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_OVER);
237
cairo_save (pCairoContext);
238
cairo_scale(pCairoContext,
239
(double) w / g_pBoxBelowBuffer.iWidth,
240
(double) h / g_pBoxBelowBuffer.iHeight);
241
cairo_dock_draw_surface (pCairoContext,
242
g_pBoxBelowBuffer.pSurface,
243
g_pBoxBelowBuffer.iWidth, g_pBoxBelowBuffer.iHeight,
244
pContainer->bDirectionUp,
245
pContainer->bIsHorizontal,
247
/**cairo_set_source_surface (pCairoContext,
248
g_pBoxBelowBuffer.pSurface,
251
cairo_paint (pCairoContext);*/
252
cairo_restore (pCairoContext);
254
cairo_save (pCairoContext);
255
if (pContainer->bIsHorizontal)
257
if (!pContainer->bDirectionUp)
258
cairo_translate (pCairoContext, 0., .2*h);
262
if (! pContainer->bDirectionUp)
263
cairo_translate (pCairoContext, .2*h, 0.);
265
cairo_scale(pCairoContext,
272
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 3; ic = ic->next, i++)
275
if (CAIRO_DOCK_IS_SEPARATOR (icon))
281
if (pContainer->bIsHorizontal)
284
if (pContainer->bDirectionUp)
292
if (pContainer->bDirectionUp)
297
cairo_set_source_surface (pCairoContext,
301
cairo_paint (pCairoContext);
303
cairo_restore (pCairoContext);
305
cairo_scale(pCairoContext,
306
(double) w / g_pBoxAboveBuffer.iWidth,
307
(double) h / g_pBoxAboveBuffer.iHeight);
308
cairo_dock_draw_surface (pCairoContext,
309
g_pBoxAboveBuffer.pSurface,
310
g_pBoxAboveBuffer.iWidth, g_pBoxAboveBuffer.iHeight,
311
pContainer->bDirectionUp,
312
pContainer->bIsHorizontal,
314
/**cairo_set_source_surface (pCairoContext,
315
g_pBoxAboveBuffer.pSurface,
318
cairo_paint (pCairoContext);*/
321
static void _cairo_dock_draw_subdock_content_as_box_opengl (Icon *pIcon, CairoContainer *pContainer, int w, int h)
323
_cairo_dock_set_blend_source ();
325
if (pContainer->bIsHorizontal)
327
if (! pContainer->bDirectionUp)
328
glScalef (1., -1., 1.);
332
glRotatef (90., 0., 0., 1.);
333
if (! pContainer->bDirectionUp)
334
glScalef (1., -1., 1.);
336
_cairo_dock_apply_texture_at_size (g_pBoxBelowBuffer.iTexture, w, h);
338
glMatrixMode(GL_TEXTURE);
340
if (pContainer->bIsHorizontal)
342
if (! pContainer->bDirectionUp)
343
glScalef (1., -1., 1.);
347
glRotatef (-90., 0., 0., 1.);
348
if (! pContainer->bDirectionUp)
349
glScalef (1., -1., 1.);
351
glMatrixMode (GL_MODELVIEW);
352
_cairo_dock_set_blend_alpha ();
356
for (ic = pIcon->pSubDock->icons, i = 0; ic != NULL && i < 3; ic = ic->next, i++)
359
if (CAIRO_DOCK_IS_SEPARATOR (icon))
364
glBindTexture (GL_TEXTURE_2D, icon->iIconTexture);
365
_cairo_dock_apply_current_texture_at_size_with_offset (.8*w, .8*h, 0., .1*(1-i)*h);
367
glMatrixMode(GL_TEXTURE);
369
glMatrixMode (GL_MODELVIEW);
371
_cairo_dock_apply_texture_at_size (g_pBoxAboveBuffer.iTexture, w, h);
376
void cairo_dock_register_icon_container_renderers (void)
378
CairoIconContainerRenderer *p;
379
p = g_new0 (CairoIconContainerRenderer, 1);
380
p->render = _cairo_dock_draw_subdock_content_as_emblem;
381
p->render_opengl = _cairo_dock_draw_subdock_content_as_emblem_opengl;
382
cairo_dock_register_icon_container_renderer ("Emblem", p);
384
p = g_new0 (CairoIconContainerRenderer, 1);
385
p->render = _cairo_dock_draw_subdock_content_as_stack;
386
p->render_opengl = _cairo_dock_draw_subdock_content_as_stack_opengl;
387
cairo_dock_register_icon_container_renderer ("Stack", p);
389
p = g_new0 (CairoIconContainerRenderer, 1);
390
p->load = _cairo_dock_load_box_surface;
391
p->unload = _cairo_dock_unload_box_surface;
392
p->render = _cairo_dock_draw_subdock_content_as_box;
393
p->render_opengl = _cairo_dock_draw_subdock_content_as_box_opengl;
394
cairo_dock_register_icon_container_renderer ("Box", p);
396
memset (&g_pBoxAboveBuffer, 0, sizeof (CairoDockImageBuffer));
397
memset (&g_pBoxBelowBuffer, 0, sizeof (CairoDockImageBuffer));