~ubuntu-branches/ubuntu/saucy/cairo-dock-plug-ins/saucy

« back to all changes in this revision

Viewing changes to desklet-rendering/src/rendering-desklet-mediaplayer.c

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2009-08-26 21:07:39 UTC
  • Revision ID: james.westby@ubuntu.com-20090826210739-gyjuuqezrzuluao4
Tags: upstream-2.0.8.1
Import upstream version 2.0.8.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
* This file is a part of the Cairo-Dock project
 
3
*
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
 
6
*
 
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.
 
11
*
 
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/>.
 
18
*/
 
19
 
 
20
/*********************************************************************************
 
21
 
 
22
This file is a part of the cairo-dock program, 
 
23
released under the terms of the GNU General Public License.
 
24
 
 
25
Written by Fabrice Rey (for any bug report, please mail me to fabounet@users.berlios.de)
 
26
 
 
27
*********************************************************************************/
 
28
#include <string.h>
 
29
#include <math.h>
 
30
#include <cairo-dock.h>
 
31
 
 
32
#include "rendering-desklet-mediaplayer.h"
 
33
 
 
34
static gboolean on_button_press_mediaplayer (GtkWidget *widget,
 
35
        GdkEventButton *pButton,
 
36
        CairoDesklet *pDesklet)
 
37
{
 
38
        if (pButton->button == 1)  // clic gauche.
 
39
        {
 
40
                CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
41
                if (pMediaplayer == NULL)
 
42
                        return FALSE;
 
43
                
 
44
                if (pButton->type == GDK_BUTTON_PRESS)
 
45
                {
 
46
                        pMediaplayer->pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
 
47
                        if (pMediaplayer->pClickedIcon != NULL)
 
48
                        {
 
49
                                gtk_widget_queue_draw (pDesklet->pWidget);
 
50
                        }
 
51
                }
 
52
                else if (pButton->type == GDK_BUTTON_RELEASE)
 
53
                {
 
54
                        if (pMediaplayer->pClickedIcon != NULL)
 
55
                        {
 
56
                                pMediaplayer->pClickedIcon = NULL;
 
57
                                gtk_widget_queue_draw (pDesklet->pWidget);
 
58
                        }
 
59
                }
 
60
        }
 
61
        return FALSE;
 
62
}
 
63
 
 
64
CDMediaplayerParameters *rendering_configure_mediaplayer (CairoDesklet *pDesklet, cairo_t *pSourceContext, gpointer *pConfig)
 
65
{
 
66
        cd_debug ("");
 
67
        CDMediaplayerParameters *pMediaplayer = g_new0 (CDMediaplayerParameters, 1);
 
68
        if (pConfig != NULL)  // dessin de l'artiste et du titre sur le coté du desklet.
 
69
        {
 
70
                pMediaplayer->cArtist = pConfig[0];
 
71
                pMediaplayer->cTitle = pConfig[1];
 
72
                if (pMediaplayer->cArtist != NULL)
 
73
                        pMediaplayer->pArtistSurface = cairo_dock_create_surface_from_text (pMediaplayer->cArtist,
 
74
                        pSourceContext,
 
75
                        &myLabels.iconTextDescription,
 
76
                        cairo_dock_get_max_scale (pDesklet),
 
77
                        &pMediaplayer->fArtistWidth, &pMediaplayer->fArtistHeight, &pMediaplayer->fArtistXOffset, &pMediaplayer->fArtistYOffset);
 
78
                if (pMediaplayer->cTitle != NULL)
 
79
                        pMediaplayer->pTitleSurface = cairo_dock_create_surface_from_text (pMediaplayer->cTitle,
 
80
                        pSourceContext,
 
81
                        &myLabels.iconTextDescription,
 
82
                        cairo_dock_get_max_scale (pDesklet),
 
83
                        &pMediaplayer->fTitleWidth, &pMediaplayer->fTitleHeight, &pMediaplayer->fTitleXOffset, &pMediaplayer->fTitleYOffset);
 
84
                
 
85
                pMediaplayer->bControlButton = GPOINTER_TO_INT (pConfig[2]);
 
86
        }
 
87
        return pMediaplayer;
 
88
}
 
