]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
*** empty log message ***
[evince.git] / shell / ev-window.c
index c61515be7e381a0a592744786fbaa6978d7c1e43..a487c88b7fd63d7bf8c03bc7022e88cd3a6329a5 100644 (file)
@@ -190,7 +190,7 @@ static void     ev_window_stop_presentation             (EvWindow         *windo
 static void     ev_window_cmd_view_presentation         (GtkAction        *action,
                                                         EvWindow         *window);
 static void     show_fullscreen_popup                   (EvWindow         *window);
-                                                       
+
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
@@ -618,6 +618,10 @@ page_changed_cb (EvPageCache *page_cache,
                 EvWindow    *ev_window)
 {
        update_action_sensitivity (ev_window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_int (ev_window->priv->uri, "page", page);
+#endif
 }
 
 static void
@@ -631,6 +635,22 @@ update_document_mode (EvWindow *window, EvDocumentMode mode)
        }
 }
 
+#ifdef ENABLE_METADATA
+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));
+       }
+
+}
+#endif
+
 static void
 ev_window_setup_document (EvWindow *ev_window)
 {
@@ -675,6 +695,10 @@ ev_window_setup_document (EvWindow *ev_window)
                ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties),
                                                   ev_window->priv->document);
        }
+
+#ifdef ENABLE_METADATA
+       setup_document_from_metadata (ev_window);
+#endif
 }
 
 static void
@@ -913,18 +937,84 @@ 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));
+               }
+       }
 
-       ev_metadata_manager_get (uri, "window_width", &width);
-       ev_metadata_manager_get (uri, "window_height", &height);
+       /* 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);
+       }
+
+       /* 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));
+       }
 
-       gtk_window_set_default_size (GTK_WINDOW (window),
-                                    g_value_get_int (&width),
-                                    g_value_get_int (&height));
+       /* Presentation */
+       if (ev_metadata_manager_get (uri, "presentation", &presentation)) {
+               if (g_value_get_boolean (&presentation)) {
+                       ev_window_run_presentation (window);
+               }
+       }
+
+       /* Fullscreen */
+       if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen)) {
+               if (g_value_get_boolean (&fullscreen)) {
+                       ev_window_run_fullscreen (window);
+               }
+       }
 }
 #endif
 
@@ -938,7 +1028,7 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri)
        ev_window->priv->uri = g_strdup (uri);
 
 #ifdef ENABLE_METADATA
-       ev_window_setup_from_metadata (ev_window);
+       setup_view_from_metadata (ev_window);
 #endif
        
        ev_window_clear_jobs (ev_window);
@@ -1015,7 +1105,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action,
 
        uri = egg_recent_item_get_uri (item);
 
-       ev_application_open_uri (EV_APP, uri, NULL);    
+       ev_application_open_uri (EV_APP, uri, NULL, NULL);      
        
        g_free (uri);
 }
@@ -1651,7 +1741,7 @@ ev_window_run_fullscreen (EvWindow *window)
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
-
+       
        g_signal_connect (window->priv->view,
                          "motion-notify-event",
                          G_CALLBACK (fullscreen_motion_notify_cb),
@@ -1666,6 +1756,10 @@ ev_window_run_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_fullscreen_popup (window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE);
+#endif
 }
 
 static void
@@ -1692,6 +1786,10 @@ ev_window_stop_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        gtk_window_unfullscreen (GTK_WINDOW (window));
        update_chrome_visibility (window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
+#endif
 }
 
 static void
@@ -1736,6 +1834,10 @@ ev_window_run_presentation (EvWindow *window)
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE);
+#endif
 }
 
 static void
@@ -1751,6 +1853,10 @@ ev_window_stop_presentation (EvWindow *window)
        gtk_window_unfullscreen (GTK_WINDOW (window));
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE);
+#endif
 }
 
 static void
@@ -2093,6 +2199,23 @@ update_view_size (EvView *view, EvWindow *window)
                                   hsb_requisition.height + scrollbar_spacing);
 }
 
+static void
+save_sizing_mode (EvWindow *window)
+{
+#ifdef ENABLE_METADATA
+       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);
+       }
+#endif
+}
+
 static void     
 ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                  EvWindow   *ev_window)
@@ -2139,13 +2262,70 @@ 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);
+
+#ifdef ENABLE_METADATA
+       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));
+       }
+#endif
+}
+
+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);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous",
+                                        ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
+#endif
+}
+
+static void     
+ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
+{
+       ev_window_update_dual_page_action (ev_window);
+
+#ifdef ENABLE_METADATA
+       ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page",
+                                        ev_view_get_dual_page (EV_VIEW (ev_window->priv->view)));
+#endif
 }
 
 static char *
@@ -2501,7 +2681,6 @@ ev_window_dispose (GObject *object)
                priv->recent_view = NULL;
        }
 
-
        if (priv->ui_manager) {
                g_object_unref (priv->ui_manager);
                priv->ui_manager = NULL;
@@ -3008,19 +3187,41 @@ 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);
        }
+#endif
 
-       gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+       return FALSE;
+}
 
-       ev_metadata_manager_set_int (window->priv->uri, "window_width", width);
-       ev_metadata_manager_set_int (window->priv->uri, "window_height", height);
+static gboolean
+window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy)
+{
+#ifdef ENABLE_METADATA
+       char *uri = window->priv->uri;
+       GdkWindowState state;
+       int x, y, width, height;
+
+       state = gdk_window_get_state (GTK_WIDGET (window)->window);
+
+       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);
+       }
 #endif
 
        return FALSE;
@@ -3039,6 +3240,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);
 
@@ -3227,6 +3430,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),
@@ -3305,5 +3516,3 @@ ev_window_new (void)
 
        return ev_window;
 }
-
-