]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Use F5 as presentation accell
[evince.git] / shell / ev-window.c
index 8f55f13dd12a08fcbd4a80102fb032d8754f127f..4ac2bb35ab08348e2e8a8dc2a7eda6e0e6a2474f 100644 (file)
 #include "eggfindbar.h"
 #include "egg-recent-view-uimanager.h"
 #include "egg-recent-view.h"
-#include "egg-recent-model.h"
 #include "egg-toolbar-editor.h"
-#include "egg-toolbars-model.h"
 #include "egg-editable-toolbar.h"
+#include "egg-recent-model.h"
+#include "egg-toolbars-model.h"
 #include "ephy-zoom.h"
 #include "ephy-zoom-action.h"
 #include "ev-application.h"
 #include "ev-stock-icons.h"
-#include "ev-file-helpers.h"
 #include "ev-metadata-manager.h"
 
 #include <poppler.h>
@@ -114,13 +113,10 @@ struct _EvWindowPrivate {
        GtkActionGroup *action_group;
        GtkUIManager *ui_manager;
 
-       gchar *toolbar_file;
-       EggToolbarsModel *toolbar_model;
-       
        /* Fullscreen mode */
        GtkWidget *fullscreen_toolbar;
        GtkWidget *fullscreen_popup;
-       GSource *fullscreen_timeout_source;
+       GSource   *fullscreen_timeout_source;
 
        /* Document */
        char *uri;
@@ -139,8 +135,6 @@ struct _EvWindowPrivate {
        EvJob *xfer_job;
        EvJob *load_job;
 
-       /* recent file stuff */
-       EggRecentModel *recent_model;
        EggRecentViewUIManager *recent_view;
 };
 
@@ -347,13 +341,14 @@ update_chrome_visibility (EvWindow *window)
        set_widget_visibility (priv->sidebar, sidebar);
        set_widget_visibility (priv->find_bar, findbar);
        set_widget_visibility (priv->statusbar, statusbar);
-       set_widget_visibility (priv->fullscreen_toolbar, fullscreen_toolbar);
 
        if (priv->fullscreen_popup != NULL) {
                if (fullscreen)
                        show_fullscreen_popup (window);
                else
                        set_widget_visibility (priv->fullscreen_popup, FALSE);
+
+               set_widget_visibility (priv->fullscreen_toolbar, fullscreen_toolbar);
        }
 }
 
@@ -618,6 +613,8 @@ page_changed_cb (EvPageCache *page_cache,
                 EvWindow    *ev_window)
 {
        update_action_sensitivity (ev_window);
+
+       ev_metadata_manager_set_int (ev_window->priv->uri, "page", page);
 }
 
 static void
@@ -631,6 +628,20 @@ update_document_mode (EvWindow *window, EvDocumentMode mode)
        }
 }
 
+static void
+setup_document_from_metadata (EvWindow *window)
+{
+       char *uri = window->priv->uri;
+       GValue page = { 0, };
+
+       /* Page */
+       if (ev_metadata_manager_get (uri, "page", &page)) {
+               ev_page_cache_set_current_page (window->priv->page_cache,
+                                               g_value_get_int (&page));
+       }
+
+}
+
 static void
 ev_window_setup_document (EvWindow *ev_window)
 {
@@ -675,6 +686,8 @@ ev_window_setup_document (EvWindow *ev_window)
                ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties),
                                                   ev_window->priv->document);
        }
+
+       setup_document_from_metadata (ev_window);
 }
 
 static void
@@ -911,22 +924,86 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
        }               
 }
 
-#ifdef ENABLE_METADATA
 static void
