]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
[printing] Embed page setup settings in the print dialog
[evince.git] / shell / ev-window.c
index c55c9f80650f7e479cf832abdd2d21e9f8dcdb62..6f98711f4a38486fd8f01e60fbb42e5c4b382cdc 100644 (file)
@@ -395,7 +395,9 @@ 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);
+#if !GTK_CHECK_VERSION (2, 17, 4)
        ev_window_set_action_sensitive (ev_window, "FilePageSetup", has_pages && ok_to_print);
+#endif
        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);
 
@@ -1708,19 +1710,30 @@ ev_window_load_file_remote (EvWindow *ev_window,
        GFile *target_file;
        
        if (!ev_window->priv->local_uri) {
-               gchar *tmp_name;
-               gchar *base_name;
+               char *base_name, *template;
+                GFile *tmp_file;
+                GError *err = NULL;
 
                /* We'd like to keep extension of source uri since
-                * it helps to resolve some mime types, say cbz */
-               tmp_name = ev_tmp_filename (NULL);
+                * it helps to resolve some mime types, say cbz.
+                 */
                base_name = g_file_get_basename (source_file);
-               ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-",
-                                                         base_name, NULL);
+                template = g_build_filename ("document.XXXXXX-%s", base_name, NULL);
+                g_free (base_name);
+
+                tmp_file = ev_mkstemp_file (template, &err);
+                if (tmp_file == NULL) {
+                        ev_window_error_message (ev_window, err,
+                                                 "%s", _("Failed to load remote file."));
+                        g_error_free (err);
+                        return;
+                }
+
+               ev_window->priv->local_uri = g_file_get_uri (tmp_file);
+               g_object_unref (tmp_file);
+
                ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job),
                                     ev_window->priv->local_uri);
-               g_free (base_name);
-               g_free (tmp_name);
        }
 
        ev_window_reset_progress_cancellable (ev_window);
@@ -2064,7 +2077,7 @@ file_open_dialog_response_cb (GtkWidget *chooser,
 
                ev_application_open_uri_list (EV_APP, uris,
                                              gtk_window_get_screen (GTK_WINDOW (ev_window)),
-                                             GDK_CURRENT_TIME);
+                                             gtk_get_current_event_time ());
 
                g_slist_foreach (uris, (GFunc)g_free, NULL);
                g_slist_free (uris);
@@ -2166,7 +2179,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action,
        
        ev_application_open_uri_at_dest (EV_APP, uri,
                                         gtk_window_get_screen (GTK_WINDOW (window)),
-                                        NULL, 0, NULL, GDK_CURRENT_TIME);
+                                        NULL, 0, NULL, gtk_get_current_event_time ());
 }
 
 static void
@@ -2176,7 +2189,7 @@ ev_window_open_recent_action_item_activated (EvOpenRecentAction *action,
 {
        ev_application_open_uri_at_dest (EV_APP, uri,
                                         gtk_window_get_screen (GTK_WINDOW (window)),
-                                        NULL, 0, NULL, GDK_CURRENT_TIME);
+                                        NULL, 0, NULL, gtk_get_current_event_time ());
 }
 
 static void
