77
#define ATOI(s) (((s) != NULL) ? atoi(s) : 0)
78
#define ATOL(s) (((s) != NULL) ? atol(s) : 0)
79
#define ATOF(s) (((s) != NULL) ? atof(s) : 0.0f)
80
#define STRDUP(s) (((s) != NULL) ? g_strdup(s) : NULL)
79
#define ATOI(s) (((s) != NULL) ? atoi(s) : 0)
80
#define ATOL(s) (((s) != NULL) ? atol(s) : 0)
81
#define ATOF(s) (((s) != NULL) ? atof(s) : 0.0f)
82
#define STRDUP(s) (((s) != NULL) ? g_strdup(s) : NULL)
82
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
83
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
84
#define CLIP(a,l,h) (MIN(MAX((a),(l)),(h)))
85
#define STRLEN(s) (((s) != NULL) ? strlen(s) : 0)
86
#define STRISEMPTY(s) (((s) != NULL) ? (*(s) == '\0') : TRUE)
84
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
85
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
86
#define CLIP(a,l,h) (MIN(MAX((a),(l)),(h)))
87
#define STRLEN(s) (((s) != NULL) ? strlen(s) : 0)
88
#define STRISEMPTY(s) (((s) != NULL) ? (*(s) == '\0') : TRUE)
92
94
static void AnimIconDataDestroyCB(gpointer data)
95
96
AnimIcon *a = ANIM_ICON(data);
99
GTK_TIMEOUT_REMOVE(a->toid);
102
for(i = 0; i < a->nframes; i++)
104
GDK_PIXMAP_UNREF(a->pixmaps_list[i]);
105
GDK_BITMAP_UNREF(a->masks_list[i]);
107
g_free(a->pixmaps_list);
108
g_free(a->masks_list);
103
gtk_timeout_remove(a->toid);
105
if(a->pixmaps_list != NULL)
108
for(glist = a->pixmaps_list;
110
glist = g_list_next(glist)
113
if(glist->data != NULL)
114
gdk_pixmap_unref((GdkPixmap *)glist->data);
116
g_list_free(a->pixmaps_list);
118
if(a->masks_list != NULL)
121
for(glist = a->masks_list;
123
glist = g_list_next(glist)
126
if(glist->data != NULL)
127
gdk_bitmap_unref((GdkBitmap *)glist->data);
129
g_list_free(a->masks_list);
110
132
if(a->color_bg != NULL)
288
/* Draw animated icon */
326
/* Draw the animated icon */
327
if(a->pixmaps_list != NULL)
291
const gint frame = a->frame,
292
nframes = a->nframes;
293
if((frame >= 0) && (frame < nframes))
329
const guint frame = (guint)a->frame;
330
GdkPixmap *pixmap = (GdkPixmap *)g_list_nth_data(
331
a->pixmaps_list, frame
295
GdkPixmap *pixmap = a->pixmaps_list[frame];
296
GdkBitmap *mask = a->masks_list[frame];
335
GdkBitmap *mask = (GdkBitmap *)g_list_nth_data(
297
338
gdk_gc_set_clip_mask(gc, mask);
298
339
gdk_gc_set_clip_origin(gc, 0, 0);
326
367
GtkWidget *AnimIconNew(const gint width, const gint height)
328
GtkWidget *w = gtk_drawing_area_new();
329
AnimIcon *a = ANIM_ICON(g_malloc0(sizeof(AnimIcon)));
372
a = ANIM_ICON(g_malloc0(sizeof(AnimIcon)));
380
a->pixmaps_list = NULL;
381
a->masks_list = NULL;
383
a->drawing_area = NULL;
393
a->drawing_area = w = gtk_drawing_area_new();
331
394
gtk_object_set_data_full(
332
395
GTK_OBJECT(w), ANIM_ICON_DATA_KEY,
333
396
a, AnimIconDataDestroyCB
336
398
gtk_widget_set_usize(w, width, height);
337
399
gtk_widget_add_events(
378
428
GtkWidget *w, GList *data_list, const gulong interval
382
431
AnimIcon *a = ANIM_ICON((w != NULL) ?
383
432
gtk_object_get_data(GTK_OBJECT(w), ANIM_ICON_DATA_KEY) : NULL
388
/* Remove current draw timeout if any */
439
/* Remove the current draw timeout if any */
391
442
gtk_timeout_remove(a->toid);
395
/* Delete existing pixmaps and masks lists */
396
for(i = 0; i < a->nframes; i++)
398
GDK_PIXMAP_UNREF(a->pixmaps_list[i]);
399
GDK_BITMAP_UNREF(a->masks_list[i]);
401
g_free(a->pixmaps_list);
402
a->pixmaps_list = NULL;
403
g_free(a->masks_list);
404
a->masks_list = NULL;
446
/* Delete the pixmaps and masks lists */
447
if(a->pixmaps_list != NULL)
450
for(glist = a->pixmaps_list;
452
glist = g_list_next(glist)
455
if(glist->data != NULL)
456
gdk_pixmap_unref((GdkPixmap *)glist->data);
458
g_list_free(a->pixmaps_list);
459
a->pixmaps_list = NULL;
461
if(a->masks_list != NULL)
464
for(glist = a->masks_list;
466
glist = g_list_next(glist)
469
if(glist->data != NULL)
470
gdk_bitmap_unref((GdkBitmap *)glist->data);
472
g_list_free(a->masks_list);
473
a->masks_list = NULL;
407
477
a->interval = (gulong)AnimIconIntervalDefault;
480
/* Load the XPM data */
411
481
if(data_list != NULL)
416
/* Get number of frames */
417
a->nframes = g_list_length(data_list);
419
/* Allocate pixmaps and masks lists */
420
a->pixmaps_list = (GdkPixmap **)g_malloc0(
421
a->nframes * sizeof(GdkPixmap *)
423
a->masks_list = (GdkBitmap **)g_malloc0(
424
a->nframes * sizeof(GdkBitmap *)
426
if((a->pixmaps_list == NULL) || (a->masks_list == NULL))
428
g_free(a->pixmaps_list);
429
a->pixmaps_list = NULL;
430
g_free(a->masks_list);
431
a->masks_list = NULL;
436
488
/* Load each pixmap and mask */
437
for(glist = data_list, i = 0;
489
for(glist = data_list;
439
glist = g_list_next(glist), i++
491
glist = g_list_next(glist)
442
494
data = (guint8 **)glist->data;
446
a->pixmaps_list[i] = GDK_PIXMAP_NEW_FROM_XPM_DATA(
447
&a->masks_list[i], (guint8 **)data
498
pixmap = GDK_PIXMAP_NEW_FROM_XPM_DATA(
499
&mask, (guint8 **)data
504
a->pixmaps_list = g_list_append(a->pixmaps_list, pixmap);
505
a->masks_list = g_list_append(a->masks_list, mask);
508
/* Set the total number of frames */
509
a->nframes = g_list_length(a->pixmaps_list);
511
/* Set the interval */
452
512
a->interval = interval;