89
 
 
90
void rendering_load_mediaplayer_data (CairoDesklet *pDesklet, cairo_t *pSourceContext)
 
91
{
 
92
        CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
93
        if (pMediaplayer == NULL)
 
94
                return ;
 
95
        
 
96
        //On initialise la bande des boutons de controle
 
97
        pMediaplayer->iNbIcons = g_list_length (pDesklet->icons);
 
98
        pMediaplayer->iIconsLimit = pMediaplayer->iNbIcons / 2;
 
99
        pMediaplayer->fBandWidth = (pDesklet->iHeight - g_iDockRadius) / 4;
 
100
        pMediaplayer->fIconBandOffset = pMediaplayer->fBandWidth / pMediaplayer->iNbIcons;
 
101
        
 
102
        //On force la détection du clique sur les icônes
 
103
        g_signal_connect (G_OBJECT (pDesklet->pWidget),
 
104
                "button-press-event",
 
105
                G_CALLBACK (on_button_press_mediaplayer),
 
106
                pDesklet);
 
107
        g_signal_connect (G_OBJECT (pDesklet->pWidget),
 
108
                "button-release-event",
 
109
                G_CALLBACK (on_button_press_mediaplayer),
 
110
                pDesklet);
 
111
}
 
112
 
 
113
 
 
114
void rendering_free_mediaplayer_data (CairoDesklet *pDesklet)
 
115
{
 
116
        cd_debug ("");
 
117
        CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
118
        if (pMediaplayer == NULL)
 
119
                return;
 
120
        
 
121
        //On ne free pa cArtist et cTitle, ces vars appartiennent à l'applet.
 
122
        
 
123
        if (pMediaplayer->pArtistSurface != NULL)
 
124
        {
 
125
                cairo_surface_destroy (pMediaplayer->pArtistSurface);
 
126
                pMediaplayer->pArtistSurface = NULL;
 
127
        }
 
128
        if (pMediaplayer->pTitleSurface != NULL)
 
129
        {
 
130
                cairo_surface_destroy (pMediaplayer->pTitleSurface);
 
131
                pMediaplayer->pTitleSurface = NULL;
 
132
        }
 
133
                
 
134
        g_free (pMediaplayer);
 
135
        pDesklet->pRendererData = NULL;
 
136
}
 
137
 
 
138
void rendering_load_icons_for_mediaplayer (CairoDesklet *pDesklet, cairo_t *pSourceContext)
 
139
{
 
140
        g_return_if_fail (pDesklet != NULL && pSourceContext != NULL);
 
141
        CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
142
        
 
143
        Icon *pIcon = pDesklet->pIcon;
 
144
        g_return_if_fail (pIcon != NULL);
 
145
        if (pMediaplayer != NULL)
 
146
        {
 
147
                if (pMediaplayer->bControlButton) //Certain voudrons uniquement l'info, d'autre l'info + les boutons de controle
 
148
                        pIcon->fWidth = (pDesklet->iHeight - g_iDockRadius) / 4 * 3; 
 
149
                else
 
150
                        pIcon->fWidth = pDesklet->iHeight - g_iDockRadius; 
 
151
                
 
152
                pIcon->fWidth = MAX (1, pIcon->fWidth); 
 
153
                pIcon->fHeight = pIcon->fWidth; //L'icône aura la même taille en W et en H pour afficher le texte sur le coté
 
154
                //Du coup l'utilisateur pourra alonger le W pour que le texte soit visible
 
155
        }
 
156
        else
 
157
        {
 
158
                pIcon->fWidth = MAX (1, pDesklet->iWidth - g_iDockRadius);  // 2 * g_iDockRadius/2
 
159
                pIcon->fHeight = MAX (1, pDesklet->iHeight - g_iDockRadius); //Icône de taille normal
 
160
        }
 
161
        pIcon->fDrawX = .5 * g_iDockRadius;
 
162
        pIcon->fDrawY = .5 * g_iDockRadius;
 
163
        pIcon->fScale = 1;
 
164
        
 
165
        g_print ("%s (%.2fx%.2f)\n", __func__, pIcon->fWidth, pIcon->fHeight);
 
166
        cairo_dock_fill_icon_buffers_for_desklet (pIcon, pSourceContext);
 
167
        
 
168
        GList* ic;
 
169
        for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
 
170
        {
 
171
                pIcon = ic->data;
 
172
                pIcon->fWidth = pDesklet->pIcon->fWidth / 5.;
 
173
                pIcon->fHeight = pIcon->fWidth;
 
174
                cairo_dock_fill_icon_buffers_for_desklet (pIcon, pSourceContext);
 
175
        }
 
176
}
 
