#include "file.h" #include "image.h" #include #include #include #include #include #define TIMEOUT 20 GtkWidget *window; gint win_width, win_height; GError *error = NULL; static gboolean key_press(GtkWindow *window, GdkEvent *event, gpointer data) { char *name; switch (event->key.keyval) { case GDK_KEY_q: g_application_quit( G_APPLICATION(gtk_window_get_application(GTK_WINDOW(window)))); return FALSE; case GDK_KEY_w: curr_scale_mod = fit; fit_image(win_width, win_height); return FALSE; case GDK_KEY_plus: case GDK_KEY_KP_Add: zoom(1); return FALSE; case GDK_KEY_minus: case GDK_KEY_KP_Subtract: zoom(-1); return FALSE; case GDK_KEY_equal: zoom(0); return FALSE; case GDK_KEY_n: case GDK_KEY_j: case GDK_KEY_Right: if ((name = get_next_file()) != NULL) load_image(name, win_width, win_height); return FALSE; case GDK_KEY_p: case GDK_KEY_k: case GDK_KEY_Left: if ((name = get_prev_file()) != NULL) load_image(name, win_width, win_height); return FALSE; case GDK_KEY_g: case GDK_KEY_Home: if ((name = get_first_file()) != NULL) load_image(name, win_width, win_height); return FALSE; case GDK_KEY_G: case GDK_KEY_End: if ((name = get_last_file()) != NULL) load_image(name, win_width, win_height); return FALSE; default: return TRUE; } } gboolean scroll_callback(GtkWindow *window, GdkEvent *event, gpointer data) { GdkModifierType state; gdk_event_get_state(event, &state); if (state & GDK_CONTROL_MASK && event->scroll.direction == GDK_SCROLL_UP) { zoom(1); curr_scale_mod = zoomed; return FALSE; } else if (state & GDK_CONTROL_MASK && event->scroll.direction == GDK_SCROLL_DOWN) { zoom(-1); curr_scale_mod = zoomed; return FALSE; } return TRUE; } gboolean resize_done(gpointer data) { guint *id = data; *id = 0; gtk_window_get_size(GTK_WINDOW(window), &win_width, &win_height); fit_image(win_width, win_height); return FALSE; } gboolean configure_callback(GtkWindow *window, GdkEvent *event, gpointer data) { if (curr_scale_mod != fit) { return FALSE; } static guint id = 0; if (id) g_source_remove(id); id = g_timeout_add(TIMEOUT, resize_done, &id); return FALSE; } static void activate(GtkApplication *app, gpointer user_data) { } static void open(GApplication *app, GFile **files, gint n_files, const gchar *hint) { if (n_files != 1) { return; } window = gtk_application_window_new(GTK_APPLICATION(app)); gtk_window_set_title(GTK_WINDOW(window), "qwe"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(configure_callback), NULL); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press), NULL); gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK); g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(scroll_callback), NULL); char *curr_filename = g_file_get_path(files[0]); int i = scan(curr_filename); if (i < 0) { printf("scan() error %d\n", i); return; } GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(new_image())); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(scrolled_window)); gtk_widget_show_all(GTK_WIDGET(window)); load_image(curr_filename, win_width, win_height); } int main(int argc, char *argv[]) { GtkApplication *app; int status; app = gtk_application_new("org.gtk.qwe", G_APPLICATION_HANDLES_OPEN); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); g_signal_connect(app, "open", G_CALLBACK(open), NULL); status = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); return status; }