diff --git a/src/tpdfview.c b/src/tpdfview.c
index 0d3755958a800a9bb511ccacde5ef3e02678a2e2..fe56ad9174723955dc2e913d1044b0b29ccab82d 100644 (file)
--- a/src/tpdfview.c
+++ b/src/tpdfview.c
#include "tpdfv_features.h"
#include "gtk-tpdfv.h"
+#include "tpdfv-ctl.h"
#if HAVE_LIBGEN_H
# include <libgen.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+/*
+ * Global variables.
+ */
+static gtk_tpdfv_screens_t *screens = NULL;
+
static void
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"
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)
} /* 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:
break;
case GDK_r:
- gtk_tpdfv_reload(tpdfv);
+ 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;
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;
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 */