Learning_GTK4_tree/gtk/print/gtkprintsettings.c

1867 lines
45 KiB
C
Raw Permalink Normal View History

2023-12-12 11:36:42 +01:00
/* GTK - The GIMP Toolkit
* gtkprintsettings.c: Print Settings
* Copyright (C) 2006, Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <string.h>
#include <stdlib.h>
#include <glib/gprintf.h>
#include <gtk/gtk.h>
#include "gtkprintsettings.h"
#include "gtkprintutilsprivate.h"
/**
* GtkPrintSettings:
*
* A `GtkPrintSettings` object represents the settings of a print dialog in
* a system-independent way.
*
* The main use for this object is that once youve 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 in so that the user doesnt have
* to re-set all his settings.
*
* Its also possible to enumerate the settings so that you can easily save
* the settings for the next time your app runs, or even store them in a
* document. The predefined keys try to use shared values as much as possible
* so that moving such a document between systems still works.
*/
typedef struct _GtkPrintSettingsClass GtkPrintSettingsClass;
#define GTK_IS_PRINT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PRINT_SETTINGS))
#define GTK_PRINT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PRINT_SETTINGS, GtkPrintSettingsClass))
#define GTK_PRINT_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PRINT_SETTINGS, GtkPrintSettingsClass))
struct _GtkPrintSettings
{
GObject parent_instance;
GHashTable *hash;
};
struct _GtkPrintSettingsClass
{
GObjectClass parent_class;
};
#define KEYFILE_GROUP_NAME "Print Settings"
G_DEFINE_TYPE (GtkPrintSettings, gtk_print_settings, G_TYPE_OBJECT)
static void
gtk_print_settings_finalize (GObject *object)
{
GtkPrintSettings *settings = GTK_PRINT_SETTINGS (object);
g_hash_table_destroy (settings->hash);
G_OBJECT_CLASS (gtk_print_settings_parent_class)->finalize (object);
}
static void
gtk_print_settings_init (GtkPrintSettings *settings)
{
settings->hash = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_free);
}
static void
gtk_print_settings_class_init (GtkPrintSettingsClass *class)
{
GObjectClass *gobject_class = (GObjectClass *)class;
gobject_class->finalize = gtk_print_settings_finalize;
}
/**
* gtk_print_settings_new:
*
* Creates a new `GtkPrintSettings` object.
*
* Returns: a new `GtkPrintSettings` object
*/
GtkPrintSettings *
gtk_print_settings_new (void)
{
return g_object_new (GTK_TYPE_PRINT_SETTINGS, NULL);
}
static void
copy_hash_entry (gpointer key,
gpointer value,
gpointer user_data)
{
GtkPrintSettings *settings = user_data;
g_hash_table_insert (settings->hash,
g_strdup (key),
g_strdup (value));
}
/**
* gtk_print_settings_copy:
* @other: a `GtkPrintSettings`
*
* Copies a `GtkPrintSettings` object.
*
* Returns: (transfer full): a newly allocated copy of @other
*/
GtkPrintSettings *
gtk_print_settings_copy (GtkPrintSettings *other)
{
GtkPrintSettings *settings;
if (other == NULL)
return NULL;
g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (other), NULL);
settings = gtk_print_settings_new ();
g_hash_table_foreach (other->hash,
copy_hash_entry,
settings);
return settings;
}
/**
* gtk_print_settings_get:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Looks up the string value associated with @key.
*
* Returns: (nullable): the string value for @key
*/
const char *
gtk_print_settings_get (GtkPrintSettings *settings,
const char *key)
{
return g_hash_table_lookup (settings->hash, key);
}
/**
* gtk_print_settings_set:
* @settings: a `GtkPrintSettings`
* @key: a key
* @value: (nullable): a string value
*
* Associates @value with @key.
*/
void
gtk_print_settings_set (GtkPrintSettings *settings,
const char *key,
const char *value)
{
if (value == NULL)
gtk_print_settings_unset (settings, key);
else
g_hash_table_insert (settings->hash,
g_strdup (key),
g_strdup (value));
}
/**
* gtk_print_settings_unset:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Removes any value associated with @key.
*
* This has the same effect as setting the value to %NULL.
*/
void
gtk_print_settings_unset (GtkPrintSettings *settings,
const char *key)
{
g_hash_table_remove (settings->hash, key);
}
/**
* gtk_print_settings_has_key:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Returns %TRUE, if a value is associated with @key.
*
* Returns: %TRUE, if @key has a value
*/
gboolean
gtk_print_settings_has_key (GtkPrintSettings *settings,
const char *key)
{
return gtk_print_settings_get (settings, key) != NULL;
}
/**
* gtk_print_settings_get_bool:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Returns the boolean represented by the value
* that is associated with @key.
*
* The string true represents %TRUE, any other
* string %FALSE.
*
* Returns: %TRUE, if @key maps to a true value.
*/
gboolean
gtk_print_settings_get_bool (GtkPrintSettings *settings,
const char *key)
{
const char *val;
val = gtk_print_settings_get (settings, key);
if (g_strcmp0 (val, "true") == 0)
return TRUE;
return FALSE;
}
/**
* gtk_print_settings_get_bool_with_default:
* @settings: a `GtkPrintSettings`
* @key: a key
* @default_val: the default value
*
* Returns the boolean represented by the value
* that is associated with @key, or @default_val
* if the value does not represent a boolean.
*
* The string true represents %TRUE, the string
* false represents %FALSE.
*
* Returns: the boolean value associated with @key
*/
static gboolean
gtk_print_settings_get_bool_with_default (GtkPrintSettings *settings,
const char *key,
gboolean default_val)
{
const char *val;
val = gtk_print_settings_get (settings, key);
if (g_strcmp0 (val, "true") == 0)
return TRUE;
if (g_strcmp0 (val, "false") == 0)
return FALSE;
return default_val;
}
/**
* gtk_print_settings_set_bool:
* @settings: a `GtkPrintSettings`
* @key: a key
* @value: a boolean
*
* Sets @key to a boolean value.
*/
void
gtk_print_settings_set_bool (GtkPrintSettings *settings,
const char *key,
gboolean value)
{
if (value)
gtk_print_settings_set (settings, key, "true");
else
gtk_print_settings_set (settings, key, "false");
}
/**
* gtk_print_settings_get_double_with_default:
* @settings: a `GtkPrintSettings`
* @key: a key
* @def: the default value
*
* Returns the floating point number represented by
* the value that is associated with @key, or @default_val
* if the value does not represent a floating point number.
*
* Floating point numbers are parsed with g_ascii_strtod().
*
* Returns: the floating point number associated with @key
*/
double
gtk_print_settings_get_double_with_default (GtkPrintSettings *settings,
const char *key,
double def)
{
const char *val;
val = gtk_print_settings_get (settings, key);
if (val == NULL)
return def;
return g_ascii_strtod (val, NULL);
}
/**
* gtk_print_settings_get_double:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Returns the double value associated with @key, or 0.
*
* Returns: the double value of @key
*/
double
gtk_print_settings_get_double (GtkPrintSettings *settings,
const char *key)
{
return gtk_print_settings_get_double_with_default (settings, key, 0.0);
}
/**
* gtk_print_settings_set_double:
* @settings: a `GtkPrintSettings`
* @key: a key
* @value: a double value
*
* Sets @key to a double value.
*/
void
gtk_print_settings_set_double (GtkPrintSettings *settings,
const char *key,
double value)
{
char buf[G_ASCII_DTOSTR_BUF_SIZE];
g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, value);
gtk_print_settings_set (settings, key, buf);
}
/**
* gtk_print_settings_get_length:
* @settings: a `GtkPrintSettings`
* @key: a key
* @unit: the unit of the return value
*
* Returns the value associated with @key, interpreted
* as a length.
*
* The returned value is converted to @units.
*
* Returns: the length value of @key, converted to @unit
*/
double
gtk_print_settings_get_length (GtkPrintSettings *settings,
const char *key,
GtkUnit unit)
{
double length = gtk_print_settings_get_double (settings, key);
return _gtk_print_convert_from_mm (length, unit);
}
/**
* gtk_print_settings_set_length:
* @settings: a `GtkPrintSettings`
* @key: a key
* @value: a length
* @unit: the unit of @length
*
* Associates a length in units of @unit with @key.
*/
void
gtk_print_settings_set_length (GtkPrintSettings *settings,
const char *key,
double value,
GtkUnit unit)
{
gtk_print_settings_set_double (settings, key,
_gtk_print_convert_to_mm (value, unit));
}
/**
* gtk_print_settings_get_int_with_default:
* @settings: a `GtkPrintSettings`
* @key: a key
* @def: the default value
*
* Returns the value of @key, interpreted as
* an integer, or the default value.
*
* Returns: the integer value of @key
*/
int
gtk_print_settings_get_int_with_default (GtkPrintSettings *settings,
const char *key,
int def)
{
const char *val;
val = gtk_print_settings_get (settings, key);
if (val == NULL)
return def;
return atoi (val);
}
/**
* gtk_print_settings_get_int:
* @settings: a `GtkPrintSettings`
* @key: a key
*
* Returns the integer value of @key, or 0.
*
* Returns: the integer value of @key
*/
int
gtk_print_settings_get_int (GtkPrintSettings *settings,
const char *key)
{
return gtk_print_settings_get_int_with_default (settings, key, 0);
}
/**
* gtk_print_settings_set_int:
* @settings: a `GtkPrintSettings`
* @key: a key
* @value: an integer
*
* Sets @key to an integer value.
*/
void
gtk_print_settings_set_int (GtkPrintSettings *settings,
const char *key,
int value)
{
char buf[128];
g_sprintf (buf, "%d", value);
gtk_print_settings_set (settings, key, buf);
}
/**
* gtk_print_settings_foreach:
* @settings: a `GtkPrintSettings`
* @func: (scope call): the function to call
* @user_data: (closure): user data for @func
*
* Calls @func for each key-value pair of @settings.
*/
void
gtk_print_settings_foreach (GtkPrintSettings *settings,
GtkPrintSettingsFunc func,
gpointer user_data)
{
g_hash_table_foreach (settings->hash, (GHFunc)func, user_data);
}
/**
* gtk_print_settings_get_printer:
* @settings: a `GtkPrintSettings`
*
* Convenience function to obtain the value of
* %GTK_PRINT_SETTINGS_PRINTER.
*
* Returns: (nullable): the printer name
*/
const char *
gtk_print_settings_get_printer (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PRINTER);
}
/**
* gtk_print_settings_set_printer:
* @settings: a `GtkPrintSettings`
* @printer: the printer name
*
* Convenience function to set %GTK_PRINT_SETTINGS_PRINTER
* to @printer.
*/
void
gtk_print_settings_set_printer (GtkPrintSettings *settings,
const char *printer)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PRINTER, printer);
}
/**
* gtk_print_settings_get_orientation:
* @settings: a `GtkPrintSettings`
*
* Get the value of %GTK_PRINT_SETTINGS_ORIENTATION,
* converted to a `GtkPageOrientation`.
*
* Returns: the orientation
*/
GtkPageOrientation
gtk_print_settings_get_orientation (GtkPrintSettings *settings)
{
const char *val;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_ORIENTATION);
if (val == NULL || strcmp (val, "portrait") == 0)
return GTK_PAGE_ORIENTATION_PORTRAIT;
if (strcmp (val, "landscape") == 0)
return GTK_PAGE_ORIENTATION_LANDSCAPE;
if (strcmp (val, "reverse_portrait") == 0)
return GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT;
if (strcmp (val, "reverse_landscape") == 0)
return GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE;
return GTK_PAGE_ORIENTATION_PORTRAIT;
}
/**
* gtk_print_settings_set_orientation:
* @settings: a `GtkPrintSettings`
* @orientation: a page orientation
*
* Sets the value of %GTK_PRINT_SETTINGS_ORIENTATION.
*/
void
gtk_print_settings_set_orientation (GtkPrintSettings *settings,
GtkPageOrientation orientation)
{
const char *val;
switch (orientation)
{
case GTK_PAGE_ORIENTATION_LANDSCAPE:
val = "landscape";
break;
default:
case GTK_PAGE_ORIENTATION_PORTRAIT:
val = "portrait";
break;
case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE:
val = "reverse_landscape";
break;
case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT:
val = "reverse_portrait";
break;
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_ORIENTATION, val);
}
/**
* gtk_print_settings_get_paper_size:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_PAPER_FORMAT,
* converted to a `GtkPaperSize`.
*
* Returns: (nullable): the paper size
*/
GtkPaperSize *
gtk_print_settings_get_paper_size (GtkPrintSettings *settings)
{
const char *val;
const char *name;
double w, h;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PAPER_FORMAT);
if (val == NULL)
return NULL;
if (g_str_has_prefix (val, "custom-"))
{
name = val + strlen ("custom-");
w = gtk_print_settings_get_paper_width (settings, GTK_UNIT_MM);
h = gtk_print_settings_get_paper_height (settings, GTK_UNIT_MM);
return gtk_paper_size_new_custom (name, name, w, h, GTK_UNIT_MM);
}
return gtk_paper_size_new (val);
}
/**
* gtk_print_settings_set_paper_size:
* @settings: a `GtkPrintSettings`
* @paper_size: a paper size
*
* Sets the value of %GTK_PRINT_SETTINGS_PAPER_FORMAT,
* %GTK_PRINT_SETTINGS_PAPER_WIDTH and
* %GTK_PRINT_SETTINGS_PAPER_HEIGHT.
*/
void
gtk_print_settings_set_paper_size (GtkPrintSettings *settings,
GtkPaperSize *paper_size)
{
char *custom_name;
if (paper_size == NULL)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAPER_FORMAT, NULL);
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAPER_WIDTH, NULL);
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAPER_HEIGHT, NULL);
}
else if (gtk_paper_size_is_custom (paper_size))
{
custom_name = g_strdup_printf ("custom-%s",
gtk_paper_size_get_name (paper_size));
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAPER_FORMAT, custom_name);
g_free (custom_name);
gtk_print_settings_set_paper_width (settings,
gtk_paper_size_get_width (paper_size,
GTK_UNIT_MM),
GTK_UNIT_MM);
gtk_print_settings_set_paper_height (settings,
gtk_paper_size_get_height (paper_size,
GTK_UNIT_MM),
GTK_UNIT_MM);
}
else
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAPER_FORMAT,
gtk_paper_size_get_name (paper_size));
}
/**
* gtk_print_settings_get_paper_width:
* @settings: a `GtkPrintSettings`
* @unit: the unit for the return value
*
* Gets the value of %GTK_PRINT_SETTINGS_PAPER_WIDTH,
* converted to @unit.
*
* Returns: the paper width, in units of @unit
*/
double
gtk_print_settings_get_paper_width (GtkPrintSettings *settings,
GtkUnit unit)
{
return gtk_print_settings_get_length (settings, GTK_PRINT_SETTINGS_PAPER_WIDTH, unit);
}
/**
* gtk_print_settings_set_paper_width:
* @settings: a `GtkPrintSettings`
* @width: the paper width
* @unit: the units of @width
*
* Sets the value of %GTK_PRINT_SETTINGS_PAPER_WIDTH.
*/
void
gtk_print_settings_set_paper_width (GtkPrintSettings *settings,
double width,
GtkUnit unit)
{
gtk_print_settings_set_length (settings, GTK_PRINT_SETTINGS_PAPER_WIDTH, width, unit);
}
/**
* gtk_print_settings_get_paper_height:
* @settings: a `GtkPrintSettings`
* @unit: the unit for the return value
*
* Gets the value of %GTK_PRINT_SETTINGS_PAPER_HEIGHT,
* converted to @unit.
*
* Returns: the paper height, in units of @unit
*/
double
gtk_print_settings_get_paper_height (GtkPrintSettings *settings,
GtkUnit unit)
{
return gtk_print_settings_get_length (settings,
GTK_PRINT_SETTINGS_PAPER_HEIGHT,
unit);
}
/**
* gtk_print_settings_set_paper_height:
* @settings: a `GtkPrintSettings`
* @height: the paper height
* @unit: the units of @height
*
* Sets the value of %GTK_PRINT_SETTINGS_PAPER_HEIGHT.
*/
void
gtk_print_settings_set_paper_height (GtkPrintSettings *settings,
double height,
GtkUnit unit)
{
gtk_print_settings_set_length (settings,
GTK_PRINT_SETTINGS_PAPER_HEIGHT,
height, unit);
}
/**
* gtk_print_settings_get_use_color:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_USE_COLOR.
*
* Returns: whether to use color
*/
gboolean
gtk_print_settings_get_use_color (GtkPrintSettings *settings)
{
return gtk_print_settings_get_bool_with_default (settings,
GTK_PRINT_SETTINGS_USE_COLOR,
TRUE);
}
/**
* gtk_print_settings_set_use_color:
* @settings: a `GtkPrintSettings`
* @use_color: whether to use color
*
* Sets the value of %GTK_PRINT_SETTINGS_USE_COLOR.
*/
void
gtk_print_settings_set_use_color (GtkPrintSettings *settings,
gboolean use_color)
{
gtk_print_settings_set_bool (settings,
GTK_PRINT_SETTINGS_USE_COLOR,
use_color);
}
/**
* gtk_print_settings_get_collate:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_COLLATE.
*
* Returns: whether to collate the printed pages
*/
gboolean
gtk_print_settings_get_collate (GtkPrintSettings *settings)
{
return gtk_print_settings_get_bool_with_default (settings,
GTK_PRINT_SETTINGS_COLLATE,
TRUE);
}
/**
* gtk_print_settings_set_collate:
* @settings: a `GtkPrintSettings`
* @collate: whether to collate the output
*
* Sets the value of %GTK_PRINT_SETTINGS_COLLATE.
*/
void
gtk_print_settings_set_collate (GtkPrintSettings *settings,
gboolean collate)
{
gtk_print_settings_set_bool (settings,
GTK_PRINT_SETTINGS_COLLATE,
collate);
}
/**
* gtk_print_settings_get_reverse:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_REVERSE.
*
* Returns: whether to reverse the order of the printed pages
*/
gboolean
gtk_print_settings_get_reverse (GtkPrintSettings *settings)
{
return gtk_print_settings_get_bool (settings,
GTK_PRINT_SETTINGS_REVERSE);
}
/**
* gtk_print_settings_set_reverse:
* @settings: a `GtkPrintSettings`
* @reverse: whether to reverse the output
*
* Sets the value of %GTK_PRINT_SETTINGS_REVERSE.
*/
void
gtk_print_settings_set_reverse (GtkPrintSettings *settings,
gboolean reverse)
{
gtk_print_settings_set_bool (settings,
GTK_PRINT_SETTINGS_REVERSE,
reverse);
}
/**
* gtk_print_settings_get_duplex:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_DUPLEX.
*
* Returns: whether to print the output in duplex.
*/
GtkPrintDuplex
gtk_print_settings_get_duplex (GtkPrintSettings *settings)
{
const char *val;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_DUPLEX);
if (val == NULL || (strcmp (val, "simplex") == 0))
return GTK_PRINT_DUPLEX_SIMPLEX;
if (strcmp (val, "horizontal") == 0)
return GTK_PRINT_DUPLEX_HORIZONTAL;
if (strcmp (val, "vertical") == 0)
return GTK_PRINT_DUPLEX_VERTICAL;
return GTK_PRINT_DUPLEX_SIMPLEX;
}
/**
* gtk_print_settings_set_duplex:
* @settings: a `GtkPrintSettings`
* @duplex: a `GtkPrintDuplex` value
*
* Sets the value of %GTK_PRINT_SETTINGS_DUPLEX.
*/
void
gtk_print_settings_set_duplex (GtkPrintSettings *settings,
GtkPrintDuplex duplex)
{
const char *str;
switch (duplex)
{
default:
case GTK_PRINT_DUPLEX_SIMPLEX:
str = "simplex";
break;
case GTK_PRINT_DUPLEX_HORIZONTAL:
str = "horizontal";
break;
case GTK_PRINT_DUPLEX_VERTICAL:
str = "vertical";
break;
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_DUPLEX, str);
}
/**
* gtk_print_settings_get_quality:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_QUALITY.
*
* Returns: the print quality
*/
GtkPrintQuality
gtk_print_settings_get_quality (GtkPrintSettings *settings)
{
const char *val;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_QUALITY);
if (val == NULL || (strcmp (val, "normal") == 0))
return GTK_PRINT_QUALITY_NORMAL;
if (strcmp (val, "high") == 0)
return GTK_PRINT_QUALITY_HIGH;
if (strcmp (val, "low") == 0)
return GTK_PRINT_QUALITY_LOW;
if (strcmp (val, "draft") == 0)
return GTK_PRINT_QUALITY_DRAFT;
return GTK_PRINT_QUALITY_NORMAL;
}
/**
* gtk_print_settings_set_quality:
* @settings: a `GtkPrintSettings`
* @quality: a `GtkPrintQuality` value
*
* Sets the value of %GTK_PRINT_SETTINGS_QUALITY.
*/
void
gtk_print_settings_set_quality (GtkPrintSettings *settings,
GtkPrintQuality quality)
{
const char *str;
switch (quality)
{
default:
case GTK_PRINT_QUALITY_NORMAL:
str = "normal";
break;
case GTK_PRINT_QUALITY_HIGH:
str = "high";
break;
case GTK_PRINT_QUALITY_LOW:
str = "low";
break;
case GTK_PRINT_QUALITY_DRAFT:
str = "draft";
break;
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_QUALITY, str);
}
/**
* gtk_print_settings_get_page_set:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_PAGE_SET.
*
* Returns: the set of pages to print
*/
GtkPageSet
gtk_print_settings_get_page_set (GtkPrintSettings *settings)
{
const char *val;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PAGE_SET);
if (val == NULL || (strcmp (val, "all") == 0))
return GTK_PAGE_SET_ALL;
if (strcmp (val, "even") == 0)
return GTK_PAGE_SET_EVEN;
if (strcmp (val, "odd") == 0)
return GTK_PAGE_SET_ODD;
return GTK_PAGE_SET_ALL;
}
/**
* gtk_print_settings_set_page_set:
* @settings: a `GtkPrintSettings`
* @page_set: a `GtkPageSet` value
*
* Sets the value of %GTK_PRINT_SETTINGS_PAGE_SET.
*/
void
gtk_print_settings_set_page_set (GtkPrintSettings *settings,
GtkPageSet page_set)
{
const char *str;
switch (page_set)
{
default:
case GTK_PAGE_SET_ALL:
str = "all";
break;
case GTK_PAGE_SET_EVEN:
str = "even";
break;
case GTK_PAGE_SET_ODD:
str = "odd";
break;
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAGE_SET, str);
}
/**
* gtk_print_settings_get_number_up_layout:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT.
*
* Returns: layout of page in number-up mode
*/
GtkNumberUpLayout
gtk_print_settings_get_number_up_layout (GtkPrintSettings *settings)
{
GtkNumberUpLayout layout;
GtkTextDirection text_direction;
GEnumClass *enum_class;
GEnumValue *enum_value;
const char *val;
g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings), GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM);
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT);
text_direction = gtk_widget_get_default_direction ();
if (text_direction == GTK_TEXT_DIR_LTR)
layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
else
layout = GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM;
if (val == NULL)
return layout;
enum_class = g_type_class_ref (GTK_TYPE_NUMBER_UP_LAYOUT);
enum_value = g_enum_get_value_by_nick (enum_class, val);
if (enum_value)
layout = enum_value->value;
g_type_class_unref (enum_class);
return layout;
}
/**
* gtk_print_settings_set_number_up_layout:
* @settings: a `GtkPrintSettings`
* @number_up_layout: a `GtkNumberUpLayout` value
*
* Sets the value of %GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT.
*/
void
gtk_print_settings_set_number_up_layout (GtkPrintSettings *settings,
GtkNumberUpLayout number_up_layout)
{
GEnumClass *enum_class;
GEnumValue *enum_value;
g_return_if_fail (GTK_IS_PRINT_SETTINGS (settings));
enum_class = g_type_class_ref (GTK_TYPE_NUMBER_UP_LAYOUT);
enum_value = g_enum_get_value (enum_class, number_up_layout);
g_return_if_fail (enum_value != NULL);
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, enum_value->value_nick);
g_type_class_unref (enum_class);
}
/**
* gtk_print_settings_get_n_copies:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_N_COPIES.
*
* Returns: the number of copies to print
*/
int
gtk_print_settings_get_n_copies (GtkPrintSettings *settings)
{
return gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_N_COPIES, 1);
}
/**
* gtk_print_settings_set_n_copies:
* @settings: a `GtkPrintSettings`
* @num_copies: the number of copies
*
* Sets the value of %GTK_PRINT_SETTINGS_N_COPIES.
*/
void
gtk_print_settings_set_n_copies (GtkPrintSettings *settings,
int num_copies)
{
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_N_COPIES,
num_copies);
}
/**
* gtk_print_settings_get_number_up:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_NUMBER_UP.
*
* Returns: the number of pages per sheet
*/
int
gtk_print_settings_get_number_up (GtkPrintSettings *settings)
{
return gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_NUMBER_UP, 1);
}
/**
* gtk_print_settings_set_number_up:
* @settings: a `GtkPrintSettings`
* @number_up: the number of pages per sheet
*
* Sets the value of %GTK_PRINT_SETTINGS_NUMBER_UP.
*/
void
gtk_print_settings_set_number_up (GtkPrintSettings *settings,
int number_up)
{
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_NUMBER_UP,
number_up);
}
/**
* gtk_print_settings_get_resolution:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_RESOLUTION.
*
* Returns: the resolution in dpi
*/
int
gtk_print_settings_get_resolution (GtkPrintSettings *settings)
{
return gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION, 300);
}
/**
* gtk_print_settings_set_resolution:
* @settings: a `GtkPrintSettings`
* @resolution: the resolution in dpi
*
* Sets the values of %GTK_PRINT_SETTINGS_RESOLUTION,
* %GTK_PRINT_SETTINGS_RESOLUTION_X and
* %GTK_PRINT_SETTINGS_RESOLUTION_Y.
*/
void
gtk_print_settings_set_resolution (GtkPrintSettings *settings,
int resolution)
{
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION,
resolution);
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION_X,
resolution);
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y,
resolution);
}
/**
* gtk_print_settings_get_resolution_x:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_RESOLUTION_X.
*
* Returns: the horizontal resolution in dpi
*/
int
gtk_print_settings_get_resolution_x (GtkPrintSettings *settings)
{
return gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_X, 300);
}
/**
* gtk_print_settings_get_resolution_y:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_RESOLUTION_Y.
*
* Returns: the vertical resolution in dpi
*/
int
gtk_print_settings_get_resolution_y (GtkPrintSettings *settings)
{
return gtk_print_settings_get_int_with_default (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y, 300);
}
/**
* gtk_print_settings_set_resolution_xy:
* @settings: a `GtkPrintSettings`
* @resolution_x: the horizontal resolution in dpi
* @resolution_y: the vertical resolution in dpi
*
* Sets the values of %GTK_PRINT_SETTINGS_RESOLUTION,
* %GTK_PRINT_SETTINGS_RESOLUTION_X and
* %GTK_PRINT_SETTINGS_RESOLUTION_Y.
*/
void
gtk_print_settings_set_resolution_xy (GtkPrintSettings *settings,
int resolution_x,
int resolution_y)
{
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION_X,
resolution_x);
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION_Y,
resolution_y);
gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_RESOLUTION,
resolution_x);
}
/**
* gtk_print_settings_get_printer_lpi:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_PRINTER_LPI.
*
* Returns: the resolution in lpi (lines per inch)
*/
double
gtk_print_settings_get_printer_lpi (GtkPrintSettings *settings)
{
return gtk_print_settings_get_double_with_default (settings, GTK_PRINT_SETTINGS_PRINTER_LPI, 150.0);
}
/**
* gtk_print_settings_set_printer_lpi:
* @settings: a `GtkPrintSettings`
* @lpi: the resolution in lpi (lines per inch)
*
* Sets the value of %GTK_PRINT_SETTINGS_PRINTER_LPI.
*/
void
gtk_print_settings_set_printer_lpi (GtkPrintSettings *settings,
double lpi)
{
gtk_print_settings_set_double (settings, GTK_PRINT_SETTINGS_PRINTER_LPI,
lpi);
}
/**
* gtk_print_settings_get_scale:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_SCALE.
*
* Returns: the scale in percent
*/
double
gtk_print_settings_get_scale (GtkPrintSettings *settings)
{
return gtk_print_settings_get_double_with_default (settings,
GTK_PRINT_SETTINGS_SCALE,
100.0);
}
/**
* gtk_print_settings_set_scale:
* @settings: a `GtkPrintSettings`
* @scale: the scale in percent
*
* Sets the value of %GTK_PRINT_SETTINGS_SCALE.
*/
void
gtk_print_settings_set_scale (GtkPrintSettings *settings,
double scale)
{
gtk_print_settings_set_double (settings, GTK_PRINT_SETTINGS_SCALE,
scale);
}
/**
* gtk_print_settings_get_print_pages:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_PRINT_PAGES.
*
* Returns: which pages to print
*/
GtkPrintPages
gtk_print_settings_get_print_pages (GtkPrintSettings *settings)
{
const char *val;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PRINT_PAGES);
if (val == NULL || (strcmp (val, "all") == 0))
return GTK_PRINT_PAGES_ALL;
if (strcmp (val, "selection") == 0)
return GTK_PRINT_PAGES_SELECTION;
if (strcmp (val, "current") == 0)
return GTK_PRINT_PAGES_CURRENT;
if (strcmp (val, "ranges") == 0)
return GTK_PRINT_PAGES_RANGES;
return GTK_PRINT_PAGES_ALL;
}
/**
* gtk_print_settings_set_print_pages:
* @settings: a `GtkPrintSettings`
* @pages: a `GtkPrintPages` value
*
* Sets the value of %GTK_PRINT_SETTINGS_PRINT_PAGES.
*/
void
gtk_print_settings_set_print_pages (GtkPrintSettings *settings,
GtkPrintPages pages)
{
const char *str;
switch (pages)
{
default:
case GTK_PRINT_PAGES_ALL:
str = "all";
break;
case GTK_PRINT_PAGES_CURRENT:
str = "current";
break;
case GTK_PRINT_PAGES_SELECTION:
str = "selection";
break;
case GTK_PRINT_PAGES_RANGES:
str = "ranges";
break;
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PRINT_PAGES, str);
}
/**
* gtk_print_settings_get_page_ranges:
* @settings: a `GtkPrintSettings`
* @num_ranges: (out): return location for the length of the returned array
*
* Gets the value of %GTK_PRINT_SETTINGS_PAGE_RANGES.
*
* Returns: (array length=num_ranges) (transfer full): an array
* of `GtkPageRange`s. Use g_free() to free the array when
* it is no longer needed.
*/
GtkPageRange *
gtk_print_settings_get_page_ranges (GtkPrintSettings *settings,
int *num_ranges)
{
const char *val;
char **range_strs;
GtkPageRange *ranges;
int i, n;
val = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PAGE_RANGES);
if (val == NULL)
{
*num_ranges = 0;
return NULL;
}
range_strs = g_strsplit (val, ",", 0);
for (i = 0; range_strs[i] != NULL; i++)
;
n = i;
ranges = g_new0 (GtkPageRange, n);
for (i = 0; i < n; i++)
{
int start, end;
char *str;
start = (int)strtol (range_strs[i], &str, 10);
end = start;
if (*str == '-')
{
str++;
end = (int)strtol (str, NULL, 10);
}
ranges[i].start = start;
ranges[i].end = end;
}
g_strfreev (range_strs);
*num_ranges = n;
return ranges;
}
/**
* gtk_print_settings_set_page_ranges:
* @settings: a `GtkPrintSettings`
* @page_ranges: (array length=num_ranges): an array of `GtkPageRange`s
* @num_ranges: the length of @page_ranges
*
* Sets the value of %GTK_PRINT_SETTINGS_PAGE_RANGES.
*/
void
gtk_print_settings_set_page_ranges (GtkPrintSettings *settings,
GtkPageRange *page_ranges,
int num_ranges)
{
GString *s;
int i;
s = g_string_new ("");
for (i = 0; i < num_ranges; i++)
{
if (page_ranges[i].start == page_ranges[i].end)
g_string_append_printf (s, "%d", page_ranges[i].start);
else
g_string_append_printf (s, "%d-%d",
page_ranges[i].start,
page_ranges[i].end);
if (i < num_ranges - 1)
g_string_append (s, ",");
}
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_PAGE_RANGES,
s->str);
g_string_free (s, TRUE);
}
/**
* gtk_print_settings_get_default_source:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_DEFAULT_SOURCE.
*
* Returns: (nullable): the default source
*/
const char *
gtk_print_settings_get_default_source (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_DEFAULT_SOURCE);
}
/**
* gtk_print_settings_set_default_source:
* @settings: a `GtkPrintSettings`
* @default_source: the default source
*
* Sets the value of %GTK_PRINT_SETTINGS_DEFAULT_SOURCE.
*/
void
gtk_print_settings_set_default_source (GtkPrintSettings *settings,
const char *default_source)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_DEFAULT_SOURCE, default_source);
}
/**
* gtk_print_settings_get_media_type:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_MEDIA_TYPE.
*
* The set of media types is defined in PWG 5101.1-2002 PWG.
*
* Returns: (nullable): the media type
*/
const char *
gtk_print_settings_get_media_type (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_MEDIA_TYPE);
}
/**
* gtk_print_settings_set_media_type:
* @settings: a `GtkPrintSettings`
* @media_type: the media type
*
* Sets the value of %GTK_PRINT_SETTINGS_MEDIA_TYPE.
*
* The set of media types is defined in PWG 5101.1-2002 PWG.
*/
void
gtk_print_settings_set_media_type (GtkPrintSettings *settings,
const char *media_type)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_MEDIA_TYPE, media_type);
}
/**
* gtk_print_settings_get_dither:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_DITHER.
*
* Returns: (nullable): the dithering that is used
*/
const char *
gtk_print_settings_get_dither (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_DITHER);
}
/**
* gtk_print_settings_set_dither:
* @settings: a `GtkPrintSettings`
* @dither: the dithering that is used
*
* Sets the value of %GTK_PRINT_SETTINGS_DITHER.
*/
void
gtk_print_settings_set_dither (GtkPrintSettings *settings,
const char *dither)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_DITHER, dither);
}
/**
* gtk_print_settings_get_finishings:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_FINISHINGS.
*
* Returns: (nullable): the finishings
*/
const char *
gtk_print_settings_get_finishings (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_FINISHINGS);
}
/**
* gtk_print_settings_set_finishings:
* @settings: a `GtkPrintSettings`
* @finishings: the finishings
*
* Sets the value of %GTK_PRINT_SETTINGS_FINISHINGS.
*/
void
gtk_print_settings_set_finishings (GtkPrintSettings *settings,
const char *finishings)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_FINISHINGS, finishings);
}
/**
* gtk_print_settings_get_output_bin:
* @settings: a `GtkPrintSettings`
*
* Gets the value of %GTK_PRINT_SETTINGS_OUTPUT_BIN.
*
* Returns: (nullable): the output bin
*/
const char *
gtk_print_settings_get_output_bin (GtkPrintSettings *settings)
{
return gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_BIN);
}
/**
* gtk_print_settings_set_output_bin:
* @settings: a `GtkPrintSettings`
* @output_bin: the output bin
*
* Sets the value of %GTK_PRINT_SETTINGS_OUTPUT_BIN.
*/
void
gtk_print_settings_set_output_bin (GtkPrintSettings *settings,
const char *output_bin)
{
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_BIN, output_bin);
}
/**
* gtk_print_settings_load_file:
* @settings: a `GtkPrintSettings`
* @file_name: (type filename): the filename to read the settings from
* @error: (nullable): return location for errors
*
* Reads the print settings from @file_name.
*
* If the file could not be loaded then error is set to either
* a `GFileError` or `GKeyFileError`.
*
* See [method@Gtk.PrintSettings.to_file].
*
* Returns: %TRUE on success
*/
gboolean
gtk_print_settings_load_file (GtkPrintSettings *settings,
const char *file_name,
GError **error)
{
gboolean retval = FALSE;
GKeyFile *key_file;
g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings), FALSE);
g_return_val_if_fail (file_name != NULL, FALSE);
key_file = g_key_file_new ();
if (g_key_file_load_from_file (key_file, file_name, 0, error) &&
gtk_print_settings_load_key_file (settings, key_file, NULL, error))
retval = TRUE;
g_key_file_free (key_file);
return retval;
}
/**
* gtk_print_settings_new_from_file:
* @file_name: (type filename): the filename to read the settings from
* @error: (nullable): return location for errors
*
* Reads the print settings from @file_name.
*
* Returns a new `GtkPrintSettings` object with the restored settings,
* or %NULL if an error occurred. If the file could not be loaded then
* error is set to either a `GFileError` or `GKeyFileError`.
*
* See [method@Gtk.PrintSettings.to_file].
*
* Returns: the restored `GtkPrintSettings`
*/
GtkPrintSettings *
gtk_print_settings_new_from_file (const char *file_name,
GError **error)
{
GtkPrintSettings *settings = gtk_print_settings_new ();
if (!gtk_print_settings_load_file (settings, file_name, error))
{
g_object_unref (settings);
settings = NULL;
}
return settings;
}
/**
* gtk_print_settings_load_key_file:
* @settings: a `GtkPrintSettings`
* @key_file: the `GKeyFile` to retrieve the settings from
* @group_name: (nullable): the name of the group to use, or %NULL
* to use the default Print Settings
* @error: (nullable): return location for errors
*
* Reads the print settings from the group @group_name in @key_file.
*
* If the file could not be loaded then error is set to either a
* `GFileError` or `GKeyFileError`.
*
* Returns: %TRUE on success
*/
gboolean
gtk_print_settings_load_key_file (GtkPrintSettings *settings,
GKeyFile *key_file,
const char *group_name,
GError **error)
{
char **keys;
gsize n_keys, i;
GError *err = NULL;
g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings), FALSE);
g_return_val_if_fail (key_file != NULL, FALSE);
if (!group_name)
group_name = KEYFILE_GROUP_NAME;
keys = g_key_file_get_keys (key_file,
group_name,
&n_keys,
&err);
if (err != NULL)
{
g_propagate_error (error, err);
return FALSE;
}
for (i = 0 ; i < n_keys; ++i)
{
char *value;
value = g_key_file_get_string (key_file,
group_name,
keys[i],
NULL);
if (!value)
continue;
gtk_print_settings_set (settings, keys[i], value);
g_free (value);
}
g_strfreev (keys);
return TRUE;
}
/**
* gtk_print_settings_new_from_key_file:
* @key_file: the `GKeyFile` to retrieve the settings from
* @group_name: (nullable): the name of the group to use, or %NULL to use
* the default Print Settings
* @error: (nullable): return location for errors
*
* Reads the print settings from the group @group_name in @key_file.
*
* Returns a new `GtkPrintSettings` object with the restored settings,
* or %NULL if an error occurred. If the file could not be loaded then
* error is set to either `GFileError` or `GKeyFileError`.
*
* Returns: the restored `GtkPrintSettings`
*/
GtkPrintSettings *
gtk_print_settings_new_from_key_file (GKeyFile *key_file,
const char *group_name,
GError **error)
{
GtkPrintSettings *settings = gtk_print_settings_new ();
if (!gtk_print_settings_load_key_file (settings, key_file,
group_name, error))
{
g_object_unref (settings);
settings = NULL;
}
return settings;
}
/**
* gtk_print_settings_to_file:
* @settings: a `GtkPrintSettings`
* @file_name: (type filename): the file to save to
* @error: (nullable): return location for errors
*
* This function saves the print settings from @settings to @file_name.
*
* If the file could not be written then error is set to either a
* `GFileError` or `GKeyFileError`.
*
* Returns: %TRUE on success
*/
gboolean
gtk_print_settings_to_file (GtkPrintSettings *settings,
const char *file_name,
GError **error)
{
GKeyFile *key_file;
gboolean retval = FALSE;
char *data = NULL;
gsize len;
GError *err = NULL;
g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings), FALSE);
g_return_val_if_fail (file_name != NULL, FALSE);
key_file = g_key_file_new ();
gtk_print_settings_to_key_file (settings, key_file, NULL);
data = g_key_file_to_data (key_file, &len, &err);
if (!data)
goto out;
retval = g_file_set_contents (file_name, data, len, &err);
out:
if (err != NULL)
g_propagate_error (error, err);
g_key_file_free (key_file);
g_free (data);
return retval;
}
typedef struct {
GKeyFile *key_file;
const char *group_name;
} SettingsData;
static void
add_value_to_key_file (const char *key,
const char *value,
SettingsData *data)
{
g_key_file_set_string (data->key_file, data->group_name, key, value);
}
/**
* gtk_print_settings_to_key_file:
* @settings: a `GtkPrintSettings`
* @key_file: the `GKeyFile` to save the print settings to
* @group_name: (nullable): the group to add the settings to in @key_file, or
* %NULL to use the default Print Settings
*
* This function adds the print settings from @settings to @key_file.
*/
void
gtk_print_settings_to_key_file (GtkPrintSettings *settings,
GKeyFile *key_file,
const char *group_name)
{
SettingsData data;
g_return_if_fail (GTK_IS_PRINT_SETTINGS (settings));
g_return_if_fail (key_file != NULL);
if (!group_name)
group_name = KEYFILE_GROUP_NAME;
data.key_file = key_file;
data.group_name = group_name;
gtk_print_settings_foreach (settings,
(GtkPrintSettingsFunc) add_value_to_key_file,
&data);
}
static void
add_to_variant (const char *key,
const char *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`
*/
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.
*
* The variant must be in the format produced by
* [method@Gtk.PrintSettings.to_gvariant].
*
* Returns: (transfer full): a new `GtkPrintSettings` object
*/
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;
}