1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
3
** Login : <ctaf42@gmail.com>
4
** Started on Sun Jan 27 18:35:38 2008 Cedric GESTES
8
** - Cedric GESTES <ctaf42@gmail.com>
11
** Copyright (C) 2008 Cedric GESTES
12
** This program is free software; you can redistribute it and/or modify
13
** it under the terms of the GNU General Public License as published by
14
** the Free Software Foundation; either version 3 of the License, or
15
** (at your option) any later version.
17
** This program is distributed in the hope that it will be useful,
18
** but WITHOUT ANY WARRANTY; without even the implied warranty of
19
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
** GNU General Public License for more details.
22
** You should have received a copy of the GNU General Public License
23
** along with this program; if not, write to the Free Software
24
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32
#include <gtk/gtkgl.h>
36
#include <gdk/x11/gdkglx.h>
39
#include "cairo-dock-draw.h"
40
#include "cairo-dock-modules.h"
41
#include "cairo-dock-dialogs.h"
42
#include "cairo-dock-icons.h"
43
#include "cairo-dock-config.h"
44
#include "cairo-dock-applications-manager.h"
45
#include "cairo-dock-notifications.h"
46
#include "cairo-dock-log.h"
47
#include "cairo-dock-menu.h"
48
#include "cairo-dock-container.h"
49
#include "cairo-dock-X-utilities.h"
50
#include "cairo-dock-surface-factory.h"
51
#include "cairo-dock-renderer-manager.h"
52
#include "cairo-dock-draw-opengl.h"
53
#include "cairo-dock-load.h"
54
#include "cairo-dock-animations.h"
55
#include "cairo-dock-internal-desklets.h"
56
#include "cairo-dock-gui-manager.h"
57
#include "cairo-dock-desklet.h"
59
extern int g_iXScreenWidth[2], g_iXScreenHeight[2];
60
extern gboolean g_bUseOpenGL;
61
extern int g_iNbDesktops;
62
extern int g_iNbViewportX,g_iNbViewportY ;
64
static CairoDockImageBuffer s_pRotateButtonBuffer = {0};
65
static CairoDockImageBuffer s_pRetachButtonBuffer = {0};
66
static CairoDockImageBuffer s_pDepthRotateButtonBuffer = {0};
67
static CairoDockImageBuffer s_pNoInputButtonBuffer = {0};
69
#define CD_NB_ITER_FOR_GRADUATION 10
70
#define _cairo_dock_desklet_is_free(pDesklet) (! (pDesklet->bPositionLocked || pDesklet->bFixedAttitude))
73
void cairo_dock_init_desklet_manager (void)
75
memset (&s_pRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
76
memset (&s_pRetachButtonBuffer, 0, sizeof (CairoDockImageBuffer));
77
memset (&s_pDepthRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
78
memset (&s_pNoInputButtonBuffer, 0, sizeof (CairoDockImageBuffer));
81
void cairo_dock_load_desklet_buttons (void)
83
//g_print ("%s ()\n", __func__);
84
if (myDesklets.cRotateButtonImage != NULL)
86
cairo_dock_load_image_buffer (&s_pRotateButtonBuffer,
87
myDesklets.cRotateButtonImage,
88
myDesklets.iDeskletButtonSize,
89
myDesklets.iDeskletButtonSize,
90
CAIRO_DOCK_FILL_SPACE);
92
if (s_pRotateButtonBuffer.pSurface == NULL)
94
cairo_dock_load_image_buffer (&s_pRotateButtonBuffer,
95
CAIRO_DOCK_SHARE_DATA_DIR"/rotate-desklet.svg",
96
myDesklets.iDeskletButtonSize,
97
myDesklets.iDeskletButtonSize,
98
CAIRO_DOCK_FILL_SPACE);
101
if (myDesklets.cRetachButtonImage != NULL)
103
cairo_dock_load_image_buffer (&s_pRetachButtonBuffer,
104
myDesklets.cRetachButtonImage,
105
myDesklets.iDeskletButtonSize,
106
myDesklets.iDeskletButtonSize,
107
CAIRO_DOCK_FILL_SPACE);
109
if (s_pRetachButtonBuffer.pSurface == NULL)
111
cairo_dock_load_image_buffer (&s_pRetachButtonBuffer,
112
CAIRO_DOCK_SHARE_DATA_DIR"/retach-desklet.svg",
113
myDesklets.iDeskletButtonSize,
114
myDesklets.iDeskletButtonSize,
115
CAIRO_DOCK_FILL_SPACE);
118
if (myDesklets.cDepthRotateButtonImage != NULL)
120
cairo_dock_load_image_buffer (&s_pDepthRotateButtonBuffer,
121
myDesklets.cDepthRotateButtonImage,
122
myDesklets.iDeskletButtonSize,
123
myDesklets.iDeskletButtonSize,
124
CAIRO_DOCK_FILL_SPACE);
126
if (s_pDepthRotateButtonBuffer.pSurface == NULL)
128
cairo_dock_load_image_buffer (&s_pDepthRotateButtonBuffer,
129
CAIRO_DOCK_SHARE_DATA_DIR"/depth-rotate-desklet.svg",
130
myDesklets.iDeskletButtonSize,
131
myDesklets.iDeskletButtonSize,
132
CAIRO_DOCK_FILL_SPACE);
135
/*if (myDesklets.cNoInputButtonImage != NULL)
137
cairo_dock_load_image_buffer (&s_pNoInputButtonBuffer,
138
myDesklets.cNoInputButtonImage,
139
myDesklets.iDeskletButtonSize,
140
myDesklets.iDeskletButtonSize,
141
CAIRO_DOCK_FILL_SPACE);
143
if (s_pNoInputButtonBuffer.pSurface == NULL)
145
cairo_dock_load_image_buffer (&s_pNoInputButtonBuffer,
146
CAIRO_DOCK_SHARE_DATA_DIR"/no-input-desklet.svg",
147
myDesklets.iDeskletButtonSize,
148
myDesklets.iDeskletButtonSize,
149
CAIRO_DOCK_FILL_SPACE);
153
void cairo_dock_unload_desklet_buttons (void)
155
//g_print ("%s ()\n", __func__);
156
cairo_dock_unload_image_buffer (&s_pRotateButtonBuffer);
157
cairo_dock_unload_image_buffer (&s_pRetachButtonBuffer);
158
cairo_dock_unload_image_buffer (&s_pDepthRotateButtonBuffer);
159
cairo_dock_unload_image_buffer (&s_pNoInputButtonBuffer);
162
static void _cairo_dock_load_desklet_decorations (CairoDesklet *pDesklet, cairo_t *pSourceContext)
164
if (pDesklet->pBackGroundSurface != NULL)
166
cairo_surface_destroy (pDesklet->pBackGroundSurface);
167
pDesklet->pBackGroundSurface = NULL;
169
if (pDesklet->pForeGroundSurface != NULL)
171
cairo_surface_destroy (pDesklet->pForeGroundSurface);
172
pDesklet->pForeGroundSurface = NULL;
174
if (pDesklet->iBackGroundTexture != 0)
176
_cairo_dock_delete_texture (pDesklet->iBackGroundTexture);
177
pDesklet->iBackGroundTexture = 0;
179
if (pDesklet->iForeGroundTexture != 0)
181
_cairo_dock_delete_texture (pDesklet->iForeGroundTexture);
182
pDesklet->iForeGroundTexture = 0;
185
CairoDeskletDecoration *pDeskletDecorations;
186
//cd_debug ("%s (%s)", __func__, pDesklet->cDecorationTheme);
187
if (pDesklet->cDecorationTheme == NULL || strcmp (pDesklet->cDecorationTheme, "personnal") == 0)
188
pDeskletDecorations = pDesklet->pUserDecoration;
189
else if (strcmp (pDesklet->cDecorationTheme, "default") == 0)
190
pDeskletDecorations = cairo_dock_get_desklet_decoration (myDesklets.cDeskletDecorationsName);
192
pDeskletDecorations = cairo_dock_get_desklet_decoration (pDesklet->cDecorationTheme);
193
if (pDeskletDecorations == NULL) // peut arriver si rendering n'a pas encore charge ses decorations.
195
//cd_debug ("pDeskletDecorations : %s (%x)", pDesklet->cDecorationTheme, pDeskletDecorations);
197
double fZoomX = 0., fZoomY = 0.;
198
if (pDeskletDecorations->cBackGroundImagePath != NULL && pDeskletDecorations->fBackGroundAlpha > 0)
200
//cd_debug ("bg : %s", pDeskletDecorations->cBackGroundImagePath);
201
gchar *cPath = cairo_dock_generate_file_path (pDeskletDecorations->cBackGroundImagePath);
202
pDesklet->pBackGroundSurface = cairo_dock_create_surface_from_image (cPath,
204
1., // cairo_dock_get_max_scale (pDesklet)
205
pDesklet->container.iWidth, pDesklet->container.iHeight,
206
pDeskletDecorations->iLoadingModifier,
207
&pDesklet->fImageWidth, &pDesklet->fImageHeight,
211
if (pDeskletDecorations->cForeGroundImagePath != NULL && pDeskletDecorations->fForeGroundAlpha > 0)
213
//cd_debug ("fg : %s", pDeskletDecorations->cForeGroundImagePath);
214
gchar *cPath = cairo_dock_generate_file_path (pDeskletDecorations->cForeGroundImagePath);
215
pDesklet->pForeGroundSurface = cairo_dock_create_surface_from_image (cPath,
217
1., // cairo_dock_get_max_scale (pDesklet)
218
pDesklet->container.iWidth, pDesklet->container.iHeight,
219
pDeskletDecorations->iLoadingModifier,
220
&pDesklet->fImageWidth, &pDesklet->fImageHeight,
224
//cd_debug ("image : %.2fx%.2f ; zoom : %.2fx%.2f", pDesklet->fImageWidth, pDesklet->fImageHeight, fZoomX, fZoomY);
225
pDesklet->iLeftSurfaceOffset = pDeskletDecorations->iLeftMargin * fZoomX;
226
pDesklet->iTopSurfaceOffset = pDeskletDecorations->iTopMargin * fZoomY;
227
pDesklet->iRightSurfaceOffset = pDeskletDecorations->iRightMargin * fZoomX;
228
pDesklet->iBottomSurfaceOffset = pDeskletDecorations->iBottomMargin * fZoomY;
229
pDesklet->fBackGroundAlpha = pDeskletDecorations->fBackGroundAlpha;
230
pDesklet->fForeGroundAlpha = pDeskletDecorations->fForeGroundAlpha;
231
//cd_debug ("%d;%d;%d;%d ; %.2f;%.2f", pDesklet->iLeftSurfaceOffset, pDesklet->iTopSurfaceOffset, pDesklet->iRightSurfaceOffset, pDesklet->iBottomSurfaceOffset, pDesklet->fBackGroundAlpha, pDesklet->fForeGroundAlpha);
234
if (pDesklet->pBackGroundSurface != NULL)
235
pDesklet->iBackGroundTexture = cairo_dock_create_texture_from_surface (pDesklet->pBackGroundSurface);
236
if (pDesklet->pForeGroundSurface != NULL)
237
pDesklet->iForeGroundTexture = cairo_dock_create_texture_from_surface (pDesklet->pForeGroundSurface);
241
static gboolean _cairo_dock_reload_one_desklet_decorations (CairoDesklet *pDesklet, CairoDockModuleInstance *pInstance, gpointer *data)
243
gboolean bDefaultThemeOnly = GPOINTER_TO_INT (data[0]);
244
cairo_t *pSourceContext = data[1];
246
if (bDefaultThemeOnly)
248
if (pDesklet->cDecorationTheme == NULL || strcmp (pDesklet->cDecorationTheme, "default") == 0)
250
cd_debug ("on recharge les decorations de ce desklet");
251
_cairo_dock_load_desklet_decorations (pDesklet, pSourceContext);
254
else // tous ceux qui ne sont pas encore charges et qui ont leur taille definitive.
256
//cd_debug ("pouet %dx%d ; %d ; %x;%x", pDesklet->iDesiredWidth, pDesklet->iDesiredHeight, pDesklet->iSidWriteSize, pDesklet->pBackGroundSurface, pDesklet->pForeGroundSurface);
257
if (pDesklet->iDesiredWidth == 0 && pDesklet->iDesiredHeight == 0 && pDesklet->iSidWriteSize == 0 && pDesklet->pBackGroundSurface == NULL && pDesklet->pForeGroundSurface == NULL)
259
cd_debug ("ce desklet a saute le chargement de ses deco => on l'aide.");
260
_cairo_dock_load_desklet_decorations (pDesklet, pSourceContext);
265
void cairo_dock_reload_desklets_decorations (gboolean bDefaultThemeOnly, cairo_t *pSourceContext) // tous ou bien seulement ceux avec "default".
267
cd_message ("%s (%d)", __func__, bDefaultThemeOnly);
268
gpointer data[2] = {GINT_TO_POINTER (bDefaultThemeOnly), pSourceContext};
269
cairo_dock_foreach_desklet ((CairoDockForeachDeskletFunc)_cairo_dock_reload_one_desklet_decorations, data);
272
void cairo_dock_free_desklet_decoration (CairoDeskletDecoration *pDecoration)
274
if (pDecoration == NULL)
276
g_free (pDecoration->cBackGroundImagePath);
277
g_free (pDecoration->cForeGroundImagePath);
278
g_free (pDecoration);
283
static inline double _compute_zoom_for_rotation (CairoDesklet *pDesklet)
285
double w = pDesklet->container.iWidth/2, h = pDesklet->container.iHeight/2;
286
double alpha = atan2 (h, w);
287
double theta = fabs (pDesklet->fRotation);
291
double d = sqrt (w * w + h * h);
292
double xmax = d * MAX (fabs (cos (alpha + theta)), fabs (cos (alpha - theta)));
293
double ymax = d * MAX (fabs (sin (alpha + theta)), fabs (sin (alpha - theta)));
294
double fZoom = MIN (w / xmax, h / ymax);
298
static inline void _render_desklet_cairo (CairoDesklet *pDesklet, cairo_t *pCairoContext)
300
// en attendant de trouver l'equivalent opengl.
302
double fColor[4] = {1., 1., 1., 0.};
303
if (! gtk_window_is_active (GTK_WINDOW (pDesklet->container.pWidget)))
306
fColor[3] = 1.*pDesklet->iGradationCount / CD_NB_ITER_FOR_GRADUATION;
310
cairo_save (pCairoContext);
311
cairo_pattern_t *pPattern = cairo_pattern_create_radial (.5*pDesklet->container.iWidth,
312
.5*pDesklet->container.iHeight,
314
.5*pDesklet->container.iWidth,
315
.5*pDesklet->container.iHeight,
316
.5*MIN (pDesklet->container.iWidth, pDesklet->container.iHeight));
317
cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_NONE);
319
cairo_pattern_add_color_stop_rgba (pPattern,
321
fColor[0], fColor[1], fColor[2], fColor[3]);
322
cairo_pattern_add_color_stop_rgba (pPattern,
324
fColor[0], fColor[1], fColor[2], 0.);
325
cairo_set_source (pCairoContext, pPattern);
326
cairo_paint (pCairoContext);
327
cairo_pattern_destroy (pPattern);
328
cairo_restore (pCairoContext);
332
cairo_save (pCairoContext);
334
if (pDesklet->container.fRatio != 1)
336
//g_print (" desklet zoom : %.2f (%dx%d)\n", pDesklet->container.fRatio, pDesklet->container.iWidth, pDesklet->container.iHeight);
337
cairo_translate (pCairoContext,
338
pDesklet->container.iWidth * (1 - pDesklet->container.fRatio)/2,
339
pDesklet->container.iHeight * (1 - pDesklet->container.fRatio)/2);
340
cairo_scale (pCairoContext, pDesklet->container.fRatio, pDesklet->container.fRatio);
343
if (pDesklet->fRotation != 0)
345
double fZoom = _compute_zoom_for_rotation (pDesklet);
347
cairo_translate (pCairoContext,
348
.5*pDesklet->container.iWidth,
349
.5*pDesklet->container.iHeight);
351
cairo_rotate (pCairoContext, pDesklet->fRotation);
353
cairo_scale (pCairoContext, fZoom, fZoom);
355
cairo_translate (pCairoContext,
356
-.5*pDesklet->container.iWidth,
357
-.5*pDesklet->container.iHeight);
360
if (pDesklet->pBackGroundSurface != NULL && pDesklet->fBackGroundAlpha != 0)
362
cairo_set_source_surface (pCairoContext,
363
pDesklet->pBackGroundSurface,
366
if (pDesklet->fBackGroundAlpha == 1)
367
cairo_paint (pCairoContext);
369
cairo_paint_with_alpha (pCairoContext, pDesklet->fBackGroundAlpha);
372
cairo_save (pCairoContext);
373
if (pDesklet->iLeftSurfaceOffset != 0 || pDesklet->iTopSurfaceOffset != 0 || pDesklet->iRightSurfaceOffset != 0 || pDesklet->iBottomSurfaceOffset != 0)
375
cairo_translate (pCairoContext, pDesklet->iLeftSurfaceOffset, pDesklet->iTopSurfaceOffset);
376
cairo_scale (pCairoContext,
377
1. - 1.*(pDesklet->iLeftSurfaceOffset + pDesklet->iRightSurfaceOffset) / pDesklet->container.iWidth,
378
1. - 1.*(pDesklet->iTopSurfaceOffset + pDesklet->iBottomSurfaceOffset) / pDesklet->container.iHeight);
381
if (pDesklet->pRenderer != NULL && pDesklet->pRenderer->render != NULL) // un moteur de rendu specifique a ete fourni.
383
pDesklet->pRenderer->render (pCairoContext, pDesklet);
385
cairo_restore (pCairoContext);
387
if (pDesklet->pForeGroundSurface != NULL && pDesklet->fForeGroundAlpha != 0)
389
cairo_set_source_surface (pCairoContext,
390
pDesklet->pForeGroundSurface,
393
if (pDesklet->fForeGroundAlpha == 1)
394
cairo_paint (pCairoContext);
396
cairo_paint_with_alpha (pCairoContext, pDesklet->fForeGroundAlpha);
399
if (! pDesklet->rotating) // si on est en train de tourner, les boutons suivent le mouvement, sinon ils sont dans les coins.
401
cairo_restore (pCairoContext);
402
cairo_save (pCairoContext);
404
if ((pDesklet->container.bInside || pDesklet->rotating) && _cairo_dock_desklet_is_free (pDesklet))
406
if (s_pRotateButtonBuffer.pSurface != NULL)
408
cairo_set_source_surface (pCairoContext, s_pRotateButtonBuffer.pSurface, 0., 0.);
409
cairo_paint (pCairoContext);
411
if (s_pRetachButtonBuffer.pSurface != NULL)
413
cairo_set_source_surface (pCairoContext, s_pRetachButtonBuffer.pSurface, pDesklet->container.iWidth - myDesklets.iDeskletButtonSize, 0.);
414
cairo_paint (pCairoContext);
417
/*if ((pDesklet->container.bInside || pDesklet->bNoInput) && s_pNoInputButtonBuffer.pSurface != NULL)
419
cairo_set_source_surface (pCairoContext, s_pNoInputButtonBuffer.pSurface, pDesklet->container.iWidth - myDesklets.iDeskletButtonSize, pDesklet->container.iHeight - myDesklets.iDeskletButtonSize);
420
cairo_paint (pCairoContext);
422
cairo_restore (pCairoContext);
425
static inline void _cairo_dock_set_desklet_matrix (CairoDesklet *pDesklet)
427
glTranslatef (0., 0., -pDesklet->container.iHeight * sqrt(3)/2 -
428
.45 * MAX (pDesklet->container.iWidth * fabs (sin (pDesklet->fDepthRotationY)),
429
pDesklet->container.iHeight * fabs (sin (pDesklet->fDepthRotationX)))
430
); // avec 60 deg de perspective
432
if (pDesklet->container.fRatio != 1)
434
glScalef (pDesklet->container.fRatio, pDesklet->container.fRatio, 1.);
437
if (pDesklet->fRotation != 0)
439
double fZoom = _compute_zoom_for_rotation (pDesklet);
440
glScalef (fZoom, fZoom, 1.);
441
glRotatef (- pDesklet->fRotation / G_PI * 180., 0., 0., 1.);
444
if (pDesklet->fDepthRotationY != 0)
446
glRotatef (- pDesklet->fDepthRotationY / G_PI * 180., 0., 1., 0.);
449
if (pDesklet->fDepthRotationX != 0)
451
glRotatef (- pDesklet->fDepthRotationX / G_PI * 180., 1., 0., 0.);
455
static inline void _render_desklet_opengl (CairoDesklet *pDesklet)
458
///glTranslatef (0*pDesklet->container.iWidth/2, 0*pDesklet->container.iHeight/2, 0.); // avec une perspective ortho.
459
///glTranslatef (0*pDesklet->container.iWidth/2, 0*pDesklet->container.iHeight/2, -pDesklet->container.iWidth*(1.87 +.35*fabs (sin(pDesklet->fDepthRotationY)))); // avec 30 deg de perspective
460
_cairo_dock_set_desklet_matrix (pDesklet);
462
_cairo_dock_enable_texture ();
463
_cairo_dock_set_blend_pbuffer ();
465
if (pDesklet->iBackGroundTexture != 0 && pDesklet->fBackGroundAlpha != 0)
467
_cairo_dock_apply_texture_at_size_with_alpha (pDesklet->iBackGroundTexture, pDesklet->container.iWidth, pDesklet->container.iHeight, pDesklet->fBackGroundAlpha);
471
if (pDesklet->iLeftSurfaceOffset != 0 || pDesklet->iTopSurfaceOffset != 0 || pDesklet->iRightSurfaceOffset != 0 || pDesklet->iBottomSurfaceOffset != 0)
473
glTranslatef ((pDesklet->iLeftSurfaceOffset - pDesklet->iRightSurfaceOffset)/2, (pDesklet->iBottomSurfaceOffset - pDesklet->iTopSurfaceOffset)/2, 0.);
474
glScalef (1. - 1.*(pDesklet->iLeftSurfaceOffset + pDesklet->iRightSurfaceOffset) / pDesklet->container.iWidth,
475
1. - 1.*(pDesklet->iTopSurfaceOffset + pDesklet->iBottomSurfaceOffset) / pDesklet->container.iHeight,
479
if (pDesklet->pRenderer != NULL && pDesklet->pRenderer->render_opengl != NULL) // un moteur de rendu specifique a ete fourni.
481
_cairo_dock_set_alpha (1.);
482
pDesklet->pRenderer->render_opengl (pDesklet);
486
_cairo_dock_enable_texture ();
487
_cairo_dock_set_blend_pbuffer ();
488
if (pDesklet->iForeGroundTexture != 0 && pDesklet->fForeGroundAlpha != 0)
490
_cairo_dock_apply_texture_at_size_with_alpha (pDesklet->iForeGroundTexture, pDesklet->container.iWidth, pDesklet->container.iHeight, pDesklet->fForeGroundAlpha);
493
//if (pDesklet->container.bInside && _cairo_dock_desklet_is_free (pDesklet))
495
if (! pDesklet->rotating && ! pDesklet->rotatingY && ! pDesklet->rotatingX)
499
glTranslatef (0., 0., -pDesklet->container.iHeight*(sqrt(3)/2));
503
if ((pDesklet->container.bInside || pDesklet->rotating || pDesklet->rotatingY || pDesklet->rotatingX) && _cairo_dock_desklet_is_free (pDesklet))
505
_cairo_dock_set_alpha (1.);
506
if (s_pRotateButtonBuffer.iTexture != 0)
509
glTranslatef (-pDesklet->container.iWidth/2 + myDesklets.iDeskletButtonSize/2,
510
pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
512
_cairo_dock_apply_texture_at_size (s_pRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
515
if (s_pRetachButtonBuffer.iTexture != 0)
518
glTranslatef (pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
519
pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
521
_cairo_dock_apply_texture_at_size (s_pRetachButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
524
if (s_pDepthRotateButtonBuffer.iTexture != 0)
528
pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
530
_cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
534
glRotatef (90., 0., 0., 1.);
536
pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
538
_cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
542
/*if ((pDesklet->container.bInside || pDesklet->bNoInput) && s_pNoInputButtonBuffer.iTexture != 0)
544
_cairo_dock_set_alpha (1.);
546
glTranslatef (pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
547
- pDesklet->container.iHeight/2 + myDesklets.iDeskletButtonSize/2,
549
_cairo_dock_apply_texture_at_size (s_pNoInputButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
553
_cairo_dock_disable_texture ();
557
gboolean cairo_dock_render_desklet_notification (gpointer pUserData, CairoDesklet *pDesklet, cairo_t *pCairoContext)
559
if (pCairoContext != NULL)
560
_render_desklet_cairo (pDesklet, pCairoContext);
562
_render_desklet_opengl (pDesklet);
563
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
566
static gboolean on_expose_desklet(GtkWidget *pWidget,
567
GdkEventExpose *pExpose,
568
CairoDesklet *pDesklet)
570
if (pDesklet->iDesiredWidth != 0 && pDesklet->iDesiredHeight != 0 && (pDesklet->iKnownWidth != pDesklet->iDesiredWidth || pDesklet->iKnownHeight != pDesklet->iDesiredHeight))
572
//g_print ("on saute le dessin\n");
575
// dessiner la fausse transparence.
579
cairo_t *pCairoContext = cairo_dock_create_drawing_context_on_container (CAIRO_CONTAINER (pDesklet));
580
cairo_destroy (pCairoContext);
585
pDesklet->iDesiredWidth = 0; /// ???
586
pDesklet->iDesiredHeight = 0;
588
if (g_bUseOpenGL && pDesklet->pRenderer && pDesklet->pRenderer->render_opengl)
590
GdkGLContext *pGlContext = gtk_widget_get_gl_context (pDesklet->container.pWidget);
591
GdkGLDrawable *pGlDrawable = gtk_widget_get_gl_drawable (pDesklet->container.pWidget);
592
if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
595
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
598
cairo_dock_apply_desktop_background_opengl (CAIRO_CONTAINER (pDesklet));
600
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_RENDER_DESKLET, pDesklet, NULL);
602
if (gdk_gl_drawable_is_double_buffered (pGlDrawable))
603
gdk_gl_drawable_swap_buffers (pGlDrawable);
606
gdk_gl_drawable_gl_end (pGlDrawable);
610
cairo_t *pCairoContext = cairo_dock_create_drawing_context_on_container (CAIRO_CONTAINER (pDesklet));
612
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_RENDER_DESKLET, pDesklet, pCairoContext);
614
cairo_destroy (pCairoContext);
621
/*static void _cairo_dock_set_desklet_input_shape (CairoDesklet *pDesklet)
623
gtk_widget_input_shape_combine_mask (pDesklet->container.pWidget,
627
if (pDesklet->bNoInput)
629
GdkBitmap *pShapeBitmap = (GdkBitmap*) gdk_pixmap_new (NULL,
630
pDesklet->container.iWidth,
631
pDesklet->container.iHeight,
634
cairo_t *pCairoContext = gdk_cairo_create (pShapeBitmap);
635
cairo_set_source_rgba (pCairoContext, 0.0f, 0.0f, 0.0f, 0.0f);
636
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_SOURCE);
637
cairo_paint (pCairoContext);
638
cairo_set_source_rgba (pCairoContext, 1., 1., 1., 1.);
639
cairo_rectangle (pCairoContext,
640
pDesklet->container.iWidth - myDesklets.iDeskletButtonSize,
641
pDesklet->container.iHeight - myDesklets.iDeskletButtonSize,
642
myDesklets.iDeskletButtonSize,
643
myDesklets.iDeskletButtonSize);
644
cairo_fill (pCairoContext);
645
cairo_destroy (pCairoContext);
646
gtk_widget_input_shape_combine_mask (pDesklet->container.pWidget,
650
g_object_unref (pShapeBitmap);
651
g_print ("input shape : %dx%d", pDesklet->container.iWidth, pDesklet->container.iHeight);
655
static gboolean _cairo_dock_write_desklet_size (CairoDesklet *pDesklet)
657
if ((pDesklet->iDesiredWidth == 0 && pDesklet->iDesiredHeight == 0) && pDesklet->pIcon != NULL && pDesklet->pIcon->pModuleInstance != NULL)
659
gchar *cSize = g_strdup_printf ("%d;%d", pDesklet->container.iWidth, pDesklet->container.iHeight);
660
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
661
G_TYPE_STRING, "Desklet", "size", cSize,
664
cairo_dock_update_desklet_size_in_gui (pDesklet->pIcon->pModuleInstance,
665
pDesklet->container.iWidth,
666
pDesklet->container.iHeight);
668
pDesklet->iSidWriteSize = 0;
669
pDesklet->iKnownWidth = pDesklet->container.iWidth;
670
pDesklet->iKnownHeight = pDesklet->container.iHeight;
671
if (((pDesklet->iDesiredWidth != 0 || pDesklet->iDesiredHeight != 0) && pDesklet->iDesiredWidth == pDesklet->container.iWidth && pDesklet->iDesiredHeight == pDesklet->container.iHeight) || (pDesklet->iDesiredWidth == 0 && pDesklet->iDesiredHeight == 0))
673
pDesklet->iDesiredWidth = 0;
674
pDesklet->iDesiredHeight = 0;
676
cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDesklet));
677
_cairo_dock_load_desklet_decorations (pDesklet, pCairoContext);
678
cairo_destroy (pCairoContext);
680
if (pDesklet->pIcon != NULL && pDesklet->pIcon->pModuleInstance != NULL)
682
//g_print ("RELOAD\n");
683
cairo_dock_reload_module_instance (pDesklet->pIcon->pModuleInstance, FALSE);
684
gtk_widget_queue_draw (pDesklet->container.pWidget); // sinon on ne redessine que l'interieur.
687
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
688
if (/*cairo_dock_window_is_dock (Xid) || */pDesklet->bSpaceReserved)
690
cairo_dock_reserve_space_for_desklet (pDesklet, TRUE);
694
//g_print ("iWidth <- %d;iHeight <- %d ; (%dx%d) (%x)\n", pDesklet->container.iWidth, pDesklet->container.iHeight, pDesklet->iKnownWidth, pDesklet->iKnownHeight, pDesklet->pIcon);
697
static gboolean _cairo_dock_write_desklet_position (CairoDesklet *pDesklet)
699
if (pDesklet->pIcon != NULL && pDesklet->pIcon->pModuleInstance != NULL)
701
int iRelativePositionX = (pDesklet->container.iWindowPositionX + pDesklet->container.iWidth/2 <= g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]/2 ? pDesklet->container.iWindowPositionX : pDesklet->container.iWindowPositionX - g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]);
702
int iRelativePositionY = (pDesklet->container.iWindowPositionY + pDesklet->container.iHeight/2 <= g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]/2 ? pDesklet->container.iWindowPositionY : pDesklet->container.iWindowPositionY - g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
704
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
705
int iNumDesktop = -1;
706
if (! cairo_dock_xwindow_is_sticky (Xid))
708
int iDesktop = cairo_dock_get_xwindow_desktop (Xid);
709
int iGlobalPositionX, iGlobalPositionY, iWidthExtent, iHeightExtent;
710
cairo_dock_get_xwindow_geometry (Xid, &iGlobalPositionX, &iGlobalPositionY, &iWidthExtent, &iHeightExtent);
711
if (iGlobalPositionX < 0)
712
iGlobalPositionX += g_iNbViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
713
if (iGlobalPositionY < 0)
714
iGlobalPositionY += g_iNbViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
716
int iViewportX = iGlobalPositionX / g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
717
int iViewportY = iGlobalPositionY / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
719
int iCurrentDesktop, iCurrentViewportX, iCurrentViewportY;
720
cairo_dock_get_current_desktop_and_viewport (&iCurrentDesktop, &iCurrentViewportX, &iCurrentViewportY);
722
iViewportX += iCurrentViewportX;
723
if (iViewportX >= g_iNbViewportX)
724
iViewportX -= g_iNbViewportX;
725
iViewportY += iCurrentViewportY;
726
if (iViewportY >= g_iNbViewportY)
727
iViewportY -= g_iNbViewportY;
728
//g_print ("position : %d,%d,%d / %d,%d,%d\n", iDesktop, iViewportX, iViewportY, iCurrentDesktop, iCurrentViewportX, iCurrentViewportY);
730
iNumDesktop = iDesktop * g_iNbViewportX * g_iNbViewportY + iViewportX * g_iNbViewportY + iViewportY;
731
//g_print ("desormais on place le desklet sur le bureau (%d,%d,%d)\n", iDesktop, iViewportX, iViewportY);
734
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
735
G_TYPE_INT, "Desklet", "x position", iRelativePositionX,
736
G_TYPE_INT, "Desklet", "y position", iRelativePositionY,
737
G_TYPE_INT, "Desklet", "num desktop", iNumDesktop,
739
cairo_dock_update_desklet_position_in_gui (pDesklet->pIcon->pModuleInstance,
744
if (pDesklet->bSpaceReserved)
746
cairo_dock_reserve_space_for_desklet (pDesklet, TRUE);
748
if (pDesklet->pIcon && cairo_dock_icon_has_dialog (pDesklet->pIcon))
750
cairo_dock_replace_all_dialogs ();
752
pDesklet->iSidWritePosition = 0;
755
static gboolean on_configure_desklet (GtkWidget* pWidget,
756
GdkEventConfigure* pEvent,
757
CairoDesklet *pDesklet)
759
//g_print (" >>>>>>>>> %s (%dx%d, %d;%d)", __func__, pEvent->width, pEvent->height, pEvent->x, pEvent->y);
760
if (pDesklet->container.iWidth != pEvent->width || pDesklet->container.iHeight != pEvent->height)
762
if ((pEvent->width < pDesklet->container.iWidth || pEvent->height < pDesklet->container.iHeight) && (pDesklet->iDesiredWidth != 0 && pDesklet->iDesiredHeight != 0))
764
gdk_window_resize (pDesklet->container.pWidget->window,
765
pDesklet->iDesiredWidth,
766
pDesklet->iDesiredHeight);
769
pDesklet->container.iWidth = pEvent->width;
770
pDesklet->container.iHeight = pEvent->height;
774
GdkGLContext* pGlContext = gtk_widget_get_gl_context (pWidget);
775
GdkGLDrawable* pGlDrawable = gtk_widget_get_gl_drawable (pWidget);
776
GLsizei w = pEvent->width;
777
GLsizei h = pEvent->height;
778
if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
781
glViewport(0, 0, w, h);
783
cairo_dock_set_perspective_view (w, h);
785
gdk_gl_drawable_gl_end (pGlDrawable);
788
/*if (pDesklet->bNoInput)
789
_cairo_dock_set_desklet_input_shape (pDesklet);*/ // 2.1.4
791
if (pDesklet->iSidWriteSize != 0)
793
g_source_remove (pDesklet->iSidWriteSize);
795
pDesklet->iSidWriteSize = g_timeout_add (500, (GSourceFunc) _cairo_dock_write_desklet_size, (gpointer) pDesklet);
798
int x = pEvent->x, y = pEvent->y;
799
//g_print ("new desklet position : (%d;%d)", x, y);
800
while (x < 0) // on passe au referentiel du viewport de la fenetre; inutile de connaitre sa position, puisqu'ils ont tous la meme taille.
801
x += g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
802
while (x >= g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL])
803
x -= g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
805
y += g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
806
while (y >= g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL])
807
y -= g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
808
//g_print (" => (%d;%d)\n", x, y);
809
if (pDesklet->container.iWindowPositionX != x || pDesklet->container.iWindowPositionY != y)
811
pDesklet->container.iWindowPositionX = x;
812
pDesklet->container.iWindowPositionY = y;
814
if (pDesklet->iSidWritePosition != 0)
816
g_source_remove (pDesklet->iSidWritePosition);
818
pDesklet->iSidWritePosition = g_timeout_add (500, (GSourceFunc) _cairo_dock_write_desklet_position, (gpointer) pDesklet);
820
pDesklet->moving = FALSE;
825
gboolean on_scroll_desklet (GtkWidget* pWidget,
826
GdkEventScroll* pScroll,
827
CairoDesklet *pDesklet)
829
//g_print ("scroll\n");
830
if (! (pScroll->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)))
832
Icon *icon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
835
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_SCROLL_ICON, icon, pDesklet, pScroll->direction);
841
gboolean on_unmap_desklet (GtkWidget* pWidget,
843
CairoDesklet *pDesklet)
845
g_print ("unmap desklet (bAllowMinimize:%d)\n", pDesklet->bAllowMinimize);
846
Window Xid = GDK_WINDOW_XID (pWidget->window);
847
if (cairo_dock_window_is_utility (Xid)) // sur la couche des widgets, on ne fait rien.
849
if (! pDesklet->bAllowMinimize)
851
if (pDesklet->pUnmapTimer)
853
double fElapsedTime = g_timer_elapsed (pDesklet->pUnmapTimer, NULL);
854
g_print ("fElapsedTime : %fms\n", fElapsedTime);
855
g_timer_destroy (pDesklet->pUnmapTimer);
856
pDesklet->pUnmapTimer = NULL;
857
if (fElapsedTime < .2)
860
gtk_window_present (GTK_WINDOW (pWidget));
864
pDesklet->bAllowMinimize = FALSE;
865
if (pDesklet->pUnmapTimer == NULL)
866
pDesklet->pUnmapTimer = g_timer_new (); // starts the timer.
868
return TRUE; // stops other handlers from being invoked for the event.
871
Icon *cairo_dock_pick_icon_on_opengl_desklet (CairoDesklet *pDesklet)
877
GdkGLContext* pGlContext = gtk_widget_get_gl_context (pDesklet->container.pWidget);
878
GdkGLDrawable* pGlDrawable = gtk_widget_get_gl_drawable (pDesklet->container.pWidget);
879
if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
882
glGetIntegerv (GL_VIEWPORT, viewport);
883
glSelectBuffer (4, selectBuf);
885
glRenderMode(GL_SELECT);
889
glMatrixMode (GL_PROJECTION);
892
gluPickMatrix ((GLdouble) pDesklet->container.iMouseX, (GLdouble) (viewport[3] - pDesklet->container.iMouseY), 2.0, 2.0, viewport);
893
gluPerspective (60.0, 1.0*(GLfloat)pDesklet->container.iWidth/(GLfloat)pDesklet->container.iHeight, 1., 4*pDesklet->container.iHeight);
895
glMatrixMode (GL_MODELVIEW);
899
_cairo_dock_set_desklet_matrix (pDesklet);
901
if (pDesklet->iLeftSurfaceOffset != 0 || pDesklet->iTopSurfaceOffset != 0 || pDesklet->iRightSurfaceOffset != 0 || pDesklet->iBottomSurfaceOffset != 0)
903
glTranslatef ((pDesklet->iLeftSurfaceOffset - pDesklet->iRightSurfaceOffset)/2, (pDesklet->iBottomSurfaceOffset - pDesklet->iTopSurfaceOffset)/2, 0.);
904
glScalef (1. - 1.*(pDesklet->iLeftSurfaceOffset + pDesklet->iRightSurfaceOffset) / pDesklet->container.iWidth,
905
1. - 1.*(pDesklet->iTopSurfaceOffset + pDesklet->iBottomSurfaceOffset) / pDesklet->container.iHeight,
909
glPolygonMode (GL_FRONT, GL_FILL);
910
glColor4f (1., 1., 1., 1.);
912
pDesklet->iPickedObject = 0;
913
if (pDesklet->render_bounding_box != NULL) // surclasse la fonction du moteur de rendu.
915
pDesklet->render_bounding_box (pDesklet);
917
else if (pDesklet->pRenderer && pDesklet->pRenderer->render_bounding_box != NULL)
919
pDesklet->pRenderer->render_bounding_box (pDesklet);
921
else // on le fait nous-memes a partir des coordonnees des icones.
923
glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.);
928
pIcon = pDesklet->pIcon;
929
if (pIcon != NULL && pIcon->iIconTexture != 0)
932
h = pIcon->fHeight/2;
933
x = pIcon->fDrawX + w;
934
y = pDesklet->container.iHeight - pIcon->fDrawY - h;
936
glLoadName(pIcon->iIconTexture);
939
glVertex3f(x-w, y+h, 0.);
940
glVertex3f(x+w, y+h, 0.);
941
glVertex3f(x+w, y-h, 0.);
942
glVertex3f(x-w, y-h, 0.);
947
for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
950
if (pIcon->iIconTexture == 0)
954
h = pIcon->fHeight/2;
955
x = pIcon->fDrawX + w;
956
y = pDesklet->container.iHeight - pIcon->fDrawY - h;
958
glLoadName(pIcon->iIconTexture);
961
glVertex3f(x-w, y+h, 0.);
962
glVertex3f(x+w, y+h, 0.);
963
glVertex3f(x+w, y-h, 0.);
964
glVertex3f(x-w, y-h, 0.);
971
hits = glRenderMode (GL_RENDER);
973
glMatrixMode (GL_PROJECTION);
975
glMatrixMode(GL_MODELVIEW);
978
Icon *pFoundIcon = NULL;
981
GLuint id = selectBuf[3];
984
if (pDesklet->render_bounding_box != NULL)
986
pDesklet->iPickedObject = id;
987
//g_print ("iPickedObject <- %d\n", id);
988
pFoundIcon = pDesklet->pIcon; // il faut mettre qqch, sinon la notification est filtree par la macro CD_APPLET_ON_CLICK_BEGIN.
992
pIcon = pDesklet->pIcon;
993
if (pIcon != NULL && pIcon->iIconTexture != 0)
995
if (pIcon->iIconTexture == id)
1001
if (pFoundIcon == NULL)
1004
for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
1007
if (pIcon->iIconTexture == id)
1017
gdk_gl_drawable_gl_end (pGlDrawable);
1022
Icon *cairo_dock_find_clicked_icon_in_desklet (CairoDesklet *pDesklet)
1024
if (g_bUseOpenGL && pDesklet->pRenderer && pDesklet->pRenderer->render_opengl)
1026
return cairo_dock_pick_icon_on_opengl_desklet (pDesklet);
1029
int iMouseX = pDesklet->container.iMouseX, iMouseY = pDesklet->container.iMouseY;
1030
if (pDesklet->fRotation != 0)
1032
//g_print (" clic en (%d;%d) rotations : %.2frad\n", iMouseX, iMouseY, pDesklet->fRotation);
1033
double x, y; // par rapport au centre du desklet.
1034
x = iMouseX - pDesklet->container.iWidth/2;
1035
y = pDesklet->container.iHeight/2 - iMouseY;
1037
double r, t; // coordonnees polaires.
1038
r = sqrt (x*x + y*y);
1041
double z = _compute_zoom_for_rotation (pDesklet);
1044
x = r * cos (t + pDesklet->fRotation); // la rotation de cairo est dans le sene horaire.
1045
y = r * sin (t + pDesklet->fRotation);
1047
iMouseX = x + pDesklet->container.iWidth/2;
1048
iMouseY = pDesklet->container.iHeight/2 - y;
1049
//g_print (" => (%d;%d)\n", iMouseX, iMouseY);
1051
pDesklet->iMouseX2d = iMouseX;
1052
pDesklet->iMouseY2d = iMouseY;
1054
Icon *icon = pDesklet->pIcon;
1055
g_return_val_if_fail (icon != NULL, NULL); // peut arriver au tout debut, car on associe l'icone au desklet _apres_ l'avoir cree, et on fait tourner la gtk_main entre-temps (pour le redessiner invisible).
1056
if (icon->fDrawX < iMouseX && icon->fDrawX + icon->fWidth * icon->fScale > iMouseX && icon->fDrawY < iMouseY && icon->fDrawY + icon->fHeight * icon->fScale > iMouseY)
1061
if (pDesklet->icons != NULL)
1064
for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
1067
if (icon->fDrawX < iMouseX && icon->fDrawX + icon->fWidth * icon->fScale > iMouseX && icon->fDrawY < iMouseY && icon->fDrawY + icon->fHeight * icon->fScale > iMouseY)
1076
static gboolean on_button_press_desklet(GtkWidget *pWidget,
1077
GdkEventButton *pButton,
1078
CairoDesklet *pDesklet)
1080
if (pButton->button == 1) // clic gauche.
1082
if (pButton->type == GDK_BUTTON_PRESS)
1084
pDesklet->bClicked = TRUE;
1085
if (_cairo_dock_desklet_is_free (pDesklet))
1087
pDesklet->container.iMouseX = pButton->x; // pour le deplacement manuel.
1088
pDesklet->container.iMouseY = pButton->y;
1090
if (pButton->x < myDesklets.iDeskletButtonSize && pButton->y < myDesklets.iDeskletButtonSize)
1091
pDesklet->rotating = TRUE;
1092
else if (pButton->x > pDesklet->container.iWidth - myDesklets.iDeskletButtonSize && pButton->y < myDesklets.iDeskletButtonSize)
1093
pDesklet->retaching = TRUE;
1094
else if (pButton->x > (pDesklet->container.iWidth - myDesklets.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDesklets.iDeskletButtonSize)/2 && pButton->y < myDesklets.iDeskletButtonSize)
1095
pDesklet->rotatingY = TRUE;
1096
else if (pButton->y > (pDesklet->container.iHeight - myDesklets.iDeskletButtonSize)/2 && pButton->y < (pDesklet->container.iHeight + myDesklets.iDeskletButtonSize)/2 && pButton->x < myDesklets.iDeskletButtonSize)
1097
pDesklet->rotatingX = TRUE;
1099
pDesklet->time = pButton->time;
1101
/*if (pButton->x > pDesklet->container.iWidth - myDesklets.iDeskletButtonSize && pButton->y > pDesklet->container.iHeight - myDesklets.iDeskletButtonSize)
1102
pDesklet->making_transparent = TRUE;*/ // 2.1.4
1104
else if (pButton->type == GDK_BUTTON_RELEASE)
1106
if (!pDesklet->bClicked) // on n'accepte le release que si on avait clique sur le desklet avant (on peut recevoir le release si on avat clique sur un dialogue qui chevauchait notre desklet et qui a disparu au clic).
1110
pDesklet->bClicked = FALSE;
1111
cd_debug ("GDK_BUTTON_RELEASE");
1112
if (pDesklet->moving)
1114
pDesklet->moving = FALSE;
1116
else if (pDesklet->rotating)
1118
pDesklet->rotating = FALSE;
1119
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1120
G_TYPE_INT, "Desklet", "rotation", (int) (pDesklet->fRotation / G_PI * 180.),
1122
gtk_widget_queue_draw (pDesklet->container.pWidget);
1124
else if (pDesklet->retaching)
1126
pDesklet->retaching = FALSE;
1127
if (pButton->x > pDesklet->container.iWidth - myDesklets.iDeskletButtonSize && pButton->y < myDesklets.iDeskletButtonSize) // on verifie qu'on est encore dedans.
1129
Icon *icon = pDesklet->pIcon;
1130
g_return_val_if_fail (CAIRO_DOCK_IS_APPLET (icon), FALSE);
1131
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1132
G_TYPE_BOOLEAN, "Desklet", "initially detached", FALSE,
1134
cairo_dock_update_desklet_detached_state_in_gui (icon->pModuleInstance, FALSE);
1135
cairo_dock_reload_module_instance (icon->pModuleInstance, TRUE);
1136
return TRUE; // interception du signal.
1139
/*else if (pDesklet->making_transparent)
1141
g_print ("pDesklet->making_transparent\n");
1142
pDesklet->making_transparent = FALSE;
1143
if (pButton->x > pDesklet->container.iWidth - myDesklets.iDeskletButtonSize && pButton->y > pDesklet->container.iHeight - myDesklets.iDeskletButtonSize) // on verifie qu'on est encore dedans.
1145
Icon *icon = pDesklet->pIcon;
1146
g_return_val_if_fail (CAIRO_DOCK_IS_APPLET (icon), FALSE);
1147
pDesklet->bNoInput = ! pDesklet->bNoInput;
1148
g_print ("no input : %d (%s)\n", pDesklet->bNoInput, icon->pModuleInstance->cConfFilePath);
1149
cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath,
1150
G_TYPE_BOOLEAN, "Desklet", "no input", pDesklet->bNoInput,
1152
_cairo_dock_set_desklet_input_shape (pDesklet);
1153
gtk_widget_queue_draw (pDesklet->container.pWidget);
1156
else if (pDesklet->rotatingY)
1158
pDesklet->rotatingY = FALSE;
1159
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1160
G_TYPE_INT, "Desklet", "depth rotation y", (int) (pDesklet->fDepthRotationY / G_PI * 180.),
1162
gtk_widget_queue_draw (pDesklet->container.pWidget);
1164
else if (pDesklet->rotatingX)
1166
pDesklet->rotatingX = FALSE;
1167
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1168
G_TYPE_INT, "Desklet", "depth rotation x", (int) (pDesklet->fDepthRotationX / G_PI * 180.),
1170
gtk_widget_queue_draw (pDesklet->container.pWidget);
1174
Icon *pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
1175
cairo_dock_notify (CAIRO_DOCK_CLICK_ICON, pClickedIcon, pDesklet, pButton->state);
1178
else if (pButton->type == GDK_2BUTTON_PRESS)
1180
if (! (pButton->x < myDesklets.iDeskletButtonSize && pButton->y < myDesklets.iDeskletButtonSize) && ! (pButton->x > (pDesklet->container.iWidth - myDesklets.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDesklets.iDeskletButtonSize)/2 && pButton->y < myDesklets.iDeskletButtonSize))
1182
Icon *pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
1183
cairo_dock_notify (CAIRO_DOCK_DOUBLE_CLICK_ICON, pClickedIcon, pDesklet);
1187
else if (pButton->button == 3 && pButton->type == GDK_BUTTON_PRESS) // clique droit.
1189
Icon *pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
1190
GtkWidget *menu = cairo_dock_build_menu (pClickedIcon, CAIRO_CONTAINER (pDesklet)); // genere un CAIRO_DOCK_BUILD_ICON_MENU.
1191
gtk_widget_show_all (menu);
1192
gtk_menu_popup (GTK_MENU (menu),
1198
gtk_get_current_event_time ());
1199
pDesklet->container.bInside = FALSE;
1200
pDesklet->iGradationCount = 0; // on force le fond a redevenir transparent.
1201
gtk_widget_queue_draw (pDesklet->container.pWidget);
1203
else if (pButton->button == 2 && pButton->type == GDK_BUTTON_PRESS) // clique milieu.
1205
if (pButton->x < myDesklets.iDeskletButtonSize && pButton->y < myDesklets.iDeskletButtonSize)
1207
pDesklet->fRotation = 0.;
1208
gtk_widget_queue_draw (pDesklet->container.pWidget);
1209
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1210
G_TYPE_INT, "Desklet", "rotation", 0,
1213
else if (pButton->x > (pDesklet->container.iWidth - myDesklets.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDesklets.iDeskletButtonSize)/2 && pButton->y < myDesklets.iDeskletButtonSize)
1215
pDesklet->fDepthRotationY = 0.;
1216
gtk_widget_queue_draw (pDesklet->container.pWidget);
1217
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1218
G_TYPE_INT, "Desklet", "depth rotation y", 0,
1221
else if (pButton->y > (pDesklet->container.iHeight - myDesklets.iDeskletButtonSize)/2 && pButton->y < (pDesklet->container.iHeight + myDesklets.iDeskletButtonSize)/2 && pButton->x < myDesklets.iDeskletButtonSize)
1223
pDesklet->fDepthRotationX = 0.;
1224
gtk_widget_queue_draw (pDesklet->container.pWidget);
1225
cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath,
1226
G_TYPE_INT, "Desklet", "depth rotation x", 0,
1231
cairo_dock_notify (CAIRO_DOCK_MIDDLE_CLICK_ICON, pDesklet->pIcon, pDesklet);
1237
void on_drag_data_received_desklet (GtkWidget *pWidget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, CairoDesklet *pDesklet)
1239
//g_print ("%s (%dx%d)\n", __func__, x, y);
1241
//\_________________ On recupere l'URI.
1242
gchar *cReceivedData = (gchar *) selection_data->data;
1243
g_return_if_fail (cReceivedData != NULL);
1245
pDesklet->container.iMouseX = x;
1246
pDesklet->container.iMouseY = y;
1247
Icon *pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
1248
cairo_dock_notify_drop_data (cReceivedData, pClickedIcon, 0, CAIRO_CONTAINER (pDesklet));
1251
static gboolean on_motion_notify_desklet(GtkWidget *pWidget,
1252
GdkEventMotion* pMotion,
1253
CairoDesklet *pDesklet)
1255
if (pMotion->state & GDK_BUTTON1_MASK && _cairo_dock_desklet_is_free (pDesklet))
1257
cd_debug ("root : %d;%d", (int) pMotion->x_root, (int) pMotion->y_root);
1258
/*pDesklet->moving = TRUE;
1259
gtk_window_move (GTK_WINDOW (pWidget),
1260
pMotion->x_root + pDesklet->diff_x,
1261
pMotion->y_root + pDesklet->diff_y);*/
1263
else // le 'press-button' est local au sous-widget clique, alors que le 'motion-notify' est global a la fenetre; c'est donc par lui qu'on peut avoir a coup sur les coordonnees du curseur (juste avant le clic).
1265
pDesklet->container.iMouseX = pMotion->x;
1266
pDesklet->container.iMouseY = pMotion->y;
1267
gboolean bStartAnimation = FALSE;
1268
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_MOUSE_MOVED, pDesklet, &bStartAnimation);
1269
if (bStartAnimation)
1270
cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet));
1273
if (pDesklet->rotating && _cairo_dock_desklet_is_free (pDesklet))
1275
double alpha = atan2 (pDesklet->container.iHeight, - pDesklet->container.iWidth);
1276
pDesklet->fRotation = alpha - atan2 (.5*pDesklet->container.iHeight - pMotion->y, pMotion->x - .5*pDesklet->container.iWidth);
1277
while (pDesklet->fRotation > G_PI)
1278
pDesklet->fRotation -= 2 * G_PI;
1279
while (pDesklet->fRotation <= - G_PI)
1280
pDesklet->fRotation += 2 * G_PI;
1281
gtk_widget_queue_draw(pDesklet->container.pWidget);
1283
else if (pDesklet->rotatingY && _cairo_dock_desklet_is_free (pDesklet))
1285
pDesklet->fDepthRotationY = G_PI * (pMotion->x - .5*pDesklet->container.iWidth) / pDesklet->container.iWidth;
1286
gtk_widget_queue_draw(pDesklet->container.pWidget);
1288
else if (pDesklet->rotatingX && _cairo_dock_desklet_is_free (pDesklet))
1290
pDesklet->fDepthRotationX = G_PI * (pMotion->y - .5*pDesklet->container.iHeight) / pDesklet->container.iHeight;
1291
gtk_widget_queue_draw(pDesklet->container.pWidget);
1293
else if (pMotion->state & GDK_BUTTON1_MASK && _cairo_dock_desklet_is_free (pDesklet) && ! pDesklet->moving)
1295
gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (pWidget)),
1296
1/*pButton->button*/,
1297
pMotion->x_root/*pButton->x_root*/,
1298
pMotion->y_root/*pButton->y_root*/,
1299
pDesklet->time/*pButton->time*/);
1300
pDesklet->moving = TRUE;
1304
gboolean bStartAnimation = FALSE;
1305
Icon *pIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
1308
if (! pIcon->bPointed)
1310
Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDesklet->icons);
1311
if (pPointedIcon != NULL)
1312
pPointedIcon->bPointed = FALSE;
1313
pIcon->bPointed = TRUE;
1315
//g_print ("on survole %s\n", pIcon->cName);
1316
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_ENTER_ICON, pIcon, pDesklet, &bStartAnimation);
1321
Icon *pPointedIcon = cairo_dock_get_pointed_icon (pDesklet->icons);
1322
if (pPointedIcon != NULL)
1324
pPointedIcon->bPointed = FALSE;
1326
//g_print ("kedal\n");
1327
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_ENTER_ICON, pPointedIcon, pDesklet, &bStartAnimation);
1331
if (bStartAnimation)
1333
cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet));
1337
gdk_device_get_state (pMotion->device, pMotion->window, NULL, NULL); // pour recevoir d'autres MotionNotify.
1342
static gboolean on_focus_in_out_desklet(GtkWidget *widget,
1343
GdkEventFocus *event,
1344
CairoDesklet *pDesklet)
1347
gtk_widget_queue_draw(pDesklet->container.pWidget);
1351
static gboolean _cairo_dock_desklet_gradation (CairoDesklet *pDesklet)
1353
pDesklet->iGradationCount += (pDesklet->container.bInside ? 1 : -1);
1354
gtk_widget_queue_draw (pDesklet->container.pWidget);
1356
if (pDesklet->iGradationCount <= 0 || pDesklet->iGradationCount >= CD_NB_ITER_FOR_GRADUATION)
1358
if (pDesklet->iGradationCount < 0)
1359
pDesklet->iGradationCount = 0;
1360
else if (pDesklet->iGradationCount > CD_NB_ITER_FOR_GRADUATION)
1361
pDesklet->iGradationCount = CD_NB_ITER_FOR_GRADUATION;
1362
pDesklet->iSidGradationOnEnter = 0;
1367
static gboolean on_enter_desklet (GtkWidget* pWidget,
1368
GdkEventCrossing* pEvent,
1369
CairoDesklet *pDesklet)
1371
//g_print ("%s (%d)\n", __func__, pDesklet->container.bInside);
1372
if (! pDesklet->container.bInside) // avant on etait dehors, on redessine donc.
1374
pDesklet->container.bInside = TRUE;
1375
/**if (pDesklet->iSidGradationOnEnter == 0)
1377
pDesklet->iSidGradationOnEnter = g_timeout_add (50, (GSourceFunc) _cairo_dock_desklet_gradation, (gpointer) pDesklet);
1379
gtk_widget_queue_draw (pWidget); // redessin des boutons.
1381
if (g_bUseOpenGL/* && pDesklet->pRenderer && pDesklet->pRenderer->render_opengl != NULL*/)
1383
gboolean bStartAnimation = FALSE;
1384
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_ENTER_DESKLET, pDesklet, &bStartAnimation);
1385
if (bStartAnimation)
1386
cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet));
1391
static gboolean on_leave_desklet (GtkWidget* pWidget,
1392
GdkEventCrossing* pEvent,
1393
CairoDesklet *pDesklet)
1395
//g_print ("%s (%d)\n", __func__, pDesklet->container.bInside);
1396
int iMouseX, iMouseY;
1397
gdk_window_get_pointer (pWidget->window, &iMouseX, &iMouseY, NULL);
1398
if (gtk_bin_get_child (GTK_BIN (pDesklet->container.pWidget)) != NULL && iMouseX > 0 && iMouseX < pDesklet->container.iWidth && iMouseY > 0 && iMouseY < pDesklet->container.iHeight) // en fait on est dans un widget fils, donc on ne fait rien.
1403
pDesklet->container.bInside = FALSE;
1404
/**if (pDesklet->iSidGradationOnEnter == 0)
1406
pDesklet->iSidGradationOnEnter = g_timeout_add (50, (GSourceFunc) _cairo_dock_desklet_gradation, (gpointer) pDesklet);
1408
gtk_widget_queue_draw (pWidget); // redessin des boutons.
1410
gboolean bStartAnimation = FALSE;
1411
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_LEAVE_DESKLET, pDesklet, &bStartAnimation);
1412
if (bStartAnimation)
1413
cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet));
1419
CairoDesklet *cairo_dock_create_desklet (Icon *pIcon, GtkWidget *pInteractiveWidget, CairoDeskletAccessibility iAccessibility)
1421
cd_message ("%s ()", __func__);
1422
CairoDesklet *pDesklet = g_new0(CairoDesklet, 1);
1423
pDesklet->container.iType = CAIRO_DOCK_TYPE_DESKLET;
1424
pDesklet->container.bIsHorizontal = TRUE;
1425
pDesklet->container.bDirectionUp = TRUE;
1426
pDesklet->container.fRatio = 1;
1428
GtkWidget* pWindow = cairo_dock_create_container_window ();
1429
if (iAccessibility == CAIRO_DESKLET_ON_WIDGET_LAYER)
1430
gtk_window_set_type_hint (GTK_WINDOW (pWindow), GDK_WINDOW_TYPE_HINT_UTILITY);
1431
else if (iAccessibility == CAIRO_DESKLET_RESERVE_SPACE)
1432
gtk_window_set_type_hint (GTK_WINDOW (pWindow), GDK_WINDOW_TYPE_HINT_DOCK);
1434
pDesklet->container.pWidget = pWindow;
1435
pDesklet->pIcon = pIcon;
1437
gtk_window_set_title (GTK_WINDOW(pWindow), "cairo-dock-desklet");
1438
gtk_widget_add_events( pWindow, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_FOCUS_CHANGE_MASK);
1439
gtk_container_set_border_width(GTK_CONTAINER(pWindow), 3); // comme ca.
1440
gtk_window_set_default_size(GTK_WINDOW(pWindow), 10, 10); // idem.
1442
g_signal_connect (G_OBJECT (pWindow),
1444
G_CALLBACK (on_expose_desklet),
1446
g_signal_connect (G_OBJECT (pWindow),
1448
G_CALLBACK (on_configure_desklet),
1450
g_signal_connect (G_OBJECT (pWindow),
1451
"motion-notify-event",
1452
G_CALLBACK (on_motion_notify_desklet),
1454
g_signal_connect (G_OBJECT (pWindow),
1455
"button-press-event",
1456
G_CALLBACK (on_button_press_desklet),
1458
g_signal_connect (G_OBJECT (pWindow),
1459
"button-release-event",
1460
G_CALLBACK (on_button_press_desklet),
1462
g_signal_connect (G_OBJECT (pWindow),
1464
G_CALLBACK (on_focus_in_out_desklet),
1466
g_signal_connect (G_OBJECT (pWindow),
1468
G_CALLBACK (on_focus_in_out_desklet),
1470
g_signal_connect (G_OBJECT (pWindow),
1471
"enter-notify-event",
1472
G_CALLBACK (on_enter_desklet),
1474
g_signal_connect (G_OBJECT (pWindow),
1475
"leave-notify-event",
1476
G_CALLBACK (on_leave_desklet),
1478
g_signal_connect (G_OBJECT (pWindow),
1480
G_CALLBACK (on_unmap_desklet),
1482
g_signal_connect (G_OBJECT (pWindow),
1484
G_CALLBACK (on_scroll_desklet),
1486
cairo_dock_allow_widget_to_receive_data (pWindow, G_CALLBACK (on_drag_data_received_desklet), pDesklet);
1489
if (pInteractiveWidget != NULL)
1491
cd_debug ("ref = %d", pInteractiveWidget->object.parent_instance.ref_count);
1492
cairo_dock_add_interactive_widget_to_desklet (pInteractiveWidget, pDesklet);
1493
cd_debug ("pack -> ref = %d", pInteractiveWidget->object.parent_instance.ref_count);
1496
gtk_widget_show_all(pWindow);
1498
if (s_pRotateButtonBuffer.pSurface == NULL)
1500
cairo_dock_load_desklet_buttons ();
1506
void cairo_dock_configure_desklet (CairoDesklet *pDesklet, CairoDeskletAttribute *pAttribute)
1508
cd_debug ("%s (%dx%d ; (%d,%d) ; %d)", __func__, pAttribute->iDeskletWidth, pAttribute->iDeskletHeight, pAttribute->iDeskletPositionX, pAttribute->iDeskletPositionY, pAttribute->iAccessibility);
1509
if (pAttribute->bDeskletUseSize && (pAttribute->iDeskletWidth != pDesklet->container.iWidth || pAttribute->iDeskletHeight != pDesklet->container.iHeight))
1511
pDesklet->iDesiredWidth = pAttribute->iDeskletWidth;
1512
pDesklet->iDesiredHeight = pAttribute->iDeskletHeight;
1513
gdk_window_resize (pDesklet->container.pWidget->window,
1514
pAttribute->iDeskletWidth,
1515
pAttribute->iDeskletHeight);
1517
if (! pAttribute->bDeskletUseSize)
1518
gtk_container_set_border_width (GTK_CONTAINER (pDesklet->container.pWidget), 0);
1520
int iAbsolutePositionX = (pAttribute->iDeskletPositionX < 0 ? g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] + pAttribute->iDeskletPositionX : pAttribute->iDeskletPositionX);
1521
iAbsolutePositionX = MAX (0, MIN (g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - pAttribute->iDeskletWidth, iAbsolutePositionX));
1522
int iAbsolutePositionY = (pAttribute->iDeskletPositionY < 0 ? g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] + pAttribute->iDeskletPositionY : pAttribute->iDeskletPositionY);
1523
iAbsolutePositionY = MAX (0, MIN (g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - pAttribute->iDeskletHeight, iAbsolutePositionY));
1525
if (pAttribute->bOnAllDesktops)
1526
gdk_window_move(pDesklet->container.pWidget->window,
1528
iAbsolutePositionY);
1529
//g_print (" let's place the deklet at (%d;%d)", iAbsolutePositionX, iAbsolutePositionY);
1531
gtk_window_set_keep_below (GTK_WINDOW (pDesklet->container.pWidget), pAttribute->iAccessibility == CAIRO_DESKLET_KEEP_BELOW);
1532
gtk_window_set_keep_above (GTK_WINDOW (pDesklet->container.pWidget), pAttribute->iAccessibility == CAIRO_DESKLET_KEEP_ABOVE);
1534
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1535
if (pAttribute->iAccessibility == CAIRO_DESKLET_ON_WIDGET_LAYER)
1536
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_UTILITY"); // le hide-show le fait deconner completement, il perd son skip_task_bar ! au moins sous KDE3.
1538
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");
1540
if (pAttribute->iAccessibility == CAIRO_DESKLET_RESERVE_SPACE)
1542
if (! pDesklet->bSpaceReserved)
1543
cairo_dock_reserve_space_for_desklet (pDesklet, pAttribute->iAccessibility == CAIRO_DESKLET_RESERVE_SPACE); // sinon inutile de le refaire maintenant, ce sera declenche par le changement de taille/position s'il y'en a.
1544
pDesklet->bSpaceReserved = TRUE;
1547
pDesklet->bSpaceReserved = FALSE;
1549
if (pAttribute->bOnAllDesktops)
1551
gtk_window_stick (GTK_WINDOW (pDesklet->container.pWidget));
1555
gtk_window_unstick (GTK_WINDOW (pDesklet->container.pWidget));
1556
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1557
if (g_iNbViewportX > 0 && g_iNbViewportY > 0)
1559
int iNumDesktop, iNumViewportX, iNumViewportY;
1560
iNumDesktop = pAttribute->iNumDesktop / (g_iNbViewportX * g_iNbViewportY);
1561
int index2 = pAttribute->iNumDesktop % (g_iNbViewportX * g_iNbViewportY);
1562
iNumViewportX = index2 / g_iNbViewportY;
1563
iNumViewportY = index2 % g_iNbViewportY;
1565
int iCurrentDesktop, iCurrentViewportX, iCurrentViewportY;
1566
cairo_dock_get_current_desktop_and_viewport (&iCurrentDesktop, &iCurrentViewportX, &iCurrentViewportY);
1567
g_print (">>> on fixe le desklet sur le bureau (%d,%d,%d) (cur : %d,%d,%d)\n", iNumDesktop, iNumViewportX, iNumViewportY, iCurrentDesktop, iCurrentViewportX, iCurrentViewportY);
1569
iNumViewportX -= iCurrentViewportX;
1570
iNumViewportY -= iCurrentViewportY;
1572
g_print ("on le place en %d + %d\n", iNumViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL], iAbsolutePositionX);
1573
cairo_dock_move_xwindow_to_absolute_position (Xid, iNumDesktop, iNumViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] + iAbsolutePositionX, iNumViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] + iAbsolutePositionY);
1576
pDesklet->bPositionLocked = pAttribute->bPositionLocked;
1577
/*pDesklet->bNoInput = pAttribute->bNoInput;*/ // 2.1.4
1578
pDesklet->fRotation = pAttribute->iRotation / 180. * G_PI ;
1579
pDesklet->fDepthRotationY = pAttribute->iDepthRotationY / 180. * G_PI ;
1580
pDesklet->fDepthRotationX = pAttribute->iDepthRotationX / 180. * G_PI ;
1582
g_free (pDesklet->cDecorationTheme);
1583
pDesklet->cDecorationTheme = pAttribute->cDecorationTheme;
1584
pAttribute->cDecorationTheme = NULL;
1585
cairo_dock_free_desklet_decoration (pDesklet->pUserDecoration);
1586
pDesklet->pUserDecoration = pAttribute->pUserDecoration;
1587
pAttribute->pUserDecoration = NULL;
1589
//cd_debug ("%s (%dx%d ; %d)", __func__, pDesklet->iDesiredWidth, pDesklet->iDesiredHeight, pDesklet->iSidWriteSize);
1590
if (pDesklet->iDesiredWidth == 0 && pDesklet->iDesiredHeight == 0 && pDesklet->iSidWriteSize == 0)
1592
cairo_t *pCairoContext = cairo_dock_create_drawing_context_generic (CAIRO_CONTAINER (pDesklet));
1593
_cairo_dock_load_desklet_decorations (pDesklet, pCairoContext);
1594
cairo_destroy (pCairoContext);
1598
void cairo_dock_free_desklet (CairoDesklet *pDesklet)
1600
if (pDesklet == NULL)
1603
if (pDesklet->iSidWriteSize != 0)
1604
g_source_remove (pDesklet->iSidWriteSize);
1605
if (pDesklet->iSidWritePosition != 0)
1606
g_source_remove (pDesklet->iSidWritePosition);
1607
if (pDesklet->iSidGrowUp != 0)
1608
g_source_remove (pDesklet->iSidGrowUp);
1609
if (pDesklet->container.iSidGLAnimation != 0)
1610
g_source_remove (pDesklet->container.iSidGLAnimation);
1611
if (pDesklet->iSidGradationOnEnter != 0)
1612
g_source_remove (pDesklet->iSidGradationOnEnter);
1613
cairo_dock_notify_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_STOP_DESKLET, pDesklet);
1615
cairo_dock_steal_interactive_widget_from_desklet (pDesklet);
1617
gtk_widget_destroy (pDesklet->container.pWidget);
1618
pDesklet->container.pWidget = NULL;
1620
if (pDesklet->pRenderer != NULL)
1622
if (pDesklet->pRenderer->free_data != NULL)
1624
pDesklet->pRenderer->free_data (pDesklet);
1625
pDesklet->pRendererData = NULL;
1629
if (pDesklet->icons != NULL)
1631
g_list_foreach (pDesklet->icons, (GFunc) cairo_dock_free_icon, NULL);
1632
g_list_free (pDesklet->icons);
1633
pDesklet->icons = NULL;
1636
g_free (pDesklet->cDecorationTheme);
1637
cairo_dock_free_desklet_decoration (pDesklet->pUserDecoration);
1639
if (pDesklet->pBackGroundSurface != NULL)
1640
cairo_surface_destroy (pDesklet->pBackGroundSurface);
1641
if (pDesklet->pForeGroundSurface != NULL)
1642
cairo_surface_destroy (pDesklet->pForeGroundSurface);
1643
if (pDesklet->iBackGroundTexture != 0)
1644
_cairo_dock_delete_texture (pDesklet->iBackGroundTexture);
1645
if (pDesklet->iForeGroundTexture != 0)
1646
_cairo_dock_delete_texture (pDesklet->iForeGroundTexture);
1653
void cairo_dock_add_interactive_widget_to_desklet_full (GtkWidget *pInteractiveWidget, CairoDesklet *pDesklet, int iRightMargin)
1655
g_return_if_fail (pDesklet != NULL && pInteractiveWidget != NULL);
1656
if (pDesklet->pInteractiveWidget != NULL || gtk_bin_get_child (GTK_BIN (pDesklet->container.pWidget)) != NULL)
1658
cd_warning ("This desklet already has an interactive widget !");
1662
//gtk_container_add (GTK_CONTAINER (pDesklet->container.pWidget), pInteractiveWidget);
1663
GtkWidget *pHBox = gtk_hbox_new (FALSE, 0);
1664
gtk_container_add (GTK_CONTAINER (pDesklet->container.pWidget), pHBox);
1666
gtk_box_pack_start (GTK_BOX (pHBox), pInteractiveWidget, TRUE, TRUE, 0);
1667
pDesklet->pInteractiveWidget = pInteractiveWidget;
1669
if (iRightMargin != 0)
1671
GtkWidget *pMarginBox = gtk_vbox_new (FALSE, 0);
1672
gtk_widget_set (pMarginBox, "width-request", iRightMargin, NULL);
1673
gtk_box_pack_start (GTK_BOX (pHBox), pMarginBox, FALSE, FALSE, 0); // a tester ...
1676
gtk_widget_show_all (pHBox);
1679
void cairo_dock_set_desklet_margin (CairoDesklet *pDesklet, int iRightMargin)
1681
g_return_if_fail (pDesklet != NULL && pDesklet->pInteractiveWidget != NULL);
1683
GtkWidget *pHBox = gtk_bin_get_child (GTK_BIN (pDesklet->container.pWidget));
1684
if (pHBox && pHBox != pDesklet->pInteractiveWidget) // precaution.
1686
GList *pChildList = gtk_container_get_children (GTK_CONTAINER (pHBox));
1687
if (pChildList != NULL)
1689
if (pChildList->next != NULL)
1691
GtkWidget *pMarginBox = GTK_WIDGET (pChildList->next->data);
1692
gtk_widget_set (pMarginBox, "width-request", iRightMargin, NULL);
1694
else // on rajoute le widget de la marge.
1696
GtkWidget *pMarginBox = gtk_vbox_new (FALSE, 0);
1697
gtk_widget_set (pMarginBox, "width-request", iRightMargin, NULL);
1698
gtk_box_pack_start (GTK_BOX (pHBox), pMarginBox, FALSE, FALSE, 0);
1700
g_list_free (pChildList);
1705
GtkWidget *cairo_dock_steal_interactive_widget_from_desklet (CairoDesklet *pDesklet)
1707
if (pDesklet == NULL)
1710
GtkWidget *pInteractiveWidget = pDesklet->pInteractiveWidget;
1711
if (pInteractiveWidget != NULL)
1713
pInteractiveWidget = cairo_dock_steal_widget_from_its_container (pInteractiveWidget);
1714
pDesklet->pInteractiveWidget = NULL;
1715
GtkWidget *pBox = gtk_bin_get_child (GTK_BIN (pDesklet->container.pWidget));
1717
gtk_widget_destroy (pBox);
1719
return pInteractiveWidget;
1724
void cairo_dock_hide_desklet (CairoDesklet *pDesklet)
1728
pDesklet->bAllowMinimize = TRUE;
1729
gtk_widget_hide (pDesklet->container.pWidget);
1733
void cairo_dock_show_desklet (CairoDesklet *pDesklet)
1737
gtk_window_present(GTK_WINDOW(pDesklet->container.pWidget));
1738
gtk_window_move (GTK_WINDOW(pDesklet->container.pWidget), pDesklet->container.iWindowPositionX, pDesklet->container.iWindowPositionY); // sinon le WM le place n'importe ou.
1743
static gboolean _cairo_dock_set_one_desklet_visible (CairoDesklet *pDesklet, CairoDockModuleInstance *pInstance, gpointer data)
1745
gboolean bOnWidgetLayerToo = GPOINTER_TO_INT (data);
1746
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1747
gboolean bIsOnWidgetLayer = cairo_dock_window_is_utility (Xid);
1748
if (bOnWidgetLayerToo || ! bIsOnWidgetLayer)
1750
cd_debug ("%s (%d)", __func__, Xid);
1752
if (bIsOnWidgetLayer) // on le passe sur la couche visible.
1753
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");
1755
gtk_window_set_keep_below (GTK_WINDOW (pDesklet->container.pWidget), FALSE);
1757
cairo_dock_show_desklet (pDesklet);
1761
void cairo_dock_set_all_desklets_visible (gboolean bOnWidgetLayerToo)
1763
cd_debug ("%s (%d)", __func__, bOnWidgetLayerToo);
1764
cairo_dock_foreach_desklet (_cairo_dock_set_one_desklet_visible, GINT_TO_POINTER (bOnWidgetLayerToo));
1767
static gboolean _cairo_dock_set_one_desklet_visibility_to_default (CairoDesklet *pDesklet, CairoDockModuleInstance *pInstance, CairoDockMinimalAppletConfig *pMinimalConfig)
1769
GKeyFile *pKeyFile = cairo_dock_pre_read_module_instance_config (pInstance, pMinimalConfig);
1770
g_key_file_free (pKeyFile);
1772
gtk_window_set_keep_below (GTK_WINDOW (pDesklet->container.pWidget), pMinimalConfig->deskletAttribute.iAccessibility == CAIRO_DESKLET_KEEP_BELOW);
1773
gtk_window_set_keep_above (GTK_WINDOW (pDesklet->container.pWidget), pMinimalConfig->deskletAttribute.iAccessibility == CAIRO_DESKLET_KEEP_ABOVE);
1775
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1776
if (pMinimalConfig->deskletAttribute.iAccessibility == CAIRO_DESKLET_ON_WIDGET_LAYER)
1777
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_UTILITY");
1778
else if (pMinimalConfig->deskletAttribute.iAccessibility == CAIRO_DESKLET_RESERVE_SPACE)
1780
if (! pDesklet->bSpaceReserved)
1782
cairo_dock_reserve_space_for_desklet (pDesklet, TRUE);
1783
pDesklet->bSpaceReserved = TRUE;
1785
//cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_DOCK");
1788
cairo_dock_set_xwindow_type_hint (Xid, "_NET_WM_WINDOW_TYPE_NORMAL");
1789
pDesklet->bAllowMinimize = FALSE;
1793
void cairo_dock_set_desklets_visibility_to_default (void)
1795
CairoDockMinimalAppletConfig minimalConfig;
1796
cairo_dock_foreach_desklet ((CairoDockForeachDeskletFunc) _cairo_dock_set_one_desklet_visibility_to_default, &minimalConfig);
1799
static gboolean _cairo_dock_test_one_desklet_Xid (CairoDesklet *pDesklet, CairoDockModuleInstance *pInstance, Window *pXid)
1801
return (GDK_WINDOW_XID (pDesklet->container.pWidget->window) == *pXid);
1803
CairoDesklet *cairo_dock_get_desklet_by_Xid (Window Xid)
1805
CairoDockModuleInstance *pInstance = cairo_dock_foreach_desklet ((CairoDockForeachDeskletFunc) _cairo_dock_test_one_desklet_Xid, &Xid);
1806
return (pInstance != NULL ? pInstance->pDesklet : NULL);
1810
static gboolean _cairo_dock_grow_up_desklet (CairoDesklet *pDesklet)
1812
pDesklet->container.fRatio += .1;
1813
gtk_widget_queue_draw (pDesklet->container.pWidget);
1815
if (pDesklet->container.fRatio >= 1.11) // la derniere est a x1.1
1817
pDesklet->container.fRatio = 1;
1818
pDesklet->iSidGrowUp = 0;
1823
void cairo_dock_zoom_out_desklet (CairoDesklet *pDesklet)
1825
g_return_if_fail (pDesklet != NULL);
1826
pDesklet->container.fRatio = 0;
1827
pDesklet->iSidGrowUp = g_timeout_add (50, (GSourceFunc) _cairo_dock_grow_up_desklet, (gpointer) pDesklet);
1832
void cairo_dock_reserve_space_for_desklet (CairoDesklet *pDesklet, gboolean bReserve)
1834
g_print ("%s (%d)\n", __func__, bReserve);
1835
Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
1836
int left=0, right=0, top=0, bottom=0;
1837
int left_start_y=0, left_end_y=0, right_start_y=0, right_end_y=0, top_start_x=0, top_end_x=0, bottom_start_x=0, bottom_end_x=0;
1838
int iHeight = pDesklet->container.iHeight, iWidth = pDesklet->container.iWidth;
1839
int iX = pDesklet->container.iWindowPositionX, iY = pDesklet->container.iWindowPositionY;
1842
int iTopOffset, iBottomOffset, iRightOffset, iLeftOffset;
1844
iBottomOffset = g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - 1 - (iY + iHeight);
1846
iRightOffset = g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - 1 - (iX + iWidth);
1848
if (iBottomOffset < MIN (iLeftOffset, iRightOffset)) // en bas.
1850
bottom = iHeight + iBottomOffset;
1851
bottom_start_x = iX;
1852
bottom_end_x = iX + iWidth;
1854
else if (iTopOffset < MIN (iLeftOffset, iRightOffset)) // en haut.
1856
top = iHeight + iTopOffset;
1858
top_end_x = iX + iWidth;
1860
else if (iLeftOffset < iRightOffset) // a gauche.
1862
left = iWidth + iLeftOffset;
1864
left_end_y = iY + iHeight;
1868
right = iWidth + iRightOffset;
1870
right_end_y = iY + iHeight;
1874
cairo_dock_set_strut_partial (Xid, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x);