[gimp] Bug 780015 - Filter settings are not properly restored after Gimp restart
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 780015 - Filter settings are not properly restored after Gimp restart
- Date: Fri, 24 Mar 2017 00:37:17 +0000 (UTC)
commit ee6c7ec7b703a15a8eac217f5b59fb69caf7f698
Author: Michael Natterer <mitch gimp org>
Date: Fri Mar 24 01:29:50 2017 +0100
Bug 780015 - Filter settings are not properly restored after Gimp restart
Filters settings used to be serialized and deserialized only
when a filter tool's GUI was shown, too late for the code that
re-runs/re-shows filters with previous values.
Move the entire loading/saving code to gimp-operation-config.c, even
adding/removing the dummy separator item between timestamped automatic
history and manually saved settings. Load the settings automatically
when a settings container is requested, but still trigger saving from
the few places the container is changed in the GUI; could also
automate that later.
This commit also moves all settings of filters that have their own
tools from gimpdir/tool-options/ to gimpdir/filters/. Add compat code
to try the old filename if the new doesn't exist, so files are
migrated automatically.
WIP, but this step already fixes the bug.
app/actions/gimpgeglprocedure.c | 19 +++-
app/gegl/gimp-gegl.c | 2 +-
app/operations/gimp-operation-config.c | 174 ++++++++++++++++++++++++++++++--
app/operations/gimp-operation-config.h | 36 +++++--
app/operations/gimp-operations.c | 51 ++++++++--
app/operations/gimp-operations.h | 2 +-
app/tools/gimpfiltertool-settings.c | 2 -
app/tools/gimpfiltertool-settings.h | 1 -
app/tools/gimpfiltertool.c | 64 +++++++-----
app/tools/gimpfiltertool.h | 1 -
app/tools/gimpoperationtool.c | 12 --
app/widgets/gimpsettingsbox.c | 113 +-------------------
app/widgets/gimpsettingsbox.h | 1 -
app/widgets/gimpsettingseditor.c | 11 ++-
14 files changed, 301 insertions(+), 188 deletions(-)
---
diff --git a/app/actions/gimpgeglprocedure.c b/app/actions/gimpgeglprocedure.c
index d1b6956..237bd88 100644
--- a/app/actions/gimpgeglprocedure.c
+++ b/app/actions/gimpgeglprocedure.c
@@ -251,11 +251,15 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure,
GimpContainer *container;
GimpTool *active_tool;
- settings = gimp_operation_config_new (procedure->original_name,
+ settings = gimp_operation_config_new (gimp,
+ procedure->original_name,
gimp_viewable_get_icon_name (GIMP_VIEWABLE (procedure)),
GIMP_TYPE_SETTINGS);
- container = gimp_operation_config_get_container (G_TYPE_FROM_INSTANCE (settings));
+ container =
+ gimp_operation_config_get_container (gimp,
+ G_TYPE_FROM_INSTANCE (settings),
+ (GCompareFunc) gimp_settings_compare);
g_object_unref (settings);
@@ -263,10 +267,15 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure,
settings = gimp_container_get_child_by_index (container, 0);
/* only use the settings if they are automatically created "last used"
- * values, not if they were saved explicitly and have a zero timestamp
+ * values, not if they were saved explicitly and have a zero timestamp;
+ * and if they are not a separator.
*/
- if (settings && GIMP_SETTINGS (settings)->time == 0)
- settings = NULL;
+ if (settings &&
+ (GIMP_SETTINGS (settings)->time == 0 ||
+ ! gimp_object_get_name (settings)))
+ {
+ settings = NULL;
+ }
if (run_mode == GIMP_RUN_WITH_LAST_VALS)
{
diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c
index 0574ab0..db6a3c1 100644
--- a/app/gegl/gimp-gegl.c
+++ b/app/gegl/gimp-gegl.c
@@ -73,7 +73,7 @@ gimp_gegl_init (Gimp *gimp)
gimp_babl_init ();
- gimp_operations_init ();
+ gimp_operations_init (gimp);
}
static void
diff --git a/app/operations/gimp-operation-config.c b/app/operations/gimp-operation-config.c
index 3330c5f..6d0f01d 100644
--- a/app/operations/gimp-operation-config.c
+++ b/app/operations/gimp-operation-config.c
@@ -23,11 +23,14 @@
#include <gegl.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
+#include "libgimpbase/gimpbase.h"
#include "libgimpcolor/gimpcolor.h"
#include "libgimpconfig/gimpconfig.h"
#include "operations-types.h"
+#include "core/gimp.h"
+
#include "core/gimplist.h"
#include "core/gimpparamspecs-duplicate.h"
#include "core/gimpviewable.h"
@@ -49,11 +52,14 @@ static void gimp_operation_config_node_notify (GeglNode *node,
const GParamSpec *gegl_pspec,
GObject *config);
+static void gimp_operation_config_add_sep (GimpContainer *container);
+static void gimp_operation_config_remove_sep (GimpContainer *container);
+
/* public functions */
static GHashTable *
-gimp_operation_config_get_type_table (void)
+gimp_operation_config_get_type_table (Gimp *gimp)
{
static GHashTable *config_types = NULL;
@@ -67,7 +73,7 @@ gimp_operation_config_get_type_table (void)
}
static GHashTable *
-gimp_operation_config_get_container_table (void)
+gimp_operation_config_get_container_table (Gimp *gimp)
{
static GHashTable *config_containers = NULL;
@@ -235,15 +241,17 @@ gimp_operation_config_config_iface_init (GimpConfigInterface *iface)
/* public functions */
void
-gimp_operation_config_register (const gchar *operation,
+gimp_operation_config_register (Gimp *gimp,
+ const gchar *operation,
GType config_type)
{
GHashTable *config_types;
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
g_return_if_fail (operation != NULL);
g_return_if_fail (g_type_is_a (config_type, GIMP_TYPE_OBJECT));
- config_types = gimp_operation_config_get_type_table ();
+ config_types = gimp_operation_config_get_type_table (gimp);
g_hash_table_insert (config_types,
g_strdup (operation),
@@ -251,17 +259,19 @@ gimp_operation_config_register (const gchar *operation,
}
GimpObject *
-gimp_operation_config_new (const gchar *operation,
+gimp_operation_config_new (Gimp *gimp,
+ const gchar *operation,
const gchar *icon_name,
GType parent_type)
{
GHashTable *config_types;
GType config_type;
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (operation != NULL, NULL);
g_return_val_if_fail (g_type_is_a (parent_type, GIMP_TYPE_OBJECT), NULL);
- config_types = gimp_operation_config_get_type_table ();
+ config_types = gimp_operation_config_get_type_table (gimp);
config_type = (GType) g_hash_table_lookup (config_types, operation);
@@ -315,7 +325,7 @@ gimp_operation_config_new (const gchar *operation,
g_type_class_unref (viewable_class);
}
- gimp_operation_config_register (operation, config_type);
+ gimp_operation_config_register (gimp, operation, config_type);
}
}
@@ -323,29 +333,145 @@ gimp_operation_config_new (const gchar *operation,
}
GimpContainer *
-gimp_operation_config_get_container (GType config_type)
+gimp_operation_config_get_container (Gimp *gimp,
+ GType config_type,
+ GCompareFunc sort_func)
{
GHashTable *config_containers;
GimpContainer *container;
+ g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (g_type_is_a (config_type, GIMP_TYPE_OBJECT), NULL);
- config_containers = gimp_operation_config_get_container_table ();
+ config_containers = gimp_operation_config_get_container_table (gimp);
container = g_hash_table_lookup (config_containers, (gpointer) config_type);
if (! container)
{
container = gimp_list_new (config_type, TRUE);
+ gimp_list_set_sort_func (GIMP_LIST (container), sort_func);
g_hash_table_insert (config_containers,
(gpointer) config_type, container);
+
+ gimp_operation_config_deserialize (gimp, container, NULL);
+
+ if (gimp_container_get_n_children (container) == 0)
+ {
+ gchar *basename;
+ GFile *file;
+
+ basename = g_strconcat (g_type_name (config_type), ".settings", NULL);
+ file = gimp_directory_file ("filters", basename, NULL);
+ g_free (basename);
+
+ if (! g_file_query_exists (file, NULL))
+ {
+ GQuark quark = g_quark_from_static_string ("compat-file");
+
+ g_object_unref (file);
+
+ file = g_type_get_qdata (config_type, quark);
+
+ if (file)
+ {
+ g_object_ref (file);
+
+ gimp_operation_config_deserialize (gimp, container, file);
+ }
+ }
+
+ g_object_unref (file);
+ }
+
+ gimp_operation_config_add_sep (container);
}
return container;
}
void
+gimp_operation_config_serialize (Gimp *gimp,
+ GimpContainer *container,
+ GFile *file)
+{
+ GError *error = NULL;
+
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+ g_return_if_fail (GIMP_IS_CONTAINER (container));
+ g_return_if_fail (file == NULL || G_IS_FILE (file));
+
+ if (! file)
+ {
+ GType config_type = gimp_container_get_children_type (container);
+ gchar *basename;
+
+ basename = g_strconcat (g_type_name (config_type), ".settings", NULL);
+ file = gimp_directory_file ("filters", basename, NULL);
+ g_free (basename);
+ }
+
+ if (gimp->be_verbose)
+ g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file));
+
+ gimp_operation_config_remove_sep (container);
+
+ if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (container),
+ file,
+ "settings",
+ "end of settings",
+ NULL, &error))
+ {
+ gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR,
+ error->message);
+ g_clear_error (&error);
+ }
+
+ gimp_operation_config_add_sep (container);
+
+ g_object_unref (file);
+}
+
+void
+gimp_operation_config_deserialize (Gimp *gimp,
+ GimpContainer *container,
+ GFile *file)
+{
+ GError *error = NULL;
+
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+ g_return_if_fail (GIMP_IS_CONTAINER (container));
+ g_return_if_fail (file == NULL || G_IS_FILE (file));
+
+ if (! file)
+ {
+ GType config_type = gimp_container_get_children_type (container);
+ gchar *basename;
+
+ basename = g_strconcat (g_type_name (config_type), ".settings", NULL);
+ file = gimp_directory_file ("filters", basename, NULL);
+ g_free (basename);
+ }
+
+ if (gimp->be_verbose)
+ g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file));
+
+ if (! gimp_config_deserialize_gfile (GIMP_CONFIG (container),
+ file,
+ NULL, &error))
+ {
+ if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT)
+ gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR,
+ error->message);
+
+ g_clear_error (&error);
+ }
+
+ g_object_unref (file);
+}
+
+void
gimp_operation_config_sync_node (GimpObject *config,
GeglNode *node)
{
@@ -611,3 +737,33 @@ gimp_operation_config_node_notify (GeglNode *node,
g_signal_handler_unblock (config, handler);
}
}
+
+static void
+gimp_operation_config_add_sep (GimpContainer *container)
+{
+ GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator");
+
+ if (! sep)
+ {
+ sep = g_object_new (gimp_container_get_children_type (container),
+ NULL);
+
+ gimp_container_add (container, sep);
+ g_object_unref (sep);
+
+ g_object_set_data (G_OBJECT (container), "separator", sep);
+ }
+}
+
+static void
+gimp_operation_config_remove_sep (GimpContainer *container)
+{
+ GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator");
+
+ if (sep)
+ {
+ gimp_container_remove (container, sep);
+
+ g_object_set_data (G_OBJECT (container), "separator", NULL);
+ }
+}
diff --git a/app/operations/gimp-operation-config.h b/app/operations/gimp-operation-config.h
index 2fe9873..f8471a2 100644
--- a/app/operations/gimp-operation-config.h
+++ b/app/operations/gimp-operation-config.h
@@ -19,18 +19,30 @@
#define __GIMP_OPERATION_CONFIG_H__
-void gimp_operation_config_register (const gchar *operation,
- GType config_type);
-
-GimpObject * gimp_operation_config_new (const gchar *operation,
- const gchar *icon_name,
- GType parent_type);
-GimpContainer * gimp_operation_config_get_container (GType config_type);
-
-void gimp_operation_config_sync_node (GimpObject *config,
- GeglNode *node);
-void gimp_operation_config_connect_node (GimpObject *config,
- GeglNode *node);
+void gimp_operation_config_register (Gimp *gimp,
+ const gchar *operation,
+ GType config_type);
+
+GimpObject * gimp_operation_config_new (Gimp *gimp,
+ const gchar *operation,
+ const gchar *icon_name,
+ GType parent_type);
+
+GimpContainer * gimp_operation_config_get_container (Gimp *gimp,
+ GType config_type,
+ GCompareFunc sort_func);
+
+void gimp_operation_config_serialize (Gimp *gimp,
+ GimpContainer *container,
+ GFile *file);
+void gimp_operation_config_deserialize (Gimp *gimp,
+ GimpContainer *container,
+ GFile *file);
+
+void gimp_operation_config_sync_node (GimpObject *config,
+ GeglNode *node);
+void gimp_operation_config_connect_node (GimpObject *config,
+ GeglNode *node);
#endif /* __GIMP_OPERATION_CONFIG_H__ */
diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c
index 957659d..26136a7 100644
--- a/app/operations/gimp-operations.c
+++ b/app/operations/gimp-operations.c
@@ -22,6 +22,8 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gegl.h>
+#include "libgimpbase/gimpbase.h"
+
#include "operations-types.h"
#include "core/gimp.h"
@@ -94,9 +96,21 @@
#include "layer-modes/gimpoperationsplit.h"
+static void
+set_compat_file (GType type,
+ const gchar *basename)
+{
+ GFile *file = gimp_directory_file ("tool-options", basename, NULL);
+ GQuark quark = g_quark_from_static_string ("compat-file");
+
+ g_type_set_qdata (type, quark, file);
+}
+
void
-gimp_operations_init (void)
+gimp_operations_init (Gimp *gimp)
{
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+
gimp_layer_modes_init ();
g_type_class_ref (GIMP_TYPE_OPERATION_BLEND);
@@ -154,16 +168,39 @@ gimp_operations_init (void)
g_type_class_ref (GIMP_TYPE_OPERATION_REPLACE);
g_type_class_ref (GIMP_TYPE_OPERATION_ANTI_ERASE);
- gimp_operation_config_register ("gimp:brightness-contrast",
+ gimp_operation_config_register (gimp,
+ "gimp:brightness-contrast",
GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG);
- gimp_operation_config_register ("gimp:color-balance",
+ set_compat_file (GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG,
+ "gimp-brightness-contrast-tool.settings");
+
+ gimp_operation_config_register (gimp,
+ "gimp:color-balance",
GIMP_TYPE_COLOR_BALANCE_CONFIG);
- gimp_operation_config_register ("gimp:colorize",
+ set_compat_file (GIMP_TYPE_COLOR_BALANCE_CONFIG,
+ "gimp-color-balance-tool.settings");
+
+ gimp_operation_config_register (gimp,
+ "gimp:colorize",
GIMP_TYPE_COLORIZE_CONFIG);
- gimp_operation_config_register ("gimp:curves",
+ set_compat_file (GIMP_TYPE_COLORIZE_CONFIG,
+ "gimp-colorize-tool.settings");
+
+ gimp_operation_config_register (gimp,
+ "gimp:curves",
GIMP_TYPE_CURVES_CONFIG);
- gimp_operation_config_register ("gimp:hue-saturation",
+ set_compat_file (GIMP_TYPE_CURVES_CONFIG,
+ "gimp-curves-tool.settings");
+
+ gimp_operation_config_register (gimp,
+ "gimp:hue-saturation",
GIMP_TYPE_HUE_SATURATION_CONFIG);
- gimp_operation_config_register ("gimp:levels",
+ set_compat_file (GIMP_TYPE_HUE_SATURATION_CONFIG,
+ "gimp-hue-saturation-tool.settings");
+
+ gimp_operation_config_register (gimp,
+ "gimp:levels",
GIMP_TYPE_LEVELS_CONFIG);
+ set_compat_file (GIMP_TYPE_LEVELS_CONFIG,
+ "gimp-levels-tool.settings");
}
diff --git a/app/operations/gimp-operations.h b/app/operations/gimp-operations.h
index d1378d1..8f11626 100644
--- a/app/operations/gimp-operations.h
+++ b/app/operations/gimp-operations.h
@@ -21,7 +21,7 @@
#define __GIMP_OPERATIONS_H__
-void gimp_operations_init (void);
+void gimp_operations_init (Gimp *gimp);
#endif /* __GIMP_OPERATIONS_H__ */
diff --git a/app/tools/gimpfiltertool-settings.c b/app/tools/gimpfiltertool-settings.c
index e48bf5a..0ea9037 100644
--- a/app/tools/gimpfiltertool-settings.c
+++ b/app/tools/gimpfiltertool-settings.c
@@ -62,7 +62,6 @@ static gboolean gimp_filter_tool_settings_export (GimpSettingsBox *box,
GtkWidget *
gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool,
GimpContainer *settings,
- GFile *settings_file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
@@ -85,7 +84,6 @@ gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool,
*settings_box = gimp_settings_box_new (tool_info->gimp,
filter_tool->config,
settings,
- settings_file,
import_dialog_title,
export_dialog_title,
file_dialog_help_id,
diff --git a/app/tools/gimpfiltertool-settings.h b/app/tools/gimpfiltertool-settings.h
index 8da042f..1976f86 100644
--- a/app/tools/gimpfiltertool-settings.h
+++ b/app/tools/gimpfiltertool-settings.h
@@ -23,7 +23,6 @@
GtkWidget * gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool,
GimpContainer *settings,
- GFile *settings_file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
diff --git a/app/tools/gimpfiltertool.c b/app/tools/gimpfiltertool.c
index de024a4..85e07f8 100644
--- a/app/tools/gimpfiltertool.c
+++ b/app/tools/gimpfiltertool.c
@@ -133,6 +133,9 @@ static void gimp_filter_tool_dialog (GimpFilterTool *filter_to
static void gimp_filter_tool_dialog_unmap (GtkWidget *dialog,
GimpFilterTool *filter_tool);
static void gimp_filter_tool_reset (GimpFilterTool *filter_tool);
+static GtkWidget * gimp_filter_tool_get_settings_ui
+ (GimpFilterTool *filter_tool);
+
static void gimp_filter_tool_create_filter (GimpFilterTool *filter_tool);
static void gimp_filter_tool_flush (GimpDrawableFilter *filter,
@@ -374,33 +377,9 @@ gimp_filter_tool_initialize (GimpTool *tool,
if (filter_tool->config && klass->settings_name)
{
- GType type = G_TYPE_FROM_INSTANCE (filter_tool->config);
- GimpContainer *settings;
- GFile *settings_file;
- GFile *default_folder;
- GtkWidget *settings_ui;
-
- settings = gimp_operation_config_get_container (type);
- if (! gimp_list_get_sort_func (GIMP_LIST (settings)))
- gimp_list_set_sort_func (GIMP_LIST (settings),
- (GCompareFunc) gimp_settings_compare);
-
- settings_file = gimp_tool_info_get_options_file (tool_info,
- ".settings");
- default_folder = gimp_directory_file (klass->settings_name, NULL);
-
- settings_ui = klass->get_settings_ui (filter_tool,
- settings,
- settings_file,
- klass->import_dialog_title,
- klass->export_dialog_title,
- filter_tool->help_id,
- default_folder,
- &filter_tool->settings_box);
-
- g_object_unref (default_folder);
- g_object_unref (settings_file);
+ GtkWidget *settings_ui;
+ settings_ui = gimp_filter_tool_get_settings_ui (filter_tool);
gtk_box_pack_start (GTK_BOX (vbox), settings_ui, FALSE, FALSE, 0);
gtk_widget_show (settings_ui);
}
@@ -977,6 +956,36 @@ gimp_filter_tool_reset (GimpFilterTool *filter_tool)
g_object_thaw_notify (filter_tool->config);
}
+static GtkWidget *
+gimp_filter_tool_get_settings_ui (GimpFilterTool *filter_tool)
+{
+ GimpTool *tool = GIMP_TOOL (filter_tool);
+ GimpFilterToolClass *klass = GIMP_FILTER_TOOL_GET_CLASS (filter_tool);
+ GType type = G_TYPE_FROM_INSTANCE (filter_tool->config);
+ GimpContainer *settings;
+ GFile *default_folder;
+ GtkWidget *settings_ui;
+
+ settings =
+ gimp_operation_config_get_container (tool->tool_info->gimp,
+ type,
+ (GCompareFunc) gimp_settings_compare);
+
+ default_folder = gimp_directory_file (klass->settings_name, NULL);
+
+ settings_ui = klass->get_settings_ui (filter_tool,
+ settings,
+ klass->import_dialog_title,
+ klass->export_dialog_title,
+ filter_tool->help_id,
+ default_folder,
+ &filter_tool->settings_box);
+
+ g_object_unref (default_folder);
+
+ return settings_ui;
+}
+
static void
gimp_filter_tool_create_filter (GimpFilterTool *filter_tool)
{
@@ -1313,7 +1322,8 @@ gimp_filter_tool_get_operation (GimpFilterTool *filter_tool)
"operation", operation_name,
NULL);
filter_tool->config =
- G_OBJECT (gimp_operation_config_new (operation_name,
+ G_OBJECT (gimp_operation_config_new (tool_info->gimp,
+ operation_name,
filter_tool->icon_name,
GIMP_TYPE_SETTINGS));
diff --git a/app/tools/gimpfiltertool.h b/app/tools/gimpfiltertool.h
index fd72642..091d7be 100644
--- a/app/tools/gimpfiltertool.h
+++ b/app/tools/gimpfiltertool.h
@@ -82,7 +82,6 @@ struct _GimpFilterToolClass
GtkWidget * (* get_settings_ui) (GimpFilterTool *filter_tool,
GimpContainer *settings,
- GFile *settings_file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
diff --git a/app/tools/gimpoperationtool.c b/app/tools/gimpoperationtool.c
index c9a1540..7720bd7 100644
--- a/app/tools/gimpoperationtool.c
+++ b/app/tools/gimpoperationtool.c
@@ -88,7 +88,6 @@ static void gimp_operation_tool_dialog (GimpFilterTool *filte
static void gimp_operation_tool_reset (GimpFilterTool *filter_tool);
static GtkWidget * gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool,
GimpContainer *settings,
- GFile *settings_file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
@@ -320,7 +319,6 @@ gimp_operation_tool_reset (GimpFilterTool *filter_tool)
static GtkWidget *
gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool,
GimpContainer *settings,
- GFile *settings_file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
@@ -329,23 +327,15 @@ gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool,
{
GimpOperationTool *tool = GIMP_OPERATION_TOOL (filter_tool);
GtkWidget *widget;
- gchar *basename;
- GFile *file;
gchar *import_title;
gchar *export_title;
- basename = g_strconcat (G_OBJECT_TYPE_NAME (filter_tool->config),
- ".settings", NULL);
- file = gimp_directory_file ("filters", basename, NULL);
- g_free (basename);
-
import_title = g_strdup_printf (_("Import '%s' Settings"), tool->title);
export_title = g_strdup_printf (_("Export '%s' Settings"), tool->title);
widget =
GIMP_FILTER_TOOL_CLASS (parent_class)->get_settings_ui (filter_tool,
settings,
- file,
import_title,
export_title,
file_dialog_help_id,
@@ -355,8 +345,6 @@ gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool,
g_free (import_title);
g_free (export_title);
- g_object_unref (file);
-
return widget;
}
diff --git a/app/widgets/gimpsettingsbox.c b/app/widgets/gimpsettingsbox.c
index 6d11466..6b16460 100644
--- a/app/widgets/gimpsettingsbox.c
+++ b/app/widgets/gimpsettingsbox.c
@@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpsettingsbox.c
- * Copyright (C) 2008 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2008-2017 Michael Natterer <mitch gimp org>
*
* 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
@@ -23,12 +23,13 @@
#include <gegl.h>
#include <gtk/gtk.h>
-#include "libgimpbase/gimpbase.h"
#include "libgimpconfig/gimpconfig.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "widgets-types.h"
+#include "operations/gimp-operation-config.h"
+
#include "core/gimp.h"
#include "core/gimplist.h"
#include "core/gimpmarshal.h"
@@ -56,8 +57,7 @@ enum
PROP_0,
PROP_GIMP,
PROP_CONFIG,
- PROP_CONTAINER,
- PROP_FILE
+ PROP_CONTAINER
};
@@ -75,7 +75,6 @@ struct _GimpSettingsBoxPrivate
Gimp *gimp;
GObject *config;
GimpContainer *container;
- GFile *file;
gchar *import_dialog_title;
gchar *export_dialog_title;
@@ -100,8 +99,6 @@ static void gimp_settings_box_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
-static void gimp_settings_box_deserialize (GimpSettingsBox *box);
-static void gimp_settings_box_serialize (GimpSettingsBox *box);
static GtkWidget *
gimp_settings_box_menu_item_add (GimpSettingsBox *box,
const gchar *icon_name,
@@ -218,13 +215,6 @@ gimp_settings_box_class_init (GimpSettingsBoxClass *klass)
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class, PROP_FILE,
- g_param_spec_object ("file",
- NULL, NULL,
- G_TYPE_FILE,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
g_type_class_add_private (klass, sizeof (GimpSettingsBoxPrivate));
}
@@ -252,10 +242,6 @@ gimp_settings_box_constructed (GObject *object)
g_assert (GIMP_IS_GIMP (private->gimp));
g_assert (GIMP_IS_CONFIG (private->config));
g_assert (GIMP_IS_CONTAINER (private->container));
- g_assert (G_IS_FILE (private->file));
-
- if (gimp_container_get_n_children (private->container) == 0)
- gimp_settings_box_deserialize (box);
private->combo = gimp_container_combo_box_new (private->container,
gimp_get_user_context (private->gimp),
@@ -352,12 +338,6 @@ gimp_settings_box_finalize (GObject *object)
private->container = NULL;
}
- if (private->file)
- {
- g_object_unref (private->file);
- private->file = NULL;
- }
-
if (private->last_file)
{
g_object_unref (private->last_file);
@@ -423,10 +403,6 @@ gimp_settings_box_set_property (GObject *object,
private->container = g_value_dup_object (value);
break;
- case PROP_FILE:
- private->file = g_value_dup_object (value);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -455,86 +431,12 @@ gimp_settings_box_get_property (GObject *object,
g_value_set_object (value, private->container);
break;
- case PROP_FILE:
- g_value_set_object (value, private->file);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
-static void
-gimp_settings_box_separator_add (GimpContainer *container)
-{
- GimpObject *sep = g_object_new (gimp_container_get_children_type (container),
- NULL);
-
- gimp_container_add (container, sep);
- g_object_unref (sep);
-
- g_object_set_data (G_OBJECT (container), "separator", sep);
-}
-
-static void
-gimp_settings_box_separator_remove (GimpContainer *container)
-{
- GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator");
-
- gimp_container_remove (container, sep);
-
- g_object_set_data (G_OBJECT (container), "separator", NULL);
-}
-
-static void
-gimp_settings_box_deserialize (GimpSettingsBox *box)
-{
- GimpSettingsBoxPrivate *private = GET_PRIVATE (box);
- GError *error = NULL;
-
- if (private->gimp->be_verbose)
- g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (private->file));
-
- if (! gimp_config_deserialize_gfile (GIMP_CONFIG (private->container),
- private->file,
- NULL, &error))
- {
- if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT)
- gimp_message_literal (private->gimp, NULL, GIMP_MESSAGE_ERROR,
- error->message);
-
- g_clear_error (&error);
- }
-
- gimp_settings_box_separator_add (private->container);
-}
-
-static void
-gimp_settings_box_serialize (GimpSettingsBox *box)
-{
- GimpSettingsBoxPrivate *private = GET_PRIVATE (box);
- GError *error = NULL;
-
- gimp_settings_box_separator_remove (private->container);
-
- if (private->gimp->be_verbose)
- g_print ("Writing '%s'\n", gimp_file_get_utf8_name (private->file));
-
- if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (private->container),
- private->file,
- "settings",
- "end of settings",
- NULL, &error))
- {
- gimp_message_literal (private->gimp, NULL, GIMP_MESSAGE_ERROR,
- error->message);
- g_clear_error (&error);
- }
-
- gimp_settings_box_separator_add (private->container);
-}
-
static GtkWidget *
gimp_settings_box_menu_item_add (GimpSettingsBox *box,
const gchar *icon_name,
@@ -735,7 +637,7 @@ gimp_settings_box_favorite_callback (GtkWidget *query_box,
gimp_container_add (private->container, GIMP_OBJECT (config));
g_object_unref (config);
- gimp_settings_box_serialize (box);
+ gimp_operation_config_serialize (private->gimp, private->container, NULL);
}
static void
@@ -950,7 +852,6 @@ GtkWidget *
gimp_settings_box_new (Gimp *gimp,
GObject *config,
GimpContainer *container,
- GFile *file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
@@ -963,7 +864,6 @@ gimp_settings_box_new (Gimp *gimp,
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (GIMP_IS_CONFIG (config), NULL);
g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
- g_return_val_if_fail (G_IS_FILE (file), NULL);
g_return_val_if_fail (default_folder == NULL || G_IS_FILE (default_folder),
NULL);
g_return_val_if_fail (last_file == NULL || G_IS_FILE (last_file), NULL);
@@ -972,7 +872,6 @@ gimp_settings_box_new (Gimp *gimp,
"gimp", gimp,
"config", config,
"container", container,
- "file", file,
NULL);
private = GET_PRIVATE (box);
@@ -1037,7 +936,7 @@ gimp_settings_box_add_current (GimpSettingsBox *box,
gimp_settings_box_truncate_list (box, max_recent);
- gimp_settings_box_serialize (box);
+ gimp_operation_config_serialize (private->gimp, private->container, NULL);
}
GtkWidget *
diff --git a/app/widgets/gimpsettingsbox.h b/app/widgets/gimpsettingsbox.h
index 3813b84..7a1c4a9 100644
--- a/app/widgets/gimpsettingsbox.h
+++ b/app/widgets/gimpsettingsbox.h
@@ -57,7 +57,6 @@ GType gimp_settings_box_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_settings_box_new (Gimp *gimp,
GObject *config,
GimpContainer *container,
- GFile *file,
const gchar *import_dialog_title,
const gchar *export_dialog_title,
const gchar *file_dialog_help_id,
diff --git a/app/widgets/gimpsettingseditor.c b/app/widgets/gimpsettingseditor.c
index b6a7f54..d7b2e52 100644
--- a/app/widgets/gimpsettingseditor.c
+++ b/app/widgets/gimpsettingseditor.c
@@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpsettingseditor.c
- * Copyright (C) 2008-2011 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2008-2017 Michael Natterer <mitch gimp org>
*
* 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
@@ -31,8 +31,10 @@
#include "widgets-types.h"
+#include "operations/gimp-operation-config.h"
+
#include "core/gimp.h"
-#include "core/gimplist.h"
+#include "core/gimpcontainer.h"
#include "core/gimpviewable.h"
#include "gimpcontainertreestore.h"
@@ -360,6 +362,8 @@ gimp_settings_editor_delete_clicked (GtkWidget *widget,
gimp_container_view_select_item (GIMP_CONTAINER_VIEW (private->view),
GIMP_VIEWABLE (new));
+
+ gimp_operation_config_serialize (private->gimp, private->container, NULL);
}
}
@@ -409,6 +413,9 @@ gimp_settings_editor_name_edited (GtkCellRendererText *cell,
/* set name after time so the object is reordered correctly */
gimp_object_take_name (object, name);
+
+ gimp_operation_config_serialize (private->gimp, private->container,
+ NULL);
}
else
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]