-ev_window_setup_from_metadata (EvWindow *window)
+setup_view_from_metadata (EvWindow *window)
 {
+       EvView *view = EV_VIEW (window->priv->view);
        char *uri = window->priv->uri;
+       GEnumValue *enum_value;
        GValue width = { 0, };
        GValue height = { 0, };
+       GValue maximized = { 0, };
+       GValue x = { 0, };
+       GValue y = { 0, };
+       GValue sizing_mode = { 0, };
+       GValue zoom = { 0, };
+       GValue continuous = { 0, };
+       GValue dual_page = { 0, };
+       GValue presentation = { 0, };
+       GValue fullscreen = { 0, };
+
+       /* Window size */
+       if (!GTK_WIDGET_VISIBLE (window)) {
+               gboolean restore_size = TRUE;
+
+               if (ev_metadata_manager_get (uri, "window_maximized", &maximized)) {
+                       if (g_value_get_boolean (&maximized)) {
+                               gtk_window_maximize (GTK_WINDOW (window));
+                               restore_size = FALSE;
+                       }
+               }
+
+               if (restore_size &&
+                   ev_metadata_manager_get (uri, "window_x", &x) &&
+                   ev_metadata_manager_get (uri, "window_y", &y) &&
+                   ev_metadata_manager_get (uri, "window_width", &width) &&
+                   ev_metadata_manager_get (uri, "window_height", &height)) {
+                       gtk_window_set_default_size (GTK_WINDOW (window),
+                                                    g_value_get_int (&width),
+                                                    g_value_get_int (&height));
+                       gtk_window_move (GTK_WINDOW (window), g_value_get_int (&x),
+                                        g_value_get_int (&y));
+               }
+       }
+
+       /* Sizing mode */
+       if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode)) {
+               enum_value = g_enum_get_value_by_nick
+                       (EV_SIZING_MODE_CLASS, g_value_get_string (&sizing_mode));
+               g_value_unset (&sizing_mode);
+               ev_view_set_sizing_mode (view, enum_value->value);
+       }
 
-       ev_metadata_manager_get (uri, "window_width", &width);
-       ev_metadata_manager_get (uri, "window_height", &height);
+       /* Zoom */
+       if (ev_metadata_manager_get (uri, "zoom", &zoom) &&
+           ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
+               ev_view_set_zoom (view, g_value_get_double (&zoom), FALSE);
+       }
+
+       /* Continuous */
+       if (ev_metadata_manager_get (uri, "continuous", &continuous)) {
+               ev_view_set_continuous (view, g_value_get_boolean (&continuous));
+       }
+
+       /* Dual page */
+       if (ev_metadata_manager_get (uri, "dual-page", &dual_page)) {
+               ev_view_set_dual_page (view, g_value_get_boolean (&dual_page));
+       }
+
+       /* Presentation */
+       if (ev_metadata_manager_get (uri, "presentation", &presentation)) {
+               if (g_value_get_boolean (&presentation)) {
+                       ev_window_run_presentation (window);
+               }
+       }
 
-       gtk_window_set_default_size (GTK_WINDOW (window),
-                                    g_value_get_int (&width),
-                                    g_value_get_int (&height));
+       /* Fullscreen */
+       if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen)) {
+               if (g_value_get_boolean (&fullscreen)) {
+                       ev_window_run_fullscreen (window);
+               }
+       }
 }
-#endif
 
 void
 ev_window_open_uri (EvWindow *ev_window, const char *uri)
@@ -937,9 +1014,7 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri)
        g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
 
-#ifdef ENABLE_METADATA
-       ev_window_setup_from_metadata (ev_window);
-#endif
+       setup_view_from_metadata (ev_window);
        
        ev_window_clear_jobs (ev_window);
        ev_window_clear_local_uri (ev_window);
@@ -1027,33 +1102,22 @@ ev_window_add_recent (EvWindow *window, const char *filename)
 
        item = egg_recent_item_new_from_uri (filename);
        egg_recent_item_add_group (item, "Evince");
-       egg_recent_model_add_full (window->priv->recent_model, item);
+       egg_recent_model_add_full (ev_application_get_recent_model (EV_APP), item);
 }
 
 static void
 ev_window_setup_recent (EvWindow *ev_window)
 {
 
-
-
-       /* it would be better if we just filtered by mime-type, but there
-        * doesn't seem to be an easy way to figure out which mime-types we
-        * can handle */
-       ev_window->priv->recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU);
-
        ev_window->priv->recent_view = egg_recent_view_uimanager_new (ev_window->priv->ui_manager,
                                                                      "/MainMenu/FileMenu/RecentFilesMenu",
                                                                      G_CALLBACK (ev_window_cmd_recent_file_activate), 
                                                                      ev_window);       
 
         egg_recent_view_uimanager_show_icons (EGG_RECENT_VIEW_UIMANAGER (ev_window->priv->recent_view), FALSE);
