]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Use an specific lock for FontConfig. Hopefully it fixes some crashes
[evince.git] / shell / ev-window.c
index 98d888f41d940726b3724ee64f45fb50d98bc64c..2aaff16108973edb7c8aed0e4c27b455ce5f526b 100644 (file)
@@ -40,7 +40,7 @@
 #include "ev-password.h"
 #include "ev-password-view.h"
 #include "ev-properties-dialog.h"
-#include "ev-ps-exporter.h"
+#include "ev-file-exporter.h"
 #include "ev-document-thumbnails.h"
 #include "ev-document-links.h"
 #include "ev-document-fonts.h"
@@ -91,8 +91,6 @@
 #include <libgnomevfs/gnome-vfs-utils.h>
 #include <gconf/gconf-client.h>
 
-#include "totem-scrsaver.h"
-
 #include <string.h>
 
 typedef enum {
@@ -153,9 +151,6 @@ struct _EvWindowPrivate {
        GtkWidget *fullscreen_popup;
        guint      fullscreen_timeout_id;
 
-       /* Screensaver */
-       TotemScrsaver *screensaver;
-
        /* Popup link */
        GtkWidget *view_popup;
        EvLink    *link;
@@ -270,6 +265,20 @@ static gboolean fullscreen_leave_notify_cb                 (GtkWidget *widget,
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
+static gdouble
+ev_window_get_screen_dpi (EvWindow *ev_window)
+{
+       GdkScreen *screen;
+       gdouble    xdpi, ydpi;
+
+       screen = gtk_window_get_screen (GTK_WINDOW (ev_window));
+
+       xdpi = 25.4 * gdk_screen_get_width (screen) / gdk_screen_get_width_mm (screen);
+       ydpi = 25.4 * gdk_screen_get_height (screen) / gdk_screen_get_height_mm (screen);
+       
+       return (xdpi + ydpi) / 2.0;
+}
+
 static void
 ev_window_set_action_sensitive (EvWindow   *ev_window,
                                const char *name,
@@ -328,7 +337,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
                ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY);
        }
 
-       if (has_document && !EV_IS_PS_EXPORTER(document))
+       if (has_document && !EV_IS_FILE_EXPORTER(document))
                ok_to_print = FALSE;
 
        
@@ -430,6 +439,7 @@ ev_window_update_actions (EvWindow *ev_window)
                                                      ZOOM_CONTROL_ACTION);
 
                real_zoom = ev_view_get_zoom (EV_VIEW (ev_window->priv->view));
+               real_zoom *= 72.0 / ev_window_get_screen_dpi (ev_window);
                zoom = ephy_zoom_get_nearest_zoom_level (real_zoom);
 
                ephy_zoom_action_set_zoom_level (EPHY_ZOOM_ACTION (action), zoom);
@@ -815,7 +825,11 @@ setup_view_from_metadata (EvWindow *window)
        /* Zoom */
        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);
+               gdouble zoom_value;
+
+               zoom_value = g_value_get_double (&zoom);
+               zoom_value *= ev_window_get_screen_dpi (window) / 72.0;
+               ev_view_set_zoom (view, zoom_value, FALSE);
                g_value_unset (&zoom);
        }
 
@@ -1742,6 +1756,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        gdouble        width;
        gdouble        height;
        GtkPrintPages  print_pages;
+       const gchar   *file_format;
        
        if (response != GTK_RESPONSE_OK) {
                gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -1764,6 +1779,9 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        window->priv->print_page_setup = g_object_ref (
                gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dialog)));
 
+       file_format = gtk_print_settings_get (window->priv->print_settings,
+                                             GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT);
+       
        if (!gtk_printer_accepts_ps (window->priv->printer)) {
                GtkWidget *msgdialog;
 
@@ -1825,6 +1843,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        reverse = gtk_print_settings_get_reverse (window->priv->print_settings);
        
        window->priv->print_job = ev_job_print_new (window->priv->document,
+                                                   file_format ? file_format : "ps",
                                                    width, height,
                                                    ranges, n_ranges,
                                                    page_set,
@@ -1846,10 +1865,11 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
 void
 ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
 {
-       GtkWidget   *dialog;
-       EvPageCache *page_cache;
-       gint         current_page;
-       gint         document_last_page;
+       GtkWidget           *dialog;
+       EvPageCache         *page_cache;
+       gint                 current_page;
+       gint                 document_last_page;
+       GtkPrintCapabilities capabilities;
 
        g_return_if_fail (EV_IS_WINDOW (ev_window));
        g_return_if_fail (ev_window->priv->document != NULL);
@@ -1881,13 +1901,22 @@ 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;
+       
+       capabilities = 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;
+       
+       if (EV_IS_FILE_EXPORTER (ev_window->priv->document) &&
+           ev_file_exporter_format_supported (EV_FILE_EXPORTER (ev_window->priv->document),
+                                              EV_FILE_FORMAT_PDF)) {
+               capabilities |= GTK_PRINT_CAPABILITY_GENERATE_PDF;
+       }
+       
        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);
+                                                      capabilities);
 
        gtk_print_unix_dialog_set_current_page (GTK_PRINT_UNIX_DIALOG (dialog),
                                                current_page);
@@ -2057,7 +2086,9 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window)
                                              GTK_WINDOW (ev_window));
        }
 
