rendered paste bodyIndex: 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;