177
 
 
178
 
 
179
void rendering_draw_mediaplayer_in_desklet (cairo_t *pCairoContext, CairoDesklet *pDesklet, gboolean bRenderOptimized)
 
180
{
 
181
        CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
182
        Icon *pIcon;
 
183
        Icon *pMainIcon = pDesklet->pIcon;
 
184
        GList *ic;
 
185
        
 
186
        if (pMediaplayer->bControlButton)
 
187
        {
 
188
                int i = 1;
 
189
                for (ic = pDesklet->icons; ic != NULL; ic = ic->next) {
 
190
                        pIcon = ic->data;
 
191
                        pIcon->fScale = 1.;
 
192
                        pIcon->fAlpha = 1.;
 
193
                        pIcon->fDrawX = i * (pMainIcon->fWidth / pMediaplayer->iNbIcons) - pIcon->fWidth;
 
194
                        if (i <= pMediaplayer->iIconsLimit)
 
195
                                pIcon->fDrawY = ((pDesklet->iHeight - g_iDockRadius) - pMediaplayer->fBandWidth) + (pMediaplayer->fIconBandOffset * (i - 1));
 
196
                        else
 
197
                                pIcon->fDrawY = ((pDesklet->iHeight - g_iDockRadius) - pMediaplayer->fBandWidth) + (pMediaplayer->fIconBandOffset * (pMediaplayer->iNbIcons - i));
 
198
                        i++;
 
199
                }
 
200
        }
 
201
        
 
202
        pIcon = pMainIcon;
 
203
        cairo_save (pCairoContext);
 
204
        cairo_translate (pCairoContext, pIcon->fDrawX, pIcon->fDrawY);
 
205
        if (pIcon->pIconBuffer != NULL) //On dessine l'icône
 
206
        {
 
207
                cairo_set_source_surface (pCairoContext,
 
208
                        pIcon->pIconBuffer,
 
209
                        0.,
 
210
                        0.);
 
211
                cairo_paint (pCairoContext);
 
212
        }
 
213
        if (pIcon->pQuickInfoBuffer != NULL) //On dessine la quickinfo
 
214
        {
 
215
                cairo_translate (pCairoContext,
 
216
                        (- pIcon->iQuickInfoWidth + pIcon->fWidth) / 2 * pIcon->fScale,
 
217
                        (pIcon->fHeight - pIcon->iQuickInfoHeight) * pIcon->fScale);
 
218
                
 
219
                cairo_set_source_surface (pCairoContext,
 
220
                        pIcon->pQuickInfoBuffer,
 
221
                        0.,
 
222
                        0.);
 
223
                cairo_paint (pCairoContext);
 
224
        }
 
225
        
 
226
        cairo_restore (pCairoContext);
 
227
        if (pMediaplayer != NULL) //On dessine nos informations
 
228
        {
 
229
                if (pMediaplayer->pArtistSurface != NULL)
 
230
                {
 
231
                        double fX = pIcon->fWidth + 5, fY = pIcon->fHeight / 3;
 
232
                        cairo_set_source_surface (pCairoContext, pMediaplayer->pArtistSurface, fX, fY);
 
233
                        cairo_paint (pCairoContext);
 
234
                }
 
235
                if (pMediaplayer->pTitleSurface != NULL)
 
236
                {
 
237
                        double fX = pIcon->fWidth + 5, fY = (pIcon->fHeight / 3) * 2;
 
238
                        cairo_set_source_surface (pCairoContext, pMediaplayer->pTitleSurface, fX, fY);
 
239
                        cairo_paint (pCairoContext);
 
240
                }
 
241
        }
 
242
        
 
243
        if (pMediaplayer->bControlButton) // On dessine nos icônes prev, play, stop, next.
 
244
        {
 
245
                for (ic = pDesklet->icons; ic != NULL; ic = ic->next) {
 
246
                        pIcon = ic->data;
 
247
                        if (pIcon->pIconBuffer != NULL)
 
248
                        {
 
249
                                cairo_save (pCairoContext);
 
250
                                cairo_dock_render_one_icon_in_desklet (pIcon, pCairoContext, TRUE, TRUE, pDesklet->iWidth);
 
251
                                cairo_restore (pCairoContext);
 
252
                        }
 
253
                }
 
254
        }
 
255
}
 