+       ev_document_fc_mutex_lock ();
        gtk_widget_show (ev_window->priv->properties);
+       ev_document_fc_mutex_unlock ();
 }
                                        
 static void
@@ -2287,9 +2318,11 @@ fullscreen_timeout_cb (EvWindow *window)
 {
        EvView *view = EV_VIEW (window->priv->view);
 
-       if (!view || !ev_view_get_fullscreen (EV_VIEW (view)))
+       if (!view ||
+           (!ev_view_get_fullscreen (EV_VIEW (view)) &&
+            !ev_view_get_presentation (EV_VIEW (view))))
                return FALSE;
-       
+
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, FALSE);
        ev_view_hide_cursor (EV_VIEW (window->priv->view));
        window->priv->fullscreen_timeout_id = 0;
@@ -2542,8 +2575,8 @@ ev_window_run_presentation (EvWindow *window)
                          window);
        fullscreen_set_timeout (window);
 
-       totem_scrsaver_disable (window->priv->screensaver);
-
+       ev_application_screensaver_disable (EV_APP);
+       
        if (!ev_window_is_empty (window))
                ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE);
 }
@@ -2570,7 +2603,7 @@ ev_window_stop_presentation (EvWindow *window)
                                              window);
        fullscreen_clear_timeout (window);
 
-       totem_scrsaver_enable (window->priv->screensaver);
+       ev_application_screensaver_enable (EV_APP);
 
        if (!ev_window_is_empty (window))
                ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE);
@@ -3013,8 +3046,11 @@ ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
         ev_window_update_actions (ev_window);
 
        if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE && !ev_window_is_empty (ev_window)) {
-               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom",
-                                               ev_view_get_zoom (view));
+               gdouble zoom;
+
+               zoom = ev_view_get_zoom (view);
+               zoom *= 72.0 / ev_window_get_screen_dpi (ev_window);
+               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", zoom);
        }
 }
 
@@ -3109,11 +3145,11 @@ build_comments_string (void)
                        break;
        }
 
-       return g_strdup_printf (_("PostScript and PDF File Viewer.\n"
+       return g_strdup_printf (_("Document Viewer.\n"
                                  "Using poppler %s (%s)"),
                                version, backend_name);
 #else
-       return g_strdup_printf (_("Document Viewer."));
+       return g_strdup_printf (_("Document Viewer"));
 #endif
 }
 
@@ -3447,7 +3483,9 @@ zoom_control_changed_cb (EphyZoomAction *action,
        ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode);
        
        if (mode == EV_SIZING_FREE) {
-               ev_view_set_zoom (EV_VIEW (ev_window->priv->view), zoom, FALSE);
+               ev_view_set_zoom (EV_VIEW (ev_window->priv->view),
+                                 zoom * ev_window_get_screen_dpi (ev_window) / 72.0,
+                                 FALSE);
        }
 }
 
@@ -3666,7 +3704,11 @@ static const GtkActionEntry entries[] = {
         /* Edit menu */
         { "EditCopy", GTK_STOCK_COPY, NULL, "<control>C", NULL,
           G_CALLBACK (ev_window_cmd_edit_copy) },
-       { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL,
+#ifdef HAVE_GTK_RECENT
+       { "EditSelectAll", GTK_STOCK_SELECT_ALL, N_("Select _All"), "<control>A", NULL,
+#else
+       { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL,
+#endif /* HAVE_GTK_RECENT */
          G_CALLBACK (ev_window_cmd_edit_select_all) },
         { "EditFind", GTK_STOCK_FIND, N_("_Find..."), "<control>F",
           N_("Find a word or phrase in the document"),
@@ -3851,7 +3893,7 @@ activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window)
 }
 
 static gboolean
-activate_label_cb (EvPageAction *page_action, char *label, EvWindow *window)
+activate_label_cb (EvPageAction *page_action, const gchar *label, EvWindow *window)
 {
        g_return_val_if_fail (EV_IS_WINDOW (window), FALSE);
 
@@ -4637,10 +4679,6 @@ ev_window_init (EvWindow *ev_window)
                                  G_CALLBACK (drag_data_received_cb),
                                  ev_window);
 
-       /* Screensaver */
-
-       ev_window->priv->screensaver = totem_scrsaver_new ();
-
        /* Set it user interface params */
 
        ev_window_setup_recent (ev_window);