-       egg_recent_model_set_limit (ev_window->priv->recent_model, 5);
 
        egg_recent_view_set_model (EGG_RECENT_VIEW (ev_window->priv->recent_view),
-                                  ev_window->priv->recent_model);
-
-       egg_recent_model_set_filter_groups (ev_window->priv->recent_model,
-                                           "Evince", NULL);
+                                  ev_application_get_recent_model (EV_APP));
 
        egg_recent_view_uimanager_set_trailing_sep (ev_window->priv->recent_view, TRUE);
        
@@ -1599,6 +1663,9 @@ ev_window_create_fullscreen_popup (EvWindow *window)
        GtkWidget *hbox;
        GtkWidget *button;
 
+       window->priv->fullscreen_toolbar = egg_editable_toolbar_new_with_model
+                       (window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP));
+
        popup = gtk_window_new (GTK_WINDOW_POPUP);
        hbox = gtk_hbox_new (FALSE, 0);
        button = ev_window_get_exit_fullscreen_button (window);
@@ -1666,6 +1733,8 @@ ev_window_run_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_fullscreen_popup (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE);
 }
 
 static void
@@ -1692,6 +1761,8 @@ ev_window_stop_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_unfullscreen (GTK_WINDOW (window));
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
 }
 
 static void
@@ -1736,6 +1807,8 @@ ev_window_run_presentation (EvWindow *window)
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE);
 }
 
 static void
@@ -1751,6 +1824,8 @@ ev_window_stop_presentation (EvWindow *window)
        gtk_window_unfullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE);
 }
 
 static void
@@ -1859,8 +1934,7 @@ ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, gint response, gpointer data)
        EvWindow *ev_window = EV_WINDOW (data);
         egg_editable_toolbar_set_edit_mode
                        (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), FALSE);
-        egg_toolbars_model_save (ev_window->priv->toolbar_model,
-                                ev_window->priv->toolbar_file, "1.0");
+       ev_application_save_toolbars_model (EV_APP);
         gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
@@ -1883,33 +1957,34 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
 {
        GtkWidget *dialog;
        GtkWidget *editor;
-       g_return_if_fail (EV_IS_WINDOW (ev_window));
     
-       dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"), GTK_WINDOW (ev_window), 
+       dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"),
+                                             GTK_WINDOW (ev_window), 
                                              GTK_DIALOG_DESTROY_WITH_PARENT, 
                                              GTK_STOCK_CLOSE,
-                                             GTK_RESPONSE_CANCEL
+                                             GTK_RESPONSE_CLOSE
                                              NULL);
+       gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5);
+       gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 18);
        gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
        gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
          
        editor = egg_toolbar_editor_new (ev_window->priv->ui_manager,
-                                        ev_window->priv->toolbar_model);
+                                        ev_application_get_toolbars_model (EV_APP));
        gtk_container_set_border_width (GTK_CONTAINER (editor), 5);
        gtk_box_set_spacing (GTK_BOX (EGG_TOOLBAR_EDITOR (editor)), 5);
-                    
+             
        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), editor);
        egg_toolbar_editor_load_actions (EGG_TOOLBAR_EDITOR (editor),
-                                     DATADIR"/evince-toolbar.xml");
+                                        DATADIR "/evince-toolbar.xml");
 
        egg_editable_toolbar_set_edit_mode
                (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), TRUE);
 
-       gtk_widget_show_all (dialog);
-      
-       g_signal_connect (G_OBJECT (dialog), "response",
+       g_signal_connect (dialog, "response",
                          G_CALLBACK (ev_window_cmd_edit_toolbar_cb),
                          ev_window);
+       gtk_widget_show_all (dialog);
 }
 
 static void
@@ -2093,6 +2168,21 @@ update_view_size (EvView *view, EvWindow *window)
                                   hsb_requisition.height + scrollbar_spacing);
 }
 
+static void
+save_sizing_mode (EvWindow *window)
+{
+       EvSizingMode mode;
+       GEnumValue *enum_value;
+
+       if (window->priv->uri) {
+               mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view));
+               enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode);
+
+               ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
+                                               enum_value->value_nick);
+       }
+}
+
 static void     
 ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                  EvWindow   *ev_window)
@@ -2139,13 +2229,64 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
        }
 
        update_sizing_buttons (ev_window);
+       save_sizing_mode (ev_window);
 }
 
 static void     
-ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec,
-                          EvWindow   *ev_window)
+ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
 {
         update_action_sensitivity (ev_window);
+
+       if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
+               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom",
+                                               ev_view_get_zoom (view));
+       }
+}
+
+static void
+ev_window_update_continuous_action (EvWindow *window)
+{
+       GtkAction *action;
+
+       action = gtk_action_group_get_action (window->priv->action_group, "ViewContinuous");
+       g_signal_handlers_block_by_func
+               (action, G_CALLBACK (ev_window_cmd_continuous), window);
+       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+                                     ev_view_get_continuous (EV_VIEW (window->priv->view)));
+       g_signal_handlers_unblock_by_func
+               (action, G_CALLBACK (ev_window_cmd_continuous), window);
+}
+
+static void
+ev_window_update_dual_page_action (EvWindow *window)
+{
+       GtkAction *action;
+
+       action = gtk_action_group_get_action (window->priv->action_group, "ViewDual");
+       g_signal_handlers_block_by_func
+               (action, G_CALLBACK (ev_window_cmd_dual), window);
+       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
+                                     ev_view_get_dual_page (EV_VIEW (window->priv->view)));
+       g_signal_handlers_unblock_by_func
+               (action, G_CALLBACK (ev_window_cmd_dual), window);
+}
+
+static void     
+ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+{
+       ev_window_update_continuous_action (ev_window);
+
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous",
+                                        ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
+}
+
+static void     
+ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+{
+       ev_window_update_dual_page_action (ev_window);
+
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page",
+                                        ev_view_get_dual_page (EV_VIEW (ev_window->priv->view)));
 }
 
 static char *
@@ -2484,18 +2625,6 @@ ev_window_dispose (GObject *object)
        EvWindow *window = EV_WINDOW (object);
        EvWindowPrivate *priv = window->priv;
 
-       if (priv->toolbar_model) {
-               g_object_unref (priv->toolbar_model);
-               g_free (priv->toolbar_file);
-               priv->toolbar_model = NULL;
-               priv->toolbar_file = NULL;
-       }
-
-       if (priv->recent_model) {
-               g_object_unref (priv->recent_model);
-               priv->recent_model = NULL;
-       }
-
        if (priv->recent_view) {
                g_object_unref (priv->recent_view);
                priv->recent_view = NULL;
@@ -2738,7 +2867,7 @@ static const GtkToggleActionEntry toggle_entries[] = {
         { "ViewFullscreen", NULL, N_("_Fullscreen"), "F11",
           N_("Expand the window to fill the screen"),
           G_CALLBACK (ev_window_cmd_view_fullscreen) },
-        { "ViewPresentation", NULL, N_("_Presentation"), "F12",
+        { "ViewPresentation", NULL, N_("_Presentation"), "F5",
           N_("Run document as a presentation"),
           G_CALLBACK (ev_window_cmd_view_presentation) },
         { "ViewBestFit", EV_STOCK_ZOOM_PAGE, N_("_Best Fit"), NULL,
@@ -2971,19 +3100,23 @@ set_view_actions_sensitivity (EvWindow *window, gboolean sensitive)
        }
 }
 
-static void
+static gboolean
 view_actions_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *window)
 {
        update_chrome_flag (window, EV_CHROME_RAISE_TOOLBAR, NULL, FALSE);
        set_action_sensitive (window, "ViewToolbar", TRUE);
 
        set_view_actions_sensitivity (window, TRUE);
+
+       return FALSE;
 }
 
-static void
+static gboolean
 view_actions_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *window)
 {
        set_view_actions_sensitivity (window, FALSE);
+
+       return FALSE;
 }
 
 static void
@@ -3007,20 +3140,38 @@ sidebar_page_main_widget_update_cb (GObject *ev_sidebar_page,
 }
 
 static gboolean
