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 | |
parent | 51d91d63181f82f605a8b9de6d280622ef697630 (diff) | |
download | im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.tar.gz im-fde5cb29f95f51ed075c34f5eebdccb81fa2f0e4.zip |
Added async file loading
-rw-r--r-- | src/file.c | 30 | ||||
-rw-r--r-- | src/file.h | 8 | ||||
-rw-r--r-- | src/image.c | 52 | ||||
-rw-r--r-- | src/input.c | 64 | ||||
-rw-r--r-- | src/main.c | 2 |
5 files changed, 83 insertions, 73 deletions
@@ -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() @@ -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: @@ -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); |