Michael Terry has proposed merging 
lp:~mterry/indicator-applet/global-desc-update-callback into 
lp:indicator-applet.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)
Related bugs:
  Bug #745115 in indicator-application (Ubuntu): "indicator-applet-complete 
crashed with SIGSEGV in g_cclosure_marshal_VOID__POINTER()"
  https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/745115

For more details, see:
https://code.launchpad.net/~mterry/indicator-applet/global-desc-update-callback/+merge/57533

Every time an indicator-applet adds an entry, it connects to the global 
IndicatorObject INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE signal with the 
new entry menuitem as an argument.

But it never cleaned it up, meaning that we could crash after the menuitem goes 
away and another entry emits the DESC_UPDATE signal.

This branch changes it to just one signal connection and has the applet search 
for the right entry.  This matches how it handles other global signals.

This might fix linked bug 745115.
-- 
https://code.launchpad.net/~mterry/indicator-applet/global-desc-update-callback/+merge/57533
Your team ayatana-commits is subscribed to branch lp:indicator-applet.
=== modified file 'src/applet-main.c'
--- src/applet-main.c	2011-03-22 20:35:19 +0000
+++ src/applet-main.c	2011-04-13 16:29:30 +0000
@@ -266,10 +266,22 @@
 }
 
 static void
-accessible_desc_update (IndicatorObject * io, IndicatorObjectEntry * entry, GtkWidget * menuitem)
-{
-	g_return_if_fail(GTK_IS_WIDGET(menuitem));
-	update_accessible_desc(entry, menuitem);
+accessible_desc_update_cb (GtkWidget * widget, gpointer userdata)
+{
+	gpointer data = g_object_get_data(G_OBJECT(widget), MENU_DATA_INDICATOR_ENTRY);
+
+	if (data != userdata) {
+		return;
+	}
+
+	IndicatorObjectEntry * entry = (IndicatorObjectEntry *)data;
+	update_accessible_desc(entry, widget);
+}
+
+static void
+accessible_desc_update (IndicatorObject * io, IndicatorObjectEntry * entry, GtkWidget * menubar)
+{
+	gtk_container_foreach(GTK_CONTAINER(menubar), accessible_desc_update_cb, entry);
 	return;
 }
 
@@ -350,8 +362,6 @@
 
 	gtk_menu_shell_insert(GTK_MENU_SHELL(menubar), menuitem, position.menupos);
 
-	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE, G_CALLBACK(accessible_desc_update), menuitem);
-
 	if (something_visible) {
 		if (entry->accessible_desc != NULL) {
 			update_accessible_desc(entry, menuitem);
@@ -529,6 +539,7 @@
 	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED, G_CALLBACK(entry_removed),  menubar);
 	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ENTRY_MOVED,   G_CALLBACK(entry_moved),    menubar);
 	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_MENU_SHOW,     G_CALLBACK(menu_show),      menubar);
+	g_signal_connect(G_OBJECT(io), INDICATOR_OBJECT_SIGNAL_ACCESSIBLE_DESC_UPDATE, G_CALLBACK(accessible_desc_update), menubar);
 
 	/* Work on the entries */
 	GList * entries = indicator_object_get_entries(io);

_______________________________________________
Mailing list: https://launchpad.net/~ayatana-commits
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~ayatana-commits
More help   : https://help.launchpad.net/ListHelp

Reply via email to