[gtk+] Add api to serialize a GtkPaperSize to a GVariant



commit 42ae48a23e4f95f5c975890b4f3636102ebc40c4
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jul 6 21:31:49 2016 -0400

    Add api to serialize a GtkPaperSize to a GVariant
    
    This will be useful in portalized printing.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768499

 docs/reference/gtk/gtk3-sections.txt |    2 +
 gtk/gtkpapersize.c                   |   87 ++++++++++++++++++++++++++++++++++
 gtk/gtkpapersize.h                   |    5 ++
 3 files changed, 94 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 05d830f..9921b53 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -7323,7 +7323,9 @@ gtk_paper_size_get_default
 
 <SUBSECTION Serialization>
 gtk_paper_size_new_from_key_file
+gtk_paper_size_new_from_gvariant
 gtk_paper_size_to_key_file
+gtk_paper_size_to_gvariant
 
 <SUBSECTION Standard>
 GTK_TYPE_PAPER_SIZE
diff --git a/gtk/gtkpapersize.c b/gtk/gtkpapersize.c
index 278832e..c293ba2 100644
--- a/gtk/gtkpapersize.c
+++ b/gtk/gtkpapersize.c
@@ -1078,3 +1078,90 @@ gtk_paper_size_to_key_file (GtkPaperSize *size,
   g_key_file_set_double (key_file, group_name,
                          "Height", gtk_paper_size_get_height (size, GTK_UNIT_MM));
 }
+
+/**
+ * gtk_paper_size_to_gvariant:
+ * @paper_size: a #GtkPaperSize
+ *
+ * Serialize a paper size to an a{sv} variant.
+ *
+ * Returns: (transfer none): a new, floating, #GVariant
+ *
+ * Since: 3.22
+ */
+GVariant *
+gtk_paper_size_to_gvariant (GtkPaperSize *paper_size)
+{
+  const char *name;
+  const char *ppd_name;
+  const char *display_name;
+  GVariantBuilder builder;
+
+  g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+
+  name = gtk_paper_size_get_name (paper_size);
+  ppd_name = gtk_paper_size_get_ppd_name (paper_size);
+  display_name = gtk_paper_size_get_display_name (paper_size);
+
+  if (ppd_name != NULL)
+    g_variant_builder_add (&builder, "{sv}", "PPDName", g_variant_new_string (ppd_name));
+  else
+    g_variant_builder_add (&builder, "{sv}", "Name", g_variant_new_string (name));
+
+  if (display_name != NULL)
+    g_variant_builder_add (&builder, "{sv}", "DisplayName", g_variant_new_string (display_name));
+
+  g_variant_builder_add (&builder, "{sv}", "Width", g_variant_new_double (gtk_paper_size_get_width 
(paper_size, GTK_UNIT_MM)));
+  g_variant_builder_add (&builder, "{sv}", "Height", g_variant_new_double (gtk_paper_size_get_height 
(paper_size, GTK_UNIT_MM)));
+
+  return g_variant_builder_end (&builder);
+}
+
+/**
+ * gtk_paper_size_new_from_gvariant:
+ * @variant: an a{sv} #GVariant
+ *
+ * Deserialize a paper size from an a{sv} variant in
+ * the format produced by gtk_paper_size_to_gvariant().
+ *
+ * Returns: (transfer full): a new #GtkPaperSize object
+ *
+ * Since: 3.22
+ */
+GtkPaperSize *
+gtk_paper_size_new_from_gvariant (GVariant *variant)
+{
+  GtkPaperSize *paper_size;
+  const char *name;
+  const char *ppd_name;
+  const char *display_name;
+  gdouble width, height;
+
+  g_return_val_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARDICT), NULL);
+
+  if (!g_variant_lookup (variant, "Width", "d", &width) ||
+      !g_variant_lookup (variant, "Height", "d", &height))
+    return NULL;
+
+  if (!g_variant_lookup (variant, "Name", "&s", &name))
+    name = NULL;
+
+  if (!g_variant_lookup (variant, "PPDName", "&s", &ppd_name))
+    ppd_name = NULL;
+
+  if (!g_variant_lookup (variant, "DisplayName", "&s", &display_name))
+    display_name = name;
+
+  if (ppd_name != NULL)
+    paper_size = gtk_paper_size_new_from_ppd (ppd_name,
+                                              display_name,
+                                              _gtk_print_convert_from_mm (width, GTK_UNIT_POINTS),
+                                              _gtk_print_convert_from_mm (height, GTK_UNIT_POINTS));
+  else if (name != NULL)
+    paper_size = gtk_paper_size_new_custom (name, display_name,
+                                            width, height, GTK_UNIT_MM);
+  else
+    paper_size = NULL;
+
+  return paper_size;
+}
diff --git a/gtk/gtkpapersize.h b/gtk/gtkpapersize.h
index 24f8a2f..daa78e8 100644
--- a/gtk/gtkpapersize.h
+++ b/gtk/gtkpapersize.h
@@ -164,6 +164,11 @@ void     gtk_paper_size_to_key_file            (GtkPaperSize *size,
                                                GKeyFile     *key_file,
                                                const gchar  *group_name);
 
+GDK_AVAILABLE_IN_3_22
+GtkPaperSize *gtk_paper_size_new_from_gvariant (GVariant     *variant);
+GDK_AVAILABLE_IN_3_22
+GVariant     *gtk_paper_size_to_gvariant       (GtkPaperSize *size);
+
 G_END_DECLS
 
 #endif /* __GTK_PAPER_SIZE_H__ */


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