Mercurial > hg > forks > geeqie
changeset 1938:ee4f2e54d806
call size signal indirectly via idle_call
image_loader_size_cb is called from a second thread, so it can't
use any gtk functions directly or via signals
this fixes random crashes in gtk code introduced by commit e24281e5
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Sat, 12 Nov 2011 11:36:18 +0100 |
parents | b7ecaec17b74 |
children | debb46578e7b |
files | src/image-load.c src/image-load.h |
diffstat | 2 files changed, 32 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/image-load.c Sat Nov 12 11:34:55 2011 +0100 +++ b/src/image-load.c Sat Nov 12 11:36:18 2011 +0100 @@ -92,6 +92,8 @@ il->requested_width = 0; il->requested_height = 0; + il->actual_width = 0; + il->actual_height = 0; il->shrunk = FALSE; il->can_destroy = TRUE; @@ -280,6 +282,19 @@ return FALSE; } +static gboolean image_loader_emit_size_cb(gpointer data) +{ + gint width, height; + ImageLoader *il = data; + g_mutex_lock(il->data_mutex); + width = il->actual_width; + height = il->actual_height; + g_mutex_unlock(il->data_mutex); + g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height); + return FALSE; +} + + /* DONE and ERROR are emited only once, thus they can have normal priority PERCENT and AREA_READY should be processed ASAP */ @@ -299,6 +314,11 @@ g_idle_add_full(G_PRIORITY_HIGH, image_loader_emit_percent_cb, il, NULL); } +static void image_loader_emit_size(ImageLoader *il) +{ + g_idle_add_full(G_PRIORITY_HIGH, image_loader_emit_size_cb, il, NULL); +} + /* this function expects that il->data_mutex is locked by caller */ static void image_loader_emit_area_ready(ImageLoader *il, guint x, guint y, guint w, guint h) { @@ -444,10 +464,12 @@ gint n; g_mutex_lock(il->data_mutex); + il->actual_width = width; + il->actual_height = height; if (il->requested_width < 1 || il->requested_height < 1) { g_mutex_unlock(il->data_mutex); - g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height); + image_loader_emit_size(il); return; } g_mutex_unlock(il->data_mutex); @@ -463,7 +485,7 @@ if (!scale) { - g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height); + image_loader_emit_size(il); return; } @@ -486,12 +508,14 @@ if (nw < 1) nw = 1; } + il->actual_width = nw; + il->actual_height = nh; il->backend.set_size(loader, nw, nh); il->shrunk = TRUE; } + g_mutex_unlock(il->data_mutex); - - g_signal_emit(il, signals[SIGNAL_SIZE], 0, nw, nh); + image_loader_emit_size(il); } static void image_loader_stop_loader(ImageLoader *il)