]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprintoperation-unix.c
Fixed GtkTextTag to sync the GdkColors with the new GdkRGBA values for backwards...
[~andy/gtk] / gtk / gtkprintoperation-unix.c
index a36eced955f85221af0a2d58ebd6130cdaaff0c0..e220e590b90d79567645ec3bf00fad7d8ee8666d 100644 (file)
 #include "gtkpagesetupunixdialog.h"
 #include "gtkprintbackend.h"
 #include "gtkprinter.h"
-#include "gtkprinter-private.h"
 #include "gtkprintjob.h"
 #include "gtklabel.h"
 #include "gtkintl.h"
-#include "gtkalias.h"
+
 
 typedef struct 
 {
@@ -202,8 +201,8 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
                                                      GtkWindow         *parent,
                                                      const gchar       *filename)
 {
-  gint argc;
-  gchar **argv;
+  GAppInfo *appinfo;
+  GdkAppLaunchContext *context;
   gchar *cmd;
   gchar *preview_cmd;
   GtkSettings *settings;
@@ -277,7 +276,11 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
   quoted_filename = g_shell_quote (filename);
   quoted_settings_filename = g_shell_quote (settings_filename);
   cmd = shell_command_substitute_file (preview_cmd, quoted_filename, quoted_settings_filename, &filename_used, &settings_used);
-  g_shell_parse_argv (cmd, &argc, &argv, &error);
+
+  appinfo = g_app_info_create_from_commandline (cmd,
+                                                "Print Preview",
+                                                G_APP_INFO_CREATE_NONE,
+                                                &error);
 
   g_free (preview_cmd);
   g_free (quoted_filename);
@@ -287,9 +290,12 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
   if (error != NULL)
     goto out;
 
-  gdk_spawn_on_screen (screen, NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error);
+  context = gdk_display_get_app_launch_context (gdk_screen_get_display (screen));
+  gdk_app_launch_context_set_screen (context, screen);
+  g_app_info_launch (appinfo, NULL, G_APP_LAUNCH_CONTEXT (context), &error);
 
-  g_strfreev (argv);
+  g_object_unref (context);
+  g_object_unref (appinfo);
 
   if (error != NULL)
     {
@@ -307,24 +313,14 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
  out:
   if (error != NULL)
     {
-      GtkWidget *edialog;
-      edialog = gtk_message_dialog_new (parent, 
-                                        GTK_DIALOG_DESTROY_WITH_PARENT,
-                                        GTK_MESSAGE_ERROR,
-                                        GTK_BUTTONS_CLOSE,
-                                        _("Error launching preview") /* FIXME better text */);
-      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (edialog),
-                                                "%s", error->message);
-      g_signal_connect (edialog, "response",
-                        G_CALLBACK (gtk_widget_destroy), NULL);
-
-      gtk_window_present (GTK_WINDOW (edialog));
-
-      g_error_free (error);
+      if (op->priv->error == NULL)
+        op->priv->error = error;
+      else
+        g_error_free (error);
 
-      filename_used = FALSE; 
+      filename_used = FALSE;
       settings_used = FALSE;
-   } 
+   }
 
   if (!filename_used)
     g_unlink (filename);
@@ -334,7 +330,7 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
 
   if (fd > 0)
     close (fd);
-  
+
   if (key_file)
     g_key_file_free (key_file);
   g_free (data);
@@ -342,29 +338,15 @@ _gtk_print_operation_platform_backend_launch_preview (GtkPrintOperation *op,
 }
 
 static void
-unix_finish_send  (GtkPrintJob *job,
-                   gpointer     user_data, 
-                   GError      *error)
+unix_finish_send  (GtkPrintJob  *job,
+                   gpointer      user_data, 
+                   const GError *error)
 {
   GtkPrintOperation *op = (GtkPrintOperation *) user_data;
   GtkPrintOperationUnix *op_unix = op->priv->platform_data;
 
-  if (error != NULL)
-    {
-      GtkWidget *edialog;
-      edialog = gtk_message_dialog_new (op_unix->parent, 
-                                        GTK_DIALOG_DESTROY_WITH_PARENT,
-                                        GTK_MESSAGE_ERROR,
-                                        GTK_BUTTONS_CLOSE,
-                                        _("Error printing") /* FIXME better text */);
-      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (edialog),
-                                                "%s", error->message);
-      gtk_window_set_modal (GTK_WINDOW (edialog), TRUE);
-      g_signal_connect (edialog, "response",
-                        G_CALLBACK (gtk_widget_destroy), NULL);
-
-      gtk_window_present (GTK_WINDOW (edialog));
-    }
+  if (error != NULL && op->priv->error == NULL)
+    op->priv->error = g_error_copy (error);
 
   op_unix->data_sent = TRUE;
 
