Mercurial > hg > forks > geeqie
changeset 2086:724e6afd4b58
dynamic change of texture upload priority
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Sat, 18 Aug 2012 16:25:18 +0200 |
parents | 4819bb191532 |
children | db758ceaa1fc |
files | src/renderer-clutter.c |
diffstat | 1 files changed, 24 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/renderer-clutter.c Sat Aug 18 00:33:54 2012 +0200 +++ b/src/renderer-clutter.c Sat Aug 18 16:25:18 2012 +0200 @@ -105,6 +105,7 @@ ClutterActor *group; gboolean clut_updated; + gint64 last_pixbuf_change; }; typedef struct _RendererClutterAreaParam RendererClutterAreaParam; @@ -373,6 +374,23 @@ #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; @@ -426,7 +444,10 @@ return FALSE; } - return TRUE; + + rc_schedule_texture_upload(rc); + + return FALSE; /* it was rescheduled, possibly with different prio */ } @@ -457,7 +478,7 @@ 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); } } @@ -519,6 +540,7 @@ } rc->clut_updated = FALSE; + rc->last_pixbuf_change = g_get_monotonic_time(); printf("renderer_update_pixbuf\n"); rc_sync_actor(rc); }