@@ -2606,24 +2619,25 @@ get_print_settings_file (void)
 {
        GKeyFile *print_settings_file;
        gchar    *filename;
+        GError *error = NULL;
 
        print_settings_file = g_key_file_new ();
 
-       filename = g_build_filename (ev_application_get_dot_dir (EV_APP),
-                                    EV_PRINT_SETTINGS_FILE, NULL);
-       if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
-               GError *error = NULL;
-
-               g_key_file_load_from_file (print_settings_file,
-                                          filename,
-                                          G_KEY_FILE_KEEP_COMMENTS |
-                                          G_KEY_FILE_KEEP_TRANSLATIONS,
-                                          &error);
-               if (error) {
+       filename = g_build_filename (ev_application_get_dot_dir (EV_APP, FALSE),
+                                     EV_PRINT_SETTINGS_FILE, NULL);
+        if (!g_key_file_load_from_file (print_settings_file,
+                                        filename,
+                                        G_KEY_FILE_KEEP_COMMENTS |
+                                        G_KEY_FILE_KEEP_TRANSLATIONS,
+                                        &error)) {
+
+                /* Don't warn if the file simply doesn't exist */
+                if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
                        g_warning ("%s", error->message);
-                       g_error_free (error);
-               }
+
+                g_error_free (error);
        }
+
        g_free (filename);
 
        return print_settings_file;
@@ -2634,15 +2648,15 @@ save_print_setting_file (GKeyFile *key_file)
 {
        gchar  *filename;
        gchar  *data;
-       gssize  data_length;
+       gsize  data_length;
        GError *error = NULL;
 
-       filename = g_build_filename (ev_application_get_dot_dir (EV_APP),
+       filename = g_build_filename (ev_application_get_dot_dir (EV_APP, TRUE),
                                     EV_PRINT_SETTINGS_FILE, NULL);
-       data = g_key_file_to_data (key_file, (gsize *)&data_length, NULL);
+       data = g_key_file_to_data (key_file, &data_length, NULL);
        g_file_set_contents (filename, data, data_length, &error);
        if (error) {
-               g_warning ("%s", error->message);
+               g_warning ("Failed to save print settings: %s", error->message);
                g_error_free (error);
        }
        g_free (data);
@@ -2896,6 +2910,13 @@ ev_window_print_operation_done (EvPrintOperation       *op,
 
                print_settings = ev_print_operation_get_print_settings (op);
                ev_window_save_print_settings (ev_window, print_settings);
+
+               if (ev_print_operation_get_embed_page_setup (op)) {
+                       GtkPageSetup *page_setup;
+
+                       page_setup = ev_print_operation_get_default_page_setup (op);
+                       ev_window_save_print_page_setup (ev_window, page_setup);
+               }
        }
 
                break;
@@ -3069,6 +3090,7 @@ ev_window_print_range (EvWindow *ev_window,
        ev_print_operation_set_current_page (op, current_page);
        ev_print_operation_set_print_settings (op, print_settings);
        ev_print_operation_set_default_page_setup (op, print_page_setup);
+       ev_print_operation_set_embed_page_setup (op, TRUE);
 
        g_object_unref (print_settings);
        g_object_unref (print_page_setup);
@@ -3790,7 +3812,7 @@ ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog,
        toolbar = EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar);
         egg_editable_toolbar_set_edit_mode (toolbar, FALSE);
 
-       toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP),
+       toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP, TRUE),
                                          "evince_toolbar.xml", NULL);
        egg_toolbars_model_save_toolbars (egg_editable_toolbar_get_model (toolbar),
                                          toolbars_file, "1.0");
@@ -3934,7 +3956,7 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
 
        gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (ev_window)),
                      "ghelp:evince",
-                     GDK_CURRENT_TIME,
+                     gtk_get_current_event_time (),
                      &error);
        if (error) {
                ev_window_error_message (ev_window, error, 
@@ -4648,13 +4670,13 @@ ev_window_drag_data_received (GtkWidget        *widget,
 static void
 ev_window_finalize (GObject *object)
 {
+       G_OBJECT_CLASS (ev_window_parent_class)->finalize (object);
+
        if (ev_window_n_copies == 0) {
                ev_application_shutdown (EV_APP);
        } else {
                ev_window_n_copies--;
        }
-
-       G_OBJECT_CLASS (ev_window_parent_class)->finalize (object);
 }
 
 static void
@@ -5395,7 +5417,8 @@ launch_action (EvWindow *window, EvLinkAction *action)
        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);
+       gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context),
+                                              gtk_get_current_event_time ());
        
        file_list.data = file;
        if (!g_app_info_launch (app_info, &file_list, context, &error)) {
@@ -5407,6 +5430,7 @@ launch_action (EvWindow *window, EvLinkAction *action)
        
        g_object_unref (app_info);
        g_object_unref (file);
+        /* FIXMEchpe: unref launch context? */
 
        /* According to the PDF spec filename can be an executable. I'm not sure
           allowing to launch executables is a good idea though. -- marco */
@@ -5424,7 +5448,7 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
        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);
+                                             gtk_get_current_event_time ());
 
        if (!g_strstr_len (uri, strlen (uri), "://") &&
            !g_str_has_prefix (uri, "mailto:")) {
@@ -5432,10 +5456,10 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
                
                /* Not a valid uri, assuming it's http */
                http = g_strdup_printf ("http://%s", uri);
-               ret = g_app_info_launch_default_for_uri (http, NULL, &error);
+               ret = g_app_info_launch_default_for_uri (http, context, &error);
                g_free (http);
        } else {
-               ret = g_app_info_launch_default_for_uri (uri, NULL, &error);
+               ret = g_app_info_launch_default_for_uri (uri, context, &error);
        }
        
        if (ret == FALSE) {
@@ -5443,6 +5467,8 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
                                         "%s", _("Unable to open external link"));
                g_error_free (error);
        }
