Add gtk_printer_get_hard_margins_for_paper_size
authorAdrian Johnson <ajohnson@redneon.com>
Thu, 12 Apr 2018 09:31:37 +0000 (11:31 +0200)
committerMarek Kasik <mkasik@redhat.com>
Thu, 26 Apr 2018 12:19:55 +0000 (14:19 +0200)
to retreive paper size specific hard margins and use this
to set the hard margins in the print context.
(modified by Marek Kasik <mkasik@redhat.com>)

https://bugzilla.gnome.org/show_bug.cgi?id=686109

docs/reference/gtk/gtk4-sections.txt
gtk/gtkprintbackend.c
gtk/gtkprintbackend.h
gtk/gtkprinter.c
gtk/gtkprinter.h
gtk/gtkprintoperation-unix.c
modules/printbackends/gtkprintbackendcups.c

index 7ea8aa8ba88a2f1cb3700b809c6806d511ac93f5..90d886cbc6db200380b3b31818057e4330d989f3 100644 (file)
@@ -5278,6 +5278,7 @@ gtk_printer_request_details
 gtk_printer_get_capabilities
 gtk_printer_get_default_page_size
 gtk_printer_get_hard_margins
+gtk_printer_get_hard_margins_for_paper_size
 GtkPrinterFunc
 gtk_enumerate_printers
 
index 0400100677b8117d8cb849dd282f4394cbae539b..3651d799963b73e1d3e62f10c828c1ee5a4ef85d 100644 (file)
@@ -186,6 +186,12 @@ static gboolean             fallback_printer_get_hard_margins      (GtkPrinter
                                                                     gdouble             *bottom,
                                                                     gdouble             *left,
                                                                     gdouble             *right);
+static gboolean             fallback_printer_get_hard_margins_for_paper_size (GtkPrinter          *printer,
+                                                                             GtkPaperSize        *paper_size,
+                                                                             gdouble             *top,
+                                                                             gdouble             *bottom,
+                                                                             gdouble             *left,
+                                                                             gdouble             *right);
 static GList *              fallback_printer_list_papers           (GtkPrinter          *printer);
 static GtkPageSetup *       fallback_printer_get_default_page_size (GtkPrinter          *printer);
 static GtkPrintCapabilities fallback_printer_get_capabilities      (GtkPrinter          *printer);
@@ -252,6 +258,7 @@ gtk_print_backend_class_init (GtkPrintBackendClass *class)
   class->printer_request_details = fallback_printer_request_details;
   class->printer_mark_conflicts = fallback_printer_mark_conflicts;
   class->printer_get_hard_margins = fallback_printer_get_hard_margins;
+  class->printer_get_hard_margins_for_paper_size = fallback_printer_get_hard_margins_for_paper_size;
   class->printer_list_papers = fallback_printer_list_papers;
   class->printer_get_default_page_size = fallback_printer_get_default_page_size;
   class->printer_get_capabilities = fallback_printer_get_capabilities;
@@ -375,6 +382,17 @@ fallback_printer_get_hard_margins (GtkPrinter *printer,
   return FALSE;
 }
 
+static gboolean
+fallback_printer_get_hard_margins_for_paper_size (GtkPrinter   *printer,
+                                                 GtkPaperSize *paper_size,
+                                                 gdouble      *top,
+                                                 gdouble      *bottom,
+                                                 gdouble      *left,
+                                                 gdouble      *right)
+{
+  return FALSE;
+}
+
 static GList *
 fallback_printer_list_papers (GtkPrinter *printer)
 {
index a5be9fa9f58bc8d89eebdfa17c436d0bad0ad342..2b4718e98c33a402dc5130c95eb864f85ea71514 100644 (file)
@@ -133,11 +133,17 @@ struct _GtkPrintBackendClass
                                                               gchar              **auth_info,
                                                               gboolean             store_auth_info);
 
+  gboolean              (*printer_get_hard_margins_for_paper_size) (GtkPrinter    *printer,
+                                                                   GtkPaperSize  *paper_size,
+                                                                   gdouble       *top,
+                                                                   gdouble       *bottom,
+                                                                   gdouble       *left,
+                                                                   gdouble       *right);
+
   /* Padding for future expansion */
   void (*_gtk_reserved1) (void);
   void (*_gtk_reserved2) (void);
   void (*_gtk_reserved3) (void);
-  void (*_gtk_reserved4) (void);
 };
 
 #define GTK_PRINT_BACKEND_EXTENSION_POINT_NAME "gtk-print-backend"
index 8339b5bd7a1506153ef8bcfe18cfac5a4fa11431..d9ce1efaddbfb37ffd6a80789cc119abb4e7cd2c 100644 (file)
@@ -969,6 +969,37 @@ gtk_printer_get_hard_margins (GtkPrinter *printer,
   return backend_class->printer_get_hard_margins (printer, top, bottom, left, right);
 }
 
