From a3764e27a4b8b7bafc8ba431d6c841b9211e4aea Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 2 Jul 2016 20:29:08 -0400 Subject: [PATCH] print settings: Add api to serialize to a GVariant This will be useful for portalized print support. https://bugzilla.gnome.org/show_bug.cgi?id=768499 --- docs/reference/gtk/gtk3-sections.txt | 2 + gtk/gtkprintsettings.c | 65 ++++++++++++++++++++++++++++ gtk/gtkprintsettings.h | 6 +++ 3 files changed, 73 insertions(+) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 446aa32cbe..05d830f2dc 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -7269,10 +7269,12 @@ GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION gtk_print_settings_new_from_file gtk_print_settings_new_from_key_file +gtk_print_settings_new_from_gvariant gtk_print_settings_load_file gtk_print_settings_load_key_file gtk_print_settings_to_file gtk_print_settings_to_key_file +gtk_print_settings_to_gvariant GTK_TYPE_PRINT_SETTINGS diff --git a/gtk/gtkprintsettings.c b/gtk/gtkprintsettings.c index f2cf860184..63e8da9e60 100644 --- a/gtk/gtkprintsettings.c +++ b/gtk/gtkprintsettings.c @@ -1941,3 +1941,68 @@ gtk_print_settings_to_key_file (GtkPrintSettings *settings, (GtkPrintSettingsFunc) add_value_to_key_file, &data); } + +static void +add_to_variant (const gchar *key, + const gchar *value, + gpointer data) +{ + GVariantBuilder *builder = data; + g_variant_builder_add (builder, "{sv}", key, g_variant_new_string (value)); +} + +/** + * gtk_print_settings_to_gvariant: + * @settings: a #GtkPrintSettings + * + * Serialize print settings to an a{sv} variant. + * + * Returns: (transfer none): a new, floating, #GVariant + * + * Since: 3.22 + */ +GVariant * +gtk_print_settings_to_gvariant (GtkPrintSettings *settings) +{ + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + gtk_print_settings_foreach (settings, add_to_variant, &builder); + + return g_variant_builder_end (&builder); +} + +/** + * gtk_print_settings_new_from_gvariant: + * @variant: an a{sv} #GVariant + * + * Deserialize print settings from an a{sv} variant in + * the format produced by gtk_print_settings_to_gvariant(). + * + * Returns: (transfer full): a new #GtkPrintSettings object + * + * Since: 3.22 + */ +GtkPrintSettings * +gtk_print_settings_new_from_gvariant (GVariant *variant) +{ + GtkPrintSettings *settings; + int i; + + g_return_val_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE_VARDICT), NULL); + + settings = gtk_print_settings_new (); + + for (i = 0; i < g_variant_n_children (variant); i++) + { + const char *key; + GVariant *v; + + g_variant_get_child (variant, i, "{&sv}", &key, &v); + if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)) + gtk_print_settings_set (settings, key, g_variant_get_string (v, NULL)); + g_variant_unref (v); + } + + return settings; +} diff --git a/gtk/gtkprintsettings.h b/gtk/gtkprintsettings.h index fe47dd2644..d97b7a3b65 100644 --- a/gtk/gtkprintsettings.h +++ b/gtk/gtkprintsettings.h @@ -344,6 +344,12 @@ GDK_AVAILABLE_IN_ALL void gtk_print_settings_set_output_bin (GtkPrintSettings *settings, const gchar *output_bin); +GDK_AVAILABLE_IN_3_22 +GVariant *gtk_print_settings_to_gvariant (GtkPrintSettings *settings); +GDK_AVAILABLE_IN_3_22 +GtkPrintSettings *gtk_print_settings_new_from_gvariant (GVariant *variant); + + G_END_DECLS #endif /* __GTK_PRINT_SETTINGS_H__ */