aboutsummaryrefslogtreecommitdiff
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
parent51d91d63181f82f605a8b9de6d280622ef697630 (diff)
downloadim-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.tar.gz
im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.zip
Added async file loading
-rw-r--r--src/file.c30
-rw-r--r--src/file.h8
-rw-r--r--src/image.c52
-rw-r--r--src/input.c64
-rw-r--r--src/main.c2
5 files changed, 83 insertions, 73 deletions
diff --git a/src/file.c b/src/file.c
index 459fc5d..22067c2 100644
--- a/src/file.c
+++ b/src/file.c
@@ -94,34 +94,36 @@ int scan(const char *file_name)
return 0;
}
-char *get_next_file()
+void next_file()
{
if (curr_file_index >= file_list_count - 1)
- return NULL;
- return file_list[++curr_file_index];
+ return;
+ if (!load_image(file_list[curr_file_index + 1]))
+ curr_file_index++;
}
-char *get_prev_file()
+void prev_file()
{
if (curr_file_index <= 0)
- return NULL;
- return file_list[--curr_file_index];
+ return;
+ if (!load_image(file_list[curr_file_index - 1]))
+ curr_file_index--;
}
-char *get_first_file()
+void first_file()
{
if (curr_file_index == 0)
- return NULL;
- curr_file_index = 0;
- return file_list[curr_file_index];
+ return;
+ if (!load_image(file_list[0]))
+ curr_file_index = 0;
}
-char *get_last_file()
+void last_file()
{
if (curr_file_index == file_list_count - 1)
- return NULL;
- curr_file_index = file_list_count - 1;
- return file_list[curr_file_index];
+ return;
+ if (!load_image(file_list[file_list_count - 1]))
+ curr_file_index = file_list_count - 1;
}
void clean()
diff --git a/src/file.h b/src/file.h
index a2fbd6c..9a82160 100644
--- a/src/file.h
+++ b/src/file.h
@@ -2,10 +2,10 @@
#define __FILE_H
int scan(const char *file_name);
-char *get_next_file();
-char *get_prev_file();
-char *get_first_file();
-char *get_last_file();
+void next_file();
+void prev_file();
+void first_file();
+void last_file();
void clean();
#endif
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()
diff --git a/src/input.c b/src/input.c
index 6e78a84..76b61a9 100644
--- a/src/input.c
+++ b/src/input.c
@@ -10,34 +10,6 @@
int grabbed = 0;
gdouble start_x, start_y;
-void next()
-{
- char *name;
- if ((name = get_next_file()) != NULL)
- load_image(name);
-}
-
-void prev()
-{
- char *name;
- if ((name = get_prev_file()) != NULL)
- load_image(name);
-}
-
-void first()
-{
- char *name;
- if ((name = get_first_file()) != NULL)
- load_image(name);
-}
-
-void last()
-{
- char *name;
- if ((name = get_last_file()) != NULL)
- load_image(name);
-}
-
void handle_key_press(GdkEvent *event)
{
GdkModifierType state;
@@ -62,78 +34,78 @@ void handle_key_press(GdkEvent *event)
zoom(0);
break;
case GDK_KEY_n:
- next();
+ next_file();
break;
case GDK_KEY_p:
- prev();
+ prev_file();
break;
case GDK_KEY_Up:
if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK)
- prev();
+ prev_file();
else
scroll_window(0, -SCROLLAMMOUNT);
break;
case GDK_KEY_Down:
if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK)
- next();
+ next_file();
else
scroll_window(0, SCROLLAMMOUNT);
break;
case GDK_KEY_Right:
if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK)
- next();
+ next_file();
else
scroll_window(SCROLLAMMOUNT, 0);
break;
case GDK_KEY_Left:
if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK)
- prev();
+ prev_file();
else
scroll_window(-SCROLLAMMOUNT, 0);
break;
case GDK_KEY_j:
if (get_current_scale_mode() == fit)
- next();
+ next_file();
else
scroll_window(0, SCROLLAMMOUNT);
break;
case GDK_KEY_J:
- next();
+ next_file();
break;
case GDK_KEY_k:
if (get_current_scale_mode() == fit)
- prev();
+ prev_file();
else
scroll_window(0, -SCROLLAMMOUNT);
break;
case GDK_KEY_K:
- prev();
+ prev_file();
break;
case GDK_KEY_l:
if (get_current_scale_mode() == fit)
- next();
+ next_file();
else
scroll_window(SCROLLAMMOUNT, 0);
break;
case GDK_KEY_L:
- next();
+ next_file();
break;
case GDK_KEY_h:
if (get_current_scale_mode() == fit)
- prev();
+ prev_file();
else
scroll_window(-SCROLLAMMOUNT, 0);
break;
case GDK_KEY_H:
- prev();
+ prev_file();
break;
case GDK_KEY_g:
case GDK_KEY_Home:
- first();
+ first_file();
break;
case GDK_KEY_G:
case GDK_KEY_End:
- last();
+ last_file();
break;
case GDK_KEY_f:
toggle_fullscreen();
@@ -180,14 +152,14 @@ void handle_scroll(GdkEvent *event)
if (state & GDK_CONTROL_MASK) {
zoom(1);
} else {
- prev();
+ prev_file();
}
break;
case GDK_SCROLL_DOWN:
if (state & GDK_CONTROL_MASK) {
zoom(-1);
} else {
- next();
+ next_file();
}
break;
default:
diff --git a/src/main.c b/src/main.c
index b5eb616..4289f9f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -28,7 +28,7 @@ static void open(GApplication *app, GFile **files, gint n_files,
int i = scan(curr_filename);
if (i < 0) {
printf("failed to load file\n");
- return;
+ quit();
}
i = load_image(curr_filename);