Code

tpdfview: Added simple presentation mode.
[tpdfview.git] / src / tpdfview.c
index b15bad3a078d0b87aa93e9dee03b034508106aaf..4d0cec8d09f56ded20459f926c7fd58821725195 100644 (file)
@@ -37,6 +37,7 @@
 #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)
 {
@@ -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,13 +206,15 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data)
 int
 main(int argc, char **argv)
 {
-       gtk_tpdfv_screens_t *screens;
+       GtkWidget *win;
+       GtkWidget *tpdfv;
 
-       GtkWidget *win   = NULL;
-       GtkWidget *tpdfv = NULL;
+       GObject *ctl;
 
        char win_title[1024];
 
+       _Bool presentation_mode = 0;
+
        GdkColor bg_color;
 
        char *filename;
@@ -202,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;
@@ -244,13 +268,72 @@ main(int argc, char **argv)
 
        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);