+
+        /* FIXMEchpe: unref launch context? */
 }
 
 static void
@@ -5462,7 +5488,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action)
                                         ev_link_action_get_dest (action),
                                         0,
                                         NULL, 
-                                        GDK_CURRENT_TIME);
+                                        gtk_get_current_event_time ());
 
        g_free (uri);
 }
@@ -5629,7 +5655,9 @@ image_save_dialog_response_cb (GtkWidget *fc,
        if (is_native) {
                filename = g_file_get_path (target_file);
        } else {
-               filename = ev_tmp_filename ("saveimage");
+                /* Create a temporary local file to save to */
+                if (ev_mkstemp ("saveimage.XXXXXX", &filename, &error) == -1)
+                        goto has_error;
        }
 
        ev_document_doc_mutex_lock ();
@@ -5642,6 +5670,7 @@ image_save_dialog_response_cb (GtkWidget *fc,
        g_free (file_format);
        g_object_unref (pixbuf);
        
+    has_error:
        if (error) {
                ev_window_error_message (ev_window, error, 
                                         "%s", _("The image could not be saved."));
@@ -5739,7 +5768,7 @@ ev_attachment_popup_cmd_open_attachment (GtkAction *action, EvWindow *window)
                
                attachment = (EvAttachment *) l->data;
                
-               ev_attachment_open (attachment, screen, GDK_CURRENT_TIME, &error);
+               ev_attachment_open (attachment, screen, gtk_get_current_event_time (), &error);
 
                if (error) {
                        ev_window_error_message (window, error, 
@@ -5774,7 +5803,7 @@ attachment_save_dialog_response_cb (GtkWidget *fc,
        
        for (l = ev_window->priv->attach_list; l && l->data; l = g_list_next (l)) {
                EvAttachment *attachment;
-               GFile        *save_to;
+               GFile        *save_to = NULL;
                GError       *error = NULL;
                
                attachment = (EvAttachment *) l->data;
@@ -5782,15 +5811,17 @@ attachment_save_dialog_response_cb (GtkWidget *fc,
                if (is_native) {
                        if (is_dir) {
                                save_to = g_file_get_child (target_file,
+                                    /* FIXMEchpe: file name encoding! */
                                                            ev_attachment_get_name (attachment));
                        } else {
                                save_to = g_object_ref (target_file);
                        }
                } else {
-                       save_to = ev_tmp_file_get ("saveattachment");
+                       save_to = ev_mkstemp_file ("saveattachment.XXXXXX", &error);
                }
 
-               ev_attachment_save (attachment, save_to, &error);
+                if (save_to)
+                        ev_attachment_save (attachment, save_to, &error);
                
                if (error) {
                        ev_window_error_message (ev_window, error, 
@@ -5906,7 +5937,7 @@ get_toolbars_model (void)
 
        toolbars_model = egg_toolbars_model_new ();
 
-       toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP),
+       toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP, FALSE),
                                          "evince_toolbar.xml", NULL);
        toolbars_path = g_build_filename (ev_application_get_data_dir (EV_APP),
                                         "evince-toolbar.xml", NULL);
@@ -5914,8 +5945,8 @@ get_toolbars_model (void)
 
        if (!egg_toolbars_model_load_toolbars (toolbars_model, toolbars_file)) {
                egg_toolbars_model_load_toolbars (toolbars_model, toolbars_path);
+                goto skip_conversion;
        }
-       g_free (toolbars_path);
 
        /* Open item doesn't exist anymore,
         * convert it to OpenRecent for compatibility
@@ -5932,7 +5963,10 @@ get_toolbars_model (void)
                        break;
                }
        }
+
+    skip_conversion:
        g_free (toolbars_file);
+       g_free (toolbars_path);
 
        egg_toolbars_model_set_flags (toolbars_model, 0, EGG_TB_MODEL_NOT_REMOVABLE);
 
@@ -6015,7 +6049,17 @@ ev_window_init (EvWindow *ev_window)
                g_error_free (error);
        }
        g_free (ui_path);
-       
+
+#if GTK_CHECK_VERSION (2, 17, 4)
+       {
+               GtkAction *action;
+
+               action = gtk_action_group_get_action (ev_window->priv->action_group,
+                                                     "FilePageSetup");
+               g_object_set (action, "visible", FALSE, "sensitive", FALSE, NULL);
+       }
+#endif
+
        ev_window->priv->recent_manager = gtk_recent_manager_get_default ();
        ev_window->priv->recent_action_group = NULL;
        ev_window->priv->recent_ui_id = 0;