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
il->requested_width = 0;
il->requested_height = 0;
il->requested_width = 0;
il->requested_height = 0;
+ il->actual_width = 0;
+ il->actual_height = 0;
il->shrunk = FALSE;
il->can_destroy = TRUE;
il->shrunk = FALSE;
il->can_destroy = TRUE;
+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
*/
/* DONE and ERROR are emited only once, thus they can have normal priority
PERCENT and AREA_READY should be processed ASAP
*/
g_idle_add_full(G_PRIORITY_HIGH, image_loader_emit_percent_cb, il, NULL);
}
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)
{
/* 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)
{
gint n;
g_mutex_lock(il->data_mutex);
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);
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);
return;
}
g_mutex_unlock(il->data_mutex);
- g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height);
+ image_loader_emit_size(il);
+ il->actual_width = nw;
+ il->actual_height = nh;
il->backend.set_size(loader, nw, nh);
il->shrunk = TRUE;
}
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);
+ g_mutex_unlock(il->data_mutex);
+ image_loader_emit_size(il);
}
static void image_loader_stop_loader(ImageLoader *il)
}
static void image_loader_stop_loader(ImageLoader *il)
gint requested_width;
gint requested_height;
gint requested_width;
gint requested_height;
+
+ gint actual_width;
+ gint actual_height;
+
gboolean shrunk;
gboolean done;
gboolean shrunk;
gboolean done;