Documentation: Use G_SOURCE_CONTINUE and G_SOURCE_REMOVE
[geeqie.git] / src / image-load.cc
index b5df7c4..5288ced 100644 (file)
@@ -88,7 +88,7 @@ GType image_loader_get_type(void)
                        (GInstanceInitFunc)image_loader_init, /* instance_init */
                        NULL    /* value_table */
                        };
-               type = g_type_register_static(G_TYPE_OBJECT, "ImageLoaderType", &info, G_TYPE_FLAG_NONE);
+               type = g_type_register_static(G_TYPE_OBJECT, "ImageLoaderType", &info, GTypeFlags(0));
                }
        return type;
 }
@@ -294,28 +294,28 @@ static gboolean image_loader_emit_area_ready_cb(gpointer data)
 
        g_signal_emit(il, signals[SIGNAL_AREA_READY], 0, x, y, w, h);
 
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 static gboolean image_loader_emit_done_cb(gpointer data)
 {
        ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_DONE], 0);
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 static gboolean image_loader_emit_error_cb(gpointer data)
 {
        ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_ERROR], 0);
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 static gboolean image_loader_emit_percent_cb(gpointer data)
 {
        ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_PERCENT], 0, image_loader_get_percent(il));
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 static gboolean image_loader_emit_size_cb(gpointer data)
@@ -327,7 +327,7 @@ static gboolean image_loader_emit_size_cb(gpointer data)
        height = il->actual_height;
        g_mutex_unlock(il->data_mutex);
        g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height);
-       return FALSE;
+       return G_SOURCE_REMOVE;
 }
 
 
@@ -836,7 +836,7 @@ static gboolean image_loader_continue(ImageLoader *il)
        gint b;
        gint c;
 
-       if (!il) return FALSE;
+       if (!il) return G_SOURCE_REMOVE;
 
        c = il->idle_read_loop_count ? il->idle_read_loop_count : 1;
        while (c > 0 && !image_loader_get_stopping(il))
@@ -846,13 +846,13 @@ static gboolean image_loader_continue(ImageLoader *il)
                if (b == 0)
                        {
                        image_loader_done(il);
-                       return FALSE;
+                       return G_SOURCE_REMOVE;
                        }
 
                if (b < 0 || (b > 0 && !il->backend.write(il->loader, il->mapped_file + il->bytes_read, b, &il->error)))
                        {
                        image_loader_error(il);
-                       return FALSE;
+                       return G_SOURCE_REMOVE;
                        }
 
                il->bytes_read += b;
@@ -865,7 +865,7 @@ static gboolean image_loader_continue(ImageLoader *il)
                image_loader_emit_percent(il);
                }
 
-       return TRUE;
+       return G_SOURCE_CONTINUE;
 }
 
 static gboolean image_loader_begin(ImageLoader *il)
@@ -1156,40 +1156,39 @@ void image_loader_delay_area_ready(ImageLoader *il, gboolean enable)
 /**************************************************************************************/
 /* execution via idle calls */
 
-//static gboolean image_loader_idle_cb(gpointer data)
-//{
-       //gboolean ret = FALSE;
-       //ImageLoader *il = static_cast<ImageLoader *>(data);
-
-       //if (il->idle_id)
-               //{
-               //ret = image_loader_continue(il);
-               //}
+static gboolean image_loader_idle_cb(gpointer data)
+{
+       gboolean ret = G_SOURCE_REMOVE;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
 
-       //if (!ret)
-               //{
-               //image_loader_stop_source(il);
-               //}
+       if (il->idle_id)
+               {
+               ret = image_loader_continue(il);
+               }
 
-       //return ret;
-//}
+       if (!ret)
+               {
+               image_loader_stop_source(il);
+               }
 
+       return ret;
+}
 
-//static gboolean image_loader_start_idle(ImageLoader *il)
-//{
-       //gboolean ret;
+static gboolean image_loader_start_idle(ImageLoader *il)
+{
+       gboolean ret;
 
-       //if (!il) return FALSE;
+       if (!il) return FALSE;
 
-       //if (!il->fd) return FALSE;
+       if (!il->fd) return FALSE;
 
-       //if (!image_loader_setup_source(il)) return FALSE;
+       if (!image_loader_setup_source(il)) return FALSE;
 
-       //ret = image_loader_begin(il);
+       ret = image_loader_begin(il);
 
-       //if (ret && !il->done) il->idle_id = g_idle_add_full(il->idle_priority, image_loader_idle_cb, il, NULL);
-       //return ret;
-//}
+       if (ret && !il->done) il->idle_id = g_idle_add_full(il->idle_priority, image_loader_idle_cb, il, NULL);
+       return ret;
+}
 
 /**************************************************************************************/
 /* execution via thread */
@@ -1429,27 +1428,32 @@ const gchar *image_loader_get_error(ImageLoader *il)
        return ret;
 }
 
+
+/**
+ *  @FIXME this can be rather slow and blocks until the size is known
+ */
 gboolean image_load_dimensions(FileData *fd, gint *width, gint *height)
 {
+       ImageLoader *il;
        gboolean success;
-       gint width_file = 0;
-       gint height_file = 0;
 
-       gdk_pixbuf_get_file_info(fd->path, &width_file, &height_file);
+       il = image_loader_new(fd);
+
+       success = image_loader_start_idle(il);
 
-       if (width_file && height_file)
+       if (success && il->pixbuf)
                {
-               *width = width_file;
-               *height = height_file;
-               success = TRUE;
+               if (width) *width = gdk_pixbuf_get_width(il->pixbuf);
+               if (height) *height = gdk_pixbuf_get_height(il->pixbuf);;
                }
        else
                {
-               *width = -1;
-               *height = -1;
-               success = FALSE;
+               if (width) *width = -1;
+               if (height) *height = -1;
                }
 
+       image_loader_free(il);
+
        return success;
 }
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */