]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
[shell] Remove left over GtkPrinter
[evince.git] / shell / ev-window.c
index 909272bbd25fa4b697d04a1031abf7985cd3efc4..ded233d856375bc2e94316863e5088643f44bd68 100644 (file)
 #include <glib/gi18n.h>
 #include <gio/gio.h>
 #include <gtk/gtk.h>
-#if GTK_CHECK_VERSION (2, 14, 0)
-#include <gtk/gtkunixprint.h>
-#else
-#include <gtk/gtkprintunixdialog.h>
-#endif
+
 #ifdef WITH_GCONF
 #include <gconf/gconf-client.h>
 #endif
@@ -73,7 +69,6 @@
 #include "ev-jobs.h"
 #include "ev-message-area.h"
 #include "ev-metadata-manager.h"
-#include "ev-mount-operation.h"
 #include "ev-navigation-action.h"
 #include "ev-open-recent-action.h"
 #include "ev-page-action.h"
@@ -203,7 +198,6 @@ struct _EvWindowPrivate {
 
        /* Printing */
        GQueue           *print_queue;
-       GtkPrinter       *printer;
        GtkPrintSettings *print_settings;
        GtkPageSetup     *print_page_setup;
        gboolean          close_after_print;
@@ -388,7 +382,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        /* File menu */
        ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document);
        ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
-       ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print);
+       ev_window_set_action_sensitive (ev_window, "FilePageSetup", has_pages && ok_to_print);
        ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print);
        ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties);
 
@@ -440,6 +434,8 @@ ev_window_update_actions (EvWindow *ev_window)
                                        has_pages && can_find_in_page);
        ev_window_set_action_sensitive (ev_window, "EditFindPrevious",
                                        has_pages && can_find_in_page);
+        ev_window_set_action_sensitive (ev_window, "F3",
+                                        has_pages && can_find_in_page);
 
        presentation_mode = ev_view_get_presentation (view);
        
@@ -994,10 +990,12 @@ setup_document_from_metadata (EvWindow *window)
                        request_width = MIN (request_width, gdk_screen_get_width (screen));
                        request_height = MIN (request_width, gdk_screen_get_height (screen));
                }
-                               
-               gtk_window_resize (GTK_WINDOW (window),
-                                  request_width,
-                                  request_height);
+               
+               if (request_width > 0 && request_height > 0) {
+                       gtk_window_resize (GTK_WINDOW (window),
+                                          request_width,
+                                          request_height);
+               }
                g_value_unset (&width_ratio);
                g_value_unset (&height_ratio);
        }
@@ -1159,7 +1157,8 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation)
        EvDocument *document = ev_window->priv->document;
        
        if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
-           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
+           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0 ||
+           ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
                return;
        }
        
@@ -1246,15 +1245,19 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
                ev_window->priv->dest = NULL;
        }
 
-       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
-               ev_view_set_document (view, document);
-       } else {
+       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
                ev_window_warning_message (ev_window, "%s",
                                           _("The document contains no pages"));
+       } else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
+               ev_window_warning_message (ev_window, "%s",
+                                          _("The document contains only empty pages"));
+       } else {
+               ev_view_set_document (view, document);
        }
 
        if (ev_window->priv->setup_document_idle > 0)
                g_source_remove (ev_window->priv->setup_document_idle);
+
        ev_window->priv->setup_document_idle = g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window);
 }
 
@@ -1588,12 +1591,15 @@ show_loading_progress (EvWindow *ev_window)
 {
        GtkWidget *area;
        gchar     *text;
+       gchar     *display_name;
        
        if (ev_window->priv->message_area)
                return FALSE;
-       
-       text = g_strdup_printf (_("Loading document from %s"),
-                               ev_window->priv->uri);
+
+       display_name = escape_uri_for_display (ev_window->priv->uri);
+       text = g_strdup_printf (_("Loading document from “%s”"),
+                               display_name);
+
        area = ev_progress_message_area_new (GTK_STOCK_OPEN,
                                             text,
                                             GTK_STOCK_CLOSE,
@@ -1606,7 +1612,9 @@ show_loading_progress (EvWindow *ev_window)
                          ev_window);
        gtk_widget_show (area);
        ev_window_set_message_area (ev_window, area);
+
        g_free (text);
+       g_free (display_name);
 
        return FALSE;
 }
