X-Git-Url: https://git.tokkee.org/?p=tpdfview.git;a=blobdiff_plain;f=src%2Ftpdfview.c;h=4d0cec8d09f56ded20459f926c7fd58821725195;hp=b98332d178032382ac7bfb9fccf30ab9cb474073;hb=d8a86984612f6d7c35ddc2f106ef2cd1589e4989;hpb=c3bb0049acc46995d2166022bdcf6cc3568f20b1 diff --git a/src/tpdfview.c b/src/tpdfview.c index b98332d..4d0cec8 100644 --- a/src/tpdfview.c +++ b/src/tpdfview.c @@ -37,6 +37,7 @@ #include "tpdfv_features.h" #include "gtk-tpdfv.h" +#include "tpdfv-ctl.h" #if HAVE_LIBGEN_H # include @@ -56,6 +57,11 @@ #include #include +/* + * Global variables. + */ +static gtk_tpdfv_screens_t *screens = NULL; + static void exit_usage(char *name, int status) { @@ -114,10 +120,10 @@ on_destroy(GtkWidget __attribute__((unused)) *widget, static gboolean key_press(GtkWidget *window, GdkEventKey *event, gpointer data) { - GtkWidget *tpdfv; + GObject *obj; - tpdfv = (GtkWidget *)data; - assert(tpdfv); + obj = G_OBJECT(data); + assert(obj); switch (event->keyval) { case GDK_q: @@ -125,7 +131,7 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data) break; case GDK_r: - gtk_tpdfv_reload(tpdfv); + tpdfv_ctl_reload(obj); break; case GDK_F: @@ -134,52 +140,64 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data) /* navigation */ case GDK_Page_Up: - gtk_tpdfv_page_up(tpdfv); + tpdfv_ctl_page_up(obj); break; case GDK_Page_Down: /* fall through */ case GDK_space: - gtk_tpdfv_page_down(tpdfv); + tpdfv_ctl_page_down(obj); break; case GDK_Home: - gtk_tpdfv_first_page(tpdfv); + tpdfv_ctl_first_page(obj); break; case GDK_End: - gtk_tpdfv_last_page(tpdfv); + tpdfv_ctl_last_page(obj); break; /* zoom */ case GDK_plus: - gtk_tpdfv_zoom_in(tpdfv); + tpdfv_ctl_zoom_in(obj); break; case GDK_minus: - gtk_tpdfv_zoom_out(tpdfv); + tpdfv_ctl_zoom_out(obj); break; case GDK_1: - gtk_tpdfv_zoom_1(tpdfv); + tpdfv_ctl_zoom_1(obj); break; case GDK_w: - gtk_tpdfv_zoom_width(tpdfv); + tpdfv_ctl_zoom_width(obj); break; case GDK_h: - gtk_tpdfv_zoom_height(tpdfv); + tpdfv_ctl_zoom_height(obj); break; case GDK_z: - gtk_tpdfv_zoom_fit(tpdfv); + tpdfv_ctl_zoom_fit(obj); break; /* scrolling */ case GDK_Up: - gtk_tpdfv_scroll_up(tpdfv); + tpdfv_ctl_scroll_up(obj); break; case GDK_Down: - gtk_tpdfv_scroll_down(tpdfv); + tpdfv_ctl_scroll_down(obj); break; case GDK_Left: - gtk_tpdfv_scroll_left(tpdfv); + tpdfv_ctl_scroll_left(obj); break; case GDK_Right: - gtk_tpdfv_scroll_right(tpdfv); + tpdfv_ctl_scroll_right(obj); + break; + + /* screen management */ + case GDK_M: + { + gint n_screens = gtk_tpdfv_screens_number(screens); + gint screen = gtk_tpdfv_screens_window_get(screens, + GTK_WINDOW(window)); + + gtk_tpdfv_screens_window_set(screens, + GTK_WINDOW(window), (screen + 1) % n_screens); + } break; } return FALSE; @@ -188,11 +206,15 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data) int main(int argc, char **argv) { - GtkWidget *win = NULL; - GtkWidget *tpdfv = NULL; + GtkWidget *win; + GtkWidget *tpdfv; + + GObject *ctl; char win_title[1024]; + _Bool presentation_mode = 0; + GdkColor bg_color; char *filename; @@ -200,12 +222,16 @@ main(int argc, char **argv) gtk_init(&argc, &argv); while (42) { - int opt = getopt(argc, argv, "hV"); + int opt = getopt(argc, argv, "PhV"); if (-1 == opt) break; switch (opt) { + case 'P': + presentation_mode = 1; + break; + case 'h': exit_usage(argv[0], 0); break; @@ -232,24 +258,89 @@ main(int argc, char **argv) if (! win) return 1; + screens = gtk_tpdfv_screens_init(/* display = */ NULL); + if (! screens) + return 1; + snprintf(win_title, sizeof(win_title), "tpdfview: %s", basename(filename)); gtk_window_set_title(GTK_WINDOW(win), win_title); gtk_container_add(GTK_CONTAINER(win), tpdfv); + ctl = tpdfv_ctl_new(GTK_TPDFV(tpdfv)); + if (! ctl) + return 1; + + /* TODO: use resource file */ + gdk_color_parse("#000000", &bg_color); + + if (presentation_mode) { + GtkWidget *pres_win; + GtkWidget *paned; + GtkWidget *tpdfv1, *tpdfv2; + + tpdfv1 = gtk_tpdfv_new(filename); + if (! tpdfv1) + return 1; + + if (! tpdfv_ctl_add_slave(ctl, GTK_TPDFV(tpdfv1), + /* factor = */ 1, /* offset = */ 0)) + return 1; + + tpdfv2 = gtk_tpdfv_new(filename); + if (! tpdfv2) + return 1; + + if (! tpdfv_ctl_add_slave(ctl, GTK_TPDFV(tpdfv2), + /* factor = */ 1, /* offset = */ 1)) + return 1; + + paned = gtk_hpaned_new(); + if (! paned) + return 1; + + gtk_paned_pack1(GTK_PANED(paned), tpdfv1, TRUE, TRUE); + gtk_paned_pack2(GTK_PANED(paned), tpdfv2, TRUE, TRUE); + + gtk_tpdfv_zoom_fit(tpdfv1); + gtk_tpdfv_zoom_fit(tpdfv2); + + pres_win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + if (! pres_win) + return 1; + + gtk_window_set_title(GTK_WINDOW(pres_win), win_title); + + gtk_container_add(GTK_CONTAINER(pres_win), paned); + + gtk_widget_modify_bg(tpdfv1, GTK_STATE_NORMAL, &bg_color); + gtk_widget_modify_bg(tpdfv2, GTK_STATE_NORMAL, &bg_color); + + g_signal_connect(G_OBJECT(pres_win), "destroy", + G_CALLBACK(on_destroy), NULL); + g_signal_connect(G_OBJECT(pres_win), "key-press-event", + G_CALLBACK(key_press), ctl); + + gtk_widget_modify_bg(pres_win, GTK_STATE_NORMAL, &bg_color); + gtk_widget_modify_bg(tpdfv1, GTK_STATE_NORMAL, &bg_color); + gtk_widget_modify_bg(tpdfv2, GTK_STATE_NORMAL, &bg_color); + + gtk_widget_show_all(pres_win); + } + g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(on_destroy), NULL); g_signal_connect(G_OBJECT(win), "key-press-event", - G_CALLBACK(key_press), tpdfv); + G_CALLBACK(key_press), ctl); - /* TODO: use resource file */ - gdk_color_parse("#000000", &bg_color); gtk_widget_modify_bg(tpdfv, GTK_STATE_NORMAL, &bg_color); gtk_widget_show_all(win); gtk_main(); + + gtk_tpdfv_screens_destroy(screens); return 0; } /* main */