Making library out of bluez-gnome

Antti Kaijanmäki <[email protected]>
Newsgroups gmane.linux.bluez.devel
Message-ID <[email protected]>
Hello list!

I'm developing a project[1] that needs to provide the user a way to
select[2] a Bluetooth device from a list of discovered devices.

I noticed that gnome-bluez applet has a very nice device selector and
that got me browsing though the code. Unfortunately I discovered that
bluez-gnome creates only a static library libcommon.a that contains the
device selector (common/bluetooth-device-selection.c) for private use.

Now there is two options the way I see it. Either I have a private copy
of bluez-gnome package or bluez-gnome is made to be a shared library.

The first solution would be easiest for everyone because no extra work
would be required. But it's just generally A Bad Idea to have multiple
programs using same code privately and so on..

The second solutions would be optimal. If bluez-gnome provides a shared
library 3rd party software could utilize it in sane way. I'm quite sure
there are many applications that would benefit from common bluetooth
widgets; like CUPS for bluetooth printer setup, Evolution for vCard
sending, <your favorite application that communicates with BT devices>..

Here is the lame part: I'm busy with my project, so someone else should
do all the work :P
OK, maybe not all the work, but I can not promise anything.

What do you think about the idea? Is this something not worth the
trouble and I should just STFU or is this viable?

best regards,
Antti Kaijanmäki

[1] http://live.gnome.org/NetworkManager/MobileBroadband
[2] http://www.kaijanmaki.net/kesakoodi/bt_draft.png


P.S.
Here are some wishes from top of my head regarding the device selector:
 1. remove the caption of the list
    - let the developer provide a caption best suited for
      his application
 2. put the filter in GtkExpander
    - Filters are not used for by the most of the users, thus it's
      convenient to have them hidden by default. 
 3. make the filter completely hidden
   - this combined with the 1. would make the widget appear just
     like GtkTreeView
   - this is already achievable, but there seems to be a bug. If both of
     the filter fields are hidden the caption is still shown.
     See an attached patch.
 4. have alternative filters in right-click pop-up menu
    - very handy for tight places
 5. add property for selected device name. It's always nice to be able
    to show the user a nice name instead of bluetooth address.
    - see an attached patch.

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php

_______________________________________________
Bluez-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bluez-devel
add_selected_device_name_property.patch (text/x-patch, 2.2 KB)
Index: common/bluetooth-device-selection.c
===================================================================
RCS file: /cvsroot/bluez/gnome/common/bluetooth-device-selection.c,v
retrieving revision 1.20
diff -u -p -r1.20 bluetooth-device-selection.c
--- common/bluetooth-device-selection.c	12 Mar 2008 21:03:38 -0000	1.20
+++ common/bluetooth-device-selection.c	24 Jun 2008 11:57:01 -0000
@@ -207,6 +207,22 @@ bluetooth_device_selection_get_selected_
 	return address;
 }
 
