[geany/geany-plugins] 4c4bcb: Auto-close: fix possible crash at exit

Pavel Roschin git-noreply at xxxxx
Sat Apr 12 17:44:41 UTC 2014


Branch:      refs/heads/master
Author:      Pavel Roschin <roshin at scriptumplus.ru>
Committer:   Frank Lanitz <frank at frank.uvena.de>
Date:        Sat, 12 Apr 2014 17:44:41 UTC
Commit:      4c4bcb5c2fa498b5f0bcefa20822dd252c4c0c8f
             https://github.com/geany/geany-plugins/commit/4c4bcb5c2fa498b5f0bcefa20822dd252c4c0c8f

Log Message:
-----------
Auto-close: fix possible crash at exit

Autoclose plugin uses plugin_signal_connect to connect to Scintilla
widget. This may cause a crash on old glib because widget is a short-lived
object. Now behavior changed: autoclose uses raw g_signal_connect call
and calls g_signal_handler_disconnect manually. But this may cause a
crash with old Geany versions and works good only with last revision of
Geany.


Modified Paths:
--------------
    autoclose/src/autoclose.c

Modified: autoclose/src/autoclose.c
39 files changed, 34 insertions(+), 5 deletions(-)
===================================================================
@@ -87,6 +87,7 @@ typedef struct {
 static AutocloseInfo *ac_info = NULL;
 
 typedef struct {
+	gulong notify_handler[2];
 	/* used to place the caret after autoclosed items on tab (similar to eclipse) */
 	gint jump_on_tab;
 	/* used to reset jump_on_tab when needed */
@@ -799,6 +800,7 @@ on_sci_notify(ScintillaObject *sci, gint scn, SCNotification *nt, gpointer user_
 	data->last_line = new_line;
 }
 
+
 static void
 on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data)
 {
@@ -808,15 +810,41 @@ on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data)
 
 	sci = doc->editor->sci;
 	data = g_new0(AutocloseUserData, 1);
+	g_return_if_fail(data);
 	data->doc = doc;
-	plugin_signal_connect(geany_plugin, G_OBJECT(sci), "sci-notify",
-		    FALSE, G_CALLBACK(on_sci_notify), data);
-	plugin_signal_connect(geany_plugin, G_OBJECT(sci), "key-press-event",
-			FALSE, G_CALLBACK(on_key_press), data);
+	data->notify_handler[0] = g_signal_connect(G_OBJECT(sci), "sci-notify",
+					G_CALLBACK(on_sci_notify), data);
+	data->notify_handler[1] = g_signal_connect(G_OBJECT(sci), "key-press-event",
+					G_CALLBACK(on_key_press), data);
 	/* This will free the data when the sci is destroyed */
 	g_object_set_data_full(G_OBJECT(sci), "autoclose-userdata", data, g_free);
 }
 
+static void
+autoclose_handlers_cleanup(void)
+{
+	gint i;
+
+	foreach_document(i)
+	{
+		gint j;
+		gpointer data;
+		ScintillaObject *sci;
+		AutocloseUserData *autoclose_data;
+
+		sci = documents[i]->editor->sci;
+		data = g_object_get_data(G_OBJECT(sci), "autoclose-userdata");
+		if(!data)
+			continue;
+		autoclose_data = (AutocloseUserData*)data;
+		for(j = 0; j < 2; j++)
+		{
+			gulong handler = autoclose_data->notify_handler[j];
+			g_signal_handler_disconnect(sci, handler);
+		}
+	}
+}
+
 PluginCallback plugin_callbacks[] =
 {
 	{ "document-open",  (GCallback) &on_document_open, FALSE, NULL },
@@ -885,7 +913,7 @@ configure_response_cb(GtkDialog *dialog, gint response, gpointer user_data)
 void
 plugin_init(G_GNUC_UNUSED GeanyData *data)
 {
-	int i;
+	guint i;
 	foreach_document(i)
 	{
 		on_document_open(NULL, documents[i], NULL);
@@ -1100,6 +1128,7 @@ plugin_configure(GtkDialog *dialog)
 void
 plugin_cleanup(void)
 {
+	autoclose_handlers_cleanup();
 	g_free(ac_info->config_file);
 	g_free(ac_info);
 }



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list