]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Fix memory leaks.
[evince.git] / shell / ev-window.c
index 02422e231538ba3474865e42fc64063b4f46dbc8..ad80f752a9a20072d58ba8c47ec7a1ee5fb50751 100644 (file)
@@ -605,6 +605,7 @@ setup_document_from_metadata (EvWindow *window)
                new_page = CLAMP (g_value_get_int (&page), 0, ev_page_cache_get_n_pages (window->priv->page_cache) - 1);
                ev_page_cache_set_current_page (window->priv->page_cache,
                                                new_page);
+               g_value_unset (&page);
        }
 }
 
@@ -617,6 +618,7 @@ setup_chrome_from_metadata (EvWindow *window)
        if (ev_metadata_manager_get (NULL, "show_toolbar", &show_toolbar, FALSE)) {
                if (!g_value_get_boolean (&show_toolbar))
                        chrome &= ~EV_CHROME_TOOLBAR;
+               g_value_unset (&show_toolbar);
        }
        window->priv->chrome = chrome;
 }
@@ -636,11 +638,12 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
        if (ev_metadata_manager_get (uri, "sidebar_size", &sidebar_size, FALSE)) {
                gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
                                        g_value_get_int (&sidebar_size));
+               g_value_unset(&sidebar_size);
        }
        
        if (document && ev_metadata_manager_get (uri, "sidebar_page", &sidebar_page, FALSE)) {
                const char *page_id = g_value_get_string (&sidebar_page);
-
+               
                if (strcmp (page_id, LINKS_SIDEBAR_ID) == 0 && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
                        ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
                } else if (strcmp (page_id, THUMBNAILS_SIDEBAR_ID) && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (thumbs), document)) {
@@ -648,12 +651,14 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
                } else if (strcmp (page_id, ATTACHMENTS_SIDEBAR_ID) && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (attachments), document)) {
                        ev_sidebar_set_page (EV_SIDEBAR (sidebar), thumbs);
                }
+               g_value_unset (&sidebar_page);
        } else if (document && ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
                ev_sidebar_set_page (EV_SIDEBAR (sidebar), links);
        }
 
        if (ev_metadata_manager_get (uri, "sidebar_visibility", &sidebar_visibility, FALSE)) {
                update_chrome_flag (window, EV_CHROME_SIDEBAR, g_value_get_boolean (&sidebar_visibility));
+               g_value_unset (&sidebar_visibility);
        }
 }
 
@@ -686,6 +691,7 @@ setup_view_from_metadata (EvWindow *window)
                } else {
                        gtk_window_unmaximize (GTK_WINDOW (window));
                }
+               g_value_unset (&maximized);
        }
 
        if (restore_size &&
@@ -694,12 +700,16 @@ setup_view_from_metadata (EvWindow *window)
                gtk_window_resize (GTK_WINDOW (window),
                                   g_value_get_int (&width),
                                   g_value_get_int (&height));
+               g_value_unset (&width);
+               g_value_unset (&height);                
        }
        if (restore_size &&
            ev_metadata_manager_get (uri, "window_x", &x, TRUE) &&
            ev_metadata_manager_get (uri, "window_y", &y, TRUE)) {
                gtk_window_move (GTK_WINDOW (window), g_value_get_int (&x),
                                 g_value_get_int (&y));
+               g_value_unset (&x);
+               g_value_unset (&y);
        }
 
        /* Sizing mode */
@@ -714,16 +724,19 @@ setup_view_from_metadata (EvWindow *window)
        if (ev_metadata_manager_get (uri, "zoom", &zoom, FALSE) &&
            ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
                ev_view_set_zoom (view, g_value_get_double (&zoom), FALSE);
+               g_value_unset (&zoom);
        }
 
        /* Continuous */
        if (ev_metadata_manager_get (uri, "continuous", &continuous, FALSE)) {
                ev_view_set_continuous (view, g_value_get_boolean (&continuous));
+               g_value_unset (&continuous);
        }
 
        /* Dual page */
        if (ev_metadata_manager_get (uri, "dual-page", &dual_page, FALSE)) {
                ev_view_set_dual_page (view, g_value_get_boolean (&dual_page));
+               g_value_unset (&dual_page);
        }
 
        /* Presentation */
@@ -731,6 +744,7 @@ setup_view_from_metadata (EvWindow *window)
                if (g_value_get_boolean (&presentation) && uri) {
                        ev_window_run_presentation (window);
                }
+               g_value_unset (&presentation);
        }
 
        /* Fullscreen */
@@ -738,6 +752,7 @@ setup_view_from_metadata (EvWindow *window)
                if (g_value_get_boolean (&fullscreen) && uri) {
                        ev_window_run_fullscreen (window);
                }
+               g_value_unset (&fullscreen);
        }
 
        /* Rotation */
@@ -757,6 +772,7 @@ setup_view_from_metadata (EvWindow *window)
                                        break;
                        }
                }
+               g_value_unset (&rotation);
        }
 }
 
@@ -1285,8 +1301,9 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                                    gint       response,
                                    EvWindow  *window)
 {
-       EvBackend document_type;
-       gboolean  export_to_ps = TRUE;
+       EvBackend     document_type;
+       gboolean      export_to_ps = TRUE;
+       GtkPrintPages print_pages;
        
        if (response != GTK_RESPONSE_OK) {
                gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -1310,16 +1327,27 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dialog)));
 
        document_type = ev_document_factory_get_backend (window->priv->document);
