Index: gedit/gedit-python-plugin.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-python-plugin.c,v retrieving revision 1.2 diff -u -p -b -B -r1.2 gedit-python-plugin.c --- gedit/gedit-python-plugin.c 12 Dec 2005 17:27:55 -0000 1.2 +++ gedit/gedit-python-plugin.c 5 Jan 2006 17:52:16 -0000 @@ -31,7 +31,10 @@ static GObjectClass *parent_class; -static void +static PyTypeObject *_PyGtkWidget_Type; +#define PyGtkWidget_Type (*_PyGtkWidget_Type) + +static PyObject * call_python_method (GeditPythonObject *object, GeditWindow *window, gchar *method) @@ -42,39 +45,102 @@ call_python_method (GeditPythonObject *o if (!PyObject_HasAttrString (object->instance, method)) { pyg_gil_state_release (state); - return; + return NULL; } + if (window == NULL) + { + py_ret = PyObject_CallMethod (object->instance, + method, + NULL); + } + else + { py_ret = PyObject_CallMethod (object->instance, method, "(N)", pygobject_new (G_OBJECT (window))); + } + if (!py_ret) PyErr_Print (); - Py_XDECREF (py_ret); pyg_gil_state_release (state); + + return py_ret; } static void impl_update_ui (GeditPlugin *plugin, GeditWindow *window) { - call_python_method ((GeditPythonObject *) plugin, window, "update_ui"); + PyObject *py_ret = call_python_method ((GeditPythonObject *) plugin, window, "update_ui"); + if (py_ret == NULL) + GEDIT_PLUGIN_CLASS (parent_class)->update_ui (plugin, window); + + Py_XDECREF (py_ret); } static void impl_deactivate (GeditPlugin *plugin, GeditWindow *window) { - call_python_method ((GeditPythonObject *) plugin, window, "deactivate");+ PyObject *py_ret = call_python_method ((GeditPythonObject *) plugin, window, "deactivate"); + if (py_ret == NULL) + GEDIT_PLUGIN_CLASS (parent_class)->deactivate (plugin, window); + + Py_XDECREF (py_ret); } static void impl_activate (GeditPlugin *plugin, GeditWindow *window) { - call_python_method ((GeditPythonObject *) plugin, window, "activate"); + PyObject *py_ret = call_python_method ((GeditPythonObject *) plugin, window, "activate"); + if (py_ret == NULL) + GEDIT_PLUGIN_CLASS (parent_class)->activate (plugin, window); + + Py_XDECREF (py_ret); +} + +static GtkWidget * +impl_create_configure_dialog (GeditPlugin *plugin) +{ + GtkWidget *ret; + PyObject *py_ret = call_python_method ((GeditPythonObject *) plugin, NULL, "create_configure_dialog"); + + if (py_ret == NULL) + return GEDIT_PLUGIN_CLASS (parent_class)->create_configure_dialog (plugin); + + /* Check if the type is already known */ + if (_PyGtkWidget_Type == NULL) + { + PyObject *module; + if ((module = PyImport_ImportModule ("gtk")) != NULL) + { + PyObject *moddict = PyModule_GetDict (module); + _PyGtkWidget_Type = (PyTypeObject *) PyDict_GetItemString (moddict, "Widget"); + } + } + + /* Still NULL, we have a problem */ + if (_PyGtkWidget_Type == NULL) + return GEDIT_PLUGIN_CLASS (parent_class)->create_configure_dialog (plugin); + + if (!PyObject_TypeCheck(py_ret, &PyGtkWidget_Type)) + { + PyErr_SetString(PyExc_TypeError, "return value for create_configure_dialog is not a GtkWidget"); + PyErr_Print(); + Py_XDECREF (py_ret); + return GEDIT_PLUGIN_CLASS (parent_class)->create_configure_dialog (plugin); + } + + ret = GTK_WIDGET (pygobject_get (py_ret)); + + g_object_ref (ret); + Py_DECREF (py_ret); + + return ret; } static void @@ -116,6 +182,7 @@ gedit_python_object_class_init (GeditPyt 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; } GType