X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftpdfview.c;h=fe56ad9174723955dc2e913d1044b0b29ccab82d;hb=b80324b4d56730e1dc89474f99ce63b41f541612;hp=d46aef030a44a977ebd72a4ed0d5b0f1aa40ca27;hpb=53047b071ba51bbb5974b80599217d041dac5533;p=tpdfview.git diff --git a/src/tpdfview.c b/src/tpdfview.c index d46aef0..fe56ad9 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) { @@ -65,6 +71,8 @@ exit_usage(char *name, int status) "\nA tiny PDF viewer.\n" "\nOptions:\n" +" -P enable presentation mode\n" +"\n" " -h display this help and exit\n" " -V display the version number and copyright\n" @@ -88,6 +96,22 @@ exit_version(void) exit(0); } /* exit_version */ +static void +toggle_fullscreen(GtkWindow *win) +{ + GdkWindowState state; + + if (! gtk_widget_get_realized(GTK_WIDGET(win))) + return; + + state = gdk_window_get_state(GTK_WIDGET(win)->window); + + if (state & GDK_WINDOW_STATE_FULLSCREEN) + gtk_window_unfullscreen(win); + else + gtk_window_fullscreen(win); +} /* toggle_fullscreen */ + static void on_destroy(GtkWidget __attribute__((unused)) *widget, gpointer __attribute__((unused)) data) @@ -96,67 +120,86 @@ on_destroy(GtkWidget __attribute__((unused)) *widget, } /* on_destroy */ static gboolean -key_press(GtkWidget __attribute__((unused)) *widget, - GdkEventKey *event, gpointer data) +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: gtk_main_quit(); break; + case GDK_r: + tpdfv_ctl_reload(obj); + break; + + case GDK_F: + toggle_fullscreen(GTK_WINDOW(window)); + break; + /* 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; @@ -165,20 +208,32 @@ key_press(GtkWidget __attribute__((unused)) *widget, 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; + 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; @@ -195,7 +250,9 @@ main(int argc, char **argv) exit_usage(argv[0], 1); } - tpdfv = gtk_tpdfv_new(argv[optind]); + filename = argv[optind]; + + tpdfv = gtk_tpdfv_new(filename); if (! tpdfv) return 1; @@ -203,20 +260,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 */