+void
+color_filters_cleanup(void)
+{
+ /* delete the previously deleted filters */
+ color_filter_list_delete(&color_filter_deleted_list);
+}
+
+static void
+color_filters_clone_cb(gpointer filter_arg, gpointer user_data)
+{
+ color_filter_t * new_colorf = color_filter_clone(filter_arg);
+ color_filter_add_cb (new_colorf, user_data);
+}
+
+void
+color_filters_clone(gpointer user_data)
+{
+ g_slist_foreach(color_filter_list, color_filters_clone_cb, user_data);
+}
+
+
+static void
+color_filter_compile_cb(gpointer filter_arg, gpointer unused _U_)
+{
+ color_filter_t *colorf = filter_arg;
+
+ g_assert(colorf->c_colorfilter == NULL);
+ if (!dfilter_compile(colorf->filter_text, &colorf->c_colorfilter)) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Could not compile color filter name: \"%s\" text: \"%s\".\n%s",
+ colorf->filter_name, colorf->filter_text, dfilter_error_msg);
+ /* this filter was compilable before, so this should never happen */
+ /* except if the OK button of the parent window has been clicked */
+ /* so don't use g_assert_not_reached() but check the filters again */
+ }
+}
+
+static void
+color_filter_validate_cb(gpointer filter_arg, gpointer unused _U_)
+{
+ color_filter_t *colorf = filter_arg;
+
+ g_assert(colorf->c_colorfilter == NULL);
+ if (!dfilter_compile(colorf->filter_text, &colorf->c_colorfilter)) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ "Removing color filter name: \"%s\" text: \"%s\".\n%s",
+ colorf->filter_name, colorf->filter_text, dfilter_error_msg);
+ /* Delete the color filter from the list of color filters. */
+ color_filter_valid_list = g_slist_remove(color_filter_valid_list, colorf);
+ color_filter_delete(colorf);
+ }
+}
+
+/* apply changes from the edit list */
+void
+color_filters_apply(GSList *tmp_cfl, GSList *edit_cfl)
+{
+ /* "move" old entries to the deleted list
+ * we must keep them until the dissection no longer needs them */
+ color_filter_deleted_list = g_slist_concat(color_filter_deleted_list, color_filter_list);
+ color_filter_list = NULL;
+
+ /* clone all list entries from tmp/edit to normal list */
+ color_filter_valid_list = NULL;
+ color_filter_valid_list = color_filter_list_clone(tmp_cfl);
+ color_filter_valid_list = g_slist_concat(color_filter_valid_list,
+ color_filter_list_clone(edit_cfl) );
+
+ /* compile all filter */
+ g_slist_foreach(color_filter_valid_list, color_filter_validate_cb, NULL);
+
+ /* clone all list entries from tmp/edit to normal list */
+ color_filter_list = color_filter_list_clone(color_filter_valid_list);
+
+ /* compile all filter */
+ g_slist_foreach(color_filter_list, color_filter_compile_cb, NULL);