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
*********************************************************************************/
30
#include <cairo-dock.h>
32
#include "rendering-desklet-mediaplayer.h"
34
static gboolean on_button_press_mediaplayer (GtkWidget *widget,
35
GdkEventButton *pButton,
36
CairoDesklet *pDesklet)
38
if (pButton->button == 1) // clic gauche.
40
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
41
if (pMediaplayer == NULL)
44
if (pButton->type == GDK_BUTTON_PRESS)
46
pMediaplayer->pClickedIcon = cairo_dock_find_clicked_icon_in_desklet (pDesklet);
47
if (pMediaplayer->pClickedIcon != NULL)
49
gtk_widget_queue_draw (pDesklet->pWidget);
52
else if (pButton->type == GDK_BUTTON_RELEASE)
54
if (pMediaplayer->pClickedIcon != NULL)
56
pMediaplayer->pClickedIcon = NULL;
57
gtk_widget_queue_draw (pDesklet->pWidget);
64
CDMediaplayerParameters *rendering_configure_mediaplayer (CairoDesklet *pDesklet, cairo_t *pSourceContext, gpointer *pConfig)
67
CDMediaplayerParameters *pMediaplayer = g_new0 (CDMediaplayerParameters, 1);
68
if (pConfig != NULL) // dessin de l'artiste et du titre sur le coté du desklet.
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,
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,
81
&myLabels.iconTextDescription,
82
cairo_dock_get_max_scale (pDesklet),
83
&pMediaplayer->fTitleWidth, &pMediaplayer->fTitleHeight, &pMediaplayer->fTitleXOffset, &pMediaplayer->fTitleYOffset);
85
pMediaplayer->bControlButton = GPOINTER_TO_INT (pConfig[2]);
90
void rendering_load_mediaplayer_data (CairoDesklet *pDesklet, cairo_t *pSourceContext)
92
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
93
if (pMediaplayer == NULL)
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;
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),
107
g_signal_connect (G_OBJECT (pDesklet->pWidget),
108
"button-release-event",
109
G_CALLBACK (on_button_press_mediaplayer),
114
void rendering_free_mediaplayer_data (CairoDesklet *pDesklet)
117
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
118
if (pMediaplayer == NULL)
121
//On ne free pa cArtist et cTitle, ces vars appartiennent à l'applet.
123
if (pMediaplayer->pArtistSurface != NULL)
125
cairo_surface_destroy (pMediaplayer->pArtistSurface);
126
pMediaplayer->pArtistSurface = NULL;
128
if (pMediaplayer->pTitleSurface != NULL)
130
cairo_surface_destroy (pMediaplayer->pTitleSurface);
131
pMediaplayer->pTitleSurface = NULL;
134
g_free (pMediaplayer);
135
pDesklet->pRendererData = NULL;
138
void rendering_load_icons_for_mediaplayer (CairoDesklet *pDesklet, cairo_t *pSourceContext)
140
g_return_if_fail (pDesklet != NULL && pSourceContext != NULL);
141
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
143
Icon *pIcon = pDesklet->pIcon;
144
g_return_if_fail (pIcon != NULL);
145
if (pMediaplayer != NULL)
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;
150
pIcon->fWidth = pDesklet->iHeight - g_iDockRadius;
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
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
161
pIcon->fDrawX = .5 * g_iDockRadius;
162
pIcon->fDrawY = .5 * g_iDockRadius;
165
g_print ("%s (%.2fx%.2f)\n", __func__, pIcon->fWidth, pIcon->fHeight);
166
cairo_dock_fill_icon_buffers_for_desklet (pIcon, pSourceContext);
169
for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
172
pIcon->fWidth = pDesklet->pIcon->fWidth / 5.;
173
pIcon->fHeight = pIcon->fWidth;
174
cairo_dock_fill_icon_buffers_for_desklet (pIcon, pSourceContext);
179
void rendering_draw_mediaplayer_in_desklet (cairo_t *pCairoContext, CairoDesklet *pDesklet, gboolean bRenderOptimized)
181
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
183
Icon *pMainIcon = pDesklet->pIcon;
186
if (pMediaplayer->bControlButton)
189
for (ic = pDesklet->icons; ic != NULL; ic = ic->next) {
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));
197
pIcon->fDrawY = ((pDesklet->iHeight - g_iDockRadius) - pMediaplayer->fBandWidth) + (pMediaplayer->fIconBandOffset * (pMediaplayer->iNbIcons - i));
203
cairo_save (pCairoContext);
204
cairo_translate (pCairoContext, pIcon->fDrawX, pIcon->fDrawY);
205
if (pIcon->pIconBuffer != NULL) //On dessine l'icône
207
cairo_set_source_surface (pCairoContext,
211
cairo_paint (pCairoContext);
213
if (pIcon->pQuickInfoBuffer != NULL) //On dessine la quickinfo
215
cairo_translate (pCairoContext,
216
(- pIcon->iQuickInfoWidth + pIcon->fWidth) / 2 * pIcon->fScale,
217
(pIcon->fHeight - pIcon->iQuickInfoHeight) * pIcon->fScale);
219
cairo_set_source_surface (pCairoContext,
220
pIcon->pQuickInfoBuffer,
223
cairo_paint (pCairoContext);
226
cairo_restore (pCairoContext);
227
if (pMediaplayer != NULL) //On dessine nos informations
229
if (pMediaplayer->pArtistSurface != NULL)
231
double fX = pIcon->fWidth + 5, fY = pIcon->fHeight / 3;
232
cairo_set_source_surface (pCairoContext, pMediaplayer->pArtistSurface, fX, fY);
233
cairo_paint (pCairoContext);
235
if (pMediaplayer->pTitleSurface != NULL)
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);
243
if (pMediaplayer->bControlButton) // On dessine nos icônes prev, play, stop, next.
245
for (ic = pDesklet->icons; ic != NULL; ic = ic->next) {
247
if (pIcon->pIconBuffer != NULL)
249
cairo_save (pCairoContext);
250
cairo_dock_render_one_icon_in_desklet (pIcon, pCairoContext, TRUE, TRUE, pDesklet->iWidth);
251
cairo_restore (pCairoContext);
257
void rendering_update_text_for_mediaplayer (CairoDesklet *pDesklet, gpointer *pNewData)
259
CDMediaplayerParameters *pMediaplayer = (CDMediaplayerParameters *) pDesklet->pRendererData;
260
if (pMediaplayer == NULL)
264
if (pMediaplayer->pArtistSurface != NULL)
266
cairo_surface_destroy (pMediaplayer->pArtistSurface);
267
pMediaplayer->pArtistSurface = NULL;
269
if (pMediaplayer->pTitleSurface != NULL)
271
cairo_surface_destroy (pMediaplayer->pTitleSurface);
272
pMediaplayer->pTitleSurface = NULL;
275
//On réattribue les textes
276
pMediaplayer->cArtist = pNewData[0];
277
pMediaplayer->cTitle = pNewData[1];
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,
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,
289
&myLabels.iconTextDescription,
290
cairo_dock_get_max_scale (pDesklet),
291
&pMediaplayer->fTitleWidth, &pMediaplayer->fTitleHeight, &pMediaplayer->fTitleXOffset, &pMediaplayer->fTitleYOffset);
293
cairo_destroy (pCairoContext);
298
void rendering_register_mediaplayer_desklet_renderer (void)
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;
308
cairo_dock_register_desklet_renderer (MY_APPLET_MEDIAPLAYER_DESKLET_RENDERER_NAME, pRenderer);