256
 
 
257
void rendering_update_text_for_mediaplayer (CairoDesklet *pDesklet, gpointer *pNewData)
 
258
{
 
259
        CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
 
260
        if (pMediaplayer == NULL)
 
261
                return;
 
262
        
 
263
        //On reset tout!
 
264
        if (pMediaplayer->pArtistSurface != NULL)
 
265
        {
 
266
                cairo_surface_destroy (pMediaplayer->pArtistSurface);
 
267
                pMediaplayer->pArtistSurface = NULL;
 
268
        }
 
269
        if (pMediaplayer->pTitleSurface != NULL)
 
270
        {
 
271
                cairo_surface_destroy (pMediaplayer->pTitleSurface);
 
272
                pMediaplayer->pTitleSurface = NULL;
 
273
        }
 
274
        
 
275
        //On réattribue les textes
 
276
        pMediaplayer->cArtist = pNewData[0];
 
277
        pMediaplayer->cTitle = pNewData[1];
 
278
        
 
279
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDesklet));
 
280
        if (pMediaplayer->cArtist != NULL)
 
281
                pMediaplayer->pArtistSurface = cairo_dock_create_surface_from_text (pMediaplayer->cArtist,
 
282
                        pCairoContext,
 
283
                        &myLabels.iconTextDescription,
 
284
                        cairo_dock_get_max_scale (pDesklet),
 
285
                        &pMediaplayer->fArtistWidth, &pMediaplayer->fArtistHeight, &pMediaplayer->fArtistXOffset, &pMediaplayer->fArtistYOffset);
 
286
        if (pMediaplayer->cTitle != NULL)
 
287
                pMediaplayer->pTitleSurface = cairo_dock_create_surface_from_text (pMediaplayer->cTitle,
 
288
                        pCairoContext,
 
289
                        &myLabels.iconTextDescription,
 
290
                        cairo_dock_get_max_scale (pDesklet),
 
291
                        &pMediaplayer->fTitleWidth, &pMediaplayer->fTitleHeight, &pMediaplayer->fTitleXOffset, &pMediaplayer->fTitleYOffset);
 
292
                        
 
293
        cairo_destroy (pCairoContext);
 
294
        
 
295
        cd_debug ("");
 
296
}
 
297
 
 
298
void rendering_register_mediaplayer_desklet_renderer (void)
 
299
{
 
300
        CairoDeskletRenderer *pRenderer = g_new0 (CairoDeskletRenderer, 1);
 
301
        pRenderer->render = rendering_draw_mediaplayer_in_desklet ;
 
302
        pRenderer->configure = rendering_configure_mediaplayer;
 
303
        pRenderer->load_data = rendering_load_mediaplayer_data;
 
304
        pRenderer->free_data = rendering_free_mediaplayer_data;
 
305
        pRenderer->load_icons = rendering_load_icons_for_mediaplayer;
 
306
        pRenderer->update = rendering_update_text_for_mediaplayer;
 
307
        
 
308
        cairo_dock_register_desklet_renderer (MY_APPLET_MEDIAPLAYER_DESKLET_RENDERER_NAME, pRenderer);
 
309
}