SF.net SVN: geany: [1743] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Wed Jul 25 11:59:34 UTC 2007


Revision: 1743
          http://geany.svn.sourceforge.net/geany/?rev=1743&view=rev
Author:   ntrel
Date:     2007-07-25 04:59:34 -0700 (Wed, 25 Jul 2007)

Log Message:
-----------
Don't destroy plugin_fields->menu_item automatically - plugin_fields
should be owned by the plugin, so the plugin is responsible for
destroying it, and any other memory it allocated.
Print a warning message in debug mode if a plugin has no cleanup()
function.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/plugins/htmlchars.c
    trunk/src/plugindata.h
    trunk/src/plugins.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-07-25 11:49:11 UTC (rev 1742)
+++ trunk/ChangeLog	2007-07-25 11:59:34 UTC (rev 1743)
@@ -4,6 +4,12 @@
    Translate the HTML Characters plugin.
  * src/main.c:
    Set app->debug_mode when GEANY_DEBUG is defined.
+ * plugins/htmlchars.c, src/plugindata.h, src/plugins.c:
+   Don't destroy plugin_fields->menu_item automatically - plugin_fields
+   should be owned by the plugin, so the plugin is responsible for
+   destroying it, and any other memory it allocated.
+   Print a warning message in debug mode if a plugin has no cleanup()
+   function.
 
 
 2007-07-25  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/plugins/htmlchars.c
===================================================================
--- trunk/plugins/htmlchars.c	2007-07-25 11:49:11 UTC (rev 1742)
+++ trunk/plugins/htmlchars.c	2007-07-25 11:59:34 UTC (rev 1743)
@@ -521,15 +521,17 @@
 	gtk_container_add(GTK_CONTAINER(plugin_data->tools_menu), demo_item);
 	g_signal_connect(G_OBJECT(demo_item), "activate", G_CALLBACK(item_activate), NULL);
 
-	// let Geany remove the menu item when the plugin is unloaded
+	// disable menu_item when there are no documents open
 	plugin_fields->menu_item = demo_item;
 	plugin_fields->flags = PLUGIN_IS_DOCUMENT_SENSITIVE;
 }
 
 
-/* Destroy static widgets */
+/* Destroy widgets */
 void cleanup()
 {
+	gtk_widget_destroy(plugin_fields->menu_item);
+
 	if (sc_dialog != NULL)
 		gtk_widget_destroy(sc_dialog);
 }

Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h	2007-07-25 11:49:11 UTC (rev 1742)
+++ trunk/src/plugindata.h	2007-07-25 11:59:34 UTC (rev 1743)
@@ -41,7 +41,8 @@
  * 	Called after loading the plugin.
  *
  * void cleanup()
- * 	Called before unloading the plugin.
+ * 	Called before unloading the plugin. Required for normal plugins - it should undo
+ * 	everything done in init() - e.g. destroy menu items, free memory.
  */
 
 
@@ -98,7 +99,7 @@
 typedef struct PluginFields
 {
 	PluginFlags	flags;
-	GtkWidget	*menu_item;	// (optional) widget to be destroyed after unloading the plugin
+	GtkWidget	*menu_item;	// required if using PLUGIN_IS_DOCUMENT_SENSITIVE, ignored otherwise
 }
 PluginFields;
 

Modified: trunk/src/plugins.c
===================================================================
--- trunk/src/plugins.c	2007-07-25 11:49:11 UTC (rev 1742)
+++ trunk/src/plugins.c	2007-07-25 11:59:34 UTC (rev 1743)
@@ -214,6 +214,12 @@
 
 	g_module_symbol(module, "init", (void *) &plugin->init);
 	g_module_symbol(module, "cleanup", (void *) &plugin->cleanup);
+	if (plugin->init != NULL && plugin->cleanup == NULL)
+	{
+		if (app->debug_mode)
+			g_warning("Plugin '%s' has no cleanup() function - there may be memory leaks!",
+				info()->name);
+	}
 
 	if (plugin->init)
 		plugin->init(&plugin->data);
@@ -239,11 +245,6 @@
 	if (plugin->cleanup)
 		plugin->cleanup();
 
-	if (plugin->fields.menu_item != NULL)
-	{
-		gtk_widget_destroy(plugin->fields.menu_item);
-	}
-
 	if (! g_module_close(plugin->module))
 		g_warning("%s: %s", plugin->filename, g_module_error());
 	else


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list