diff options
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/window.c b/src/window.c new file mode 100644 index 0000000..c659114 --- /dev/null +++ b/src/window.c @@ -0,0 +1,105 @@ +#include "window.h" +#include "file.h" +#include "image.h" +#include "input.h" +#include <gtk-3.0/gtk/gtk.h> + +GtkWidget *window; +GtkWidget *scrolled_window; + +static gboolean key_press(GtkWindow *window, GdkEvent *event, gpointer data) +{ + handle_key_press(event); + return FALSE; +} + +static gboolean button_press(GtkWindow *window, GdkEvent *event, gpointer data) +{ + handle_button_press(event); + return TRUE; +} + +static gboolean button_release(GtkWindow *window, GdkEvent *event, + gpointer data) +{ + handle_button_release(); + return TRUE; +} + +static gboolean motion_notify(GtkWindow *window, GdkEvent *event, gpointer data) +{ + handle_mouse_move(event->motion.x, event->motion.y); + return TRUE; +} + +static gboolean scroll_callback(GtkWindow *window, GdkEvent *event, + gpointer data) +{ + handle_scroll(event); + return TRUE; +} + +static gboolean configure_callback(GtkWindow *window, GdkEvent *event, + gpointer data) +{ + handle_resize(); + return TRUE; +} + +void create_main_window(GApplication *app) +{ + 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); + g_signal_connect(G_OBJECT(window), "button-press-event", + G_CALLBACK(button_press), NULL); + g_signal_connect(G_OBJECT(window), "button-release-event", + G_CALLBACK(button_release), NULL); + g_signal_connect(G_OBJECT(window), "motion-notify-event", + G_CALLBACK(motion_notify), NULL); + gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK); + g_signal_connect(G_OBJECT(window), "scroll-event", + G_CALLBACK(scroll_callback), NULL); + + 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)); +} + +void scroll_window(gdouble x, gdouble y) +{ + GtkAdjustment *h_adj = gtk_scrolled_window_get_hadjustment( + GTK_SCROLLED_WINDOW(scrolled_window)); + GtkAdjustment *v_adj = gtk_scrolled_window_get_vadjustment( + GTK_SCROLLED_WINDOW(scrolled_window)); + gtk_adjustment_set_value(h_adj, gtk_adjustment_get_value(h_adj) + x); + gtk_adjustment_set_value(v_adj, gtk_adjustment_get_value(v_adj) + y); + gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window), + h_adj); + gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window), + v_adj); +} + +void set_window_title(const char *title) +{ + gtk_window_set_title(GTK_WINDOW(window), title); +} + +void get_curr_win_size(gint *width, gint *height) +{ + gtk_window_get_size(GTK_WINDOW(window), width, height); +} + +void quit() +{ + clean(); + g_application_quit( + G_APPLICATION(gtk_window_get_application(GTK_WINDOW(window)))); +} |