]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Fixed wrong translation.
[evince.git] / shell / ev-window.c
index 9f6f0828ffba403437d6fcc29bc4f0159982c316..d3787180f9bc97e37053a16d11de230e94cc059e 100644 (file)
@@ -211,7 +211,7 @@ struct _EvWindowPrivate {
 #define GCONF_LOCKDOWN_SAVE         "/desktop/gnome/lockdown/disable_save_to_disk"
 #define GCONF_LOCKDOWN_PRINT        "/desktop/gnome/lockdown/disable_printing"
 
-#define PRESENTATION_TIMEOUT 5 * 1000
+#define PRESENTATION_TIMEOUT 5
 
 #define SIDEBAR_DEFAULT_SIZE    132
 #define LINKS_SIDEBAR_ID "links"
@@ -273,20 +273,6 @@ static void        view_handle_link_cb                     (EvView *view,
 
 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,
@@ -457,7 +443,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);
+               real_zoom *= 72.0 / get_screen_dpi (GTK_WINDOW (ev_window));
                zoom = ephy_zoom_get_nearest_zoom_level (real_zoom);
 
                ephy_zoom_action_set_zoom_level (EPHY_ZOOM_ACTION (action), zoom);
@@ -520,7 +506,7 @@ update_chrome_visibility (EvWindow *window)
        fullscreen_toolbar = ((priv->chrome & EV_CHROME_FULLSCREEN_TOOLBAR) != 0 || 
                              (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen;
        findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0;
-       sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !fullscreen_mode;
+       sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !presentation;
        preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR);
 
        set_widget_visibility (priv->menubar, menubar); 
@@ -987,7 +973,7 @@ setup_view_from_metadata (EvWindow *window)
                gdouble zoom_value;
 
                zoom_value = g_value_get_double (&zoom);
-               zoom_value *= ev_window_get_screen_dpi (window) / 72.0;
+               zoom_value *= get_screen_dpi (GTK_WINDOW (window)) / 72.0;
                ev_view_set_zoom (view, zoom_value, FALSE);
                g_value_unset (&zoom);
        }
@@ -1520,6 +1506,8 @@ file_open_dialog_response_cb (GtkWidget *chooser,
                              gint       response_id,
                              EvWindow  *ev_window)
 {
+       gchar *uri;
+
        if (response_id == GTK_RESPONSE_OK) {
                GSList *uris;
 
@@ -1532,8 +1520,10 @@ file_open_dialog_response_cb (GtkWidget *chooser,
                g_slist_foreach (uris, (GFunc)g_free, NULL);    
                g_slist_free (uris);
        }
-       ev_application_set_chooser_uri (EV_APP, 
-                                       gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser)));
+
+       uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
+       ev_application_set_chooser_uri (EV_APP, uri);
+       g_free (uri);
 
        gtk_widget_destroy (chooser);
 }
