[gtkmm] Gtk::PrintJob, PrintSettings: Use ArrayHandler where possible



commit 53c1647d3223b5b62e3986dd897653aae998f010
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date:   Fri Mar 17 17:13:04 2017 +0100

    Gtk::PrintJob, PrintSettings: Use ArrayHandler where possible
    
    Commit fb1906febeec767d8463ec8772b6c845bf120455
    replaced ArrayHandler with other code in PrintJob::[set|get]_page_ranges()
    and PrintSettings::[set|get]_page_ranges(). That was unnecessary, except in
    PrintJob::set_page_ranges(). Revert part of that patch by using
    ArrayHandler in PrintSettings::[set|get]_page_ranges(). Also use it in
    PrintJob::get_page_ranges(), but correct the ownership parameter.

 gtk/src/printjob.ccg      |   11 +++++------
 gtk/src/printsettings.ccg |   25 ++++++++-----------------
 gtk/src/printsettings.hg  |   14 ++++++++++++++
 3 files changed, 27 insertions(+), 23 deletions(-)
---
diff --git a/gtk/src/printjob.ccg b/gtk/src/printjob.ccg
index f38070a..2ab8b4e 100644
--- a/gtk/src/printjob.ccg
+++ b/gtk/src/printjob.ccg
@@ -62,17 +62,16 @@ std::vector<PageRange> PrintJob::get_page_ranges() const
   const GtkPageRange* page_ranges =
     gtk_print_job_get_page_ranges(const_cast<GtkPrintJob*>(gobj()), &num_ranges);
 
-  std::vector<PageRange> cpp_ranges;
-  for (int i = 0; i < num_ranges; ++i)
-    cpp_ranges.emplace_back(page_ranges[i].start, page_ranges[i].end);
-
-  // gtk_print_job_get_page_ranges() does not give us a copy. Don't free page_ranges!
-  return cpp_ranges;
+  // We don't get a copy of page_ranges. Don't delete it.
+  return Glib::ArrayHandler<PageRange, PageRangeTraits>::array_to_vector(
+    page_ranges, num_ranges, Glib::OWNERSHIP_NONE);
 }
 
 void PrintJob::set_page_ranges(const std::vector<PageRange>& page_ranges)
 {
   // gtk_print_job_set_page_ranges() will take ownership of c_ranges, and free it with g_free().
+  // This is unusual. ArrayHandler::vector_to_array() can't be used.
+  // It does not take a Glib::OwnershipType parameter.
   GtkPageRange* c_ranges = g_new0(GtkPageRange, page_ranges.size());
   for (std::size_t i = 0; i < page_ranges.size(); ++i)
   {
diff --git a/gtk/src/printsettings.ccg b/gtk/src/printsettings.ccg
index b772a26..65b37d2 100644
--- a/gtk/src/printsettings.ccg
+++ b/gtk/src/printsettings.ccg
@@ -19,7 +19,6 @@
 
 #include <gtk/gtk.h>
 #include <glib.h>
-#include <memory> // std::unique_ptr
 
 namespace // anonymous
 {
@@ -125,26 +124,18 @@ std::vector<PageRange> PrintSettings::get_page_ranges() const
   GtkPageRange* page_ranges =
     gtk_print_settings_get_page_ranges(const_cast<GtkPrintSettings*>(gobj()), &num_ranges);
 
-  std::vector<PageRange> cpp_ranges;
-  for (int i = 0; i < num_ranges; ++i)
-    cpp_ranges.emplace_back(page_ranges[i].start, page_ranges[i].end);
-
-  // gtk_print_settings_get_page_ranges() gives us a copy. Free page_ranges!
-  g_free(page_ranges);
-  return cpp_ranges;
+  // We get a copy of page_ranges. Logically our ownership is deep, but
+  // since page_ranges contains elements instead of pointers to elements,
+  // ArrayHandler shall delete only the container. Thus OWNERSHIP_SHALLOW.
+  return Glib::ArrayHandler<PageRange, PageRangeTraits>::array_to_vector(
+    page_ranges, num_ranges, Glib::OWNERSHIP_SHALLOW);
 }
 
 void PrintSettings::set_page_ranges(const std::vector<PageRange>& page_ranges)
 {
-  // gtk_print_settings_set_page_ranges() does not take ownership of c_ranges.
-  // std::unique_ptr will delete it.
-  std::unique_ptr<GtkPageRange[]> c_ranges(new GtkPageRange[page_ranges.size()]);
-  for (std::size_t i = 0; i < page_ranges.size(); ++i)
-  {
-    c_ranges[i].start = page_ranges[i].start;
-    c_ranges[i].end = page_ranges[i].end;
-  }
-  gtk_print_settings_set_page_ranges(gobj(), c_ranges.get(), page_ranges.size());
+  gtk_print_settings_set_page_ranges(gobj(),
+    Glib::ArrayHandler<PageRange, PageRangeTraits>::vector_to_array(page_ranges).data(),
+    page_ranges.size());
 }
 
 bool PrintSettings::load_from_key_file(const Glib::KeyFile& key_file)
diff --git a/gtk/src/printsettings.hg b/gtk/src/printsettings.hg
index 514a0fd..e9b51f2 100644
--- a/gtk/src/printsettings.hg
+++ b/gtk/src/printsettings.hg
@@ -45,6 +45,20 @@ public:
   int end;
 };
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+struct PageRangeTraits
+{
+  using CppType       = PageRange;
+  using CType         = GtkPageRange;
+  using CTypeNonConst = GtkPageRange;
+
+  static CType   to_c_type      (CType c_obj)            { return c_obj; }
+  static void    release_c_type (CType)                  {}
+  static CType   to_c_type      (const CppType& cpp_obj) { CTypeNonConst c_obj = {cpp_obj.start, 
cpp_obj.end}; return c_obj; }
+  static CppType to_cpp_type    (CType c_obj)            { return CppType (c_obj.start, c_obj.end); }
+};
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
 /** A PrintSettings object represents the settings of a print dialog in a system-independent way.
  * The main use for this object is that once you've printed you can get a settings object that
  * represents the settings the user chose, and the next time you print you can pass that object


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]