summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormonsta <[email protected]>2016-11-30 21:18:35 +0300
committermonsta <[email protected]>2016-11-30 22:24:15 +0300
commit108741a82a158996883f9d1ae19c6e65226f3309 (patch)
tree7b545ec61d19aa4ce2ac8f421493c248a70baf3a
parent52399afcd688b56aaa0750af6d3af42c26c31abe (diff)
downloadeom-108741a82a158996883f9d1ae19c6e65226f3309.tar.bz2
eom-108741a82a158996883f9d1ae19c6e65226f3309.tar.xz
port plugin system to libpeas
backported from eog with a few changes upstream commits for reference: https://git.gnome.org/browse/eog/commit/?id=1f79c321367c91c8e9063f1343a7e4ce4199c4d5 https://git.gnome.org/browse/eog/commit/?id=9afc5483b615039a580e295fe08d7b8ec524759c https://git.gnome.org/browse/eog/commit/?id=40bedbf33812e65f4a8e79691b1fadfaace94035 https://git.gnome.org/browse/eog/commit/?id=8b0acfddc52c220393770a9895b6b56cab7821fd https://git.gnome.org/browse/eog/commit/?id=95694f8b5f06b891a5e55356451ad60b53387563 https://git.gnome.org/browse/eog/commit/?id=7eeb6c8c0e55a3ad954cde4a6fed91ea7f89691c
-rw-r--r--configure.ac5
-rw-r--r--src/Makefile.am11
-rw-r--r--src/eom-application.c7
-rw-r--r--src/eom-application.h4
-rw-r--r--src/eom-plugin-engine.c841
-rw-r--r--src/eom-plugin-engine.h69
-rw-r--r--src/eom-preferences-dialog.c4
-rw-r--r--src/eom-window.c48
-rw-r--r--src/main.c5
9 files changed, 149 insertions, 845 deletions
diff --git a/configure.ac b/configure.ac
index 90f53c5..c3c907d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -97,6 +97,7 @@ MATE_DESKTOP_REQUIRED=1.17.0
GDKPIXBUF_REQUIRED=2.30.0
SHARED_MIME_INFO_REQUIRED=0.20
EXEMPI_REQUIRED=1.99.5
+LIBPEAS_REQUIRED=1.2.0
PKG_CHECK_MODULES(GMODULE, gmodule-2.0, [GMODULE_ADD="gmodule-2.0"],[GMODULE_ADD=""])
EOM_MODULES="gtk+-3.0 >= $GTK_REQUIRED \
@@ -109,7 +110,9 @@ EOM_MODULES="gtk+-3.0 >= $GTK_REQUIRED \
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED \
gio-2.0 >= $GIO_REQUIRED \
gtk+-unix-print-3.0 >= $GTK_REQUIRED \
- shared-mime-info >= $SHARED_MIME_INFO_REQUIRED"
+ shared-mime-info >= $SHARED_MIME_INFO_REQUIRED \
+ libpeas-1.0 >= $LIBPEAS_REQUIRED \
+ libpeas-gtk-1.0 >= $LIBPEAS_REQUIRED"
# Introspection
GOBJECT_INTROSPECTION_CHECK([0.9.3])
diff --git a/src/Makefile.am b/src/Makefile.am
index 1a09b57..c42c0de 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,8 +33,6 @@ NOINST_H_FILES = \
eom-print-image-setup.h \
eom-print-preview.h \
eom-print.h \
- eom-module.h \
- eom-plugin-manager.h \
eom-plugin-engine.h \
eom-close-confirmation-dialog.h \
zoom.h
@@ -60,8 +58,7 @@ INST_H_FILES = \
eom-thumbnail.h \
eom-job-queue.h \
eom-clipboard-handler.h \
- eom-jobs.h \
- eom-plugin.h
+ eom-jobs.h
libeom_c_files = \
eom-application.c \
@@ -96,10 +93,7 @@ libeom_c_files = \
eom-print-image-setup.c \
eom-print-preview.c \
eom-print.c \
- eom-module.c \
eom-close-confirmation-dialog.c \
- eom-plugin.c \
- eom-plugin-manager.c \
eom-plugin-engine.c \
eom-clipboard-handler.c \
zoom.c
@@ -138,7 +132,8 @@ libeom_la_CPPFLAGS = \
-DG_LOG_DOMAIN=\"EOM\" \
-DEOM_DATA_DIR=\""$(pkgdatadir)"\" \
-DEOM_LOCALE_DIR=\""$(datadir)/locale"\" \
- -DEOM_PLUGIN_DIR=\""$(libdir)/eom/plugins"\"
+ -DEOM_PLUGIN_DIR=\""$(libdir)/eom/plugins"\" \
+ -DLIBDIR=\""$(libdir)"\"
libeom_la_CFLAGS = \
$(EOM_CFLAGS) \
diff --git a/src/eom-application.c b/src/eom-application.c
index c5bdf05..1515d70 100644
--- a/src/eom-application.c
+++ b/src/eom-application.c
@@ -140,6 +140,8 @@ eom_application_init (EomApplication *eom_application)
eom_session_init (eom_application);
+ eom_application->plugin_engine = eom_plugin_engine_new ();
+
eom_application->toolbars_model = egg_toolbars_model_new ();
egg_toolbars_model_load_names (eom_application->toolbars_model,
@@ -434,6 +436,11 @@ eom_application_shutdown (EomApplication *application)
application->toolbars_file = NULL;
}
+ if (application->plugin_engine) {
+ g_object_unref (application->plugin_engine);
+ application->plugin_engine = NULL;
+ }
+
eom_application_save_accelerators ();
g_object_unref (application);
diff --git a/src/eom-application.h b/src/eom-application.h
index fcee3b6..dcf4cb8 100644
--- a/src/eom-application.h
+++ b/src/eom-application.h
@@ -26,6 +26,7 @@
#define __EOM_APPLICATION_H__
#include "eom-window.h"
+#include "eom-plugin-engine.h"
#include "egg-toolbars-model.h"
#ifdef HAVE_DBUS
@@ -55,6 +56,9 @@ struct _EomApplication {
EggToolbarsModel *toolbars_model;
gchar *toolbars_file;
+
+ EomPluginEngine *plugin_engine;
+
#ifdef HAVE_DBUS
TotemScrsaver *scr_saver;
#endif
diff --git a/src/eom-plugin-engine.c b/src/eom-plugin-engine.c
index b55b0d0..0c55731 100644
--- a/src/eom-plugin-engine.c
+++ b/src/eom-plugin-engine.c
@@ -26,833 +26,116 @@
#include <config.h>
#endif
-#include <string.h>
-
#include "eom-plugin-engine.h"
-#include "eom-plugin.h"
-#include "eom-module.h"
#include "eom-debug.h"
-#include "eom-application.h"
#include "eom-config-keys.h"
#include "eom-util.h"
#include <glib/gi18n.h>
#include <glib.h>
#include <gio/gio.h>
+#include <girepository.h>
#define USER_EOM_PLUGINS_LOCATION "plugins/"
-#define PLUGIN_EXT ".eom-plugin"
-
-typedef enum {
- EOM_PLUGIN_LOADER_C,
-} EomPluginLoader;
-
-struct _EomPluginInfo
-{
- gchar *file;
-
- gchar *location;
- EomPluginLoader loader;
- GTypeModule *module;
+G_DEFINE_TYPE (EomPluginEngine, eom_plugin_engine, PEAS_TYPE_ENGINE)
- gchar *name;
- gchar *desc;
- gchar *icon_name;
- gchar **authors;
- gchar *copyright;
- gchar *website;
-
- EomPlugin *plugin;
-
- gint active : 1;
-
- /* A plugin is unavailable if it is not possible to activate it
- due to an error loading the plugin module */
- gint available : 1;
+struct _EomPluginEnginePrivate {
+ GSettings *plugins_settings;
};
-static void eom_plugin_engine_active_plugins_changed (GSettings *settings,
- gchar *key,
- gpointer user_data);
-
-static GList *eom_plugins_list = NULL;
-
-static GSettings *eom_plugin_engine_settings = NULL;
-
-static GSList *active_plugins = NULL;
-
-static void
-eom_plugin_info_free (EomPluginInfo *info)
-{
- if (info->plugin != NULL) {
- eom_debug_message (DEBUG_PLUGINS, "Unref plugin %s", info->name);
-
- g_object_unref (info->plugin);
- }
-
- g_free (info->file);
- g_free (info->location);
- g_free (info->name);
- g_free (info->desc);
- g_free (info->icon_name);
- g_free (info->website);
- g_free (info->copyright);
- g_strfreev (info->authors);
-
- g_free (info);
-}
-
-static EomPluginInfo *
-eom_plugin_engine_load (const gchar *file)
-{
- EomPluginInfo *info;
- GKeyFile *plugin_file = NULL;
- gchar *str;
-
- g_return_val_if_fail (file != NULL, NULL);
-
- eom_debug_message (DEBUG_PLUGINS, "Loading plugin: %s", file);
-
- info = g_new0 (EomPluginInfo, 1);
- info->file = g_strdup (file);
-
- plugin_file = g_key_file_new ();
-
- if (!g_key_file_load_from_file (plugin_file, file, G_KEY_FILE_NONE, NULL)) {
- g_warning ("Bad plugin file: %s", file);
-
- goto error;
- }
-
- if (!g_key_file_has_key (plugin_file,
- "Eom Plugin",
- "IAge",
- NULL)) {
- eom_debug_message (DEBUG_PLUGINS,
- "IAge key does not exist in file: %s", file);
-
- goto error;
- }
-
- /* Check IAge=2 */
- if (g_key_file_get_integer (plugin_file,
- "Eom Plugin",
- "IAge",
- NULL) != 2) {
- eom_debug_message (DEBUG_PLUGINS,
- "Wrong IAge in file: %s", file);
-
- goto error;
- }
-
- /* Get Location */
- str = g_key_file_get_string (plugin_file,
- "Eom Plugin",
- "Module",
- NULL);
-
- if ((str != NULL) && (*str != '\0')) {
- info->location = str;
- } else {
- g_warning ("Could not find 'Module' in %s", file);
-
- goto error;
- }
-
- /* Get the loader for this plugin */
- str = g_key_file_get_string (plugin_file,
- "Eom Plugin",
- "Loader",
- NULL);
-
- info->loader = EOM_PLUGIN_LOADER_C;
-
- g_free (str);
-
- /* Get Name */
- str = g_key_file_get_locale_string (plugin_file,
- "Eom Plugin",
- "Name",
- NULL, NULL);
- if (str) {
- info->name = str;
- } else {
- g_warning ("Could not find 'Name' in %s", file);
-
- goto error;
- }
-
- /* Get Description */
- str = g_key_file_get_locale_string (plugin_file,
- "Eom Plugin",
- "Description",
- NULL, NULL);
- if (str) {
- info->desc = str;
- } else {
- eom_debug_message (DEBUG_PLUGINS, "Could not find 'Description' in %s", file);
- }
-
- /* Get Icon */
- str = g_key_file_get_locale_string (plugin_file,
- "Eom Plugin",
- "Icon",
- NULL, NULL);
- if (str) {
- info->icon_name = str;
- } else {
- eom_debug_message (DEBUG_PLUGINS, "Could not find 'Icon' in %s, "
- "using 'eom-plugin'", file);
- }
-
- /* Get Authors */
- info->authors = g_key_file_get_string_list (plugin_file,
- "Eom Plugin",
- "Authors",
- NULL,
- NULL);
-
- if (info->authors == NULL)
- eom_debug_message (DEBUG_PLUGINS, "Could not find 'Authors' in %s", file);
-
-
- /* Get Copyright */
- str = g_key_file_get_string (plugin_file,
- "Eom Plugin",
- "Copyright",
- NULL);
- if (str) {
- info->copyright = str;
- } else {
- eom_debug_message (DEBUG_PLUGINS, "Could not find 'Copyright' in %s", file);
- }
-
- /* Get Website */
- str = g_key_file_get_string (plugin_file,
- "Eom Plugin",
- "Website",
- NULL);
- if (str) {
- info->website = str;
- } else {
- eom_debug_message (DEBUG_PLUGINS, "Could not find 'Website' in %s", file);
- }
-
- g_key_file_free (plugin_file);
-
- /* If we know nothing about the availability of the plugin,
- set it as available */
- info->available = TRUE;
-
- return info;
-
-error:
- g_free (info->file);
- g_free (info->location);
- g_free (info->name);
- g_free (info);
- g_key_file_free (plugin_file);
-
- return NULL;
-}
-
-static gint
-compare_plugin_info (EomPluginInfo *info1,
- EomPluginInfo *info2)
-{
- return strcmp (info1->location, info2->location);
-}
-
-static void
-eom_plugin_engine_load_dir (const gchar *dir)
-{
- GError *error = NULL;
- GDir *d;
- const gchar *dirent;
-
- if (!g_file_test (dir, G_FILE_TEST_IS_DIR)) {
- return;
- }
-
- g_return_if_fail (eom_plugin_engine_settings != NULL);
-
- eom_debug_message (DEBUG_PLUGINS, "DIR: %s", dir);
-
- d = g_dir_open (dir, 0, &error);
-
- if (!d) {
- g_warning ("%s", error->message);
- g_error_free (error);
-
- return;
- }
-
- while ((dirent = g_dir_read_name (d))) {
- if (g_str_has_suffix (dirent, PLUGIN_EXT)) {
- gchar *plugin_file;
- EomPluginInfo *info;
-
- plugin_file = g_build_filename (dir, dirent, NULL);
- info = eom_plugin_engine_load (plugin_file);
- g_free (plugin_file);
-
- if (info == NULL)
- continue;
-
- /* If a plugin with this name has already been loaded
- * drop this one (user plugins override system plugins) */
- if (g_list_find_custom (eom_plugins_list,
- info,
- (GCompareFunc)compare_plugin_info) != NULL) {
- g_warning ("Two or more plugins named '%s'. "
- "Only the first will be considered.\n",
- info->location);
-
- eom_plugin_info_free (info);
-
- continue;
- }
-
- /* Actually, the plugin will be activated when reactivate_all
- * will be called for the first time. */
- info->active = (g_slist_find_custom (active_plugins,
- info->location,
- (GCompareFunc)strcmp) != NULL);
-
- eom_plugins_list = g_list_prepend (eom_plugins_list, info);
-
- eom_debug_message (DEBUG_PLUGINS, "Plugin %s loaded", info->name);
- }
- }
-
- eom_plugins_list = g_list_reverse (eom_plugins_list);
-
- g_dir_close (d);
-}
-
static void
-eom_plugin_engine_load_all (void)
-{
- gchar *pdir;
-
- pdir = g_build_filename (eom_util_dot_dir (),
- USER_EOM_PLUGINS_LOCATION, NULL);
-
- /* Load user's plugins */
- eom_plugin_engine_load_dir (pdir);
-
- g_free (pdir);
-
- /* Load system plugins */
- eom_plugin_engine_load_dir (EOM_PLUGIN_DIR "/");
-}
-
-static void
-eom_plugin_engine_get_active_plugins (void)
-{
- gchar **array;
- gint i;
-
- active_plugins = NULL;
- array = g_settings_get_strv (eom_plugin_engine_settings, EOM_CONF_PLUGINS_ACTIVE_PLUGINS);
- if (array != NULL) {
- for (i = 0; array[i]; i++) {
- active_plugins = g_slist_append (active_plugins, g_strdup (array[i]));
- }
- }
- g_strfreev (array);
-}
-
-gboolean
-eom_plugin_engine_init (void)
+eom_plugin_engine_init (EomPluginEngine *engine)
{
eom_debug (DEBUG_PLUGINS);
- g_return_val_if_fail (eom_plugins_list == NULL, FALSE);
+ engine->priv = G_TYPE_INSTANCE_GET_PRIVATE (engine,
+ EOM_TYPE_PLUGIN_ENGINE,
+ EomPluginEnginePrivate);
- if (!g_module_supported ()) {
- g_warning ("eom is not able to initialize the plugins engine.");
-
- return FALSE;
- }
-
- eom_plugin_engine_settings = g_settings_new (EOM_CONF_PLUGINS);
-
- g_signal_connect (eom_plugin_engine_settings,
- "changed::" EOM_CONF_PLUGINS_ACTIVE_PLUGINS,
- G_CALLBACK (eom_plugin_engine_active_plugins_changed),
- NULL);
-
- eom_plugin_engine_get_active_plugins ();
-
- eom_plugin_engine_load_all ();
-
- return TRUE;
-}
-
-void
-eom_plugin_engine_shutdown (void)
-{
- GList *pl;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_if_fail (eom_plugin_engine_settings != NULL);
-
- for (pl = eom_plugins_list; pl; pl = pl->next) {
- EomPluginInfo *info = (EomPluginInfo*) pl->data;
-
- eom_plugin_info_free (info);
- }
-
- g_slist_foreach (active_plugins, (GFunc)g_free, NULL);
- g_slist_free (active_plugins);
-
- active_plugins = NULL;
-
- g_list_free (eom_plugins_list);
- eom_plugins_list = NULL;
-
- g_object_unref (eom_plugin_engine_settings);
- eom_plugin_engine_settings = NULL;
-}
-
-const GList *
-eom_plugin_engine_get_plugins_list (void)
-{
- eom_debug (DEBUG_PLUGINS);
-
- return eom_plugins_list;
-}
-
-static gboolean
-load_plugin_module (EomPluginInfo *info)
-{
- gchar *path;
- gchar *dirname;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_val_if_fail (info != NULL, FALSE);
- g_return_val_if_fail (info->file != NULL, FALSE);
- g_return_val_if_fail (info->location != NULL, FALSE);
- g_return_val_if_fail (info->plugin == NULL, FALSE);
- g_return_val_if_fail (info->available, FALSE);
-
- switch (info->loader) {
- case EOM_PLUGIN_LOADER_C:
- dirname = g_path_get_dirname (info->file);
- g_return_val_if_fail (dirname != NULL, FALSE);
-
- path = g_module_build_path (dirname, info->location);
-
- g_free (dirname);
-
- g_return_val_if_fail (path != NULL, FALSE);
-
- info->module = G_TYPE_MODULE (eom_module_new (path));
-
- g_free (path);
-
- break;
-
- default:
- g_return_val_if_reached (FALSE);
- }
-
- if (!g_type_module_use (info->module)) {
- switch (info->loader) {
- case EOM_PLUGIN_LOADER_C:
- g_warning ("Cannot load plugin '%s' since file '%s' cannot be read.",
- info->name,
- eom_module_get_path (EOM_MODULE (info->module)));
- break;
-
- default:
- g_return_val_if_reached (FALSE);
- }
-
- g_object_unref (G_OBJECT (info->module));
-
- info->module = NULL;
-
- /* Mark plugin as unavailable and fails */
- info->available = FALSE;
-
- return FALSE;
- }
-
- switch (info->loader) {
- case EOM_PLUGIN_LOADER_C:
- info->plugin =
- EOM_PLUGIN (eom_module_new_object (EOM_MODULE (info->module)));
- break;
-
- default:
- g_return_val_if_reached (FALSE);
- }
-
- g_type_module_unuse (info->module);
-
- eom_debug_message (DEBUG_PLUGINS, "End");
-
- return TRUE;
-}
-
-static gboolean
-eom_plugin_engine_activate_plugin_real (EomPluginInfo *info)
-{
- gboolean res = TRUE;
-
- /* Plugin is not available, don't try to activate/load it */
- if (!info->available) {
- return FALSE;
- }
-
- if (info->plugin == NULL)
- res = load_plugin_module (info);
-
- if (res) {
- const GList *wins = eom_application_get_windows (EOM_APP);
-
- while (wins != NULL) {
- eom_plugin_activate (info->plugin,
- EOM_WINDOW (wins->data));
-
- wins = g_list_next (wins);
- }
- } else {
- g_warning ("Error activating plugin '%s'", info->name);
- }
-
- return res;
-}
-
-gboolean
-eom_plugin_engine_activate_plugin (EomPluginInfo *info)
-{
- eom_debug (DEBUG_PLUGINS);
-
- g_return_val_if_fail (info != NULL, FALSE);
-
- if (!info->available)
- return FALSE;
-
- if (info->active)
- return TRUE;
-
- if (eom_plugin_engine_activate_plugin_real (info)) {
- GSList *list;
-
- /* Update plugin state */
- info->active = TRUE;
-
- list = active_plugins;
-
- while (list != NULL) {
- if (strcmp (info->location, (gchar *)list->data) == 0) {
- g_warning ("Plugin '%s' is already active.", info->name);
-
- return TRUE;
- }
-
- list = g_slist_next (list);
- }
-
- active_plugins = g_slist_insert_sorted (active_plugins,
- g_strdup (info->location),
- (GCompareFunc)strcmp);
-
- GArray *array;
- GSList *l;
- array = g_array_new (TRUE, TRUE, sizeof (gchar *));
- for (l = active_plugins; l; l = l->next) {
- array = g_array_append_val (array, l->data);
- }
- g_settings_set_strv (eom_plugin_engine_settings, EOM_CONF_PLUGINS_ACTIVE_PLUGINS,
- (const gchar **) array->data);
- g_array_free (array, TRUE);
-
- return TRUE;
- }
-
- return FALSE;
+ engine->priv->plugins_settings = g_settings_new (EOM_CONF_PLUGINS);
}
static void
-eom_plugin_engine_deactivate_plugin_real (EomPluginInfo *info)
-{
- const GList *wins = eom_application_get_windows (EOM_APP);
-
- while (wins != NULL) {
- eom_plugin_deactivate (info->plugin,
- EOM_WINDOW (wins->data));
-
- wins = g_list_next (wins);
- }
-}
-
-gboolean
-eom_plugin_engine_deactivate_plugin (EomPluginInfo *info)
+eom_plugin_engine_dispose (GObject *object)
{
- gboolean res;
- GSList *list;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_val_if_fail (info != NULL, FALSE);
-
- if (!info->active || !info->available)
- return TRUE;
-
- eom_plugin_engine_deactivate_plugin_real (info);
-
- /* Update plugin state */
- info->active = FALSE;
+ EomPluginEngine *engine = EOM_PLUGIN_ENGINE (object);
- list = active_plugins;
- res = (list == NULL);
-
- while (list != NULL) {
- if (strcmp (info->location, (gchar *)list->data) == 0) {
- g_free (list->data);
- active_plugins = g_slist_delete_link (active_plugins, list);
- list = NULL;
- res = TRUE;
- } else {
- list = g_slist_next (list);
- }
- }
-
- if (!res) {
- g_warning ("Plugin '%s' is already deactivated.", info->name);
-
- return TRUE;
+ if (engine->priv->plugins_settings != NULL)
+ {
+ g_object_unref (engine->priv->plugins_settings);
+ engine->priv->plugins_settings = NULL;
}
- GArray *array;
- GSList *l;
- array = g_array_new (TRUE, TRUE, sizeof (gchar *));
- for (l = active_plugins; l; l = l->next) {
- array = g_array_append_val (array, l->data);
- }
- g_settings_set_strv (eom_plugin_engine_settings, EOM_CONF_PLUGINS_ACTIVE_PLUGINS,
- (const gchar **) array->data);
- g_array_free (array, TRUE);
-
- return TRUE;
-}
-
-gboolean
-eom_plugin_engine_plugin_is_active (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, FALSE);
-
- return (info->available && info->active);
-}
-
-gboolean
-eom_plugin_engine_plugin_is_available (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, FALSE);
-
- return (info->available != FALSE);
+ G_OBJECT_CLASS (eom_plugin_engine_parent_class)->dispose (object);
}
static void
-reactivate_all (EomWindow *window)
+eom_plugin_engine_class_init (EomPluginEngineClass *klass)
{
- GList *pl;
-
- eom_debug (DEBUG_PLUGINS);
-
- for (pl = eom_plugins_list; pl; pl = pl->next) {
- gboolean res = TRUE;
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
- EomPluginInfo *info = (EomPluginInfo*)pl->data;
+ object_class->dispose = eom_plugin_engine_dispose;
- /* If plugin is not available, don't try to activate/load it */
- if (info->available && info->active) {
- if (info->plugin == NULL)
- res = load_plugin_module (info);
-
- if (res)
- eom_plugin_activate (info->plugin,
- window);
- }
- }
-
- eom_debug_message (DEBUG_PLUGINS, "End");
+ g_type_class_add_private (klass, sizeof (EomPluginEnginePrivate));
}
-void
-eom_plugin_engine_update_plugins_ui (EomWindow *window,
- gboolean new_window)
+EomPluginEngine *
+eom_plugin_engine_new (void)
{
- GList *pl;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_if_fail (EOM_IS_WINDOW (window));
-
- if (new_window)
- reactivate_all (window);
-
- /* Updated ui of all the plugins that implement update_ui */
- for (pl = eom_plugins_list; pl; pl = pl->next) {
- EomPluginInfo *info = (EomPluginInfo*)pl->data;
-
- if (!info->available || !info->active)
- continue;
+ EomPluginEngine *engine;
+ gchar *user_plugin_path;
+ gchar *private_path;
+ GError *error = NULL;
- eom_debug_message (DEBUG_PLUGINS, "Updating UI of %s", info->name);
+ private_path = g_build_filename (LIBDIR, "girepository-1.0", NULL);
- eom_plugin_update_ui (info->plugin, window);
+ /* This should be moved to libpeas */
+ if (g_irepository_require (g_irepository_get_default (),
+ "Peas", "1.0", 0, &error) == NULL)
+ {
+ g_warning ("Error loading Peas typelib: %s\n",
+ error->message);
+ g_clear_error (&error);
}
-}
-
-gboolean
-eom_plugin_engine_plugin_is_configurable (EomPluginInfo *info) {
- eom_debug (DEBUG_PLUGINS);
-
- g_return_val_if_fail (info != NULL, FALSE);
-
- if ((info->plugin == NULL) || !info->active || !info->available)
- return FALSE;
-
- return eom_plugin_is_configurable (info->plugin);
-}
-
-void
-eom_plugin_engine_configure_plugin (EomPluginInfo *info,
- GtkWindow *parent)
-{
- GtkWidget *conf_dlg;
-
- GtkWindowGroup *wg;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_if_fail (info != NULL);
-
- conf_dlg = eom_plugin_create_configure_dialog (info->plugin);
-
- g_return_if_fail (conf_dlg != NULL);
- gtk_window_set_transient_for (GTK_WINDOW (conf_dlg),
- parent);
-
- // Will return a default group if no group is set
- wg = gtk_window_get_group (parent);
-
- // For now assign a dedicated window group if it is
- // the default one until we know if this is really needed
- if (wg == gtk_window_get_group (NULL)) {
- wg = gtk_window_group_new ();
- gtk_window_group_add_window (wg, parent);
+ if (g_irepository_require (g_irepository_get_default (),
+ "PeasGtk", "1.0", 0, &error) == NULL)
+ {
+ g_warning ("Error loading PeasGtk typelib: %s\n",
+ error->message);
+ g_clear_error (&error);
}
- gtk_window_group_add_window (wg,
- GTK_WINDOW (conf_dlg));
-
- gtk_window_set_modal (GTK_WINDOW (conf_dlg), TRUE);
-
- gtk_widget_show (conf_dlg);
-}
-
-static void
-eom_plugin_engine_active_plugins_changed (GSettings *settings,
- gchar *key,
- gpointer user_data)
-{
- GList *pl;
- gboolean to_activate;
-
- eom_debug (DEBUG_PLUGINS);
-
- g_return_if_fail (settings != NULL);
- g_return_if_fail (key != NULL);
-
- eom_plugin_engine_get_active_plugins ();
-
- for (pl = eom_plugins_list; pl; pl = pl->next) {
- EomPluginInfo *info = (EomPluginInfo*)pl->data;
-
- if (!info->available)
- continue;
-
- to_activate = (g_slist_find_custom (active_plugins,
- info->location,
- (GCompareFunc)strcmp) != NULL);
-
- if (!info->active && to_activate) {
- /* Activate plugin */
- if (eom_plugin_engine_activate_plugin_real (info))
- /* Update plugin state */
- info->active = TRUE;
- } else {
- if (info->active && !to_activate) {
- eom_plugin_engine_deactivate_plugin_real (info);
-
- /* Update plugin state */
- info->active = FALSE;
- }
- }
+ if (g_irepository_require_private (g_irepository_get_default (),
+ private_path, "Eom", "1.0", 0,
+ &error) == NULL)
+ {
+ g_warning ("Error loading Eom typelib: %s\n",
+ error->message);
+ g_clear_error (&error);
}
-}
-
-const gchar *
-eom_plugin_engine_get_plugin_name (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, NULL);
-
- return info->name;
-}
-
-const gchar *
-eom_plugin_engine_get_plugin_description (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, NULL);
-
- return info->desc;
-}
-const gchar *
-eom_plugin_engine_get_plugin_icon_name (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, NULL);
+ g_free (private_path);
- /* Use the eom-plugin icon as a default if the plugin does not
- have its own */
- if (info->icon_name != NULL &&
- gtk_icon_theme_has_icon (gtk_icon_theme_get_default (),
- info->icon_name))
- return info->icon_name;
- else
- return "eom-plugin";
-}
+ engine = EOM_PLUGIN_ENGINE (g_object_new (EOM_TYPE_PLUGIN_ENGINE, NULL));
-const gchar **
-eom_plugin_engine_get_plugin_authors (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, (const gchar **)NULL);
+ user_plugin_path = g_build_filename (eom_util_dot_dir (),
+ USER_EOM_PLUGINS_LOCATION, NULL);
- return (const gchar **) info->authors;
-}
+ peas_engine_add_search_path (PEAS_ENGINE (engine),
+ user_plugin_path, user_plugin_path);
-const gchar *
-eom_plugin_engine_get_plugin_website (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, NULL);
+ peas_engine_add_search_path (PEAS_ENGINE (engine),
+ EOM_PLUGIN_DIR, EOM_PLUGIN_DIR);
- return info->website;
-}
+ g_settings_bind (engine->priv->plugins_settings,
+ EOM_CONF_PLUGINS_ACTIVE_PLUGINS,
+ engine,
+ "loaded-plugins",
+ G_SETTINGS_BIND_DEFAULT);
-const gchar *
-eom_plugin_engine_get_plugin_copyright (EomPluginInfo *info)
-{
- g_return_val_if_fail (info != NULL, NULL);
+ g_free (user_plugin_path);
- return info->copyright;
+ return engine;
}
diff --git a/src/eom-plugin-engine.h b/src/eom-plugin-engine.h
index 67088b3..8c1d092 100644
--- a/src/eom-plugin-engine.h
+++ b/src/eom-plugin-engine.h
@@ -25,62 +25,35 @@
#ifndef __EOM_PLUGIN_ENGINE_H__
#define __EOM_PLUGIN_ENGINE_H__
-#include "eom-window.h"
-
#include <glib.h>
+#include <libpeas/peas-engine.h>
-typedef struct _EomPluginInfo EomPluginInfo;
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_init (void);
-
-G_GNUC_INTERNAL
-void eom_plugin_engine_shutdown (void);
-
-G_GNUC_INTERNAL
-const GList *eom_plugin_engine_get_plugins_list (void);
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_activate_plugin (EomPluginInfo *info);
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_deactivate_plugin (EomPluginInfo *info);
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_plugin_is_active (EomPluginInfo *info);
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_plugin_is_available (EomPluginInfo *info);
-
-G_GNUC_INTERNAL
-gboolean eom_plugin_engine_plugin_is_configurable
- (EomPluginInfo *info);
-
-G_GNUC_INTERNAL
-void eom_plugin_engine_configure_plugin (EomPluginInfo *info,
- GtkWindow *parent);
+G_BEGIN_DECLS
-G_GNUC_INTERNAL
-void eom_plugin_engine_update_plugins_ui (EomWindow *window,
- gboolean new_window);
+typedef struct _EomPluginEngine EomPluginEngine;
+typedef struct _EomPluginEngineClass EomPluginEngineClass;
+typedef struct _EomPluginEnginePrivate EomPluginEnginePrivate;
-G_GNUC_INTERNAL
-const gchar *eom_plugin_engine_get_plugin_name (EomPluginInfo *info);
+#define EOM_TYPE_PLUGIN_ENGINE eom_plugin_engine_get_type()
+#define EOM_PLUGIN_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EOM_TYPE_PLUGIN_ENGINE, EomPluginEngine))
+#define EOM_PLUGIN_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EOM_TYPE_PLUGIN_ENGINE, EomPluginEngineClass))
+#define EOM_IS_PLUGIN_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EOM_TYPE_PLUGIN_ENGINE))
+#define EOM_IS_PLUGIN_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EOM_TYPE_PLUGIN_ENGINE))
+#define EOM_PLUGIN_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EOM_TYPE_PLUGIN_ENGINE, EomPluginEngineClass))
-G_GNUC_INTERNAL
-const gchar *eom_plugin_engine_get_plugin_description
- (EomPluginInfo *info);
+struct _EomPluginEngine {
+ PeasEngine parent;
+ EomPluginEnginePrivate *priv;
+};
-G_GNUC_INTERNAL
-const gchar *eom_plugin_engine_get_plugin_icon_name (EomPluginInfo *info);
+struct _EomPluginEngineClass {
+ PeasEngineClass parent_class;
+};
-G_GNUC_INTERNAL
-const gchar **eom_plugin_engine_get_plugin_authors (EomPluginInfo *info);
+GType eom_plugin_engine_get_type (void) G_GNUC_CONST;
-G_GNUC_INTERNAL
-const gchar *eom_plugin_engine_get_plugin_website (EomPluginInfo *info);
+EomPluginEngine* eom_plugin_engine_new (void);
-G_GNUC_INTERNAL
-const gchar *eom_plugin_engine_get_plugin_copyright (EomPluginInfo *info);
+G_END_DECLS
#endif /* __EOM_PLUGIN_ENGINE_H__ */
diff --git a/src/eom-preferences-dialog.c b/src/eom-preferences-dialog.c
index 59cd042..24596d3 100644
--- a/src/eom-preferences-dialog.c
+++ b/src/eom-preferences-dialog.c
@@ -27,7 +27,6 @@
#endif
#include "eom-preferences-dialog.h"
-#include "eom-plugin-manager.h"
#include "eom-scroll-view.h"
#include "eom-util.h"
#include "eom-config-keys.h"
@@ -37,6 +36,7 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
+#include <libpeas-gtk/peas-gtk-plugin-manager.h>
#define EOM_PREFERENCES_DIALOG_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), EOM_TYPE_PREFERENCES_DIALOG, EomPreferencesDialogPrivate))
@@ -297,7 +297,7 @@ eom_preferences_dialog_constructor (GType type,
"value",
G_SETTINGS_BIND_DEFAULT);
- plugin_manager = eom_plugin_manager_new ();
+ plugin_manager = peas_gtk_plugin_manager_new (NULL);
g_assert (plugin_manager != NULL);
diff --git a/src/eom-window.c b/src/eom-window.c
index 5c022f4..72400d5 100644
--- a/src/eom-window.c
+++ b/src/eom-window.c
@@ -50,7 +50,6 @@
#include "eom-jobs.h"
#include "eom-util.h"
#include "eom-save-as-dialog-helper.h"
-#include "eom-plugin-engine.h"
#include "eom-close-confirmation-dialog.h"
#include "eom-clipboard-handler.h"
@@ -68,6 +67,9 @@
#include <gio/gdesktopappinfo.h>
#include <gtk/gtk.h>
+#include <libpeas/peas-extension-set.h>
+#include <libpeas/peas-activatable.h>
+
#if HAVE_LCMS
#include <X11/Xlib.h>
#include <X11/Xatom.h>
@@ -185,6 +187,8 @@ struct _EomWindowPrivate {
GtkPageSetup *page_setup;
+ PeasExtensionSet *extensions;
+
#ifdef HAVE_LCMS
cmsHPROFILE *display_profile;
#endif
@@ -4562,6 +4566,14 @@ eom_window_dispose (GObject *object)
window = EOM_WINDOW (object);
priv = window->priv;
+ peas_engine_garbage_collect (PEAS_ENGINE (EOM_APP->plugin_engine));
+
+ if (priv->extensions != NULL) {
+ g_object_unref (priv->extensions);
+ priv->extensions = NULL;
+ peas_engine_garbage_collect (PEAS_ENGINE (EOM_APP->plugin_engine));
+ }
+
if (priv->page_setup != NULL) {
g_object_unref (priv->page_setup);
priv->page_setup = NULL;
@@ -4678,6 +4690,8 @@ eom_window_dispose (GObject *object)
priv->last_save_as_folder = NULL;
}
+ peas_engine_garbage_collect (PEAS_ENGINE (EOM_APP->plugin_engine));
+
G_OBJECT_CLASS (eom_window_parent_class)->dispose (object);
}
@@ -4999,19 +5013,49 @@ eom_window_get_property (GObject *object,
}
}
+static void
+on_extension_added (PeasExtensionSet *set,
+ PeasPluginInfo *info,
+ PeasExtension *exten,
+ GtkWindow *window)
+{
+ peas_extension_call (exten, "activate", window);
+}
+
+static void
+on_extension_removed (PeasExtensionSet *set,
+ PeasPluginInfo *info,
+ PeasExtension *exten,
+ GtkWindow *window)
+{
+ peas_extension_call (exten, "deactivate", window);
+}
+
static GObject *
eom_window_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_params)
{
GObject *object;
+ EomWindowPrivate *priv;
object = G_OBJECT_CLASS (eom_window_parent_class)->constructor
(type, n_construct_properties, construct_params);
+ priv = EOM_WINDOW (object)->priv;
+
eom_window_construct_ui (EOM_WINDOW (object));
- eom_plugin_engine_update_plugins_ui (EOM_WINDOW (object), TRUE);
+ priv->extensions = peas_extension_set_new (PEAS_ENGINE (EOM_APP->plugin_engine),
+ PEAS_TYPE_ACTIVATABLE,
+ "object", object, NULL);
+
+ peas_extension_set_call (priv->extensions, "activate");
+
+ g_signal_connect (priv->extensions, "extension-added",
+ G_CALLBACK (on_extension_added), object);
+ g_signal_connect (priv->extensions, "extension-removed",
+ G_CALLBACK (on_extension_removed), object);
return object;
}
diff --git a/src/main.c b/src/main.c
index 6638054..18049d8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -39,7 +39,6 @@
#include "eom-thumbnail.h"
#include "eom-job-queue.h"
#include "eom-application.h"
-#include "eom-plugin-engine.h"
#include "eom-util.h"
#include <string.h>
@@ -255,8 +254,6 @@ main (int argc, char **argv)
}
g_object_unref (provider);
- eom_plugin_engine_init ();
-
/* Add application specific icons to search path */
gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
EOM_DATA_DIR G_DIR_SEPARATOR_S "icons");
@@ -271,8 +268,6 @@ main (int argc, char **argv)
if (startup_files)
g_strfreev (startup_files);
- eom_plugin_engine_shutdown ();
-
#ifdef HAVE_EXEMPI
xmp_terminate();
#endif