3
#include <librsvg/rsvg.h>
4
#include <librsvg/rsvg-cairo.h>
6
#include "cd-clock-config.h"
7
#include "cd-clock-struct.h"
8
#include "cd-clock-draw.h"
11
extern Icon *my_pIcon;
12
extern cairo_t *my_pCairoContext;
14
extern gboolean my_bShowDate;
15
extern gboolean my_bShowSeconds;
16
extern gboolean my_b24Mode;
17
extern int my_bOldStyle;
19
extern GHashTable *my_pThemeTable;
21
extern cairo_surface_t *g_pBackgroundSurface;
22
extern cairo_surface_t *g_pForegroundSurface;
23
extern RsvgDimensionData my_DimensionData;
24
extern RsvgHandle *my_pSvgHandles[CLOCK_ELEMENTS];
26
static char cDateBuffer[50];
29
gboolean cd_clock_update_with_time (Icon *icon)
31
time_t epoch = (time_t) time (NULL);
33
localtime_r (&epoch, &epoch_tm);
36
cd_clock_draw_old_fashionned_clock (my_pCairoContext, (int) icon->fWidth, (int) icon->fHeight, (1 + g_fAmplitude), &epoch_tm);
38
cd_clock_draw_text (my_pCairoContext, &epoch_tm);
41
cairo_dock_redraw_my_icon (icon);
47
void cd_clock_draw_text (cairo_t *pSourceContext, struct tm *pTime)
49
GString *sFormat = g_string_new ("");
52
g_string_printf (sFormat, "%T");
54
g_string_printf (sFormat, "%R");
57
g_string_append (sFormat, "\n%a%d%b");
59
strftime (cDateBuffer, 50, sFormat->str, pTime);
60
g_string_free (sFormat, TRUE);
63
cairo_save (pSourceContext);
65
cairo_set_tolerance (pSourceContext, 0.1);
67
cairo_set_source_rgba (pSourceContext, 0.0, 0.0, 0.0, 0.0);
68
cairo_set_operator (pSourceContext, CAIRO_OPERATOR_SOURCE);
69
cairo_paint (pSourceContext);
72
PangoLayout *pLayout = pango_cairo_create_layout (pSourceContext);
73
PangoFontDescription *pDesc = pango_font_description_new ();
75
pango_font_description_set_absolute_size (pDesc, g_iLabelSize * PANGO_SCALE);
76
pango_font_description_set_family_static (pDesc, g_cLabelPolice);
77
pango_font_description_set_weight (pDesc, g_iLabelWeight);
78
pango_font_description_set_style (pDesc, g_iLabelStyle);
79
pango_layout_set_font_description (pLayout, pDesc);
80
pango_font_description_free (pDesc);
82
pango_layout_set_text (pLayout, cDateBuffer, -1);
83
//g_print ("%s\n", cDateBuffer);
86
PangoRectangle ink, log;
87
pango_layout_get_pixel_extents (pLayout, &ink, &log);
89
cairo_surface_t *pNewSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
90
CAIRO_CONTENT_COLOR_ALPHA,
93
cairo_t *pCairoContext = cairo_create (pNewSurface);
94
cairo_set_source_rgb (pCairoContext, 0.0, 0.0, 0.5);
95
cairo_translate (pCairoContext, -ink.x, -ink.y);
97
pango_cairo_show_layout (pCairoContext, pLayout);
99
//double fTextXOffset = log.width / 2. - ink.x;
100
//double fTextYOffset = log.height - ink.y;
101
double fMaxScale = 1 + g_fAmplitude;
103
cairo_set_source_rgba (pSourceContext, 0.0, 0.0, 0.0, 0.0);
104
cairo_set_operator (pSourceContext, CAIRO_OPERATOR_OVER);
105
cairo_scale (pSourceContext, my_pIcon->fWidth * fMaxScale / ink.width, my_pIcon->fHeight * fMaxScale / ink.height);
106
cairo_set_source_surface (pSourceContext,
110
cairo_paint (pSourceContext);
112
cairo_destroy (pCairoContext);
114
g_object_unref (pLayout);
115
cairo_restore (pSourceContext);
120
void draw_background (cairo_t* pDrawingContext, int iWidth, int iHeight)
123
cairo_scale (pDrawingContext,
124
(double) iWidth / (double) my_DimensionData.width,
125
(double) iHeight / (double) my_DimensionData.height);
126
cairo_set_source_rgba (pDrawingContext, 1.0f, 1.0f, 1.0f, 0.0f);
127
cairo_set_operator (pDrawingContext, CAIRO_OPERATOR_OVER);
128
cairo_paint (pDrawingContext);
131
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_DROP_SHADOW], pDrawingContext);
132
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FACE], pDrawingContext);
133
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MARKS], pDrawingContext);
136
void draw_foreground (cairo_t* pDrawingContext, int iWidth, int iHeight)
139
cairo_scale (pDrawingContext,
140
(double) iWidth / (double) my_DimensionData.width,
141
(double) iHeight / (double) my_DimensionData.height);
142
cairo_set_source_rgba (pDrawingContext, 1.0f, 1.0f, 1.0f, 0.0f);
143
cairo_set_operator (pDrawingContext, CAIRO_OPERATOR_OVER);
144
cairo_paint (pDrawingContext);
147
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FACE_SHADOW], pDrawingContext);
148
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_GLASS], pDrawingContext);
149
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FRAME], pDrawingContext);
152
cairo_surface_t* update_surface (cairo_surface_t* pOldSurface,
153
cairo_t* pSourceContext,
158
cairo_surface_t* pNewSurface = NULL;
159
cairo_t* pDrawingContext = NULL;
161
if (pOldSurface != NULL)
162
cairo_surface_destroy (pOldSurface);
163
pNewSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
164
CAIRO_CONTENT_COLOR_ALPHA,
167
if (cairo_surface_status (pNewSurface) != CAIRO_STATUS_SUCCESS)
170
pDrawingContext = cairo_create (pNewSurface);
171
if (cairo_status (pDrawingContext) != CAIRO_STATUS_SUCCESS)
176
case KIND_BACKGROUND :
177
draw_background (pDrawingContext, iWidth, iHeight);
180
case KIND_FOREGROUND :
181
draw_foreground (pDrawingContext, iWidth, iHeight);
185
cairo_destroy (pDrawingContext);
191
void cd_clock_draw_old_fashionned_clock (cairo_t *pCairoContext, int width, int height, double fMaxScale, struct tm *pTime)
193
//g_print ("%s (%dx%d)\n", __func__, width, height);
194
static double fHalfX;
195
static double fHalfY;
196
static double fShadowOffsetX = -0.75f;
197
static double fShadowOffsetY = 0.75f;
198
static cairo_text_extents_t textExtents;
200
fHalfX = my_DimensionData.width / 2.0f;
201
fHalfY = my_DimensionData.height / 2.0f;
203
int g_iSeconds = pTime->tm_sec;
204
int g_iMinutes = pTime->tm_min;
205
int g_iHours = pTime->tm_hour;
207
cairo_set_operator (my_pCairoContext, CAIRO_OPERATOR_SOURCE);
209
cairo_set_source_surface (my_pCairoContext, g_pBackgroundSurface, 0.0f, 0.0f);
210
cairo_paint (my_pCairoContext);
212
cairo_set_operator (my_pCairoContext, CAIRO_OPERATOR_OVER);
214
cairo_save (my_pCairoContext);
215
cairo_scale (my_pCairoContext,
216
(double) width / (double) my_DimensionData.width * fMaxScale,
217
(double) height / (double) my_DimensionData.height * fMaxScale);
219
cairo_translate (my_pCairoContext, fHalfX, fHalfY);
220
cairo_rotate (my_pCairoContext, -G_PI/2.0f);
224
cairo_save (my_pCairoContext);
225
cairo_set_source_rgb (my_pCairoContext, 1.0f, 0.5f, 0.0f);
226
cairo_set_line_width (my_pCairoContext, 5.0f);
227
cairo_text_extents (my_pCairoContext, cDateBuffer, &textExtents);
228
cairo_rotate (my_pCairoContext, (G_PI/180.0f) * 90.0f);
229
cairo_move_to (my_pCairoContext,
230
-textExtents.width / 2.0f,
231
2.0f * textExtents.height);
233
strftime (cDateBuffer, 50, "%a%d%b", pTime);
234
cairo_show_text (my_pCairoContext, cDateBuffer);
235
cairo_restore (my_pCairoContext);
238
cairo_save (my_pCairoContext);
239
cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
240
cairo_rotate (my_pCairoContext, (G_PI/ 12.0f * g_iHours + (G_PI/ 720.0f) * g_iMinutes));
242
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_HOUR_HAND_SHADOW], my_pCairoContext);
244
cairo_restore (my_pCairoContext);
246
cairo_save (my_pCairoContext);
247
cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
248
cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iMinutes);
250
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MINUTE_HAND_SHADOW], my_pCairoContext);
252
cairo_restore (my_pCairoContext);
256
cairo_save (my_pCairoContext);
257
cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
258
cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iSeconds);
260
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_SECOND_HAND_SHADOW], my_pCairoContext);
262
cairo_restore (my_pCairoContext);
265
cairo_save (my_pCairoContext);
266
cairo_rotate (my_pCairoContext, (g_iHours % 12) * G_PI/6 + g_iMinutes * G_PI/360.0f);
268
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_HOUR_HAND], my_pCairoContext);
270
cairo_restore (my_pCairoContext);
272
cairo_save (my_pCairoContext);
273
cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iMinutes);
275
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MINUTE_HAND], my_pCairoContext);
277
cairo_restore (my_pCairoContext);
281
cairo_save (my_pCairoContext);
282
cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iSeconds);
284
rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_SECOND_HAND], my_pCairoContext);
285
cairo_restore (my_pCairoContext);
288
cairo_restore (my_pCairoContext);
290
cairo_set_source_surface (my_pCairoContext, g_pForegroundSurface, 0.0f, 0.0f);
291
cairo_paint (my_pCairoContext);