+/**
+ * gtk_paper_size_new_from_key_file:
+ * @key_file: the #GKeyFile to retrieve the papersize from
+ * @group_name: the name ofthe group in the key file to read,
+ * or %NULL to read the first group
+ * @error: (allow-none): return location for an error, or %NULL
+ *
+ * Reads a paper size from the group @group_name in the key file
+ * @key_file.
+ *
+ * Returns: a new #GtkPaperSize object with the restored
+ * paper size, or %NULL if an error occurred
+ *
+ * Since: 2.12
+ */
+GtkPaperSize *
+gtk_paper_size_new_from_key_file (GKeyFile *key_file,
+ const gchar *group_name,
+ GError **error)
+{
+ GtkPaperSize *paper_size = NULL;
+ gchar *name = NULL;
+ gchar *ppd_name = NULL;
+ gchar *display_name = NULL;
+ gchar *freeme = NULL;
+ gdouble width, height;
+ GError *err = NULL;
+
+ g_return_val_if_fail (key_file != NULL, NULL);
+
+ if (!group_name)
+ group_name = freeme = g_key_file_get_start_group (key_file);
+ if (!group_name || !g_key_file_has_group (key_file, group_name))
+ {
+ g_set_error_literal (error,
+ GTK_PRINT_ERROR,
+ GTK_PRINT_ERROR_INVALID_FILE,
+ _("Not a valid page setup file"));
+ goto out;
+ }
+
+#define GET_DOUBLE(kf, group, name, v) \
+ v = g_key_file_get_double (kf, group, name, &err); \
+ if (err != NULL) \
+ {\
+ g_propagate_error (error, err);\
+ goto out;\
+ }
+
+ GET_DOUBLE (key_file, group_name, "Width", width);
+ GET_DOUBLE (key_file, group_name, "Height", height);
+
+#undef GET_DOUBLE
+
+ name = g_key_file_get_string (key_file, group_name,
+ "Name", NULL);
+ ppd_name = g_key_file_get_string (key_file, group_name,
+ "PPDName", NULL);
+ display_name = g_key_file_get_string (key_file, group_name,
+ "DisplayName", NULL);
+ /* Fallback for old ~/.gtk-custom-paper entries */
+ if (!display_name)
+ display_name = g_strdup (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
+ {
+ g_set_error_literal (error,
+ GTK_PRINT_ERROR,
+ GTK_PRINT_ERROR_INVALID_FILE,
+ _("Not a valid page setup file"));
+ goto out;
+ }
+
+ g_assert (paper_size != NULL);
+
+out:
+ g_free (ppd_name);
+ g_free (name);
+ g_free (display_name);
+ g_free (freeme);
+
+ return paper_size;
+}
+
+/**
+ * gtk_paper_size_to_key_file:
+ * @size: a #GtkPaperSize
+ * @key_file: the #GKeyFile to save the paper size to
+ * @group_name: the group to add the settings to in @key_file
+ *
+ * This function adds the paper size from @size to @key_file.
+ *
+ * Since: 2.12
+ */
+void
+gtk_paper_size_to_key_file (GtkPaperSize *size,
+ GKeyFile *key_file,
+ const gchar *group_name)
+{
+ const char *name, *ppd_name, *display_name;
+
+ g_return_if_fail (size != NULL);
+ g_return_if_fail (key_file != NULL);
+
+ name = gtk_paper_size_get_name (size);
+ display_name = gtk_paper_size_get_display_name (size);
+ ppd_name = gtk_paper_size_get_ppd_name (size);