@@ -2211,6 +2201,7 @@ ev_window_print_send (EvWindow    *window,
                      const gchar *filename)
 {
        GtkPrintSettings *settings;
+       EvFileExporterCapabilities capabilities;
        
        /* Some printers take into account some print settings,
         * and others don't. However we have exported the document
@@ -2219,14 +2210,23 @@ ev_window_print_send (EvWindow    *window,
         * settings set to default values. 
         */
        settings = gtk_print_settings_copy (window->priv->print_settings);
-       gtk_print_settings_set_n_copies (settings, 1);
+       capabilities = ev_file_exporter_get_capabilities (EV_FILE_EXPORTER (window->priv->document));
+
        gtk_print_settings_set_page_ranges (settings, NULL, 0);
-       gtk_print_settings_set_page_set (settings, GTK_PAGE_SET_ALL);
        gtk_print_settings_set_print_pages (settings, GTK_PRINT_PAGES_ALL);
-       gtk_print_settings_set_scale (settings, 1.0);
-       gtk_print_settings_set_collate (settings, FALSE);
-       gtk_print_settings_set_reverse (settings, FALSE);
-
+       if (capabilities & EV_FILE_EXPORTER_CAN_COPIES)
+               gtk_print_settings_set_n_copies (settings, 1);
+       if (capabilities & EV_FILE_EXPORTER_CAN_PAGE_SET)
+               gtk_print_settings_set_page_set (settings, GTK_PAGE_SET_ALL);
+       if (capabilities & EV_FILE_EXPORTER_CAN_SCALE)
+               gtk_print_settings_set_scale (settings, 1.0);
+       if (capabilities & EV_FILE_EXPORTER_CAN_COLLATE)
+               gtk_print_settings_set_collate (settings, FALSE);
+       if (capabilities & EV_FILE_EXPORTER_CAN_REVERSE)
+               gtk_print_settings_set_reverse (settings, FALSE);
+       if (capabilities & EV_FILE_EXPORTER_CAN_NUMBER_UP)
+               gtk_print_settings_set_number_up (settings, 1);
+       
        if (window->priv->print_preview) {
                gchar *uri;
                gchar *print_settings_file = NULL;
@@ -2300,6 +2300,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        EvPrintPageSet page_set;
        gint           n_ranges = 0;
        gint           copies;
+       gint           pages_per_sheet;
        gboolean       collate;
        gboolean       reverse;
        gdouble        scale;
@@ -2391,6 +2392,8 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                height *= scale;
        }
 
+       pages_per_sheet = gtk_print_settings_get_number_up (window->priv->print_settings);
+       
        copies = gtk_print_settings_get_n_copies (window->priv->print_settings);
        collate = gtk_print_settings_get_collate (window->priv->print_settings);
        reverse = gtk_print_settings_get_reverse (window->priv->print_settings);
@@ -2400,6 +2403,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                                                    width, height,
                                                    ranges, n_ranges,
                                                    page_set,
+                                                   pages_per_sheet,
                                                    copies, collate,
                                                    reverse);
        
@@ -2457,20 +2461,8 @@ 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 |
-               GTK_PRINT_CAPABILITY_PREVIEW;
-       
-       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;
-       }
-       
+       capabilities = GTK_PRINT_CAPABILITY_PREVIEW |
+               ev_file_exporter_get_capabilities (EV_FILE_EXPORTER (ev_window->priv->document));
        gtk_print_unix_dialog_set_manual_capabilities (GTK_PRINT_UNIX_DIALOG (dialog),
                                                       capabilities);
 
@@ -2914,9 +2906,16 @@ presentation_set_timeout (EvWindow *window)
        if (window->priv->presentation_timeout_id > 0) {
                g_source_remove (window->priv->presentation_timeout_id);
        }
-       
+
+#if GLIB_CHECK_VERSION (2, 13, 0)
+       window->priv->presentation_timeout_id =
+               g_timeout_add_seconds (PRESENTATION_TIMEOUT,
+                                      (GSourceFunc)presentation_timeout_cb, window);
+#else
        window->priv->presentation_timeout_id = 
-           g_timeout_add (PRESENTATION_TIMEOUT, (GSourceFunc)presentation_timeout_cb, window);
+           g_timeout_add (PRESENTATION_TIMEOUT * 1000,
+                          (GSourceFunc)presentation_timeout_cb, window);
+#endif 
 
        ev_view_show_cursor (EV_VIEW (window->priv->view));
 }
