1
/* GIMP - The GNU Image Manipulation Program
2
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
#define PRINT_SETTINGS_MAJOR_VERSION 0
20
#define PRINT_SETTINGS_MINOR_VERSION 2
24
#include <libgimp/gimp.h>
25
#include <libgimp/gimpui.h>
28
#include "print-settings.h"
31
static GKeyFile * print_settings_key_file_from_settings (PrintData *data);
33
static void save_print_settings_resource_file (GKeyFile *settings_key_file);
35
static void save_print_settings_as_parasite (GKeyFile *settings_key_file,
38
static void add_print_setting_to_key_file (const gchar *key,
42
static GKeyFile * print_settings_key_file_from_resource_file (void);
44
static GKeyFile * print_settings_key_file_from_parasite (gint32 image_ID);
46
static gboolean load_print_settings_from_key_file (PrintData *data,
49
static GKeyFile * check_version (GKeyFile *key_file);
52
* set GtkPrintSettings from the contents of a "print-settings"
53
* image parasite, or, if none exists, from a resource
54
* file of the same name
57
load_print_settings (PrintData *data)
61
key_file = print_settings_key_file_from_parasite (data->image_id);
64
key_file = print_settings_key_file_from_resource_file ();
68
load_print_settings_from_key_file (data, key_file);
69
g_key_file_free (key_file);
77
* save all settings as a resource file "print-settings"
78
* and as an image parasite
81
save_print_settings (PrintData *data)
85
key_file = print_settings_key_file_from_settings (data);
87
save_print_settings_resource_file (key_file);
90
g_key_file_set_integer (key_file, "image-setup", "unit", data->unit);
91
g_key_file_set_double (key_file, "image-setup", "x-resolution", data->xres);
92
g_key_file_set_double (key_file, "image-setup", "y-resolution", data->yres);
94
save_print_settings_as_parasite (key_file, data->image_id);
96
g_key_file_free (key_file);
100
* serialize print settings into a GKeyFile
103
print_settings_key_file_from_settings (PrintData *data)
105
GtkPrintOperation *operation = data->operation;
106
GtkPrintSettings *settings;
107
GKeyFile *key_file = g_key_file_new ();
108
GtkPageSetup *page_setup;
110
g_key_file_set_list_separator (key_file, '=');
112
/* put version information into the file */
113
g_key_file_set_integer (key_file, "meta", "major-version",
114
PRINT_SETTINGS_MAJOR_VERSION);
115
g_key_file_set_integer (key_file, "meta", "minor-version",
116
PRINT_SETTINGS_MINOR_VERSION);
118
/* save the contents of the GtkPrintSettings for the operation */
119
settings = gtk_print_operation_get_print_settings (operation);
122
gtk_print_settings_foreach (settings, add_print_setting_to_key_file,
127
page_setup = gtk_print_operation_get_default_page_setup (operation);
130
GtkPageOrientation orientation;
132
orientation = gtk_page_setup_get_orientation (page_setup);
133
g_key_file_set_integer (key_file, "page-setup", "orientation",
139
g_key_file_set_boolean (key_file, "other-settings", "show-header",
140
data->show_info_header);
147
* create a resource file from a GKeyFile holding the settings
150
save_print_settings_resource_file (GKeyFile *settings_key_file)
155
GError *error = NULL;
157
contents = g_key_file_to_data (settings_key_file, &length, &error);
160
g_warning ("Unable to get contents of settings key file: %s",
162
g_error_free (error);
166
filename = g_build_filename (gimp_directory (), "print-settings", NULL);
168
if (! g_file_set_contents (filename, contents, length, &error))
170
g_warning ("Unable to write print settings to '%s': %s",
171
gimp_filename_to_utf8 (filename), error->message);
172
g_error_free (error);
180
* create an image parasite called "print-settings" from a GKeyFile
181
* holding the print settings
184
save_print_settings_as_parasite (GKeyFile *settings_key_file,
189
GError *error = NULL;
191
contents = g_key_file_to_data (settings_key_file, &length, &error);
194
g_warning ("Unable to get contents of settings key file: %s",
196
g_error_free (error);
200
gimp_image_attach_new_parasite (image_ID, "print-settings",
201
0, length, contents);
206
* callback used in gtk_print_settings_foreach loop
209
add_print_setting_to_key_file (const gchar *key,
213
GKeyFile *key_file = data;
215
g_key_file_set_value (key_file, "print-settings", key, value);
219
* deserialize a "print-settings" resource file into a GKeyFile
222
print_settings_key_file_from_resource_file (void)
224
GKeyFile *key_file = g_key_file_new ();
227
g_key_file_set_list_separator (key_file, '=');
229
filename = g_build_filename (gimp_directory (), "print-settings", NULL);
231
if (! g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL))
233
g_key_file_free (key_file);
239
return check_version (key_file);
242
/* load information from an image parasite called "print-settings"
243
* return a GKeyFile containing the information if a valid parasite is found,
247
print_settings_key_file_from_parasite (gint32 image_ID)
249
GimpParasite *parasite;
252
parasite = gimp_image_parasite_find (image_ID, "print-settings");
257
key_file = g_key_file_new ();
259
g_key_file_set_list_separator (key_file, '=');
261
if (! g_key_file_load_from_data (key_file,
262
gimp_parasite_data (parasite),
263
gimp_parasite_data_size (parasite),
264
G_KEY_FILE_NONE, NULL))
266
g_key_file_free (key_file);
270
gimp_parasite_free (parasite);
272
return check_version (key_file);
276
load_print_settings_from_key_file (PrintData *data,
279
GtkPrintOperation *operation = data->operation;
280
GtkPrintSettings *settings;
285
settings = gtk_print_operation_get_print_settings (operation);
287
settings = gtk_print_settings_new ();
289
keys = g_key_file_get_keys (key_file, "print-settings", &n_keys, NULL);
294
for (i = 0; i < n_keys; i++)
298
value = g_key_file_get_value (key_file, "print-settings", keys[i], NULL);
302
gtk_print_settings_set (settings, keys[i], value);
309
/* page setup parameters */
311
if (g_key_file_has_key (key_file, "page-setup", "orientation", NULL))
313
GtkPageSetup *page_setup;
314
GtkPageOrientation orientation;
316
page_setup = gtk_print_operation_get_default_page_setup (operation);
318
page_setup = gtk_page_setup_new ();
320
orientation = g_key_file_get_integer (key_file,
321
"page-setup", "orientation", NULL);
322
gtk_page_setup_set_orientation (page_setup, orientation);
323
gtk_print_settings_set_orientation (settings, orientation);
324
data->orientation = orientation;
326
gtk_print_operation_set_default_page_setup (operation, page_setup);
329
if (g_key_file_has_key (key_file, "image-setup", "unit", NULL))
331
data->unit = g_key_file_get_integer (key_file,
332
"image-setup", "unit", NULL);
335
if (g_key_file_has_key (key_file, "image-setup", "x-resolution", NULL) &&
336
g_key_file_has_key (key_file, "image-setup", "y-resolution", NULL))
338
data->xres = g_key_file_get_double (key_file,
339
"image-setup", "x-resolution", NULL);
340
data->yres = g_key_file_get_double (key_file,
341
"image-setup", "y-resolution", NULL);
346
if (g_key_file_has_key (key_file, "other-settings", "show-header", NULL))
348
data->show_info_header = g_key_file_get_boolean (key_file,
350
"show-header", NULL);
355
data->show_info_header = FALSE;
358
gtk_print_operation_set_print_settings (operation, settings);
364
check_version (GKeyFile *key_file)
369
if (! key_file || ! g_key_file_has_group (key_file, "meta"))
372
major_version = g_key_file_get_integer (key_file,
373
"meta", "major-version", NULL);
375
if (major_version != PRINT_SETTINGS_MAJOR_VERSION)
378
minor_version = g_key_file_get_integer (key_file,
379
"meta", "minor-version", NULL);
381
if (minor_version != PRINT_SETTINGS_MINOR_VERSION)