Thanks Dan, 
I've updated the patch, seems to work pretty good.

PS. Any word on the libnl bitrates patch, will it be included? Because
by default now, in 2.6.31 nm-applet shows Unknown if i'm connected to
11n network.

On Thu, 2009-10-01 at 12:59 -0700, Dan Williams wrote:
> On Thu, 2009-09-24 at 22:06 +0300, Valmantas Palikša wrote:
> > I've seen myself opening and closing connection info to see if bitrate
> > changed, this should fix it. Now the bitrate label will be updated every
> > 2s if the connection info dialog is open.
> 
> Nice; though there's an easier way; use the 'bitrate' property of the
> device instead and listen for changes, then update the label.  We don't
> want to ref the device though, because that makes the device stick
> around and it'll still be in the menu then as long as the dialog is
> open.  So this gets a bit trickier; the signal handler that we attach to
> get notifications of the bitrate changes needs to be disconnected when
> the label goes away (otherwise the label's change callback will be
> called with invalid data).  So I think it would be something like this:
> 
> typedef struct {
>       NMDevice *device;
>         GtkWidget *label;
>       guint32 id;
> } SpeedInfo;
> 
> static void
> label_destroyed (gpointer data, GObject *label_ptr)
> {
>       SpeedInfo *info = data;
> 
>       /* Remove the notify handler from the device */
>       if (info->device) {
>               if (info->id)
>                       g_signal_handler_disconnect (info->device, info->id);
>               /* destroy our info data */
>               g_object_weak_unref (info->device, device_destroyed, info);
>               memset (info, 0, sizeof (SpeedInfo));
>               g_free (info);
>       }
> }
> 
> static void
> device_destroyed (gpointer data, GObject *device_ptr)
> {
>       SpeedInfo *info = data;
> 
>       /* Device is destroyed, notify handler won't fire
>        * anymore anyway.  Let the label destroy handler
>        * know it doesn't have to disconnect the callback.
>        */
>       info->device = NULL;
>       info->id = 0;
> }
> 
> static void
> bitrate_changed_cb (GObject *device, GParamSpec *pspec, gpointer user_data)
> {
>       GtkWidget *speed_label = GTK_WIDGET (user_data)
>       guint32 bitrate;
> 
>       if (NM_IS_DEVICE_WIFI (device))
>               bitrate = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (device));
>       else if (NM_IS_DEVICE_ETHERNET (device))
>               bitrate = nm_device_ethernet_get_bitrate (NM_DEVICE_ETHERNET 
> (device));
> 
>       /* udpate label text here */
> }
> 
> static void info_dialog_add_page (...)
> {
>       GtkWidget *speed_label;
> 
>       if (NM_IS_DEVICE_WIFI (device) || NM_IS_DEVICE_ETHERNET (device)) {
>               /* create speed label */
> 
>               info = g_malloc0 (sizeof (SpeedInfo));
>               info->device = device;
>               info->label = speed_label;
>               info->id = g_signal_connect (device,
>                                            "notify::" NM_DEVICE_WIFI_BITRATE,
>                                            bitrate_changed_cb,
>                                            speed_label);
> 
>               g_object_weak_ref (speed_label, label_destroyed, info);
>               g_object_weak_ref (device, device_destroyed, info);
>       } else {
>               /* create old-style label */
>       }
> }
> 
> something like that actually.
> 
> Dan
> 
> 
diff --git a/src/applet-dialogs.c b/src/applet-dialogs.c
index e1dc530..da35c1b 100644
--- a/src/applet-dialogs.c
+++ b/src/applet-dialogs.c
@@ -231,6 +231,60 @@ create_info_notebook_label (NMConnection *connection, gboolean is_default)
 	return label;
 }
 