-       switch (document_type) {
-               case EV_BACKEND_PDF:
-                       export_to_ps = !gtk_printer_accepts_pdf (window->priv->printer);
-                       break;
-               case EV_BACKEND_PS:
-                       export_to_ps = FALSE;
-                       break;
-               default:
-                       export_to_ps = TRUE;
-                       break;
+       print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings);
+       
+       if (print_pages == GTK_PRINT_PAGES_ALL) {
+               switch (document_type) {
+                       case EV_BACKEND_PDF:
+                               /* Export to ps when printing to file */
+                               if (gtk_print_settings_has_key (window->priv->print_settings,
+                                                               GTK_PRINT_SETTINGS_OUTPUT_URI)) {
+                                       export_to_ps = TRUE;
+                               } else {
+                                       export_to_ps = !gtk_printer_accepts_pdf (window->priv->printer);
+                               }
+
+                               break;
+                       case EV_BACKEND_PS:
+                               export_to_ps = FALSE;
+                               break;
+                       default:
+                               export_to_ps = TRUE;
+                               break;
+               }
        }
 
        if ((export_to_ps || document_type == EV_BACKEND_PS) &&
@@ -1339,21 +1367,52 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        }
 
        if (export_to_ps) {
-               EvPageCache *page_cache;
-               gint         width;
-               gint         height;
+               EvPrintRange *ranges = NULL;
+               EvPageCache  *page_cache;
+               gint          n_ranges = 0;
+               gint          current_page;
+               gint          width;
+               gint          height;
 
                ev_window_clear_print_job (window);
 
+               current_page =
+                       gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog));
+
+               switch (print_pages) {
+                       case GTK_PRINT_PAGES_CURRENT:
+                               ranges = g_new0 (EvPrintRange, 1);
+
+                               ranges->start = current_page;
+                               ranges->end = current_page;
+                               n_ranges = 1;
+                               
+                               break;
+                       case GTK_PRINT_PAGES_RANGES: {
+                               GtkPageRange *page_range;
+
+                               page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings,
+                                                                                &n_ranges);
+                               if (n_ranges > 0)
+                                       ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange));
+                       }
+                               break;
+                       default:
+                               break;
+               }
+                               
                page_cache = ev_page_cache_get (window->priv->document);
                ev_page_cache_get_size (page_cache,
-                                       ev_page_cache_get_current_page (page_cache),
-                                       0, 1.0, &width, &height);
+                                       current_page,
+                                       0, 1.0,
+                                       &width, &height);
        
                window->priv->print_job =
                        ev_job_print_new (window->priv->document,
+                                         ranges, n_ranges,
                                          (gdouble)width,
                                          (gdouble)height);
+               
                g_signal_connect (window->priv->print_job, "finished",
                                  G_CALLBACK (ev_window_print_job_cb),
                                  window);
@@ -1393,15 +1452,15 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
        current_page = ev_page_cache_get_current_page (page_cache);
        document_last_page = ev_page_cache_get_n_pages (page_cache);
 
-       
        if (!ev_window->priv->print_settings)
                ev_window->priv->print_settings = gtk_print_settings_new ();
 
-       if (first_page != 1 && last_page != document_last_page) {
+       if (first_page != 1 || last_page != document_last_page) {
                GtkPageRange range;
 
-               range.start = first_page;
-               range.end = last_page;
+               /* Ranges in GtkPrint are 0 - N */
+               range.start = first_page - 1;
+               range.end = last_page - 1;
                
                gtk_print_settings_set_print_pages (ev_window->priv->print_settings,
                                                    GTK_PRINT_PAGES_RANGES);
@@ -1411,6 +1470,13 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
 
        dialog = gtk_print_unix_dialog_new (_("Print"), GTK_WINDOW (ev_window));
        ev_window->priv->print_dialog = dialog;
+       gtk_print_unix_dialog_set_manual_capabilities (GTK_PRINT_UNIX_DIALOG (dialog),
+                                                      GTK_PRINT_CAPABILITY_PAGE_SET |
+                                                      GTK_PRINT_CAPABILITY_COPIES |
+                                                      GTK_PRINT_CAPABILITY_COLLATE |
+                                                      GTK_PRINT_CAPABILITY_REVERSE |
+                                                      GTK_PRINT_CAPABILITY_SCALE |
+                                                      GTK_PRINT_CAPABILITY_GENERATE_PS);
        gtk_print_unix_dialog_set_current_page (GTK_PRINT_UNIX_DIALOG (dialog),
                                                current_page);
        
@@ -3591,7 +3657,9 @@ do_action_named (EvWindow *window, EvLinkAction *action)
        } else if (g_ascii_strcasecmp (name, "Find") == 0) {
                ev_window_cmd_edit_find (NULL, window);
        } else {
-               g_warning ("Unimplemented named action: %s, please post a bug report with a testcase.",
+               g_warning ("Unimplemented named action: %s, please post a "
+                          "bug report in Evince bugzilla "
+                          "(http://bugzilla.gnome.org) with a testcase.",
                           name);
        }
 }