@@ -1692,7 +1700,7 @@ window_open_file_copy_ready_cb (GFile        *source,
        if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) {
                GMountOperation *operation;
 
-               operation = ev_mount_operation_new (GTK_WINDOW (ev_window));
+               operation = gtk_mount_operation_new (GTK_WINDOW (ev_window));
                g_file_mount_enclosing_volume (source,
                                               G_MOUNT_MOUNT_NONE,
                                               operation, NULL,
@@ -2011,24 +2019,25 @@ file_open_dialog_response_cb (GtkWidget *chooser,
                              gint       response_id,
                              EvWindow  *ev_window)
 {
-       gchar *uri;
-
        if (response_id == GTK_RESPONSE_OK) {
                GSList *uris;
+               gchar  *uri;
 
                uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
 
                ev_application_open_uri_list (EV_APP, uris,
                                              gtk_window_get_screen (GTK_WINDOW (ev_window)),
                                              GDK_CURRENT_TIME);
-       
-               g_slist_foreach (uris, (GFunc)g_free, NULL);    
+
+               g_slist_foreach (uris, (GFunc)g_free, NULL);
                g_slist_free (uris);
-       }
 
-       uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
-       ev_application_set_chooser_uri (EV_APP, uri);
-       g_free (uri);
+               uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser));
+               ev_application_set_filechooser_uri (EV_APP,
+                                                   GTK_FILE_CHOOSER_ACTION_OPEN,
+                                                   uri);
+               g_free (uri);
+       }
 
        gtk_widget_destroy (chooser);
 }
@@ -2036,7 +2045,9 @@ file_open_dialog_response_cb (GtkWidget *chooser,
 static void
 ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
 {
-       GtkWidget *chooser;
+       GtkWidget   *chooser;
+       const gchar *default_uri;
+       gchar       *parent_uri = NULL;
 
        chooser = gtk_file_chooser_dialog_new (_("Open Document"),
                                               GTK_WINDOW (window),
@@ -2049,12 +2060,23 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
        ev_document_factory_add_filters (chooser, NULL);
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
-       if (ev_application_get_chooser_uri (EV_APP) != NULL) {
-               gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
-                                         ev_application_get_chooser_uri (EV_APP));
-       } else if (window->priv->uri != NULL) {
-               gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
-                                         window->priv->uri);
+
+       default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_OPEN);
+       if (!default_uri && window->priv->uri) {
+               GFile *file, *parent;
+
+               file = g_file_new_for_uri (window->priv->uri);
+               parent = g_file_get_parent (file);
+               if (parent) {
+                       parent_uri = g_file_get_uri (parent);
+                       default_uri = parent_uri;
+                       g_object_unref (parent);
+               }
+               g_object_unref (file);
+       }
+
+       if (default_uri) {
+               gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (chooser), default_uri);
        } else {
                const gchar *folder;
 
@@ -2062,7 +2084,8 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
                gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
                                                     folder ? folder : g_get_home_dir ());
        }
-       
+       g_free (parent_uri);
+
        g_signal_connect (chooser, "response",
                          G_CALLBACK (file_open_dialog_response_cb),
                          window);
@@ -2073,10 +2096,11 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
 static gchar *
 ev_window_create_tmp_symlink (const gchar *filename, GError **error)
 {
-       gchar *tmp_filename = NULL;
-       gchar *name;
-       gint   res;
-       guint  i = 0;
+       gchar  *tmp_filename = NULL;
+       gchar  *name;
+       guint   i = 0;
+       GError *link_error = NULL;
+       GFile  *tmp_file = NULL;
 
        name = g_path_get_basename (filename);
        
@@ -2085,29 +2109,32 @@ ev_window_create_tmp_symlink (const gchar *filename, GError **error)
 
                if (tmp_filename)
                        g_free (tmp_filename);
+               if (tmp_file)
+                       g_object_unref (tmp_file);
+               g_clear_error (&link_error);
 
                basename = g_strdup_printf ("%s-%d", name, i++);
                tmp_filename = g_build_filename (ev_tmp_dir (),
                                                 basename, NULL);
                
                g_free (basename);
-       } while ((res = symlink (filename, tmp_filename)) != 0 && errno == EEXIST);
-
-       g_free (name);
+               tmp_file = g_file_new_for_path (tmp_filename);
+       } while (!g_file_make_symbolic_link (tmp_file, filename, NULL, &link_error) &&
+                g_error_matches (link_error, G_IO_ERROR, G_IO_ERROR_EXISTS));
        
-       if (res != 0 && errno != EEXIST) {
-               if (error) {
-                       *error = g_error_new (G_FILE_ERROR,
-                                             g_file_error_from_errno (errno),
-                                             _("Couldn't create symlink “%s”: %s"),
-                                             tmp_filename, strerror (errno));
-               }
+       g_free (name);
+       g_object_unref (tmp_file);
 
+       if (link_error) {
+               g_propagate_prefixed_error (error, 
+                                           link_error,
+                                           _("Couldn't create symlink “%s”: "),
+                                           tmp_filename);
                g_free (tmp_filename);
-
+               
                return NULL;
        }
-       
+
        return tmp_filename;
 }
 
