diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 25 | ||||
-rw-r--r-- | src/eom-plugin-engine.c | 83 | ||||
-rw-r--r-- | src/eom-plugin-engine.h | 3 | ||||
-rw-r--r-- | src/eom-python-module.c | 527 | ||||
-rw-r--r-- | src/eom-python-module.h | 72 | ||||
-rw-r--r-- | src/eom-python-plugin.c | 282 | ||||
-rw-r--r-- | src/eom-python-plugin.h | 55 | ||||
-rw-r--r-- | src/eom-window.c | 4 |
8 files changed, 2 insertions, 1049 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 56b3f3a..884b955 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,12 +39,6 @@ NOINST_H_FILES = \ eom-close-confirmation-dialog.h \ zoom.h -if ENABLE_PYTHON -NOINST_H_FILES += \ - eom-python-module.h \ - eom-python-plugin.h -endif - INST_H_FILES = \ eom-application.h \ eom-debug.h \ @@ -125,14 +119,6 @@ libeom_c_files += \ eom-exif-details.c endif -if ENABLE_PYTHON -libeom_la_SOURCES += \ - eom-python-module.c \ - eom-python-module.h \ - eom-python-plugin.c \ - eom-python-plugin.h -endif - if HAVE_EXEMPI # We need to make sure eom-exif-details.h # is only listed once in INST_H_FILES @@ -169,17 +155,6 @@ libeom_la_LIBADD += \ $(X11_LIBS) endif -if ENABLE_PYTHON -libeom_la_CFLAGS += \ - $(NO_STRICT_ALIASING_CFLAGS) \ - $(PYGTK_CFLAGS) \ - $(PYTHON_CFLAGS) \ - $(AM_CFLAGS) - -libeom_la_LIBADD += \ - $(top_builddir)/bindings/python/eom.la -endif - eom_SOURCES = main.c eom_CFLAGS = \ diff --git a/src/eom-plugin-engine.c b/src/eom-plugin-engine.c index 5207d95..b55b0d0 100644 --- a/src/eom-plugin-engine.c +++ b/src/eom-plugin-engine.c @@ -40,17 +40,12 @@ #include <glib.h> #include <gio/gio.h> -#ifdef ENABLE_PYTHON -#include "eom-python-module.h" -#endif - #define USER_EOM_PLUGINS_LOCATION "plugins/" #define PLUGIN_EXT ".eom-plugin" typedef enum { EOM_PLUGIN_LOADER_C, - EOM_PLUGIN_LOADER_PY, } EomPluginLoader; struct _EomPluginInfo @@ -73,8 +68,7 @@ struct _EomPluginInfo gint active : 1; /* A plugin is unavailable if it is not possible to activate it - due to an error loading the plugin module (e.g. for Python plugins - when the interpreter has not been correctly initializated) */ + due to an error loading the plugin module */ gint available : 1; }; @@ -172,19 +166,7 @@ eom_plugin_engine_load (const gchar *file) "Loader", NULL); - if (str && strcmp(str, "python") == 0) { - info->loader = EOM_PLUGIN_LOADER_PY; - -#ifndef ENABLE_PYTHON - g_warning ("Cannot load Python plugin '%s' since eom was not " - "compiled with Python support.", file); - - goto error; -#endif - - } else { - info->loader = EOM_PLUGIN_LOADER_C; - } + info->loader = EOM_PLUGIN_LOADER_C; g_free (str); @@ -410,30 +392,12 @@ eom_plugin_engine_init (void) } void -eom_plugin_engine_garbage_collect (void) -{ -#ifdef ENABLE_PYTHON - eom_python_garbage_collect (); -#endif -} - -void eom_plugin_engine_shutdown (void) { GList *pl; eom_debug (DEBUG_PLUGINS); -#ifdef ENABLE_PYTHON - /* Note: that this may cause finalization of objects (typically - * the EomWindow) by running the garbage collector. Since some - * of the plugin may have installed callbacks upon object - * finalization (typically they need to free the WindowData) - * it must run before we get rid of the plugins. - */ - eom_python_shutdown (); -#endif - g_return_if_fail (eom_plugin_engine_settings != NULL); for (pl = eom_plugins_list; pl; pl = pl->next) { @@ -493,36 +457,6 @@ load_plugin_module (EomPluginInfo *info) break; -#ifdef ENABLE_PYTHON - case EOM_PLUGIN_LOADER_PY: - { - gchar *dir; - - if (!eom_python_init ()) { - /* Mark plugin as unavailable and fails */ - info->available = FALSE; - - g_warning ("Cannot load Python plugin '%s' since eom " - "was not able to initialize the Python interpreter.", - info->name); - - return FALSE; - } - - g_return_val_if_fail ((info->location != NULL) && - (info->location[0] != '\0'), - FALSE); - - dir = g_path_get_dirname (info->file); - - info->module = G_TYPE_MODULE ( - eom_python_module_new (dir, info->location)); - - g_free (dir); - - break; - } -#endif default: g_return_val_if_reached (FALSE); } @@ -535,12 +469,6 @@ load_plugin_module (EomPluginInfo *info) eom_module_get_path (EOM_MODULE (info->module))); break; - case EOM_PLUGIN_LOADER_PY: - g_warning ("Cannot load Python plugin '%s' since file '%s' cannot be read.", - info->name, - info->location); - break; - default: g_return_val_if_reached (FALSE); } @@ -561,13 +489,6 @@ load_plugin_module (EomPluginInfo *info) EOM_PLUGIN (eom_module_new_object (EOM_MODULE (info->module))); break; -#ifdef ENABLE_PYTHON - case EOM_PLUGIN_LOADER_PY: - info->plugin = - EOM_PLUGIN (eom_python_module_new_object (EOM_PYTHON_MODULE (info->module))); - break; -#endif - default: g_return_val_if_reached (FALSE); } diff --git a/src/eom-plugin-engine.h b/src/eom-plugin-engine.h index 1213854..67088b3 100644 --- a/src/eom-plugin-engine.h +++ b/src/eom-plugin-engine.h @@ -38,9 +38,6 @@ G_GNUC_INTERNAL void eom_plugin_engine_shutdown (void); G_GNUC_INTERNAL -void eom_plugin_engine_garbage_collect (void); - -G_GNUC_INTERNAL const GList *eom_plugin_engine_get_plugins_list (void); G_GNUC_INTERNAL diff --git a/src/eom-python-module.c b/src/eom-python-module.c deleted file mode 100644 index 9f1bfbc..0000000 --- a/src/eom-python-module.c +++ /dev/null @@ -1,527 +0,0 @@ -/* - * eom-python-module.c - * This file is part of eom - * - * Copyright (C) 2005 Raphael Slinckx - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/* This needs to be included before any standard header - * see http://docs.python.org/c-api/intro.html#include-files */ -#include <Python.h> - -#include <pygobject.h> -#include <pygtk/pygtk.h> - -#include <signal.h> - -#include <gmodule.h> - -#include "eom-python-module.h" -#include "eom-python-plugin.h" -#include "eom-debug.h" - -#if PY_VERSION_HEX < 0x02050000 -typedef int Py_ssize_t; -#define PY_SSIZE_T_MAX INT_MAX -#define PY_SSIZE_T_MIN INT_MIN -#endif - -#define EOM_PYTHON_MODULE_GET_PRIVATE(object) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((object), EOM_TYPE_PYTHON_MODULE, EomPythonModulePrivate)) - -struct _EomPythonModulePrivate { - gchar *module; - gchar *path; - GType type; -}; - -enum { - PROP_0, - PROP_PATH, - PROP_MODULE -}; - -void pyeom_register_classes (PyObject *d); -void pyeom_add_constants (PyObject *module, const gchar *strip_prefix); -extern PyMethodDef pyeom_functions[]; - -static PyTypeObject *PyEomPlugin_Type; - -G_DEFINE_TYPE (EomPythonModule, eom_python_module, G_TYPE_TYPE_MODULE) - -static gboolean -eom_python_module_load (GTypeModule *gmodule) -{ - EomPythonModulePrivate *priv = EOM_PYTHON_MODULE_GET_PRIVATE (gmodule); - PyObject *main_module, *main_locals, *locals, *key, *value; - PyObject *module, *fromlist; - Py_ssize_t pos = 0; - - g_return_val_if_fail (Py_IsInitialized (), FALSE); - - main_module = PyImport_AddModule ("__main__"); - - if (main_module == NULL) { - g_warning ("Could not get __main__."); - return FALSE; - } - - /* If we have a special path, we register it */ - if (priv->path != NULL) { - PyObject *sys_path = PySys_GetObject ("path"); - PyObject *path = PyString_FromString (priv->path); - - if (PySequence_Contains(sys_path, path) == 0) - PyList_Insert (sys_path, 0, path); - - Py_DECREF(path); - } - - main_locals = PyModule_GetDict (main_module); - - /* We need a fromlist to be able to import modules with - * a '.' in the name. */ - fromlist = PyTuple_New(0); - - module = PyImport_ImportModuleEx (priv->module, main_locals, main_locals, fromlist); - - Py_DECREF(fromlist); - - if (!module) { - PyErr_Print (); - return FALSE; - } - - locals = PyModule_GetDict (module); - - while (PyDict_Next (locals, &pos, &key, &value)) { - if (!PyType_Check(value)) - continue; - - if (PyObject_IsSubclass (value, (PyObject*) PyEomPlugin_Type)) { - priv->type = eom_python_plugin_get_type (gmodule, value); - return TRUE; - } - } - - return FALSE; -} - -static void -eom_python_module_unload (GTypeModule *module) -{ - EomPythonModulePrivate *priv = EOM_PYTHON_MODULE_GET_PRIVATE (module); - - eom_debug_message (DEBUG_PLUGINS, "Unloading Python module"); - - priv->type = 0; -} - -GObject * -eom_python_module_new_object (EomPythonModule *module) -{ - EomPythonModulePrivate *priv = EOM_PYTHON_MODULE_GET_PRIVATE (module); - - eom_debug_message (DEBUG_PLUGINS, "Creating object of type %s", g_type_name (priv->type)); - - if (priv->type == 0) - return NULL; - - return g_object_new (priv->type, NULL); -} - -static void -eom_python_module_init (EomPythonModule *module) -{ - eom_debug_message (DEBUG_PLUGINS, "Init of Python module"); -} - -static void -eom_python_module_finalize (GObject *object) -{ - EomPythonModulePrivate *priv = EOM_PYTHON_MODULE_GET_PRIVATE (object); - - eom_debug_message (DEBUG_PLUGINS, "Finalizing Python module %s", g_type_name (priv->type)); - - g_free (priv->module); - g_free (priv->path); - - G_OBJECT_CLASS (eom_python_module_parent_class)->finalize (object); -} - -static void -eom_python_module_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - g_return_if_reached (); -} - -static void -eom_python_module_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EomPythonModule *mod = EOM_PYTHON_MODULE (object); - - switch (prop_id) { - case PROP_MODULE: - EOM_PYTHON_MODULE_GET_PRIVATE (mod)->module = g_value_dup_string (value); - break; - - case PROP_PATH: - EOM_PYTHON_MODULE_GET_PRIVATE (mod)->path = g_value_dup_string (value); - break; - - default: - g_return_if_reached (); - } -} - -static void -eom_python_module_class_init (EomPythonModuleClass *class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (class); - GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class); - - object_class->finalize = eom_python_module_finalize; - object_class->get_property = eom_python_module_get_property; - object_class->set_property = eom_python_module_set_property; - - g_object_class_install_property - (object_class, - PROP_MODULE, - g_param_spec_string ("module", - "Module Name", - "The Python module to load for this plugin", - NULL, - G_PARAM_WRITABLE | G_PARAM_READABLE | G_PARAM_CONSTRUCT_ONLY)); - - g_object_class_install_property - (object_class, - PROP_PATH, - g_param_spec_string ("path", - "Path", - "The Python path to use when loading this module", - NULL, - G_PARAM_WRITABLE | G_PARAM_READABLE | G_PARAM_CONSTRUCT_ONLY)); - - g_type_class_add_private (object_class, sizeof (EomPythonModulePrivate)); - - module_class->load = eom_python_module_load; - module_class->unload = eom_python_module_unload; -} - -EomPythonModule * -eom_python_module_new (const gchar *path, - const gchar *module) -{ - EomPythonModule *result; - - if (module == NULL || module[0] == '\0') - return NULL; - - result = g_object_new (EOM_TYPE_PYTHON_MODULE, - "module", module, - "path", path, - NULL); - - g_type_module_set_name (G_TYPE_MODULE (result), module); - - return result; -} - - -static gint idle_garbage_collect_id = 0; - -/* C equivalent of - * import pygtk - * pygtk.require ("2.0") - */ -static gboolean -check_pygtk2 (void) -{ - PyObject *pygtk, *mdict, *require; - - /* pygtk.require("2.0") */ - pygtk = PyImport_ImportModule ("pygtk"); - - if (pygtk == NULL) { - g_warning ("Error initializing Python interpreter: could not import pygtk."); - return FALSE; - } - - mdict = PyModule_GetDict (pygtk); - - require = PyDict_GetItemString (mdict, "require"); - - PyObject_CallObject (require, - Py_BuildValue ("(S)", PyString_FromString ("2.0"))); - - if (PyErr_Occurred()) { - g_warning ("Error initializing Python interpreter: pygtk 2 is required."); - return FALSE; - } - - return TRUE; -} - -/* Note: the following two functions are needed because - * init_pyobject and init_pygtk which are *macros* which in case - * case of error set the PyErr and then make the calling - * function return behind our back. - * It's up to the caller to check the result with PyErr_Occurred() - */ -static void -eom_init_pygobject (void) -{ - init_pygobject_check (2, 11, 5); /* FIXME: get from config */ -} - -static void -eom_init_pygtk (void) -{ - PyObject *gtk, *mdict, *version, *required_version; - - init_pygtk (); - - /* There isn't init_pygtk_check(), do the version - * check ourselves */ - gtk = PyImport_ImportModule("gtk"); - - mdict = PyModule_GetDict(gtk); - - version = PyDict_GetItemString (mdict, "pygtk_version"); - - if (!version) { - PyErr_SetString (PyExc_ImportError, - "PyGObject version too old"); - return; - } - - required_version = Py_BuildValue ("(iii)", 2, 4, 0); /* FIXME */ - - if (PyObject_Compare (version, required_version) == -1) { - PyErr_SetString (PyExc_ImportError, - "PyGObject version too old"); - - Py_DECREF (required_version); - return; - } - - Py_DECREF (required_version); -} - -gboolean -eom_python_init (void) -{ - PyObject *mdict, *path, *tuple; - PyObject *sys_path, *eom; - PyObject *gettext, *install, *gettext_args; - struct sigaction old_sigint; - gint res; - /* Workaround for python bug. See #569228. */ - char *argv[] = { "/dev/null/python/is/buggy/eom", NULL }; - - static gboolean init_failed = FALSE; - - if (init_failed) { - /* We already failed to initialized Python, don't need to - * retry again */ - return FALSE; - } - - if (Py_IsInitialized ()) { - /* Python has already been successfully initialized */ - return TRUE; - } - - /* We are trying to initialize Python for the first time, - set init_failed to FALSE only if the entire initialization process - ends with success */ - init_failed = TRUE; - - /* Hack to make python not overwrite SIGINT: this is needed to avoid - * the crash reported on bug #326191 */ - - /* CHECK: can't we use Py_InitializeEx instead of Py_Initialize in order - to avoid to manage signal handlers ? - Paolo (Dec. 31, 2006) */ - - /* Save old handler */ - res = sigaction (SIGINT, NULL, &old_sigint); - - if (res != 0) { - g_warning ("Error initializing Python interpreter: cannot get " - "handler to SIGINT signal (%s)", strerror (errno)); - - return FALSE; - } - - /* Python initialization */ - Py_Initialize (); - - /* Restore old handler */ - res = sigaction (SIGINT, &old_sigint, NULL); - - if (res != 0) { - g_warning ("Error initializing Python interpreter: cannot restore " - "handler to SIGINT signal (%s).", strerror (errno)); - - goto python_init_error; - } - - PySys_SetArgv (1, argv); - - /* Sanitize sys.path */ - PyRun_SimpleString("import sys; sys.path = filter(None, sys.path)"); - - if (!check_pygtk2 ()) { - /* Warning message already printed in check_pygtk2 */ - goto python_init_error; - } - - /* import gobject */ - eom_init_pygobject (); - - if (PyErr_Occurred ()) { - g_warning ("Error initializing Python interpreter: could not import pygobject."); - - goto python_init_error; - } - - /* import gtk */ - eom_init_pygtk (); - - if (PyErr_Occurred ()) { - g_warning ("Error initializing Python interpreter: could not import pygtk."); - - goto python_init_error; - } - - /* sys.path.insert(0, ...) for system-wide plugins */ - sys_path = PySys_GetObject ("path"); - path = PyString_FromString (EOM_PLUGIN_DIR "/"); - PyList_Insert (sys_path, 0, path); - Py_DECREF(path); - - /* import eom */ - eom = Py_InitModule ("eom", pyeom_functions); - mdict = PyModule_GetDict (eom); - - pyeom_register_classes (mdict); - pyeom_add_constants (eom, "EOM_"); - - /* eom version */ - tuple = Py_BuildValue("(iii)", - EOM_MAJOR_VERSION, - EOM_MINOR_VERSION, - EOM_MICRO_VERSION); - PyDict_SetItemString(mdict, "version", tuple); - Py_DECREF(tuple); - - /* Retrieve the Python type for eom.Plugin */ - PyEomPlugin_Type = (PyTypeObject *) PyDict_GetItemString (mdict, "Plugin"); - - if (PyEomPlugin_Type == NULL) { - PyErr_Print (); - - goto python_init_error; - } - - /* i18n support */ - gettext = PyImport_ImportModule ("gettext"); - - if (gettext == NULL) { - g_warning ("Error initializing Python interpreter: could not import gettext."); - - goto python_init_error; - } - - mdict = PyModule_GetDict (gettext); - install = PyDict_GetItemString (mdict, "install"); - gettext_args = Py_BuildValue ("ss", GETTEXT_PACKAGE, EOM_LOCALE_DIR); - PyObject_CallObject (install, gettext_args); - Py_DECREF (gettext_args); - - /* Python has been successfully initialized */ - init_failed = FALSE; - - return TRUE; - -python_init_error: - - g_warning ("Please check the installation of all the Python related packages required " - "by eom and try again."); - - PyErr_Clear (); - - eom_python_shutdown (); - - return FALSE; -} - -void -eom_python_shutdown (void) -{ - if (Py_IsInitialized ()) { - if (idle_garbage_collect_id != 0) { - g_source_remove (idle_garbage_collect_id); - idle_garbage_collect_id = 0; - } - - while (PyGC_Collect ()) - ; - - Py_Finalize (); - } -} - -static gboolean -run_gc (gpointer data) -{ - while (PyGC_Collect ()) - ; - - idle_garbage_collect_id = 0; - - return FALSE; -} - -void -eom_python_garbage_collect (void) -{ - if (Py_IsInitialized()) { - /* - * We both run the GC right now and we schedule - * a further collection in the main loop. - */ - - while (PyGC_Collect ()) - ; - - if (idle_garbage_collect_id == 0) - idle_garbage_collect_id = g_idle_add (run_gc, NULL); - } -} - diff --git a/src/eom-python-module.h b/src/eom-python-module.h deleted file mode 100644 index bfee463..0000000 --- a/src/eom-python-module.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Eye Of Mate - Python Module - * - * Copyright (C) 2007 The Free Software Foundation - * - * Author: Lucas Rocha <[email protected]> - * - * Based on gedit code (gedit/gedit-python-module.h) by: - * - Raphael Slinckx <[email protected]> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef __EOM_PYTHON_MODULE_H__ -#define __EOM_PYTHON_MODULE_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define EOM_TYPE_PYTHON_MODULE (eom_python_module_get_type ()) -#define EOM_PYTHON_MODULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EOM_TYPE_PYTHON_MODULE, EomPythonModule)) -#define EOM_PYTHON_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EOM_TYPE_PYTHON_MODULE, EomPythonModuleClass)) -#define EOM_IS_PYTHON_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EOM_TYPE_PYTHON_MODULE)) -#define EOM_IS_PYTHON_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EOM_TYPE_PYTHON_MODULE)) -#define EOM_PYTHON_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EOM_TYPE_PYTHON_MODULE, EomPythonModuleClass)) - -typedef struct _EomPythonModule EomPythonModule; -typedef struct _EomPythonModuleClass EomPythonModuleClass; -typedef struct _EomPythonModulePrivate EomPythonModulePrivate; - -struct _EomPythonModuleClass { - GTypeModuleClass parent_class; -}; - -struct _EomPythonModule { - GTypeModule parent_instance; -}; - -G_GNUC_INTERNAL -GType eom_python_module_get_type (void) G_GNUC_CONST; - -G_GNUC_INTERNAL -EomPythonModule *eom_python_module_new (const gchar* path, - const gchar *module); - -G_GNUC_INTERNAL -GObject *eom_python_module_new_object (EomPythonModule *module); - -G_GNUC_INTERNAL -gboolean eom_python_init (void); - -G_GNUC_INTERNAL -void eom_python_shutdown (void); - -G_GNUC_INTERNAL -void eom_python_garbage_collect (void); - -G_END_DECLS - -#endif /* __EOM_PYTHON_MODULE_H__ */ diff --git a/src/eom-python-plugin.c b/src/eom-python-plugin.c deleted file mode 100644 index ea0a11d..0000000 --- a/src/eom-python-plugin.c +++ /dev/null @@ -1,282 +0,0 @@ -/* Eye Of Mate - Python Plugin - * - * Copyright (C) 2007 The Free Software Foundation - * - * Author: Lucas Rocha <[email protected]> - * - * Based on gedit code (gedit/gedit-python-module.h) by: - * - Raphael Slinckx <[email protected]> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include <config.h> - -#include "eom-python-plugin.h" -#include "eom-plugin.h" -#include "eom-debug.h" - -#define NO_IMPORT_PYGOBJECT -#include <pygobject.h> -#include <string.h> - -static GObjectClass *parent_class; - -static PyObject * -call_python_method (EomPythonPlugin *plugin, - EomWindow *window, - gchar *method) -{ - PyObject *py_ret = NULL; - - g_return_val_if_fail (PyObject_HasAttrString (plugin->instance, method), NULL); - - if (window == NULL) { - py_ret = PyObject_CallMethod (plugin->instance, - method, - NULL); - } else { - py_ret = PyObject_CallMethod (plugin->instance, - method, - "(N)", - pygobject_new (G_OBJECT (window))); - } - - if (!py_ret) - PyErr_Print (); - - return py_ret; -} - -static gboolean -check_py_object_is_gtk_widget (PyObject *py_obj) -{ - static PyTypeObject *_PyGtkWidget_Type = NULL; - - if (_PyGtkWidget_Type == NULL) { - PyObject *module; - - if ((module = PyImport_ImportModule ("gtk"))) { - PyObject *moddict = PyModule_GetDict (module); - _PyGtkWidget_Type = (PyTypeObject *) PyDict_GetItemString (moddict, "Widget"); - } - - if (_PyGtkWidget_Type == NULL) { - PyErr_SetString(PyExc_TypeError, "could not find Python gtk widget type"); - PyErr_Print(); - - return FALSE; - } - } - - return PyObject_TypeCheck (py_obj, _PyGtkWidget_Type) ? TRUE : FALSE; -} - -static void -impl_update_ui (EomPlugin *plugin, - EomWindow *window) -{ - PyGILState_STATE state = pyg_gil_state_ensure (); - - EomPythonPlugin *pyplugin = (EomPythonPlugin *) plugin; - - if (PyObject_HasAttrString (pyplugin->instance, "update_ui")) { - PyObject *py_ret = call_python_method (pyplugin, window, "update_ui"); - - if (py_ret) - { - Py_XDECREF (py_ret); - } - } else { - EOM_PLUGIN_CLASS (parent_class)->update_ui (plugin, window); - } - - pyg_gil_state_release (state); -} - -static void -impl_deactivate (EomPlugin *plugin, - EomWindow *window) -{ - PyGILState_STATE state = pyg_gil_state_ensure (); - - EomPythonPlugin *pyplugin = (EomPythonPlugin *) plugin; - - if (PyObject_HasAttrString (pyplugin->instance, "deactivate")) { - PyObject *py_ret = call_python_method (pyplugin, window, "deactivate"); - - if (py_ret) { - Py_XDECREF (py_ret); - } - } else { - EOM_PLUGIN_CLASS (parent_class)->deactivate (plugin, window); - } - - pyg_gil_state_release (state); -} - -static void -impl_activate (EomPlugin *plugin, - EomWindow *window) -{ - PyGILState_STATE state = pyg_gil_state_ensure (); - - EomPythonPlugin *pyplugin = (EomPythonPlugin *) plugin; - - if (PyObject_HasAttrString (pyplugin->instance, "activate")) { - PyObject *py_ret = call_python_method (pyplugin, window, "activate"); - - if (py_ret) { - Py_XDECREF (py_ret); - } - } else { - EOM_PLUGIN_CLASS (parent_class)->activate (plugin, window); - } - - pyg_gil_state_release (state); -} - -static GtkWidget * -impl_create_configure_dialog (EomPlugin *plugin) -{ - PyGILState_STATE state = pyg_gil_state_ensure (); - EomPythonPlugin *pyplugin = (EomPythonPlugin *) plugin; - GtkWidget *ret = NULL; - - if (PyObject_HasAttrString (pyplugin->instance, "create_configure_dialog")) { - PyObject *py_ret = call_python_method (pyplugin, NULL, "create_configure_dialog"); - - if (py_ret) { - if (check_py_object_is_gtk_widget (py_ret)) { - ret = GTK_WIDGET (pygobject_get (py_ret)); - g_object_ref (ret); - } else { - PyErr_SetString(PyExc_TypeError, "Return value for create_configure_dialog is not a GtkWidget"); - PyErr_Print(); - } - - Py_DECREF (py_ret); - } - } else { - ret = EOM_PLUGIN_CLASS (parent_class)->create_configure_dialog (plugin); - } - - pyg_gil_state_release (state); - - return ret; -} - -static gboolean -impl_is_configurable (EomPlugin *plugin) -{ - PyGILState_STATE state = pyg_gil_state_ensure (); - - EomPythonPlugin *pyplugin = (EomPythonPlugin *) plugin; - - PyObject *dict = pyplugin->instance->ob_type->tp_dict; - - gboolean result; - - if (dict == NULL) - result = FALSE; - else if (!PyDict_Check(dict)) - result = FALSE; - else - result = PyDict_GetItemString(dict, "create_configure_dialog") != NULL; - - pyg_gil_state_release (state); - - return result; -} - -static void -eom_python_plugin_init (EomPythonPlugin *plugin) -{ - EomPythonPluginClass *class; - - eom_debug_message (DEBUG_PLUGINS, "Creating Python plugin instance"); - - class = (EomPythonPluginClass*) (((GTypeInstance*) plugin)->g_class); - - plugin->instance = PyObject_CallObject (class->type, NULL); - - if (plugin->instance == NULL) - PyErr_Print(); -} - -static void -eom_python_plugin_finalize (GObject *plugin) -{ - eom_debug_message (DEBUG_PLUGINS, "Finalizing Python plugin instance"); - - Py_DECREF (((EomPythonPlugin *) plugin)->instance); - - G_OBJECT_CLASS (parent_class)->finalize (plugin); -} - -static void -eom_python_plugin_class_init (EomPythonPluginClass *klass, - gpointer class_data) -{ - EomPluginClass *plugin_class = EOM_PLUGIN_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - klass->type = (PyObject*) class_data; - - G_OBJECT_CLASS (klass)->finalize = eom_python_plugin_finalize; - - plugin_class->activate = impl_activate; - plugin_class->deactivate = impl_deactivate; - plugin_class->update_ui = impl_update_ui; - plugin_class->create_configure_dialog = impl_create_configure_dialog; - plugin_class->is_configurable = impl_is_configurable; -} - -GType -eom_python_plugin_get_type (GTypeModule *module, - PyObject *type) -{ - GType gtype; - gchar *type_name; - - GTypeInfo info = { - sizeof (EomPythonPluginClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eom_python_plugin_class_init, - NULL, /* class_finalize */ - type, /* class_data */ - sizeof (EomPythonPlugin), - 0, /* n_preallocs */ - (GInstanceInitFunc) eom_python_plugin_init, - }; - - Py_INCREF (type); - - type_name = g_strdup_printf ("%s+EomPythonPlugin", - PyString_AsString (PyObject_GetAttrString (type, "__name__"))); - - eom_debug_message (DEBUG_PLUGINS, "Registering Python plugin instance: %s", type_name); - - gtype = g_type_module_register_type (module, - EOM_TYPE_PLUGIN, - type_name, - &info, 0); - - g_free (type_name); - - return gtype; -} diff --git a/src/eom-python-plugin.h b/src/eom-python-plugin.h deleted file mode 100644 index 41b2984..0000000 --- a/src/eom-python-plugin.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Eye Of Mate - Python Plugin - * - * Copyright (C) 2007 The Free Software Foundation - * - * Author: Lucas Rocha <[email protected]> - * - * Based on gedit code (gedit/gedit-python-module.h) by: - * - Raphael Slinckx <[email protected]> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef __EOM_PYTHON_PLUGIN_H__ -#define __EOM_PYTHON_PLUGIN_H__ - -#include <Python.h> -#include <glib-object.h> - -#include "eom-plugin.h" - -G_BEGIN_DECLS - -typedef struct _EomPythonPlugin EomPythonPlugin; -typedef struct _EomPythonPluginClass EomPythonPluginClass; - -struct _EomPythonPlugin { - EomPlugin plugin; - - PyObject *instance; -}; - -struct _EomPythonPluginClass { - EomPluginClass parent_class; - - PyObject *type; -}; - -G_GNUC_INTERNAL -GType eom_python_plugin_get_type (GTypeModule *module, PyObject *type); - -G_END_DECLS - -#endif diff --git a/src/eom-window.c b/src/eom-window.c index 1e0d28a..6b3ffb4 100644 --- a/src/eom-window.c +++ b/src/eom-window.c @@ -4636,8 +4636,6 @@ eom_window_dispose (GObject *object) g_clear_object (&priv->thumbview); } - eom_plugin_engine_garbage_collect (); - if (priv->store != NULL) { g_signal_handlers_disconnect_by_func (priv->store, eom_window_list_store_image_added, @@ -4739,8 +4737,6 @@ eom_window_dispose (GObject *object) priv->last_save_as_folder = NULL; } - eom_plugin_engine_garbage_collect (); - G_OBJECT_CLASS (eom_window_parent_class)->dispose (object); } |