aboutsummaryrefslogtreecommitdiff
path: root/src/image.c
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2018-09-30 21:39:59 +0530
committerDandelion <nirav@teisuu.com>2018-09-30 21:39:59 +0530
commitfde5cb29f95f51ed075c34f5eebdccb81fa2f0e4 (patch)
tree68cbae9ac3e84cce4a4b6402d046e2a31bb4e188 /src/image.c
parent51d91d63181f82f605a8b9de6d280622ef697630 (diff)
downloadim-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.tar.gz
im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.zip
Added async file loading
Diffstat (limited to 'src/image.c')
-rw-r--r--src/image.c52
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()