app: add "running" property to extension.

And connect to this property in the extension manager to allow dynamic
reload when starting/stopping an extension. It doesn't work yet for
extensions with plug-ins but works with other kinds of data.
This commit is contained in:
Jehan
2018-07-18 12:08:57 +02:00
parent acdf169d97
commit d68a68c54d
2 changed files with 77 additions and 20 deletions

View File

@ -35,7 +35,8 @@ enum
{ {
PROP_0, PROP_0,
PROP_PATH, PROP_PATH,
PROP_WRITABLE PROP_WRITABLE,
PROP_RUNNING
}; };
struct _GimpExtensionPrivate struct _GimpExtensionPrivate
@ -44,6 +45,7 @@ struct _GimpExtensionPrivate
AsApp *app; AsApp *app;
gboolean writable; gboolean writable;
gboolean running;
/* Extension metadata: directories. */ /* Extension metadata: directories. */
GList *brush_paths; GList *brush_paths;
@ -69,6 +71,7 @@ static void gimp_extension_get_property (GObject *object,
GValue *value, GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void gimp_extension_clean (GimpExtension *extension);
static GList * gimp_extension_validate_paths (GimpExtension *extension, static GList * gimp_extension_validate_paths (GimpExtension *extension,
const gchar *paths, const gchar *paths,
gboolean as_directories, gboolean as_directories,
@ -98,6 +101,10 @@ gimp_extension_class_init (GimpExtensionClass *klass)
NULL, NULL, FALSE, NULL, NULL, FALSE,
GIMP_PARAM_READWRITE | GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY)); G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_RUNNING,
g_param_spec_boolean ("running",
NULL, NULL, FALSE,
GIMP_PARAM_READWRITE));
g_type_class_add_private (klass, sizeof (GimpExtensionPrivate)); g_type_class_add_private (klass, sizeof (GimpExtensionPrivate));
} }
@ -115,7 +122,7 @@ gimp_extension_finalize (GObject *object)
{ {
GimpExtension *extension = GIMP_EXTENSION (object); GimpExtension *extension = GIMP_EXTENSION (object);
gimp_extension_stop (extension); gimp_extension_clean (extension);
g_free (extension->p->path); g_free (extension->p->path);
if (extension->p->app) if (extension->p->app)
@ -141,6 +148,9 @@ gimp_extension_set_property (GObject *object,
case PROP_WRITABLE: case PROP_WRITABLE:
extension->p->writable = g_value_get_boolean (value); extension->p->writable = g_value_get_boolean (value);
break; break;
case PROP_RUNNING:
extension->p->running = g_value_get_boolean (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -164,6 +174,9 @@ gimp_extension_get_property (GObject *object,
case PROP_WRITABLE: case PROP_WRITABLE:
g_value_set_boolean (value, extension->p->writable); g_value_set_boolean (value, extension->p->writable);
break; break;
case PROP_RUNNING:
g_value_set_boolean (value, extension->p->running);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -366,7 +379,7 @@ gimp_extension_run (GimpExtension *extension,
g_return_val_if_fail (extension->p->app != NULL, FALSE); g_return_val_if_fail (extension->p->app != NULL, FALSE);
g_return_val_if_fail (error && *error == NULL, FALSE); g_return_val_if_fail (error && *error == NULL, FALSE);
gimp_extension_stop (extension); gimp_extension_clean (extension);
metadata = as_app_get_metadata (extension->p->app); metadata = as_app_get_metadata (extension->p->app);
value = g_hash_table_lookup (metadata, "GIMP::brush-path"); value = g_hash_table_lookup (metadata, "GIMP::brush-path");
@ -425,7 +438,11 @@ gimp_extension_run (GimpExtension *extension,
} }
if (*error) if (*error)
gimp_extension_stop (extension); gimp_extension_clean (extension);
g_object_set (extension,
"running", TRUE,
NULL);
return (*error == NULL); return (*error == NULL);
} }
@ -433,22 +450,10 @@ gimp_extension_run (GimpExtension *extension,
void void
gimp_extension_stop (GimpExtension *extension) gimp_extension_stop (GimpExtension *extension)
{ {
g_list_free_full (extension->p->brush_paths, g_object_unref); gimp_extension_clean (extension);
extension->p->brush_paths = NULL; g_object_set (extension,
g_list_free_full (extension->p->dynamics_paths, g_object_unref); "running", FALSE,
extension->p->dynamics_paths = NULL; NULL);
g_list_free_full (extension->p->mypaint_brush_paths, g_object_unref);
extension->p->brush_paths = NULL;
g_list_free_full (extension->p->pattern_paths, g_object_unref);
extension->p->pattern_paths = NULL;
g_list_free_full (extension->p->gradient_paths, g_object_unref);
extension->p->gradient_paths = NULL;
g_list_free_full (extension->p->palette_paths, g_object_unref);
extension->p->palette_paths = NULL;
g_list_free_full (extension->p->tool_preset_paths, g_object_unref);
extension->p->tool_preset_paths = NULL;
g_list_free_full (extension->p->plug_in_paths, g_object_unref);
extension->p->plug_in_paths = NULL;
} }
GList * GList *
@ -534,6 +539,27 @@ gimp_extension_id_cmp (GimpExtension *extension,
return g_strcmp0 (gimp_object_get_name (extension), id); return g_strcmp0 (gimp_object_get_name (extension), id);
} }
static void
gimp_extension_clean (GimpExtension *extension)
{
g_list_free_full (extension->p->brush_paths, g_object_unref);
extension->p->brush_paths = NULL;
g_list_free_full (extension->p->dynamics_paths, g_object_unref);
extension->p->dynamics_paths = NULL;
g_list_free_full (extension->p->mypaint_brush_paths, g_object_unref);
extension->p->brush_paths = NULL;
g_list_free_full (extension->p->pattern_paths, g_object_unref);
extension->p->pattern_paths = NULL;
g_list_free_full (extension->p->gradient_paths, g_object_unref);
extension->p->gradient_paths = NULL;
g_list_free_full (extension->p->palette_paths, g_object_unref);
extension->p->palette_paths = NULL;
g_list_free_full (extension->p->tool_preset_paths, g_object_unref);
extension->p->tool_preset_paths = NULL;
g_list_free_full (extension->p->plug_in_paths, g_object_unref);
extension->p->plug_in_paths = NULL;
}
/** /**
* gimp_extension_validate_paths: * gimp_extension_validate_paths:
* @extension: the #GimpExtension * @extension: the #GimpExtension

View File

@ -107,6 +107,10 @@ static void gimp_extension_manager_search_directory (GimpExtensionManager
GFile *directory, GFile *directory,
gboolean system_dir); gboolean system_dir);
static void gimp_extension_manager_extension_running (GimpExtension *extension,
GParamSpec *pspec,
GimpExtensionManager *manager);
G_DEFINE_TYPE_WITH_CODE (GimpExtensionManager, gimp_extension_manager, GIMP_TYPE_OBJECT, G_DEFINE_TYPE_WITH_CODE (GimpExtensionManager, gimp_extension_manager, GIMP_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
gimp_extension_manager_config_iface_init)) gimp_extension_manager_config_iface_init))
@ -523,6 +527,9 @@ gimp_extension_manager_initialize (GimpExtensionManager *manager)
(GCompareFunc) g_strcmp0)) (GCompareFunc) g_strcmp0))
processed_ids = g_list_prepend (processed_ids, processed_ids = g_list_prepend (processed_ids,
g_strdup (gimp_object_get_name (list->data))); g_strdup (gimp_object_get_name (list->data)));
g_signal_connect (list->data, "notify::running",
G_CALLBACK (gimp_extension_manager_extension_running),
manager);
} }
for (list = manager->p->sys_extensions; list; list = g_list_next (list)) for (list = manager->p->sys_extensions; list; list = g_list_next (list))
{ {
@ -551,6 +558,9 @@ gimp_extension_manager_initialize (GimpExtensionManager *manager)
g_error_free (error); g_error_free (error);
} }
} }
g_signal_connect (list->data, "notify::running",
G_CALLBACK (gimp_extension_manager_extension_running),
manager);
} }
gimp_extension_manager_refresh (manager); gimp_extension_manager_refresh (manager);
@ -807,3 +817,24 @@ gimp_extension_manager_search_directory (GimpExtensionManager *manager,
g_object_unref (enumerator); g_object_unref (enumerator);
} }
} }
static void
gimp_extension_manager_extension_running (GimpExtension *extension,
GParamSpec *pspec,
GimpExtensionManager *manager)
{
gboolean running;
g_object_get (extension,
"running", &running,
NULL);
if (running)
g_hash_table_insert (manager->p->running_extensions,
(gpointer) gimp_object_get_name (extension),
extension);
else
g_hash_table_remove (manager->p->running_extensions,
(gpointer) gimp_object_get_name (extension));
gimp_extension_manager_refresh (manager);
}