+typedef struct {
+	NMDevice *device;
+	GtkWidget *label;
+	guint32 id;
+} SpeedInfo;
+
+static void
+device_destroyed (gpointer data, GObject *device_ptr)
+{
+	SpeedInfo *info = data;
+	/* Device is destroyed, notify handler won't fire
+	 * anymore anyway.  Let the label destroy handler
+	 * know it doesn't have to disconnect the callback.
+	 */
+	info->device = NULL;
+	info->id = 0;
+}
+
+static void
+label_destroyed (gpointer data, GObject *label_ptr)
+{
+	SpeedInfo *info = data;
+	/* Remove the notify handler from the device */
+	if (info->device) {
+		if (info->id)
+			g_signal_handler_disconnect (info->device, info->id);
+		/* destroy our info data */
+		g_object_weak_unref (G_OBJECT(info->device), device_destroyed, info);
+		memset (info, 0, sizeof (SpeedInfo));
+		g_free (info);
+	}
+}
+
+static void
+bitrate_changed_cb (GObject *device, GParamSpec *pspec, gpointer user_data)
+{
+	
+	GtkWidget *speed_label = GTK_WIDGET (user_data);
+	guint32 bitrate = 0;
+	gchar* str;
+	
+	if (NM_IS_DEVICE_WIFI (device)) {
+		bitrate = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (device));
+		bitrate /= 1000;
+	}
+	if (bitrate) {
+		str = g_strdup_printf (_("%u Mb/s"), bitrate);
+	} else {
+		str = NULL;
+	}
+	gtk_label_set_text(GTK_LABEL(speed_label), str ? str : _("Unknown"));
+	g_free(str);
+}
+
 static void
 info_dialog_add_page (GtkNotebook *notebook,
 					  NMConnection *connection,
@@ -246,6 +300,9 @@ info_dialog_add_page (GtkNotebook *notebook,
 	NMIP4Address *def_addr;
 	guint32 hostmask, network, bcast, netmask;
 	int row = 0;
+	
+	SpeedInfo* info = NULL;
+	GtkWidget* speed_label;
 
 	table = GTK_TABLE (gtk_table_new (12, 2, FALSE));
 	gtk_table_set_col_spacings (table, 12);
@@ -273,7 +330,7 @@ info_dialog_add_page (GtkNotebook *notebook,
 							   1, 2, row, row + 1);
 	g_free (str);
 	row++;
-
+	
 	/* Hardware address */
 	str = NULL;
 	if (NM_IS_DEVICE_ETHERNET (device))
@@ -299,8 +356,11 @@ info_dialog_add_page (GtkNotebook *notebook,
 							   1, 2, row, row + 1);
 	row++;
 
+	speed_label = create_info_label ("", TRUE);
+
 	/* Speed */
 	speed = 0;
+	
 	if (NM_IS_DEVICE_ETHERNET (device)) {
 		/* Wired speed in Mb/s */
 		speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (device));
@@ -308,18 +368,31 @@ info_dialog_add_page (GtkNotebook *notebook,
 		/* Wireless speed in Kb/s */
 		speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (device));
 		speed /= 1000;
+        
+		info = g_malloc0 (sizeof (SpeedInfo));
+		info->device = device;
+		info->label = speed_label;
+		info->id = g_signal_connect (device,
+									"notify::" NM_DEVICE_WIFI_BITRATE,
+									(GCallback)bitrate_changed_cb,
+									speed_label);
+
+		g_object_weak_ref (G_OBJECT(speed_label), label_destroyed, info);
+		g_object_weak_ref (G_OBJECT(device), device_destroyed, info);
 	}
 
 	if (speed)
 		str = g_strdup_printf (_("%u Mb/s"), speed);
 	else
 		str = NULL;
+		
+	gtk_label_set_text(GTK_LABEL(speed_label), str ? str : _("Unknown"));
 
 	gtk_table_attach_defaults (table,
 							   create_info_label (_("Speed:"), FALSE),
 							   0, 1, row, row + 1);
 	gtk_table_attach_defaults (table,
-							   create_info_label (str ? str : _("Unknown"), TRUE),
+							   speed_label,
 							   1, 2, row, row + 1);
 	g_free (str);
 	row++;
_______________________________________________
NetworkManager-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to