/gimp-2.8.0/plug-ins/print/print-settings.c
C | 305 lines | 198 code | 63 blank | 44 comment | 23 complexity | 15037c00737796fb2e94d4be834d64c3 MD5 | raw file
Possible License(s): LGPL-3.0, BSD-3-Clause, GPL-3.0
- /* GIMP - The GNU Image Manipulation Program
- * Copyright (C) 1995 Spencer Kimball and Peter Mattis
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #include "config.h"
- #include <libgimp/gimp.h>
- #include <libgimp/gimpui.h>
- #include "print.h"
- #include "print-settings.h"
- #include "print-utils.h"
- #define PRINT_SETTINGS_MAJOR_VERSION 0
- #define PRINT_SETTINGS_MINOR_VERSION 4
- #define PRINT_SETTINGS_NAME "print-settings"
- static GKeyFile * print_settings_key_file_from_settings (PrintData *data);
- static void print_settings_add_to_key_file (const gchar *key,
- const gchar *value,
- gpointer data);
- static GKeyFile * print_settings_key_file_from_resource_file (void);
- static GKeyFile * print_settings_key_file_from_parasite (gint32 image_ID);
- static gboolean print_settings_load_from_key_file (PrintData *data,
- GKeyFile *key_file);
- static gboolean print_settings_check_version (GKeyFile *key_file);
- /*
- * set GtkPrintSettings from the contents of a "print-settings"
- * image parasite, or, if none exists, from a resource
- * file of the same name
- */
- gboolean
- print_settings_load (PrintData *data)
- {
- GKeyFile *key_file = print_settings_key_file_from_parasite (data->image_id);
- if (! key_file)
- key_file = print_settings_key_file_from_resource_file ();
- if (key_file)
- {
- print_settings_load_from_key_file (data, key_file);
- g_key_file_free (key_file);
- return TRUE;
- }
- return FALSE;
- }
- /*
- * save all settings as a resource file "print-settings"
- * and as an image parasite
- */
- void
- print_settings_save (PrintData *data)
- {
- GKeyFile *key_file = print_settings_key_file_from_settings (data);
- /* image setup */
- if (gimp_image_is_valid (data->image_id))
- {
- g_key_file_set_integer (key_file, "image-setup",
- "unit", data->unit);
- g_key_file_set_double (key_file, "image-setup",
- "x-resolution", data->xres);
- g_key_file_set_double (key_file, "image-setup",
- "y-resolution", data->yres);
- g_key_file_set_double (key_file, "image-setup",
- "x-offset", data->offset_x);
- g_key_file_set_double (key_file, "image-setup",
- "y-offset", data->offset_y);
- g_key_file_set_integer (key_file, "image-setup",
- "center-mode", data->center);
- g_key_file_set_boolean (key_file, "image-setup",
- "use-full-page", data->use_full_page);
- g_key_file_set_boolean (key_file, "image-setup",
- "crop-marks", data->draw_crop_marks);
- print_utils_key_file_save_as_parasite (key_file,
- data->image_id,
- PRINT_SETTINGS_NAME);
- }
- /* some settings shouldn't be made persistent on a global level,
- * so they are only stored in the image, not in the rcfile
- */
- g_key_file_remove_key (key_file, "image-setup", "x-resolution", NULL);
- g_key_file_remove_key (key_file, "image-setup", "y-resolution", NULL);
- g_key_file_remove_key (key_file, "image-setup", "x-offset", NULL);
- g_key_file_remove_key (key_file, "image-setup", "y-offset", NULL);
- g_key_file_remove_key (key_file, PRINT_SETTINGS_NAME, "n-copies", NULL);
- print_utils_key_file_save_as_rcfile (key_file, PRINT_SETTINGS_NAME);
- g_key_file_free (key_file);
- }
- /*
- * serialize print settings into a GKeyFile
- */
- static GKeyFile *
- print_settings_key_file_from_settings (PrintData *data)
- {
- GtkPrintOperation *operation = data->operation;
- GtkPrintSettings *settings;
- GKeyFile *key_file = g_key_file_new ();
- /* put version information into the file */
- g_key_file_set_integer (key_file, "meta", "major-version",
- PRINT_SETTINGS_MAJOR_VERSION);
- g_key_file_set_integer (key_file, "meta", "minor-version",
- PRINT_SETTINGS_MINOR_VERSION);
- /* save the contents of the GtkPrintSettings for the operation */
- settings = gtk_print_operation_get_print_settings (operation);
- if (settings)
- gtk_print_settings_foreach (settings,
- print_settings_add_to_key_file, key_file);
- return key_file;
- }
- /*
- * callback used in gtk_print_settings_foreach loop
- */
- static void
- print_settings_add_to_key_file (const gchar *key,
- const gchar *value,
- gpointer data)
- {
- GKeyFile *key_file = data;
- g_key_file_set_value (key_file, PRINT_SETTINGS_NAME, key, value);
- }
- /*
- * deserialize a "print-settings" resource file into a GKeyFile
- */
- static GKeyFile *
- print_settings_key_file_from_resource_file (void)
- {
- GKeyFile *key_file;
- key_file = print_utils_key_file_load_from_rcfile (PRINT_SETTINGS_NAME);
- if (key_file && ! print_settings_check_version (key_file))
- {
- g_key_file_free (key_file);
- return NULL;
- }
- return key_file;
- }
- /* load information from an image parasite called "print-settings"
- * return a GKeyFile containing the information if a valid parasite is found,
- * NULL otherwise
- */
- static GKeyFile *
- print_settings_key_file_from_parasite (gint32 image_ID)
- {
- GKeyFile *key_file;
- key_file = print_utils_key_file_load_from_parasite (image_ID,
- PRINT_SETTINGS_NAME);
- if (key_file && ! print_settings_check_version (key_file))
- {
- g_key_file_free (key_file);
- return NULL;
- }
- return key_file;
- }
- static gboolean
- print_settings_load_from_key_file (PrintData *data,
- GKeyFile *key_file)
- {
- GtkPrintOperation *operation = data->operation;
- GtkPrintSettings *settings;
- gchar **keys;
- gsize n_keys;
- gint i;
- settings = gtk_print_operation_get_print_settings (operation);
- if (! settings)
- settings = gtk_print_settings_new ();
- keys = g_key_file_get_keys (key_file, PRINT_SETTINGS_NAME, &n_keys, NULL);
- if (! keys)
- return FALSE;
- for (i = 0; i < n_keys; i++)
- {
- gchar *value;
- value = g_key_file_get_value (key_file,
- PRINT_SETTINGS_NAME, keys[i], NULL);
- if (value)
- {
- gtk_print_settings_set (settings, keys[i], value);
- g_free (value);
- }
- }
- g_strfreev (keys);
- if (g_key_file_has_key (key_file, "image-setup", "unit", NULL))
- {
- data->unit = g_key_file_get_integer (key_file, "image-setup",
- "unit", NULL);
- }
- if (g_key_file_has_key (key_file, "image-setup", "x-resolution", NULL) &&
- g_key_file_has_key (key_file, "image-setup", "y-resolution", NULL))
- {
- data->xres = g_key_file_get_double (key_file, "image-setup",
- "x-resolution", NULL);
- data->yres = g_key_file_get_double (key_file, "image-setup",
- "y-resolution", NULL);
- }
- if (g_key_file_has_key (key_file, "image-setup", "x-offset", NULL) &&
- g_key_file_has_key (key_file, "image-setup", "y-offset", NULL))
- {
- data->offset_x = g_key_file_get_double (key_file, "image-setup",
- "x-offset", NULL);
- data->offset_y = g_key_file_get_double (key_file, "image-setup",
- "y-offset", NULL);
- }
- if (g_key_file_has_key (key_file, "image-setup", "center-mode", NULL))
- {
- data->center = g_key_file_get_integer (key_file, "image-setup",
- "center-mode", NULL);
- }
- if (g_key_file_has_key (key_file, "image-setup", "use-full-page", NULL))
- {
- data->use_full_page = g_key_file_get_boolean (key_file, "image-setup",
- "use-full-page", NULL);
- }
- if (g_key_file_has_key (key_file, "image-setup", "crop-marks", NULL))
- {
- data->draw_crop_marks = g_key_file_get_boolean (key_file, "image-setup",
- "crop-marks", NULL);
- }
- gtk_print_operation_set_print_settings (operation, settings);
- return TRUE;
- }
- static gboolean
- print_settings_check_version (GKeyFile *key_file)
- {
- gint major_version;
- gint minor_version;
- if (! g_key_file_has_group (key_file, "meta"))
- return FALSE;
- major_version = g_key_file_get_integer (key_file,
- "meta", "major-version", NULL);
- if (major_version != PRINT_SETTINGS_MAJOR_VERSION)
- return FALSE;
- minor_version = g_key_file_get_integer (key_file,
- "meta", "minor-version", NULL);
- if (minor_version != PRINT_SETTINGS_MINOR_VERSION)
- return FALSE;
- return TRUE;
- }