diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:30:19 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:30:19 +0000 |
commit | 5c1676dfe6d2f3c837a5e074117b45613fd29a72 (patch) | |
tree | cbffb45144febf451e54061db2b21395faf94bfe /app/core/gimp-templates.c | |
parent | Initial commit. (diff) | |
download | gimp-upstream.tar.xz gimp-upstream.zip |
Adding upstream version 2.10.34.upstream/2.10.34upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'app/core/gimp-templates.c')
-rw-r--r-- | app/core/gimp-templates.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/app/core/gimp-templates.c b/app/core/gimp-templates.c new file mode 100644 index 0000000..ba0800d --- /dev/null +++ b/app/core/gimp-templates.c @@ -0,0 +1,213 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995-1997 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 <string.h> + +#include <gdk-pixbuf/gdk-pixbuf.h> +#include <gegl.h> + +#include "libgimpbase/gimpbase.h" +#include "libgimpconfig/gimpconfig.h" + +#include "core-types.h" + +#include "gimp.h" +#include "gimp-templates.h" +#include "gimplist.h" +#include "gimptemplate.h" + + +/* functions to load and save the gimp templates files */ + +void +gimp_templates_load (Gimp *gimp) +{ + GFile *file; + GError *error = NULL; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (GIMP_IS_LIST (gimp->templates)); + + file = gimp_directory_file ("templaterc", NULL); + + if (gimp->be_verbose) + g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file)); + + if (! gimp_config_deserialize_gfile (GIMP_CONFIG (gimp->templates), + file, NULL, &error)) + { + if (error->code == GIMP_CONFIG_ERROR_OPEN_ENOENT) + { + g_clear_error (&error); + g_object_unref (file); + + file = gimp_sysconf_directory_file ("templaterc", NULL); + + if (! gimp_config_deserialize_gfile (GIMP_CONFIG (gimp->templates), + file, NULL, &error)) + { + gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, + error->message); + } + } + else + { + gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message); + } + + g_clear_error (&error); + } + + gimp_list_reverse (GIMP_LIST (gimp->templates)); + + g_object_unref (file); +} + +void +gimp_templates_save (Gimp *gimp) +{ + const gchar *header = + "GIMP templaterc\n" + "\n" + "This file will be entirely rewritten each time you exit."; + const gchar *footer = + "end of templaterc"; + + GFile *file; + GError *error = NULL; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (GIMP_IS_LIST (gimp->templates)); + + file = gimp_directory_file ("templaterc", NULL); + + if (gimp->be_verbose) + g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file)); + + if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (gimp->templates), + file, + header, footer, NULL, + &error)) + { + gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message); + g_error_free (error); + } + + g_object_unref (file); +} + + +/* just like gimp_list_get_child_by_name() but matches case-insensitive + * and dpi/ppi-insensitive + */ +static GimpObject * +gimp_templates_migrate_get_child_by_name (GimpContainer *container, + const gchar *name) +{ + GimpList *list = GIMP_LIST (container); + GimpObject *retval = NULL; + GList *glist; + + for (glist = list->queue->head; glist; glist = g_list_next (glist)) + { + GimpObject *object = glist->data; + gchar *str1 = g_ascii_strdown (gimp_object_get_name (object), -1); + gchar *str2 = g_ascii_strdown (name, -1); + + if (! strcmp (str1, str2)) + { + retval = object; + } + else + { + gchar *dpi = strstr (str1, "dpi"); + + if (dpi) + { + memcpy (dpi, "ppi", 3); + + g_print ("replaced: %s\n", str1); + + if (! strcmp (str1, str2)) + retval = object; + } + } + + g_free (str1); + g_free (str2); + } + + return retval; +} + +/** + * gimp_templates_migrate: + * @olddir: the old user directory + * + * Migrating the templaterc from GIMP 2.0 to GIMP 2.2 needs this special + * hack since we changed the way that units are handled. This function + * merges the user's templaterc with the systemwide templaterc. The goal + * is to replace the unit for a couple of default templates with "pixels". + **/ +void +gimp_templates_migrate (const gchar *olddir) +{ + GimpContainer *templates = gimp_list_new (GIMP_TYPE_TEMPLATE, TRUE); + GFile *file = gimp_directory_file ("templaterc", NULL); + + if (gimp_config_deserialize_gfile (GIMP_CONFIG (templates), file, + NULL, NULL)) + { + GFile *sysconf_file; + + sysconf_file = gimp_sysconf_directory_file ("templaterc", NULL); + + if (olddir && (strstr (olddir, "2.0") || strstr (olddir, "2.2"))) + { + /* We changed the spelling of a couple of template names: + * + * - from upper to lower case between 2.0 and 2.2 + * - from "dpi" to "ppi" between 2.2 and 2.4 + */ + GimpContainerClass *class = GIMP_CONTAINER_GET_CLASS (templates); + gpointer func = class->get_child_by_name; + + class->get_child_by_name = gimp_templates_migrate_get_child_by_name; + + gimp_config_deserialize_gfile (GIMP_CONFIG (templates), + sysconf_file, NULL, NULL); + + class->get_child_by_name = func; + } + else + { + gimp_config_deserialize_gfile (GIMP_CONFIG (templates), + sysconf_file, NULL, NULL); + } + + g_object_unref (sysconf_file); + + gimp_list_reverse (GIMP_LIST (templates)); + + gimp_config_serialize_to_gfile (GIMP_CONFIG (templates), file, + NULL, NULL, NULL, NULL); + } + + g_object_unref (file); +} |