+gchar *
+bluetooth_device_selection_get_selected_device_name (BluetoothDeviceSelection *self)
+{
+	BluetoothDeviceSelectionPrivate *priv = BLUETOOTH_DEVICE_SELECTION_GET_PRIVATE(self);
+	GtkTreeIter iter;
+	gchar *name;
+	gboolean selected;
+
+	selected = gtk_tree_selection_get_selected (priv->selection, NULL, &iter);
+	if (selected == FALSE)
+		return NULL;
+
+	gtk_tree_model_get (priv->filter, &iter, COLUMN_NAME, &name, -1);
+	return name;
+}
+
 static void
 search_button_clicked (GtkButton *button, gpointer user_data)
 {
@@ -617,6 +633,7 @@ enum {
 	PROP_0,
 	PROP_TITLE,
 	PROP_DEVICE_SELECTED,
+	PROP_DEVICE_SELECTED_NAME,
 	PROP_SHOW_BONDING,
 	PROP_SHOW_SEARCH,
 	PROP_SHOW_DEVICE_TYPE,
@@ -688,6 +705,9 @@ bluetooth_device_selection_get_property 
 	case PROP_DEVICE_SELECTED:
 		g_value_set_string (value, bluetooth_device_selection_get_selected_device (self));
 		break;
+	case PROP_DEVICE_SELECTED_NAME:
+		g_value_set_string (value, bluetooth_device_selection_get_selected_device_name (self));
+		break;
 	case PROP_SHOW_BONDING:
 		g_value_set_boolean (value, priv->show_bonded);
 		break;
@@ -738,6 +758,9 @@ bluetooth_device_selection_class_init (B
 					 PROP_DEVICE_SELECTED, g_param_spec_string ("device-selected",
 										    NULL, NULL, NULL, G_PARAM_READABLE));
 	g_object_class_install_property (G_OBJECT_CLASS(klass),
+					 PROP_DEVICE_SELECTED_NAME, g_param_spec_string ("device-selected-name",
+										    NULL, NULL, NULL, G_PARAM_READABLE));
+	g_object_class_install_property (G_OBJECT_CLASS(klass),
 					 PROP_SHOW_BONDING, g_param_spec_boolean ("show-bonding",
 										  NULL, NULL, FALSE, G_PARAM_READWRITE));
 	g_object_class_install_property (G_OBJECT_CLASS(klass),
hide_filters_box_when_not_needed.patch (text/x-patch, 2.6 KB)
Index: common/bluetooth-device-selection.c
===================================================================
RCS file: /cvsroot/bluez/gnome/common/bluetooth-device-selection.c,v
retrieving revision 1.20
diff -u -p -r1.20 bluetooth-device-selection.c
--- common/bluetooth-device-selection.c	12 Mar 2008 21:03:38 -0000	1.20
+++ common/bluetooth-device-selection.c	24 Jun 2008 11:50:01 -0000
@@ -62,6 +62,7 @@ struct _BluetoothDeviceSelectionPrivate 
 	GtkWidget *search_button;
 	GtkWidget *device_type_label, *device_type;
 	GtkWidget *device_category_label, *device_category;
+	GtkWidget *filters_vbox;
 
 	/* Current filter */
 	int device_type_filter;
@@ -517,7 +534,8 @@ bluetooth_device_selection_init(Bluetoot
 	vbox = gtk_vbox_new (FALSE, 6);
 	gtk_widget_show (vbox);
 	gtk_box_pack_start (GTK_BOX (self), vbox, FALSE, TRUE, 0);
-
+	priv->filters_vbox = vbox;
+	
 	/* The filters */
 	str = g_strdup_printf ("<b>%s</b>", _("Show Only Bluetooth Devices With..."));
 	label = gtk_label_new (str);
@@ -596,7 +614,13 @@ bluetooth_device_selection_init(Bluetoot
 		gtk_widget_show (priv->device_type_label);
 		gtk_widget_show (priv->device_type);
 	}
-
+	
+	/* if filters are not visible hide the vbox */
+	if (!priv->show_device_type && !priv->show_device_category)
+	{
+		gtk_widget_hide (priv->filters_vbox);
+	}
+	
 	priv->default_adapter_changed_id = g_signal_connect (priv->client, "notify::default-adapter",
 							     G_CALLBACK (default_adapter_changed), self);
 }
@@ -657,11 +682,19 @@ bluetooth_device_selection_set_property 
 		priv->show_device_type = g_value_get_boolean (value);
 		g_object_set (G_OBJECT (priv->device_type_label), "visible", priv->show_device_type, NULL);
 		g_object_set (G_OBJECT (priv->device_type), "visible", priv->show_device_type, NULL);
+		if (priv->show_device_type || priv->show_device_category)
+			g_object_set (G_OBJECT (priv->filters_vbox), "visible", TRUE, NULL);
+		else
+			g_object_set (G_OBJECT (priv->filters_vbox), "visible", FALSE, NULL);
 		break;
 	case PROP_SHOW_DEVICE_CATEGORY:
 		priv->show_device_category = g_value_get_boolean (value);
 		g_object_set (G_OBJECT (priv->device_category_label), "visible", priv->show_device_category, NULL);
 		g_object_set (G_OBJECT (priv->device_category), "visible", priv->show_device_category, NULL);
+		if (priv->show_device_type || priv->show_device_category)
+			g_object_set (G_OBJECT (priv->filters_vbox), "visible", TRUE, NULL);
+		else
+			g_object_set (G_OBJECT (priv->filters_vbox), "visible", FALSE, NULL);
 		break;
 	case PROP_DEVICE_TYPE_FILTER:
 		priv->device_type_filter = g_value_get_int (value);
signature.asc (application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBIYObHxyyCWWVycu8RAmxBAKCc0UNiZ+jr8aqzWrOOZTyyYDcFvQCfbo4k
0lX4RK3G4RUf6CdrtuGYhYc=
=lBB4
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.