@@ -538,12 +520,27 @@ finish_print (PrintResponseData *rdata,
   GtkPrintOperation *op = rdata->op;
   GtkPrintOperationPrivate *priv = op->priv;
   GtkPrintJob *job;
+  gdouble top, bottom, left, right;
   
   if (rdata->do_print)
     {
       gtk_print_operation_set_print_settings (op, settings);
       priv->print_context = _gtk_print_context_new (op);
 
+      if (gtk_print_settings_get_number_up (settings) < 2)
+        {
+         if (printer && gtk_printer_get_hard_margins (printer, &top, &bottom, &left, &right))
+           _gtk_print_context_set_hard_margins (priv->print_context, top, bottom, left, right);
+       }
+      else
+        {
+         /* Pages do not have any unprintable area when printing n-up as each page on the
+          * sheet has been scaled down and translated to a position within the printable
+          * area of the sheet.
+          */
+         _gtk_print_context_set_hard_margins (priv->print_context, 0, 0, 0, 0);
+       }
+
       if (page_setup != NULL &&
           (gtk_print_operation_get_default_page_setup (op) == NULL ||
            page_setup_set))
@@ -587,18 +584,16 @@ finish_print (PrintResponseData *rdata,
            g_signal_connect (job, "status-changed",
                              G_CALLBACK (job_status_changed_cb), op);
          
-          priv->print_pages = job->print_pages;
-          priv->page_ranges = job->page_ranges;
-          priv->num_page_ranges = job->num_page_ranges;
-         
-          priv->manual_num_copies = job->num_copies;
-          priv->manual_collation = job->collate;
-          priv->manual_reverse = job->reverse;
-          priv->manual_page_set = job->page_set;
-          priv->manual_scale = job->scale;
-          priv->manual_orientation = job->rotate_to_orientation;
-          priv->manual_number_up = job->number_up;
-          priv->manual_number_up_layout = job->number_up_layout;
+          priv->print_pages = gtk_print_job_get_pages (job);
+          priv->page_ranges = gtk_print_job_get_page_ranges (job, &priv->num_page_ranges);
+          priv->manual_num_copies = gtk_print_job_get_num_copies (job);
+          priv->manual_collation = gtk_print_job_get_collate (job);
+          priv->manual_reverse = gtk_print_job_get_reverse (job);
+          priv->manual_page_set = gtk_print_job_get_page_set (job);
+          priv->manual_scale = gtk_print_job_get_scale (job);
+          priv->manual_orientation = gtk_print_job_get_rotate (job);
+          priv->manual_number_up = gtk_print_job_get_n_up (job);
+          priv->manual_number_up_layout = gtk_print_job_get_n_up_layout (job);
         }
     } 
  out:
@@ -645,7 +640,11 @@ handle_print_response (GtkWidget *dialog,
       settings = gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG (pd));
       page_setup = gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (pd));
       page_setup_set = gtk_print_unix_dialog_get_page_setup_set (GTK_PRINT_UNIX_DIALOG (pd));
-      
+
+      /* Set new print settings now so that custom-widget options
+       * can be added to the settings in the callback
+       */
+      gtk_print_operation_set_print_settings (rdata->op, settings);
       g_signal_emit_by_name (rdata->op, "custom-widget-apply", rdata->op->priv->custom_widget);
     }
   
@@ -952,12 +951,12 @@ get_page_setup_dialog (GtkWindow        *parent,
 
 /**
  * gtk_print_run_page_setup_dialog:
- * @parent: transient parent, or %NULL
- * @page_setup: an existing #GtkPageSetup, or %NULL
+ * @parent: (allow-none): transient parent
+ * @page_setup: (allow-none): an existing #GtkPageSetup
  * @settings: a #GtkPrintSettings
- * 
- * Runs a page setup dialog, letting the user modify the values from 
- * @page_setup. If the user cancels the dialog, the returned #GtkPageSetup 
+ *
+ * Runs a page setup dialog, letting the user modify the values from
+ * @page_setup. If the user cancels the dialog, the returned #GtkPageSetup
  * is identical to the passed in @page_setup, otherwise it contains the 
  * modifications done in the dialog.
  *
@@ -965,7 +964,7 @@ get_page_setup_dialog (GtkWindow        *parent,
  * setup dialog. See gtk_print_run_page_setup_dialog_async() if this is 
  * a problem.
  * 
- * Return value: a new #GtkPageSetup
+ * Return value: (transfer full): a new #GtkPageSetup
  *
  * Since: 2.10
  */
@@ -997,10 +996,11 @@ gtk_print_run_page_setup_dialog (GtkWindow        *parent,
 
 /**
  * gtk_print_run_page_setup_dialog_async:
- * @parent: transient parent, or %NULL
- * @page_setup: an existing #GtkPageSetup, or %NULL
+ * @parent: (allow-none): transient parent, or %NULL
+ * @page_setup: (allow-none): an existing #GtkPageSetup, or %NULL
  * @settings: a #GtkPrintSettings
- * @done_cb: a function to call when the user saves the modified page setup
+ * @done_cb: (scope async): a function to call when the user saves
+ *           the modified page setup
  * @data: user data to pass to @done_cb
  * 
  * Runs a page setup dialog, letting the user modify the values from @page_setup. 
@@ -1216,6 +1216,3 @@ find_printer (const gchar *printer,
   if (finder->backends == NULL && !finder->found_printer)
     g_idle_add (find_printer_idle, finder);
 }
-
-#define __GTK_PRINT_OPERATION_UNIX_C__
-#include "gtkaliasdef.c"