@@ -3036,7 +3035,7 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window)
 {
        gboolean presentation;
 
-        g_return_if_fail (EV_IS_WINDOW (window));
+       g_return_if_fail (EV_IS_WINDOW (window));
        ev_window_stop_fullscreen (window);
 
        presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
@@ -3095,22 +3094,8 @@ ev_window_screen_changed (GtkWidget *widget,
        if (screen == old_screen)
                return;
 
-#ifdef HAVE_GTK_RECENT
-       if (old_screen) {
-               g_signal_handlers_disconnect_by_func (
-                       gtk_recent_manager_get_for_screen (old_screen),
-                       G_CALLBACK (ev_window_setup_recent), window);
-       }
-
-       priv->recent_manager = gtk_recent_manager_get_for_screen (screen);
-       g_signal_connect_swapped (priv->recent_manager,
-                                 "changed",
-                                 G_CALLBACK (ev_window_setup_recent),
-                                 window);
-#endif
-       
-       ev_view_set_screen_dpi (EV_VIEW (window->priv->view),
-                               ev_window_get_screen_dpi (window));
+       ev_view_set_screen_dpi (EV_VIEW (priv->view),
+                               get_screen_dpi (GTK_WINDOW (window)));
        
        if (GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed) {
                GTK_WIDGET_CLASS (ev_window_parent_class)->screen_changed (widget, old_screen);
@@ -3358,25 +3343,30 @@ ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window)
 }
 
 #ifdef WITH_GTK_PRINT
+static void ev_window_do_preview_print (EvWindow *window);
+
 static gboolean
-lookup_printer_from_name (GtkPrinter *printer,
-                         EvWindow   *window)
+ev_window_enumerate_printer_cb (GtkPrinter *printer,
+                               EvWindow   *window)
 {
+       EvWindowPrivate *priv = window->priv;
        const gchar *printer_name;
 
-       printer_name = gtk_print_settings_get_printer (window->priv->print_settings);
-       
+       printer_name = gtk_print_settings_get_printer (priv->print_settings);
        if ((printer_name
-            && g_ascii_strcasecmp (printer_name, gtk_printer_get_name (printer)) == 0) ||
+            && strcmp (printer_name, gtk_printer_get_name (printer)) == 0) ||
            (!printer_name && gtk_printer_is_default (printer))) {
-               if (window->priv->printer)
-                       g_object_unref (window->priv->printer);
-               window->priv->printer = g_object_ref (printer);
+               if (priv->printer)
+                       g_object_unref (priv->printer);
+               priv->printer = g_object_ref (printer);
 
-               return TRUE;
+               /* Now that we have the printer, we'll start the print */
+               ev_window_do_preview_print (window);
+
+               return TRUE; /* we're done */
        }
 
-       return FALSE;
+       return FALSE; /* continue the enumeration */
 }
 
 static void
@@ -3402,62 +3392,34 @@ ev_window_preview_print_finished (GtkPrintJob *print_job,
        g_object_unref (print_job);
        gtk_widget_destroy (GTK_WIDGET (window));
 }
-#endif /* WITH_GTK_PRINT */
 
 static void
-ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
+ev_window_do_preview_print (EvWindow *window)
 {
-#ifdef WITH_GTK_PRINT
-       GtkPrintSettings *print_settings = NULL;
+       EvWindowPrivate  *priv = window->priv;
        GtkPageSetup     *page_setup;
        GtkPrintJob      *job;
        gchar            *filename;
        GError           *error = NULL;
-#if GTK_CHECK_VERSION (2, 11, 0)
-       const gchar      *print_settings_file = window->priv->print_settings_file;
 
-       if (print_settings_file) {
-               if (g_file_test (print_settings_file, G_FILE_TEST_IS_REGULAR)) {
-                       GError *error = NULL;
+       g_assert (priv->print_settings != NULL);
+       g_assert (priv->printer != NULL);
 
-                       print_settings = gtk_print_settings_new_from_file (print_settings_file,
-                                                                          &error);
-                       
-                       if (error) {
-                               g_warning (error->message);
-                               g_error_free (error);
-                               print_settings = NULL;
-                       }
-               }
-       }
-#endif /* GTK 2.11.0 */
-       
-       if (!print_settings)
-               print_settings = gtk_print_settings_new ();
-
-       if (window->priv->print_settings)
-               g_object_unref (window->priv->print_settings);
-       window->priv->print_settings = print_settings;
-
-       gtk_enumerate_printers ((GtkPrinterFunc) lookup_printer_from_name,
-                               window, NULL, TRUE);
-       g_assert (GTK_IS_PRINTER (window->priv->printer));
-       
        page_setup = gtk_page_setup_new ();
 
        job = gtk_print_job_new ("evince-print",
-                                window->priv->printer,
-                                window->priv->print_settings,
+                                priv->printer,
+                                priv->print_settings,
                                 page_setup);
 
-       g_object_unref (window->priv->print_settings);
-       window->priv->print_settings = NULL;
-       g_object_unref (window->priv->printer);
-       window->priv->printer = NULL;
+       g_object_unref (priv->print_settings);
+       priv->print_settings = NULL;
+       g_object_unref (priv->printer);
+       priv->printer = NULL;
        g_object_unref (page_setup);
 
-       filename = g_filename_from_uri (window->priv->local_uri ?
-                                       window->priv->local_uri : window->priv->uri,
+       filename = g_filename_from_uri (priv->local_uri ?
+                                       priv->local_uri : priv->uri,
                                        NULL, NULL);
 
        if (gtk_print_job_set_source_file (job, filename, &error)) {
@@ -3472,6 +3434,44 @@ ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
        g_free (filename);
 
        gtk_widget_hide (GTK_WIDGET (window));
+}
+
+#endif /* WITH_GTK_PRINT */
+
+static void
+ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
+{
+#ifdef WITH_GTK_PRINT
+       EvWindowPrivate *priv = window->priv;
+       GtkPrintSettings *print_settings = NULL;
+#if GTK_CHECK_VERSION (2, 11, 0)
+       const gchar      *print_settings_file = priv->print_settings_file;
+
+       if (print_settings_file) {
+               if (g_file_test (print_settings_file, G_FILE_TEST_IS_REGULAR)) {
+                       GError *error = NULL;
+
+                       print_settings = gtk_print_settings_new_from_file (print_settings_file,
+                                                                          &error);
+                       
+                       if (error) {
+                               g_warning (error->message);
+                               g_error_free (error);
+                               print_settings = NULL;
+                       }
+               }
+       }
+#endif /* GTK 2.11.0 */
+       
+       if (!print_settings)
+               print_settings = gtk_print_settings_new ();
+
+       if (priv->print_settings)
+               g_object_unref (priv->print_settings);
+       priv->print_settings = print_settings;
+
+       gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb,
+                               window, NULL, FALSE);
 #endif /* WITH_GTK_PRINT */
 }
 
@@ -3507,38 +3507,6 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window)
        }
 }
 