-window_configure_event_cb (EvWindow *window, gpointer dummy)
+window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer dummy)
 {
-#ifdef ENABLE_METADATA
-       int width, height;
+       char *uri = window->priv->uri;
+
+       if (uri && !(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
+               gboolean maximized;
 
-       if (window->priv->uri == NULL) {
-               return FALSE;
+               maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED;
+               ev_metadata_manager_set_boolean (uri, "window_maximized", maximized);
        }
 
-       gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+       return FALSE;
+}
+
+static gboolean
+window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy)
+{
+       char *uri = window->priv->uri;
+       GdkWindowState state;
+       int x, y, width, height;
+
+       state = gdk_window_get_state (GTK_WIDGET (window)->window);
 
-       ev_metadata_manager_set_int (window->priv->uri, "window_width", width);
-       ev_metadata_manager_set_int (window->priv->uri, "window_height", height);
-#endif
+       if (uri && !(state & GDK_WINDOW_STATE_FULLSCREEN)) {
+               gtk_window_get_position (GTK_WINDOW (window), &x, &y);
+               gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+
+               ev_metadata_manager_set_int (uri, "window_x", x);
+               ev_metadata_manager_set_int (uri, "window_y", y);
+               ev_metadata_manager_set_int (uri, "window_width", width);
+               ev_metadata_manager_set_int (uri, "window_height", height);
+       }
 
        return FALSE;
 }
@@ -3038,6 +3189,8 @@ ev_window_init (EvWindow *ev_window)
 
        g_signal_connect (ev_window, "configure_event",
                          G_CALLBACK (window_configure_event_cb), NULL);
+       g_signal_connect (ev_window, "window_state_event",
+                         G_CALLBACK (window_state_event_cb), NULL);
 
        ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);
 
@@ -3088,23 +3241,6 @@ ev_window_init (EvWindow *ev_window)
                            ev_window->priv->menubar,
                            FALSE, FALSE, 0);
 
-       /* Toolbar editor */
-       ev_window->priv->toolbar_model = egg_toolbars_model_new ();
-       
-       ev_window->priv->toolbar_file = g_build_filename
-                       (ev_dot_dir (), "evince_toolbar.xml", NULL);
-
-       if (!g_file_test (ev_window->priv->toolbar_file, G_FILE_TEST_EXISTS)) {
-               egg_toolbars_model_load (ev_window->priv->toolbar_model,
-                                        DATADIR"/evince-toolbar.xml");
-       } else {
-               egg_toolbars_model_load (ev_window->priv->toolbar_model,
-                                        ev_window->priv->toolbar_file);
-       }
-
-       egg_toolbars_model_set_flags (ev_window->priv->toolbar_model, 0,
-                                     EGG_TB_MODEL_NOT_REMOVABLE); 
-       
        /* This sucks, but there is no way to have a draw=no, expand=true separator
         * in a GtkUIManager-built toolbar. So, just add another toolbar.
         * See gtk+ bug 166489.
@@ -3115,18 +3251,13 @@ ev_window_init (EvWindow *ev_window)
        gtk_widget_show (toolbar_dock);
 
        ev_window->priv->toolbar = egg_editable_toolbar_new_with_model
-                               (ev_window->priv->ui_manager, ev_window->priv->toolbar_model);
+                               (ev_window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP));
        egg_editable_toolbar_show (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar),
                                   "DefaultToolBar");
        gtk_box_pack_start (GTK_BOX (toolbar_dock), ev_window->priv->toolbar,
                            TRUE, TRUE, 0);
        gtk_widget_show (ev_window->priv->toolbar);
 
-       ev_window->priv->fullscreen_toolbar =
-               gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/LeaveFullscreenToolbar");
-       gtk_toolbar_set_show_arrow (GTK_TOOLBAR (ev_window->priv->fullscreen_toolbar), TRUE);
-       
-
        /* Add the main area */
        ev_window->priv->hpaned = gtk_hpaned_new ();
        g_signal_connect (ev_window->priv->hpaned,
@@ -3226,6 +3357,14 @@ ev_window_init (EvWindow *ev_window)
                          "notify::zoom",
                          G_CALLBACK (ev_window_zoom_changed_cb),
                          ev_window);
+       g_signal_connect (ev_window->priv->view,
+                         "notify::dual-page",
+                         G_CALLBACK (ev_window_dual_mode_changed_cb),
+                         ev_window);
+       g_signal_connect (ev_window->priv->view,
+                         "notify::continuous",
+                         G_CALLBACK (ev_window_continuous_changed_cb),
+                         ev_window);
 
        ev_window->priv->statusbar = ev_statusbar_new ();
        gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),
@@ -3304,5 +3443,3 @@ ev_window_new (void)
 
        return ev_window;
 }
-
-