ClutterActor *group;
gboolean clut_updated;
+ gint64 last_pixbuf_change;
};
typedef struct _RendererClutterAreaParam RendererClutterAreaParam;
#define MAX_REGION_AREA (32768 * 1024)
+static gboolean renderer_area_changed_cb(gpointer data);
+
+static void rc_schedule_texture_upload(RendererClutter *rc)
+{
+ if (g_get_monotonic_time() - rc->last_pixbuf_change < 50000)
+ {
+ /* delay clutter redraw until the texture has some data
+ set priority between gtk redraw and clutter redraw */
+ rc->idle_update = g_idle_add_full(CLUTTER_PRIORITY_REDRAW - 10, renderer_area_changed_cb, rc, NULL);
+ }
+ else
+ {
+ /* higher prio than histogram */
+ rc->idle_update = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE - 5, renderer_area_changed_cb, rc, NULL);
+ }
+}
+
static gboolean renderer_area_changed_cb(gpointer data)
{
RendererClutter *rc = (RendererClutter *)data;
return FALSE;
}
- return TRUE;
+
+ rc_schedule_texture_upload(rc);
+
+ return FALSE; /* it was rescheduled, possibly with different prio */
}
rc->pending_updates = g_list_append(rc->pending_updates, par);
if (!rc->idle_update)
{
- rc->idle_update = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, renderer_area_changed_cb, rc, NULL);
+ rc_schedule_texture_upload(rc);
}
}
}
rc->clut_updated = FALSE;
+ rc->last_pixbuf_change = g_get_monotonic_time();
printf("renderer_update_pixbuf\n");
rc_sync_actor(rc);
}