[gtkmm] Gtk::PrintJob, PrintSettings: Use ArrayHandler where possible
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] Gtk::PrintJob, PrintSettings: Use ArrayHandler where possible
- Date: Fri, 17 Mar 2017 16:17:50 +0000 (UTC)
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]