+static OverlayData *rc_overlay_find(RendererClutter *rc, gint id)
+{
+ GList *work;
+
+ work = rc->overlay_list;
+ while (work)
+ {
+ OverlayData *od = work->data;
+ work = work->next;
+
+ if (od->id == id) return od;
+ }
+
+ return NULL;
+}
+
+static void rc_overlay_actor_destroy_cb(ClutterActor *actor, gpointer user_data)
+{
+ OverlayData *od = user_data;
+ od->actor = NULL;
+}
+
+static void rc_overlay_free(RendererClutter *rc, OverlayData *od)
+{
+ rc->overlay_list = g_list_remove(rc->overlay_list, od);
+
+ if (od->pixbuf) g_object_unref(G_OBJECT(od->pixbuf));
+ if (od->actor) clutter_actor_destroy(od->actor);
+ g_free(od);
+}
+
+static void rc_overlay_update_position(RendererClutter *rc, OverlayData *od)
+{
+ gint px, py, pw, ph;
+
+ pw = gdk_pixbuf_get_width(od->pixbuf);
+ ph = gdk_pixbuf_get_height(od->pixbuf);
+ px = od->x;
+ py = od->y;
+
+ if (od->flags & OVL_RELATIVE)
+ {
+ if (px < 0) px = rc->pr->viewport_width - pw + px;
+ if (py < 0) py = rc->pr->viewport_height - ph + py;
+ }
+ if (od->actor) clutter_actor_set_position(od->actor, px, py);
+}
+
+static void rc_overlay_update_positions(RendererClutter *rc)
+{
+ GList *work;
+
+ work = rc->overlay_list;
+ while (work)
+ {
+ OverlayData *od = work->data;
+ work = work->next;
+
+ rc_overlay_update_position(rc, od);
+ }
+}
+
+static void rc_overlay_free_all(RendererClutter *rc)
+{
+ GList *work;
+
+ work = rc->overlay_list;
+ while (work)
+ {
+ OverlayData *od = work->data;
+ work = work->next;
+
+ rc_overlay_free(rc, od);
+ }
+}
+
+