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/>.
20
/******************************************************************************
22
This file is a part of the cairo-dock program,
23
released under the terms of the GNU General Public License.
25
Written by Fabrice Rey (for any bug report, please mail me to fabounet@users.berlios.de)
27
******************************************************************************/
32
#include "applet-fire.h"
33
#include "applet-rain.h"
34
#include "applet-snow.h"
35
#include "applet-star.h"
36
#include "applet-storm.h"
37
#include "applet-struct.h"
38
#include "applet-notifications.h"
41
static void _cd_icon_effect_start (gpointer pUserData, Icon *pIcon, CairoDock *pDock, CDIconEffects *pAnimations, gboolean *bStartAnimation)
43
if (! CAIRO_DOCK_CONTAINER_IS_OPENGL (CAIRO_CONTAINER (pDock)))
46
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
49
pData = g_new0 (CDIconEffectData, 1);
50
CD_APPLET_SET_MY_ICON_DATA (pIcon, pData);
52
double dt = mySystem.iGLAnimationDeltaT;
55
for (i = 0; i < CD_ICON_EFFECT_NB_EFFECTS; i ++)
57
switch (pAnimations[i])
59
case CD_ICON_EFFECT_FIRE :
60
if (pData->pFireSystem == NULL)
61
pData->pFireSystem = cd_icon_effect_init_fire (pIcon, pDock, dt);
62
*bStartAnimation = TRUE;
65
case CD_ICON_EFFECT_STARS :
66
if (pData->pStarSystem == NULL)
67
pData->pStarSystem = cd_icon_effect_init_stars (pIcon, pDock, dt);
68
*bStartAnimation = TRUE;
71
case CD_ICON_EFFECT_RAIN :
72
if (pData->pRainSystem == NULL)
73
pData->pRainSystem = cd_icon_effect_init_rain (pIcon, pDock, dt);
74
*bStartAnimation = TRUE;
77
case CD_ICON_EFFECT_SNOW :
78
if (pData->pSnowSystem == NULL)
79
pData->pSnowSystem = cd_icon_effect_init_snow (pIcon, pDock, dt);
80
*bStartAnimation = TRUE;
83
case CD_ICON_EFFECT_SAND :
84
if (pData->pStormSystem == NULL)
85
pData->pStormSystem = cd_icon_effect_init_storm (pIcon, pDock, dt);
86
*bStartAnimation = TRUE;
90
i = CD_ICON_EFFECT_NB_EFFECTS - 1;
96
gboolean cd_icon_effect_on_enter (gpointer pUserData, Icon *pIcon, CairoDock *pDock, gboolean *bStartAnimation)
98
if (pIcon->iAnimationState > CAIRO_DOCK_STATE_MOUSE_HOVERED)
99
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
100
_cd_icon_effect_start (pUserData, pIcon, pDock, myConfig.iEffectsUsed, bStartAnimation);
103
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
104
pData->iRequestTime = 0;
105
cairo_dock_mark_icon_as_hovered_by_mouse (pIcon);
107
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
110
gboolean cd_icon_effect_on_click (gpointer pUserData, Icon *pIcon, CairoDock *pDock, gint iButtonState)
112
if (! CAIRO_DOCK_IS_DOCK (pDock) || pIcon == NULL || pIcon->iAnimationState > CAIRO_DOCK_STATE_CLICKED)
113
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
115
CairoDockIconType iType = cairo_dock_get_icon_type (pIcon);
116
if (iType == CAIRO_DOCK_APPLI && CAIRO_DOCK_IS_LAUNCHER (pIcon) && iButtonState & GDK_SHIFT_MASK)
117
iType = CAIRO_DOCK_LAUNCHER;
119
gboolean bStartAnimation = FALSE;
120
_cd_icon_effect_start (pUserData, pIcon, pDock, myConfig.iEffectsOnClick[iType], &bStartAnimation);
123
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
124
pData->iRequestTime = 0;
125
cairo_dock_mark_icon_as_clicked (pIcon);
128
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
131
gboolean cd_icon_effect_on_request (gpointer pUserData, Icon *pIcon, CairoDock *pDock, const gchar *cAnimation, gint iNbRounds)
133
if (pIcon == NULL || pIcon->iAnimationState > CAIRO_DOCK_STATE_CLICKED)
134
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
136
CDIconEffects anim[2] = {0, -1};
137
int iRoundDuration=0;
139
if (strcmp (cAnimation, "default") == 0)
141
CairoDockIconType iType = cairo_dock_get_icon_type (pIcon);
142
anim[0] = myConfig.iEffectsOnClick[iType][0];
145
case CD_ICON_EFFECT_FIRE : iRoundDuration = myConfig.iFireDuration; break;
146
case CD_ICON_EFFECT_STARS : iRoundDuration = myConfig.iStarDuration; break;
147
case CD_ICON_EFFECT_RAIN : iRoundDuration = myConfig.iRainDuration; break;
148
case CD_ICON_EFFECT_SNOW : iRoundDuration = myConfig.iSnowDuration; break;
149
case CD_ICON_EFFECT_SAND : iRoundDuration = myConfig.iStormDuration; break;
155
int iAnimationID = cairo_dock_get_animation_id (cAnimation);
156
if (iAnimationID == myData.iAnimationID[CD_ICON_EFFECT_FIRE])
158
anim[0] = CD_ICON_EFFECT_FIRE;
159
iRoundDuration = myConfig.iFireDuration;
161
else if (iAnimationID == myData.iAnimationID[CD_ICON_EFFECT_STARS])
163
anim[0] = CD_ICON_EFFECT_STARS;
164
iRoundDuration = myConfig.iStarDuration;
166
else if (iAnimationID == myData.iAnimationID[CD_ICON_EFFECT_RAIN])
168
anim[0] = CD_ICON_EFFECT_RAIN;
169
iRoundDuration = myConfig.iRainDuration;
171
else if (iAnimationID == myData.iAnimationID[CD_ICON_EFFECT_SNOW])
173
anim[0] = CD_ICON_EFFECT_SNOW;
174
iRoundDuration = myConfig.iSnowDuration;
176
else if (iAnimationID == myData.iAnimationID[CD_ICON_EFFECT_SAND])
178
anim[0] = CD_ICON_EFFECT_SAND;
179
iRoundDuration = myConfig.iStormDuration;
182
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
185
gboolean bStartAnimation = FALSE;
186
_cd_icon_effect_start (pUserData, pIcon, pDock, anim, &bStartAnimation);
189
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
190
//pData->iNumRound = iNbRounds - 1;
191
pData->iRequestTime = iNbRounds * iRoundDuration;
192
cairo_dock_mark_icon_as_hovered_by_mouse (pIcon);
194
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
198
static void _cd_icon_effect_render_effects (Icon *pIcon, CairoDock *pDock, CDIconEffectData *pData)
201
if (!pDock->bHorizontalDock && myConfig.bRotateEffects)
202
glRotatef (pDock->bDirectionUp ? 90:-90, 0., 0., 1.);
203
glTranslatef (0., - pIcon->fHeight * pIcon->fScale/2, 0.);
205
if (pData->pFireSystem != NULL)
207
cairo_dock_render_particles (pData->pFireSystem);
210
if (pData->pStarSystem != NULL)
212
cairo_dock_render_particles (pData->pStarSystem);
215
if (pData->pSnowSystem != NULL)
217
cairo_dock_render_particles (pData->pSnowSystem);
220
if (pData->pRainSystem != NULL)
222
cairo_dock_render_particles (pData->pRainSystem);
228
static void _cd_icon_effect_render_effects_with_depth (Icon *pIcon, CairoDock *pDock, CDIconEffectData *pData, int iDepth)
231
if (!pDock->bHorizontalDock && myConfig.bRotateEffects)
232
glRotatef (pDock->bDirectionUp ? 90:-90, 0., 0., 1.);
233
glTranslatef (0., - pIcon->fHeight * pIcon->fScale/2, 0.);
235
if (pData->pStormSystem != NULL)
237
cairo_dock_render_particles_full (pData->pStormSystem, iDepth);
243
gboolean cd_icon_effect_pre_render_icon (gpointer pUserData, Icon *pIcon, CairoDock *pDock)
245
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
247
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
249
if (myConfig.bBackGround)
250
_cd_icon_effect_render_effects (pIcon, pDock, pData);
252
if (pData->pStormSystem != NULL)
253
_cd_icon_effect_render_effects_with_depth (pIcon, pDock, pData, -1);
254
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
257
gboolean cd_icon_effect_render_icon (gpointer pUserData, Icon *pIcon, CairoDock *pDock, gboolean *bHasBeenRendered, cairo_t *pCairoContext)
259
if (pCairoContext != NULL)
260
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
261
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
263
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
265
if (! myConfig.bBackGround)
266
_cd_icon_effect_render_effects (pIcon, pDock, pData);
268
if (pData->pStormSystem != NULL)
269
_cd_icon_effect_render_effects_with_depth (pIcon, pDock, pData, 1);
270
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
274
#define _will_continue(bRepeat) ((pData->iRequestTime > 0) || (pIcon->iAnimationState == CAIRO_DOCK_STATE_MOUSE_HOVERED && bRepeat && pIcon->bPointed && pDock->bInside))
276
gboolean cd_icon_effect_update_icon (gpointer pUserData, Icon *pIcon, CairoDock *pDock, gboolean *bContinueAnimation)
278
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
280
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
282
if (pData->iRequestTime > 0)
284
int dt = mySystem.iGLAnimationDeltaT;
285
pData->iRequestTime -= dt;
286
if (pData->iRequestTime < 0)
287
pData->iRequestTime = 0;
290
if (pData->pFireSystem != NULL)
292
gboolean bContinueFire = cd_icon_effect_update_fire_system (pData->pFireSystem,
293
(_will_continue (myConfig.bContinueFire) ? cd_icon_effect_rewind_fire_particle : NULL));
294
pData->pFireSystem->fWidth = pIcon->fWidth * pIcon->fScale;
295
if (pDock->bAtBottom)
296
pData->pFireSystem->fHeight = pIcon->fHeight;
298
*bContinueAnimation = TRUE;
301
cairo_dock_free_particle_system (pData->pFireSystem);
302
pData->pFireSystem = NULL;
306
if (pData->pStarSystem != NULL)
308
gboolean bContinueStar = cd_icon_effect_update_star_system (pData->pStarSystem,
309
(_will_continue (myConfig.bContinueStar) ? cd_icon_effect_rewind_star_particle : NULL));
310
pData->pStarSystem->fWidth = pIcon->fWidth * pIcon->fScale;
312
*bContinueAnimation = TRUE;
315
cairo_dock_free_particle_system (pData->pStarSystem);
316
pData->pStarSystem = NULL;
320
if (pData->pSnowSystem != NULL)
322
gboolean bContinueSnow = cd_icon_effect_update_snow_system (pData->pSnowSystem,
323
(_will_continue (myConfig.bContinueSnow) ? cd_icon_effect_rewind_snow_particle : NULL));
324
pData->pSnowSystem->fWidth = pIcon->fWidth * pIcon->fScale;
326
*bContinueAnimation = TRUE;
329
cairo_dock_free_particle_system (pData->pSnowSystem);
330
pData->pSnowSystem = NULL;
334
if (pData->pRainSystem != NULL)
336
gboolean bContinueRain = cd_icon_effect_update_rain_system (pData->pRainSystem,
337
(_will_continue (myConfig.bContinueRain) ? cd_icon_effect_rewind_rain_particle : NULL));
338
pData->pRainSystem->fWidth = pIcon->fWidth * pIcon->fScale;
340
*bContinueAnimation = TRUE;
343
cairo_dock_free_particle_system (pData->pRainSystem);
344
pData->pRainSystem = NULL;
348
if (pData->pStormSystem != NULL)
350
gboolean bContinueStorm = cd_icon_effect_update_storm_system (pData->pStormSystem,
351
(_will_continue (myConfig.bContinueStorm) ? cd_icon_effect_rewind_storm_particle : NULL));
352
pData->pStormSystem->fWidth = pIcon->fWidth * pIcon->fScale;
354
*bContinueAnimation = TRUE;
357
cairo_dock_free_particle_system (pData->pStormSystem);
358
pData->pStormSystem = NULL;
362
double fMaxScale = cairo_dock_get_max_scale (pDock);
364
if (pDock->bHorizontalDock)
366
area.x = pIcon->fDrawX - .2 * pIcon->fWidth * pIcon->fScale;
367
area.y = pIcon->fDrawY;
368
if (pDock->bDirectionUp)
369
area.y -= (pIcon->fScale - fMaxScale) * pIcon->fHeight + myLabels.iconTextDescription.iSize;
370
area.width = pIcon->fWidth * pIcon->fScale * 1.4;
371
area.height = pIcon->fHeight * fMaxScale + myLabels.iconTextDescription.iSize;
375
area.y = pIcon->fDrawX - .2 * pIcon->fWidth * pIcon->fScale;
376
area.x = pIcon->fDrawY;
377
if (pDock->bDirectionUp)
378
area.x -= (pIcon->fScale - fMaxScale) * pIcon->fHeight + myLabels.iconTextDescription.iSize;
379
area.height = pIcon->fWidth * pIcon->fScale * 1.4;
380
area.width = pIcon->fHeight * fMaxScale + myLabels.iconTextDescription.iSize;
382
cairo_dock_redraw_container_area (pDock, &area);
384
if (! *bContinueAnimation)
385
cd_icon_effect_free_data (pUserData, pIcon);
387
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
391
gboolean cd_icon_effect_free_data (gpointer pUserData, Icon *pIcon)
394
CDIconEffectData *pData = CD_APPLET_GET_MY_ICON_DATA (pIcon);
396
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
398
if (pData->pFireSystem != NULL)
399
cairo_dock_free_particle_system (pData->pFireSystem);
401
if (pData->pStarSystem != NULL)
402
cairo_dock_free_particle_system (pData->pStarSystem);
404
if (pData->pRainSystem != NULL)
405
cairo_dock_free_particle_system (pData->pRainSystem);
407
if (pData->pSnowSystem != NULL)
408
cairo_dock_free_particle_system (pData->pSnowSystem);
410
if (pData->pStormSystem != NULL)
411
cairo_dock_free_particle_system (pData->pStormSystem);
414
CD_APPLET_SET_MY_ICON_DATA (pIcon, NULL);
415
return CAIRO_DOCK_LET_PASS_NOTIFICATION;