#include #include "file.h" #include "image.h" #include "input.h" #include "option.h" #include "window.h" GtkWidget *window; GtkWidget *info_panel; GtkWidget *scrolled_window; GtkWidget *info_panel_left, *info_panel_right; int is_fullscreen = 0; int show_info = 0; 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 load_css() { GtkCssProvider *provider = gtk_css_provider_new(); gtk_css_provider_load_from_resource(provider, "/org/gtk/qwe/qwe.css"); gtk_style_context_add_provider_for_screen( gdk_display_get_default_screen(gdk_display_get_default()), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); } void create_main_window() { // root window window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_set_name(GTK_WIDGET(window), "main-window"); gtk_window_set_title(GTK_WINDOW(window), "qwe"); gtk_window_set_default_size(GTK_WINDOW(window), 800, 600); gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK); 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); g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(scroll_callback), NULL); // scrolled window scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_vexpand(GTK_WIDGET(scrolled_window), TRUE); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GtkWidget *viewport = gtk_viewport_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(new_image())); gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(viewport)); // info panel info_panel = gtk_grid_new(); gtk_widget_set_name(GTK_WIDGET(info_panel), "info_panel"); info_panel_left = gtk_label_new(NULL); gtk_widget_set_hexpand(GTK_WIDGET(info_panel_left), TRUE); gtk_label_set_ellipsize(GTK_LABEL(info_panel_left), PANGO_ELLIPSIZE_END); gtk_label_set_xalign(GTK_LABEL(info_panel_left), 0.0f); gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_left), 0, 0, 1, 1); info_panel_right = gtk_label_new(NULL); gtk_grid_attach(GTK_GRID(info_panel), GTK_WIDGET(info_panel_right), 1, 0, 1, 1); gtk_widget_set_valign(GTK_WIDGET(info_panel), GTK_ALIGN_END); gtk_widget_set_name(GTK_WIDGET(info_panel_left), "info-panel"); gtk_widget_set_name(GTK_WIDGET(info_panel_right), "info-panel"); // overlay GtkWidget *overlay = gtk_overlay_new(); gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(scrolled_window)); gtk_overlay_add_overlay(GTK_OVERLAY(overlay), GTK_WIDGET(info_panel)); gtk_overlay_set_overlay_pass_through(GTK_OVERLAY(overlay), GTK_WIDGET(info_panel), TRUE); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(overlay)); gtk_widget_show_all(GTK_WIDGET(window)); if (!options->show_info) { gtk_widget_hide(GTK_WIDGET(info_panel)); } load_css(); } 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, int width, int height) { gtk_window_set_title(GTK_WINDOW(window), title); // TODO use malloc char file[100], count[100]; sprintf(file, "%s - %dx%d", title, width, height); sprintf(count, "%d/%d", get_current_file_index() + 1, get_total_file_count()); gtk_label_set_text(GTK_LABEL(info_panel_left), file); gtk_label_set_text(GTK_LABEL(info_panel_right), count); } void get_curr_win_size(gint *width, gint *height) { gtk_window_get_size(GTK_WINDOW(window), width, height); } void quit() { clean(); gtk_main_quit(); } void toggle_fullscreen() { if (is_fullscreen) { gtk_window_unfullscreen(GTK_WINDOW(window)); is_fullscreen = 0; } else { gtk_window_fullscreen(GTK_WINDOW(window)); is_fullscreen = 1; } } void toggle_infopanel() { if (show_info) { gtk_widget_hide(GTK_WIDGET(info_panel)); show_info = 0; } else { gtk_widget_show(GTK_WIDGET(info_panel)); show_info = 1; } }