diff options
author | nirav <nirav@teisuu.com> | 2018-09-30 21:39:59 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2018-09-30 21:39:59 +0530 |
commit | fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4 (patch) | |
tree | 68cbae9ac3e84cce4a4b6402d046e2a31bb4e188 /src/image.c | |
parent | 51d91d63181f82f605a8b9de6d280622ef697630 (diff) | |
download | im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.tar.gz im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.zip |
Added async file loading
Diffstat (limited to 'src/image.c')
-rw-r--r-- | src/image.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/src/image.c b/src/image.c index 23a76e0..3daf00e 100644 --- a/src/image.c +++ b/src/image.c @@ -1,6 +1,7 @@ #include "image.h" #include "window.h" #include <gtk-3.0/gtk/gtk.h> +#include <stdlib.h> static GtkWidget *image; static GdkPixbuf *pixbuf; @@ -9,6 +10,11 @@ static int pixbuf_width, pixbuf_height, curr_pixbuf_width, curr_pixbuf_height; static double aspect_ratio; static double curr_zoom; static enum scale_mode curr_scale_mod; +static int loading = 0; + +static GFile *file; +static GFileInputStream *is; +static GError *error = NULL; GtkWidget *new_image() { @@ -16,23 +22,53 @@ GtkWidget *new_image() return image; } -int load_image(char *file_name) +void pixbuf_load_callback(GObject *source_object, GAsyncResult *res, + gpointer user_data) { - GError *error = NULL; if (pixbuf != NULL) g_object_unref(pixbuf); - gtk_image_clear(GTK_IMAGE(image)); - pixbuf = gdk_pixbuf_new_from_file(file_name, &error); - if (error) - return -1; + if (is != NULL) + g_object_unref(is); + pixbuf = gdk_pixbuf_new_from_stream_finish(res, &error); + if (error != NULL) { + loading = 0; + g_printerr("%s\n", error->message); + return; + } curr_pixbuf_width = pixbuf_width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf)); curr_pixbuf_height = pixbuf_height = gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf)); aspect_ratio = (double)pixbuf_width / (double)pixbuf_height; - curr_zoom = 1.0; fit_image(); + loading = 0; +} + +void file_read_callback(GObject *source_object, GAsyncResult *res, + gpointer user_data) +{ + is = g_file_read_finish(file, res, &error); + if (error != NULL) { + loading = 0; + g_printerr("%s\n", error->message); + return; + } + gdk_pixbuf_new_from_stream_async(G_INPUT_STREAM(is), NULL, + &pixbuf_load_callback, NULL); +} + +int load_image(char *file_name) +{ + if (loading) + return -1; + loading = 1; + file = g_file_new_for_path(file_name); + g_file_read_async(file, G_PRIORITY_DEFAULT, NULL, &file_read_callback, + NULL); + if (file != NULL) + g_object_unref(file); + curr_zoom = 1.0; set_window_title(g_path_get_basename(file_name)); - return 1; + return 0; } void update_pixbuf() |