summaryrefslogtreecommitdiffstats
path: root/plug-ins/print/print-settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'plug-ins/print/print-settings.c')
-rw-r--r--plug-ins/print/print-settings.c320
1 files changed, 320 insertions, 0 deletions
diff --git a/plug-ins/print/print-settings.c b/plug-ins/print/print-settings.c
new file mode 100644
index 0000000..617282f
--- /dev/null
+++ b/plug-ins/print/print-settings.c
@@ -0,0 +1,320 @@
+/* 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 <https://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))
+ {
+ gdouble xres;
+ gdouble yres;
+
+ gimp_image_get_resolution (data->image_id, &xres, &yres);
+
+ g_key_file_set_integer (key_file, "image-setup",
+ "unit", data->unit);
+ /* Do not save the print resolution when it is the expected image
+ * resolution so that changing it (i.e. in "print size" dialog)
+ * is not overridden by any previous prints.
+ */
+ if ((data->min_xres <= xres && ABS (xres - data->xres) > 0.1) ||
+ (data->min_yres <= yres && ABS (yres - data->yres) > 0.1) ||
+ (data->min_xres > xres && ABS (data->min_xres - data->xres) > 0.1) ||
+ (data->min_yres > yres && ABS (data->min_yres - data->yres) > 0.1))
+ {
+ 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;
+}