@@ -2524,17 +2551,32 @@ file_save_dialog_response_cb (GtkWidget *fc,
                              EvWindow  *ev_window)
 {
        gchar *uri;
-       
+       GFile *file, *parent;
+
        if (response_id != GTK_RESPONSE_OK) {
                gtk_widget_destroy (fc);
                return;
        }
-       
+
        uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+       file = g_file_new_for_uri (uri);
+       parent = g_file_get_parent (file);
+       g_object_unref (file);
+       if (parent) {
+               gchar *folder_uri;
+
+               folder_uri = g_file_get_uri (parent);
+               ev_application_set_filechooser_uri (EV_APP,
+                                                   GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                   folder_uri);
+               g_free (folder_uri);
+               g_object_unref (parent);
+       }
+
        /* FIXME: remote copy should be done here rather than in the save job, 
         * so that we can track progress and cancel the operation
         */
-       
+
        ev_window_clear_save_job (ev_window);
        ev_window->priv->save_job = ev_job_save_new (ev_window->priv->document,
                                                     uri, ev_window->priv->uri);
@@ -2554,7 +2596,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
        GtkWidget *fc;
        gchar *base_name;
        GFile *file;
-       const gchar *folder;
+       const gchar *default_uri;
 
        fc = gtk_file_chooser_dialog_new (
                _("Save a Copy"),
@@ -2575,14 +2617,21 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
        file = g_file_new_for_uri (ev_window->priv->uri);
        base_name = g_file_get_basename (file);
        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name);
-       
-       folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
-       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
-                                            folder ? folder : g_get_home_dir ());
-       
+
+       default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_SAVE);
+       if (default_uri) {
+               gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (fc), default_uri);
+       } else {
+               const gchar *folder;
+
+               folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+               gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+                                                    folder ? folder : g_get_home_dir ());
+       }
+
        g_object_unref (file);
        g_free (base_name);
-        
+
        g_signal_connect (fc, "response",
                          G_CALLBACK (file_save_dialog_response_cb),
                          ev_window);
@@ -3793,7 +3842,6 @@ ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window)
        ev_view_autoscroll_start (EV_VIEW (ev_window->priv->view));
 }
 
-#if GTK_CHECK_VERSION (2, 14, 0)
 static void
 ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
 {
@@ -3809,56 +3857,6 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
                g_error_free (error);
        }
 }
-#else /* !GTK_CHECK_VERSION (2, 14, 0) */
-static void
-ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
-{
-       GError *error = NULL;
-       GdkScreen *screen;
-       char *command;
-       const char *lang;
-       char *uri = NULL;
-
-       int i;
-
-       const char * const * langs = g_get_language_names ();
-
-       for (i = 0; langs[i]; i++) {
-               lang = langs[i];
-               if (strchr (lang, '.')) {
-                       continue;
-               }
-
-               uri = g_build_filename(GNOMEDATADIR,
-                                      "/gnome/help/" PACKAGE,
-                                      lang,
-                                      "/evince.xml",
-                                      NULL);
-                                       
-               if (g_file_test (uri, G_FILE_TEST_EXISTS)) {
-                       break;
-               }
-               g_free (uri);
-               uri = NULL;
-       }
-
-       if (uri == NULL) {
-               g_warning ("Cannot find help");
-               return;
-       }
-       
-       command = g_strconcat ("gnome-help ghelp://", uri,  NULL);
-       g_free (uri);
-       
-       screen = gtk_widget_get_screen (GTK_WIDGET (ev_window));
-       gdk_spawn_command_line_on_screen (screen, command, &error);
-       if (error != NULL) {
-               g_warning ("%s", error->message);
-               g_error_free (error);
-       }
-       g_free (command);
-}
-#endif /* GTK_CHECK_VERSION (2, 14, 0) */
 
 static void
 ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window)