+/**
+ * gtk_printer_get_hard_margins_for_paper_size:
+ * @printer: a #GtkPrinter
+ * @paper_size: a #GtkPaperSize
+ * @top: (out): a location to store the top margin in
+ * @bottom: (out): a location to store the bottom margin in
+ * @left: (out): a location to store the left margin in
+ * @right: (out): a location to store the right margin in
+ *
+ * Retrieve the hard margins of @printer for @paper_size, i.e. the
+ * margins that define the area at the borders of the paper that the
+ * printer cannot print to.
+ *
+ * Note: This will not succeed unless the printer's details are available,
+ * see gtk_printer_has_details() and gtk_printer_request_details().
+ *
+ * Return value: %TRUE iff the hard margins were retrieved
+ */
+gboolean
+gtk_printer_get_hard_margins_for_paper_size (GtkPrinter   *printer,
+                                            GtkPaperSize *paper_size,
+                                            gdouble      *top,
+                                            gdouble      *bottom,
+                                            gdouble      *left,
+                                            gdouble      *right)
+{
+  GtkPrintBackendClass *backend_class = GTK_PRINT_BACKEND_GET_CLASS (printer->priv->backend);
+
+  return backend_class->printer_get_hard_margins_for_paper_size (printer, paper_size, top, bottom, left, right);
+}
+
 /**
  * gtk_printer_get_capabilities:
  * @printer: a #GtkPrinter
index bc02e93c0bb44ee6c9cd3dfcda263c1008cc299f..a3e3eb54a3eb17641bc3e7ea3808055ce481a9e8 100644 (file)
@@ -164,6 +164,12 @@ gboolean                 gtk_printer_get_hard_margins      (GtkPrinter       *pr
                                                             gdouble          *bottom,
                                                             gdouble          *left,
                                                             gdouble          *right);
+gboolean                 gtk_printer_get_hard_margins_for_paper_size (GtkPrinter       *printer,
+                                                                     GtkPaperSize     *paper_size,
+                                                                     gdouble          *top,
+                                                                     gdouble          *bottom,
+                                                                     gdouble          *left,
+                                                                     gdouble          *right);
 
 /**
  * GtkPrinterFunc:
index e0143c6e0ba2f383cd85c3c0da583201d84effce..7c044120b9e83c49ddcc868c502d0888fa9e29d4 100644 (file)
@@ -531,7 +531,8 @@ finish_print (PrintResponseData *rdata,
 
       if (gtk_print_settings_get_number_up (settings) < 2)
         {
-         if (printer && gtk_printer_get_hard_margins (printer, &top, &bottom, &left, &right))
+         if (printer && (gtk_printer_get_hard_margins_for_paper_size (printer, gtk_page_setup_get_paper_size (page_setup), &top, &bottom, &left, &right) ||
+                         gtk_printer_get_hard_margins (printer, &top, &bottom, &left, &right)))
            _gtk_print_context_set_hard_margins (priv->print_context, top, bottom, left, right);
        }
       else
index 52614069d242caba3cf3d66e08e173eccb8de406..f530c0506eb5c82d5d04fc03519f6049a4ecd86d 100644 (file)
@@ -193,6 +193,12 @@ static gboolean             cups_printer_get_hard_margins          (GtkPrinter
                                                                    gdouble                           *bottom,
                                                                    gdouble                           *left,
                                                                    gdouble                           *right);
+static gboolean             cups_printer_get_hard_margins_for_paper_size (GtkPrinter                  *printer,
+                                                                         GtkPaperSize                *paper_size,
+                                                                         gdouble                     *top,
+                                                                         gdouble                     *bottom,
+                                                                         gdouble                     *left,
+                                                                         gdouble                     *right);
 static GtkPrintCapabilities cups_printer_get_capabilities          (GtkPrinter                        *printer);
 static void                 set_option_from_settings               (GtkPrinterOption                  *option,
                                                                    GtkPrintSettings                  *setting);
@@ -355,6 +361,7 @@ gtk_print_backend_cups_class_init (GtkPrintBackendCupsClass *class)
   backend_class->printer_list_papers = cups_printer_list_papers;
   backend_class->printer_get_default_page_size = cups_printer_get_default_page_size;
   backend_class->printer_get_hard_margins = cups_printer_get_hard_margins;
+  backend_class->printer_get_hard_margins_for_paper_size = cups_printer_get_hard_margins_for_paper_size;
   backend_class->printer_get_capabilities = cups_printer_get_capabilities;
   backend_class->set_password = gtk_print_backend_cups_set_password;
 }
@@ -6697,6 +6704,47 @@ cups_printer_get_hard_margins (GtkPrinter *printer,
   return result;
 }
 
+static gboolean
+cups_printer_get_hard_margins_for_paper_size (GtkPrinter   *printer,
+                                             GtkPaperSize *paper_size,
+                                             gdouble      *top,
+                                             gdouble      *bottom,
+                                             gdouble      *left,
+                                             gdouble      *right)
+{
+  ppd_file_t *ppd_file;
+  ppd_size_t *size;
+  const gchar *paper_name;
+  int i;
+
+  ppd_file = gtk_printer_cups_get_ppd (GTK_PRINTER_CUPS (printer));
+  if (ppd_file == NULL)
+    return FALSE;
+
+  paper_name = gtk_paper_size_get_ppd_name (paper_size);
+
+  for (i = 0; i < ppd_file->num_sizes; i++)
+    {
+      size = &ppd_file->sizes[i];
+      if (g_strcmp0(size->name, paper_name) == 0)
+        {
+          *top = size->length - size->top;
+          *bottom = size->bottom;
+          *left = size->left;
+          *right = size->width - size->right;
+          return TRUE;
+       }
+    }
+
+  /* Custom size */
+  *left = ppd_file->custom_margins[0];
+  *bottom = ppd_file->custom_margins[1];
+  *right = ppd_file->custom_margins[2];
+  *top = ppd_file->custom_margins[3];
+
+  return TRUE;
+}
+
 static GtkPrintCapabilities
 cups_printer_get_capabilities (GtkPrinter *printer)
 {