-static void
-update_view_size (EvView *view, EvWindow *window)
-{
-       int width, height;
-       GtkRequisition vsb_requisition;
-       GtkRequisition hsb_requisition;
-       int scrollbar_spacing;
-
-       /* Calculate the width available for the */
-       width = window->priv->scrolled_window->allocation.width;
-       height = window->priv->scrolled_window->allocation.height;
-
-       if (gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)) == GTK_SHADOW_IN) {
-               width -= 2 * window->priv->view->style->xthickness;
-               height -= 2 * window->priv->view->style->ythickness;
-       }
-
-       gtk_widget_size_request (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)->vscrollbar,
-                                &vsb_requisition);
-       gtk_widget_size_request (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)->hscrollbar,
-                                &hsb_requisition);
-       gtk_widget_style_get (window->priv->scrolled_window,
-                             "scrollbar_spacing", &scrollbar_spacing,
-                             NULL);
-
-       ev_view_set_zoom_for_size (EV_VIEW (window->priv->view),
-                                  MAX (1, width),
-                                  MAX (1, height),
-                                  vsb_requisition.width + scrollbar_spacing,
-                                  hsb_requisition.height + scrollbar_spacing);
-}
-
 static void
 save_sizing_mode (EvWindow *window)
 {
@@ -3566,10 +3534,11 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
 
        scrolled_window = ev_window->priv->scrolled_window;
 
-       g_signal_handlers_disconnect_by_func (ev_window->priv->view, update_view_size, ev_window);
+       g_signal_handlers_disconnect_by_func (ev_window->priv->view, ev_view_update_view_size, scrolled_window);
 
        if (sizing_mode != EV_SIZING_FREE)
-               update_view_size (NULL, ev_window);
+               ev_view_update_view_size (EV_VIEW (ev_window->priv->view),
+                                         GTK_SCROLLED_WINDOW (scrolled_window));
 
        switch (sizing_mode) {
                case EV_SIZING_BEST_FIT:
@@ -3578,8 +3547,8 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                      "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
                                      NULL);
                        g_signal_connect (ev_window->priv->view, "zoom_invalid",
-                                         G_CALLBACK (update_view_size),
-                                         ev_window);
+                                         G_CALLBACK (ev_view_update_view_size),
+                                         scrolled_window);
                        break;
                case EV_SIZING_FIT_WIDTH:
                        g_object_set (G_OBJECT (scrolled_window),
@@ -3587,8 +3556,8 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                      "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
                                      NULL);
                        g_signal_connect (ev_window->priv->view, "zoom_invalid",
-                                         G_CALLBACK (update_view_size),
-                                         ev_window);
+                                         G_CALLBACK (ev_view_update_view_size),
+                                         scrolled_window);
                        break;
                case EV_SIZING_FREE:
                        g_object_set (G_OBJECT (scrolled_window),
@@ -3611,7 +3580,7 @@ ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
                gdouble zoom;
 
                zoom = ev_view_get_zoom (view);
-               zoom *= 72.0 / ev_window_get_screen_dpi (ev_window);
+               zoom *= 72.0 / get_screen_dpi (GTK_WINDOW(ev_window));
                ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", zoom);
        }
 }
@@ -3841,9 +3810,7 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar  *ev_sidebar,
 
        action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar");
 
-       if (!ev_view_get_presentation (view) && 
-           !ev_view_get_fullscreen (view)) {
-
+       if (!ev_view_get_presentation (view)) {
                gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
                                              GTK_WIDGET_VISIBLE (ev_sidebar));
 
@@ -4079,7 +4046,7 @@ zoom_control_changed_cb (EphyZoomAction *action,
        
        if (mode == EV_SIZING_FREE) {
                ev_view_set_zoom (EV_VIEW (ev_window->priv->view),
-                                 zoom * ev_window_get_screen_dpi (ev_window) / 72.0,
+                                 zoom * get_screen_dpi (GTK_WINDOW (ev_window)) / 72.0,
                                  FALSE);
        }
 }
@@ -5211,8 +5178,13 @@ ev_window_init (EvWindow *ev_window)
        }
        
 #ifdef HAVE_GTK_RECENT
+#if GTK_CHECK_VERSION(2,11,4)
+       ev_window->priv->recent_manager = gtk_recent_manager_get_default ();
+#else
+       /* It's fine to just use the one of the default screen here */
        ev_window->priv->recent_manager = gtk_recent_manager_get_for_screen (
-               gtk_widget_get_screen (GTK_WIDGET (ev_window)));
+               gdk_screen_get_default ());
+#endif
        ev_window->priv->recent_action_group = NULL;
        ev_window->priv->recent_ui_id = 0;
        g_signal_connect_swapped (ev_window->priv->recent_manager,
@@ -5309,7 +5281,7 @@ ev_window_init (EvWindow *ev_window)
 
        ev_window->priv->view = ev_view_new ();
        ev_view_set_screen_dpi (EV_VIEW (ev_window->priv->view),
-                               ev_window_get_screen_dpi (ev_window));
+                               get_screen_dpi (GTK_WINDOW (ev_window)));
        ev_window->priv->password_view = ev_password_view_new ();
        g_signal_connect_swapped (ev_window->priv->password_view,
                                  "unlock",