@@ -4556,10 +4554,17 @@ ev_window_drag_data_received (GtkWidget        *widget,
                              guint             time)
 
 {
-       EvWindow *window = EV_WINDOW (widget);
-       gchar   **uris;
-       gint      i = 0;
-       GSList   *uri_list = NULL;
+       EvWindow  *window = EV_WINDOW (widget);
+       gchar    **uris;
+       gint       i = 0;
+       GSList    *uri_list = NULL;
+       GtkWidget *source;
+
+       source = gtk_drag_get_source_widget (context);
+       if (source && widget == gtk_widget_get_toplevel (source)) {
+               gtk_drag_finish (context, FALSE, FALSE, time);
+               return;
+       }
 
        uris = gtk_selection_data_get_uris (selection_data);
        if (!uris) {
@@ -4709,11 +4714,6 @@ ev_window_dispose (GObject *object)
        
        ev_window_close_dialogs (window);
 
-       if (window->priv->printer) {
-               g_object_unref (window->priv->printer);
-               window->priv->printer = NULL;
-       }
-
        if (window->priv->print_settings) {
                g_object_unref (window->priv->print_settings);
                window->priv->print_settings = NULL;
@@ -4785,6 +4785,30 @@ ev_window_dispose (GObject *object)
        G_OBJECT_CLASS (ev_window_parent_class)->dispose (object);
 }
 
+static gboolean
+ev_window_key_press_event (GtkWidget   *widget,
+                          GdkEventKey *event)
+{
+       EvWindow *ev_window = EV_WINDOW (widget);
+       gboolean  handled = FALSE;
+
+       /* Propagate the event to the view first
+        * It's needed to be able to type in
+        * annot popups windows
+        */
+       if (ev_window->priv->view) {
+               g_object_ref (ev_window->priv->view);
+               if (GTK_WIDGET_IS_SENSITIVE (ev_window->priv->view))
+                       handled = gtk_widget_event (ev_window->priv->view, (GdkEvent*) event);
+               g_object_unref (ev_window->priv->view);
+       }
+
+       if (!handled)
+               handled = GTK_WIDGET_CLASS (ev_window_parent_class)->key_press_event (widget, event);
+
+       return handled;
+}
+
 static void
 ev_window_class_init (EvWindowClass *ev_window_class)
 {
@@ -4794,6 +4818,7 @@ ev_window_class_init (EvWindowClass *ev_window_class)
        g_object_class->dispose = ev_window_dispose;
        g_object_class->finalize = ev_window_finalize;
 
+       widget_class->key_press_event = ev_window_key_press_event;
        widget_class->screen_changed = ev_window_screen_changed;
        widget_class->window_state_event = ev_window_state_event;
        widget_class->drag_data_received = ev_window_drag_data_received;
@@ -4819,7 +4844,7 @@ static const GtkActionEntry entries[] = {
                { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), "<control>S",
          N_("Save a copy of the current document"),
          G_CALLBACK (ev_window_cmd_save_as) },
-       { "FilePrintSetup", NULL, N_("Print Set_up..."), NULL,
+       { "FilePageSetup", GTK_STOCK_PAGE_SETUP, N_("Page Set_up..."), NULL,
          N_("Setup the page settings for printing"),
          G_CALLBACK (ev_window_cmd_file_print_setup) },
        { "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
@@ -4897,6 +4922,8 @@ static const GtkActionEntry entries[] = {
          G_CALLBACK (ev_window_cmd_escape) },
         { "Slash", GTK_STOCK_FIND, NULL, "slash", NULL,
           G_CALLBACK (ev_window_cmd_edit_find) },
+        { "F3", NULL, "", "F3", NULL,
+          G_CALLBACK (ev_window_cmd_edit_find_next) },
         { "PageDown", NULL, "", "Page_Down", NULL,
           G_CALLBACK (ev_window_cmd_scroll_forward) },
         { "PageUp", NULL, "", "Page_Up", NULL,
@@ -5250,7 +5277,7 @@ launch_action (EvWindow *window, EvLinkAction *action)
        GAppInfo *app_info;
        GFile *file;
        GList file_list = {NULL};
-       GAppLaunchContext *context = NULL;
+       GAppLaunchContext *context;
        GError *error = NULL;
 
        if (filename == NULL)
@@ -5281,12 +5308,10 @@ launch_action (EvWindow *window, EvLinkAction *action)
                return;
        }
 
-#if GTK_CHECK_VERSION (2, 14, 0)
        context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
        gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context),
                                           gtk_window_get_screen (GTK_WINDOW (window)));
        gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), GDK_CURRENT_TIME);
-#endif
        
        file_list.data = file;
        if (!g_app_info_launch (app_info, &file_list, context, &error)) {
@@ -5309,17 +5334,13 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
        const gchar *uri = ev_link_action_get_uri (action);
        GError *error = NULL;
        gboolean ret;
-#if GTK_CHECK_VERSION (2, 14, 0)
-       GAppLaunchContext *context = NULL;
-#endif
+       GAppLaunchContext *context;
 
-#if GTK_CHECK_VERSION (2, 14, 0)
        context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
        gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context),
                                           gtk_window_get_screen (GTK_WINDOW (window)));
        gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context),
                                              GDK_CURRENT_TIME);
-#endif
 
        if (!g_strstr_len (uri, strlen (uri), "://") &&
            !g_str_has_prefix (uri, "mailto:")) {
@@ -5381,6 +5402,8 @@ do_action_named (EvWindow *window, EvLinkAction *action)
                ev_window_cmd_edit_find (NULL, window);
        } else if (g_ascii_strcasecmp (name, "Close") == 0) {
                ev_window_cmd_file_close_window (NULL, window);
+       } else if (g_ascii_strcasecmp (name, "Print") == 0) {
+               ev_window_cmd_file_print (NULL, window);
        } else {
                g_warning ("Unimplemented named action: %s, please post a "
                           "bug report in Evince bugzilla "