17
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
******************************************************************************/
29
20
#include <stdlib.h>
30
21
#include <string.h>
53
44
pFirstDrawnIcon = myDock->icons->data;
54
45
int iXMin = (pFirstDrawnIcon != NULL ? pFirstDrawnIcon->fXAtRest : 0);
55
46
int iXMax = iXMin + myDock->fFlatDockWidth;
56
int iHeight = myDock->iCurrentHeight;
47
int iHeight = myDock->container.iHeight;
58
49
penguin_calculate_new_position (myApplet, pAnimation, iXMin, iXMax, iHeight);
60
area.x = (int) ((myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + MIN (iPreviousPositionX, myData.iCurrentPositionX));
61
area.y = myDock->iCurrentHeight - MAX (iPreviousPositionY, myData.iCurrentPositionY) - pAnimation->iFrameHeight;
62
area.width = abs (iPreviousPositionX - myData.iCurrentPositionX) + pAnimation->iFrameWidth;
63
area.height = abs (iPreviousPositionY - myData.iCurrentPositionY) + pAnimation->iFrameHeight;
51
if (myDock->container.bIsHorizontal)
53
area.x = (int) ((myDock->container.iWidth - myDock->fFlatDockWidth) / 2 + MIN (iPreviousPositionX, myData.iCurrentPositionX));
54
area.y = myDock->container.iHeight - MAX (iPreviousPositionY, myData.iCurrentPositionY) - pAnimation->iFrameHeight;
55
area.width = abs (iPreviousPositionX - myData.iCurrentPositionX) + pAnimation->iFrameWidth;
56
area.height = abs (iPreviousPositionY - myData.iCurrentPositionY) + pAnimation->iFrameHeight;
60
area.y = (int) ((myDock->container.iWidth - myDock->fFlatDockWidth) / 2 + MIN (iPreviousPositionX, myData.iCurrentPositionX));
61
if (myDock->container.bDirectionUp)
63
area.x = myDock->container.iHeight - MAX (iPreviousPositionY, myData.iCurrentPositionY) - pAnimation->iFrameHeight;
64
area.y = myDock->container.iWidth - area.y;
68
area.x = MAX (iPreviousPositionY, myData.iCurrentPositionY);
70
area.height = abs (iPreviousPositionX - myData.iCurrentPositionX) + pAnimation->iFrameWidth;
71
area.width = abs (iPreviousPositionY - myData.iCurrentPositionY) + pAnimation->iFrameHeight;
65
73
cairo_dock_redraw_container_area (myContainer, &area);
67
75
penguin_advance_to_next_frame (myApplet, pAnimation);
78
86
_cairo_dock_set_alpha (1.);
80
88
glBindTexture (GL_TEXTURE_2D, pAnimation->iTexture);
81
_cairo_dock_apply_current_texture_portion_at_size_with_offset (1.*myData.iCurrentFrame/pAnimation->iNbFrames,
82
.5*myData.iCurrentDirection, 1./pAnimation->iNbFrames, 1./pAnimation->iNbDirections,
83
pAnimation->iFrameWidth*fScale, pAnimation->iFrameHeight*fScale,
84
fOffsetX + myData.iCurrentPositionX, fOffsetY + myData.iCurrentPositionY + pAnimation->iFrameHeight*fScale/2);
89
_cairo_dock_apply_current_texture_portion_at_size_with_offset ((double) myData.iCurrentFrame/pAnimation->iNbFrames,
90
.5*myData.iCurrentDirection,
91
1./pAnimation->iNbFrames,
92
1./pAnimation->iNbDirections,
93
pAnimation->iFrameWidth*fScale,
94
pAnimation->iFrameHeight*fScale,
95
fOffsetX + myData.iCurrentPositionX + pAnimation->iFrameWidth/2,
96
fOffsetY + myData.iCurrentPositionY + pAnimation->iFrameHeight*fScale/2);
85
97
_cairo_dock_disable_texture ();
87
/*glEnable (GL_SCISSOR_TEST);
88
glScissor ((fOffsetX + myData.iCurrentPositionX) * fScale,
89
(fOffsetY * fScale + myData.iCurrentPositionY) * fScale,
90
pAnimation->iFrameWidth * fScale,
91
pAnimation->iFrameHeight * fScale);
93
glTranslatef ((fOffsetX + myData.iCurrentPositionX + pAnimation->iFrameWidth * (.5 * pAnimation->iNbFrames - myData.iCurrentFrame)) * fScale,
94
(fOffsetY * fScale + myData.iCurrentPositionY + pAnimation->iFrameHeight * (-.5 * pAnimation->iNbDirections + 1 + (myData.iCurrentDirection)) * fScale),
97
glColor4f (1., 1., 1., 1.);
98
cairo_dock_draw_texture (pAnimation->iTexture,
99
pAnimation->iFrameWidth * pAnimation->iNbFrames * fScale,
100
pAnimation->iFrameHeight * pAnimation->iNbDirections * fScale);
102
glDisable (GL_SCISSOR_TEST);*/
104
99
void penguin_draw_on_dock_opengl (CairoDockModuleInstance *myApplet, CairoContainer *pContainer)
111
106
glLoadIdentity ();
113
_penguin_draw_texture (myApplet, pAnimation, (myDock->iCurrentWidth - myDock->fFlatDockWidth) * .5, 0., 1.);
108
if (! myDock->container.bIsHorizontal)
110
glTranslatef (myDock->container.iHeight/2, myDock->container.iWidth/2, 0.);
111
glRotatef (myDock->container.bDirectionUp ? 90. : -90., 0., 0., 1.);
112
glTranslatef (- myDock->container.iWidth/2, - myDock->container.iHeight/2, 0.);
114
_penguin_draw_texture (myApplet, pAnimation, (myDock->container.iWidth - myDock->fFlatDockWidth) * .5, 0., 1.);
127
128
cairo_save (pCairoContext);
128
129
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_OVER);
129
cairo_translate (pCairoContext, floor ((myDock->iCurrentWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX), myDock->iCurrentHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight);
130
cairo_set_source_surface (pCairoContext, pSurface, 0.0, 0.0);
131
cairo_paint (pCairoContext);
131
if (myDock->container.bIsHorizontal)
133
cairo_translate (pCairoContext, floor ((myDock->container.iWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX), myDock->container.iHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight);
134
cairo_set_source_surface (pCairoContext, pSurface, 0.0, 0.0);
135
cairo_paint (pCairoContext);
139
if (myDock->container.bDirectionUp)
140
cairo_translate (pCairoContext,
141
myDock->container.iHeight - myData.iCurrentPositionY - pAnimation->iFrameHeight,
142
myDock->container.iWidth - (floor ((myDock->container.iWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX)));
144
cairo_translate (pCairoContext,
145
myData.iCurrentPositionY,
146
floor ((myDock->container.iWidth - myDock->fFlatDockWidth) / 2 + myData.iCurrentPositionX));
147
cairo_dock_draw_surface (pCairoContext, pSurface, pAnimation->iFrameWidth, pAnimation->iFrameHeight, myDock->container.bDirectionUp, myDock->container.bIsHorizontal, 1.);
132
150
cairo_restore (pCairoContext);
134
152
gboolean penguin_render_on_container (CairoDockModuleInstance *myApplet, CairoContainer *pContainer, cairo_t *pCairoContext)
156
174
g_return_if_fail (pAnimation != NULL);
158
176
double fScale = (pAnimation->iNbFrames > 1 || pAnimation->iSpeed != 0 || pAnimation->iAcceleration != 0 ? myIcon->fScale : 1.); // s'il est a l'arret on le met a la taille de l'icone au repos.
159
int iWidth = myIcon->fWidth / myDock->fRatio * fScale;
160
int iHeight = myIcon->fHeight / myDock->fRatio * fScale;
177
int iWidth = myIcon->fWidth / myDock->container.fRatio * fScale;
178
int iHeight = myIcon->fHeight / myDock->container.fRatio * fScale;
161
179
int iXMin = - iWidth / 2;
162
180
int iXMax = - iXMin;
262
280
if (pAnimation->iNbDirections == 2) // on peut repartir dans l'autre sens ou remonter.
264
282
int iRandom = g_random_int_range (0, 3);
265
if (iRandom == 0) // 1 chance sur 3.
283
if (iRandom != 0) // 2 chance sur 3.
267
285
myData.iCurrentDirection = 1 - myData.iCurrentDirection;
268
286
cd_debug ("myData.iCurrentDirection <- %d", myData.iCurrentDirection);
511
529
int iNewAnimation = penguin_choose_beginning_animation (myApplet);
512
530
penguin_set_new_animation (myApplet, iNewAnimation);
514
cairo_dock_remove_notification_func (CAIRO_DOCK_UPDATE_ICON_SLOW, (CairoDockNotificationFunc) penguin_update_icon, myApplet);
515
cairo_dock_remove_notification_func (CAIRO_DOCK_UPDATE_DOCK_SLOW, (CairoDockNotificationFunc) penguin_update_container, myApplet);
516
cairo_dock_remove_notification_func (CAIRO_DOCK_RENDER_DOCK, (CairoDockNotificationFunc) penguin_render_on_container, myApplet);
532
penguin_remove_notfications();
517
533
if (myConfig.bFree)
519
cairo_dock_register_notification (CAIRO_DOCK_UPDATE_DOCK_SLOW, (CairoDockNotificationFunc) penguin_update_container, CAIRO_DOCK_RUN_AFTER, myApplet);
520
cairo_dock_register_notification (CAIRO_DOCK_RENDER_DOCK, (CairoDockNotificationFunc) penguin_render_on_container, CAIRO_DOCK_RUN_AFTER, myApplet);
535
cairo_dock_register_notification_on_container (myContainer, CAIRO_DOCK_UPDATE_DOCK_SLOW, (CairoDockNotificationFunc) penguin_update_container, CAIRO_DOCK_RUN_AFTER, myApplet);
536
cairo_dock_register_notification_on_container (myContainer, CAIRO_DOCK_RENDER_DOCK, (CairoDockNotificationFunc) penguin_render_on_container, CAIRO_DOCK_RUN_AFTER, myApplet);
524
cairo_dock_register_notification (CAIRO_DOCK_UPDATE_ICON_SLOW, (CairoDockNotificationFunc) penguin_update_icon, CAIRO_DOCK_RUN_AFTER, myApplet);
540
cairo_dock_register_notification_on_icon (myIcon, CAIRO_DOCK_UPDATE_ICON_SLOW, (CairoDockNotificationFunc) penguin_update_icon, CAIRO_DOCK_RUN_AFTER, myApplet);