Index: gedit-plugins-engine.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-plugins-engine.c,v retrieving revision 1.26 diff -u -p -r1.26 gedit-plugins-engine.c --- gedit-plugins-engine.c 12 Dec 2005 17:27:55 -0000 1.26 +++ gedit-plugins-engine.c 5 Jan 2006 16:33:11 -0000 @@ -342,6 +342,14 @@ gedit_plugins_engine_init (void) } void +gedit_plugins_engine_garbage_collect (void) +{ +#ifdef ENABLE_PYTHON + gedit_python_garbage_collect (); +#endif +} + +void gedit_plugins_engine_shutdown (void) { GList *pl; @@ -385,6 +393,10 @@ gedit_plugins_engine_shutdown (void) g_object_unref (gedit_plugins_engine_gconf_client); gedit_plugins_engine_gconf_client = NULL; + +#ifdef ENABLE_PYTHON + gedit_python_shutdown (); +#endif } const GList * Index: gedit-plugins-engine.h =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-plugins-engine.h,v retrieving revision 1.9 diff -u -p -r1.9 gedit-plugins-engine.h --- gedit-plugins-engine.h 12 Dec 2005 17:27:55 -0000 1.9 +++ gedit-plugins-engine.h 5 Jan 2006 16:33:11 -0000 @@ -39,6 +39,8 @@ typedef struct _GeditPluginInfo GeditPlu gboolean gedit_plugins_engine_init (void); void gedit_plugins_engine_shutdown (void); +void gedit_plugins_engine_garbage_collect (void); + const GList *gedit_plugins_engine_get_plugins_list (void); gboolean gedit_plugins_engine_activate_plugin (GeditPluginInfo *info); Index: gedit-python-module.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-python-module.c,v retrieving revision 1.2 diff -u -p -r1.2 gedit-python-module.c --- gedit-python-module.c 12 Dec 2005 17:27:55 -0000 1.2 +++ gedit-python-module.c 5 Jan 2006 16:33:12 -0000 @@ -302,3 +302,46 @@ gedit_python_module_new (const gchar *pa return result; } + + +/* --- these are not module methods, they are here out of convenience --- */ + +static gint idle_garbage_collect_id = 0; + +static gboolean +run_gc (gpointer data) +{ + while (PyGC_Collect ()) + ; + + idle_garbage_collect_id = 0; + return FALSE; +} + +void +gedit_python_garbage_collect (void) +{ + if (Py_IsInitialized() && idle_garbage_collect_id == 0) + { + idle_garbage_collect_id = g_idle_add (run_gc, NULL); + } +} + +void +gedit_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 (); + } +} + Index: gedit-python-module.h =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-python-module.h,v retrieving revision 1.2 diff -u -p -r1.2 gedit-python-module.h --- gedit-python-module.h 12 Dec 2005 17:27:55 -0000 1.2 +++ gedit-python-module.h 5 Jan 2006 16:33:12 -0000 @@ -56,6 +56,13 @@ GeditPythonModule *gedit_python_module_n GObject *gedit_python_module_new_object (GeditPythonModule *module); + +/* --- python utils --- */ + +void gedit_python_garbage_collect (void); + +void gedit_python_shutdown (void); + G_END_DECLS #endif Index: gedit-window.c =================================================================== RCS file: /cvs/gnome/gedit/gedit/gedit-window.c,v retrieving revision 1.10 diff -u -p -r1.10 gedit-window.c --- gedit-window.c 3 Jan 2006 17:19:10 -0000 1.10 +++ gedit-window.c 5 Jan 2006 16:33:16 -0000 @@ -165,6 +165,8 @@ gedit_window_destroy (GtkObject *object) g_object_unref (window->priv->recent_view_uim); window->priv->recent_view_uim = NULL; } + + gedit_plugins_engine_garbage_collect(); GTK_OBJECT_CLASS (gedit_window_parent_class)->destroy (object); } @@ -234,11 +236,20 @@ gedit_window_key_press_event (GtkWidget } static void +gedit_window_tab_removed (GeditWindow *window, + GeditTab *tab) +{ + gedit_plugins_engine_garbage_collect(); +} + +static void gedit_window_class_init (GeditWindowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkObjectClass *gobject_class = GTK_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + klass->tab_removed = gedit_window_tab_removed; object_class->finalize = gedit_window_finalize; object_class->get_property = gedit_window_get_property;