From: Bastien Nocera <hadess@hadess.net>
To: BlueZ development <bluez-devel@lists.sourceforge.net>
Subject: [Bluez-devel] Add filters to device selection (was Re: [PATCH] allow the chooser widget to show search as an afterthought)
Date: Tue, 06 Nov 2007 18:47:52 +0000 [thread overview]
Message-ID: <1194374872.15726.32.camel@cookie.hadess.net> (raw)
In-Reply-To: <1194365925.15726.19.camel@cookie.hadess.net>
[-- Attachment #1: Type: text/plain, Size: 1243 bytes --]
A bigger updated patch,
On Tue, 2007-11-06 at 16:18 +0000, Bastien Nocera wrote:
> Heya,
>
> The current device selection widget doesn't allow to show the search
> button after the widget has been created, which is a bit of a pain.
>
> The attached patch shows the search button by default in the test
> application and fixes the above problem.
The attached patch adds 2 (optional) drop-downs to show only devices
matching a certain filter.
- Add properties about whether to show the category filter, and the
device filter, and whether to show/hide those selections
- Make bluetooth_type_to_string return const (as they are const) and
mark those strings for translations
- Add a category enum to bluetooth-device-selection.h
- Add the ability to pass NULL to bluetooth_client_get_model_with_filter
(to get a list of known devices on the default adapter, but without
hiding the bonded, and otherwise not discovered yet devices)
So, the TODO list looks like:
- make the drop-downs look better
- convenience functions to change the filters programmatically (eg.
gnome-phone-manager would default to showing phones)
- add more category filters (would require client.[ch] changes), such as
"Recent devices", and "Discovered devices".
Cheers
[-- Attachment #2: bluez-gnome-device-selection-add-filters.patch --]
[-- Type: text/x-patch, Size: 17436 bytes --]
Index: common/bluetooth-device-selection.c
===================================================================
RCS file: /cvsroot/bluez/gnome/common/bluetooth-device-selection.c,v
retrieving revision 1.9
diff -u -p -r1.9 bluetooth-device-selection.c
--- common/bluetooth-device-selection.c 9 Aug 2007 08:35:19 -0000 1.9
+++ common/bluetooth-device-selection.c 6 Nov 2007 18:38:02 -0000
@@ -49,19 +49,42 @@ typedef struct _BluetoothDeviceSelection
struct _BluetoothDeviceSelectionPrivate {
BluetoothClient *client;
GtkTreeSelection *selection;
- GtkTreeModel *model;
+ GtkTreeModel *model, *filter;
GtkWidget *label;
/* Widgets/UI bits that can be shown or hidden */
GtkCellRenderer *bonded_cell;
GtkWidget *search_button;
+ GtkWidget *device_type_label, *device_type;
+ GtkWidget *device_category_label, *device_category;
+
+ /* Current filter */
+ int device_type_filter;
+ int device_category_filter;
guint show_bonded : 1;
guint show_search : 1;
+ guint show_device_type : 1;
+ guint show_device_category : 1;
};
G_DEFINE_TYPE(BluetoothDeviceSelection, bluetooth_device_selection, GTK_TYPE_VBOX)
+static const char *
+bluetooth_device_category_to_string (int type)
+{
+ switch (type) {
+ case BLUETOOTH_CATEGORY_ALL:
+ return N_("All categories");
+ case BLUETOOTH_CATEGORY_BONDED:
+ return N_("Bonded");
+ case BLUETOOTH_CATEGORY_TRUSTED:
+ return N_("Trusted");
+ default:
+ return N_("Unknown");
+ }
+}
+
static void
name_to_text (GtkTreeViewColumn *column, GtkCellRenderer *cell,
GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
@@ -173,7 +196,7 @@ bluetooth_device_selection_get_selected_
if (selected == FALSE)
return NULL;
- gtk_tree_model_get (priv->model, &iter, COLUMN_ADDRESS, &address, -1);
+ gtk_tree_model_get (priv->filter, &iter, COLUMN_ADDRESS, &address, -1);
return address;
}
@@ -210,13 +233,78 @@ select_browse_device_callback (GtkTreeSe
g_free (address);
}
+static gboolean
+filter_type_func (GtkTreeModel *model, GtkTreeIter *iter, BluetoothDeviceSelectionPrivate *priv)
+{
+ int type;
+
+ if (priv->device_type_filter == BLUETOOTH_TYPE_ANY)
+ return TRUE;
+
+ gtk_tree_model_get (model, iter, COLUMN_TYPE, &type, -1);
+ return (type == priv->device_type_filter);
+}
+
+static gboolean
+filter_category_func (GtkTreeModel *model, GtkTreeIter *iter, BluetoothDeviceSelectionPrivate *priv)
+{
+ if (priv->device_category_filter == BLUETOOTH_CATEGORY_ALL)
+ return TRUE;
+
+ if (priv->device_category_filter == BLUETOOTH_CATEGORY_BONDED) {
+ gboolean bonded;
+
+ gtk_tree_model_get (model, iter, COLUMN_BONDED, &bonded, -1);
+ return bonded;
+ }
+ if (priv->device_category_filter == BLUETOOTH_CATEGORY_TRUSTED) {
+ gboolean trusted;
+
+ gtk_tree_model_get (model, iter, COLUMN_TRUSTED, &trusted, -1);
+ return trusted;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
+{
+ BluetoothDeviceSelection *self = BLUETOOTH_DEVICE_SELECTION (data);
+ BluetoothDeviceSelectionPrivate *priv = BLUETOOTH_DEVICE_SELECTION_GET_PRIVATE(self);
+
+ return filter_type_func (model, iter, priv) && filter_category_func (model, iter, priv);
+}
+
+static void
+filter_type_changed_cb (GtkComboBox *widget, gpointer data)
+{
+ BluetoothDeviceSelection *self = BLUETOOTH_DEVICE_SELECTION (data);
+ BluetoothDeviceSelectionPrivate *priv = BLUETOOTH_DEVICE_SELECTION_GET_PRIVATE(self);
+
+ priv->device_type_filter = gtk_combo_box_get_active (GTK_COMBO_BOX(priv->device_type));
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+ g_object_notify (G_OBJECT(self), "device-type-filter");
+}
+static void
+filter_category_changed_cb (GtkComboBox *widget, gpointer data)
+{
+ BluetoothDeviceSelection *self = BLUETOOTH_DEVICE_SELECTION (data);
+ BluetoothDeviceSelectionPrivate *priv = BLUETOOTH_DEVICE_SELECTION_GET_PRIVATE(self);
+
+ priv->device_category_filter = gtk_combo_box_get_active (GTK_COMBO_BOX(priv->device_category));
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+ g_object_notify (G_OBJECT(self), "device-category-filter");
+}
+
static void
bluetooth_device_selection_init(BluetoothDeviceSelection *self)
{
BluetoothDeviceSelectionPrivate *priv = BLUETOOTH_DEVICE_SELECTION_GET_PRIVATE(self);
- GtkWidget *tree, *scrolled, *frame, *box, *hbox;
+ GtkWidget *tree, *scrolled, *frame, *box, *hbox, *table;
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
+ int i;
priv->show_bonded = FALSE;
priv->show_search = FALSE;
@@ -299,25 +387,78 @@ bluetooth_device_selection_init(Bluetoot
g_signal_connect (G_OBJECT(priv->selection), "changed",
G_CALLBACK(select_browse_device_callback), self);
- priv->model = bluetooth_client_get_model_for_adapter (priv->client, NULL);
+ /* Set the model, and filter */
+ priv->model = bluetooth_client_get_model_with_filter (priv->client, NULL, NULL, NULL);
+ priv->filter = gtk_tree_model_filter_new (priv->model, NULL);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter),
+ filter_func, self, NULL);
if (priv->model) {
- gtk_tree_view_set_model (GTK_TREE_VIEW(tree), priv->model);
- g_object_unref (priv->model);
+ gtk_tree_view_set_model (GTK_TREE_VIEW(tree), priv->filter);
+ g_object_unref (priv->filter);
}
gtk_container_add (GTK_CONTAINER(scrolled), tree);
gtk_box_pack_start (GTK_BOX(box), scrolled, TRUE, TRUE, 6);
+ /* Setup the device filter widgets */
+ table = gtk_table_new (2, 2, TRUE);
+ gtk_box_pack_start (GTK_BOX(box), table, FALSE, FALSE, 0);
+
+ priv->device_type_label = gtk_label_new_with_mnemonic (_("Device _type:"));
+ gtk_label_set_justify (GTK_LABEL(priv->device_type_label), GTK_JUSTIFY_RIGHT);
+ priv->device_type = gtk_combo_box_new_text ();
+ /* The types match the types used in client.h */
+ for (i = 0; i < BLUETOOTH_TYPE_NUM_TYPES; i++) {
+ gtk_combo_box_append_text (GTK_COMBO_BOX(priv->device_type),
+ _(bluetooth_type_to_string (i)));
+ }
+ g_signal_connect (G_OBJECT (priv->device_type), "changed",
+ G_CALLBACK(filter_type_changed_cb), self);
+ gtk_combo_box_set_active (GTK_COMBO_BOX(priv->device_type), priv->device_type_filter);
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (priv->device_type_label),
+ 0, 1, 0, 1,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (priv->device_type),
+ 1, 2, 0, 1,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ if (priv->show_device_type) {
+ gtk_widget_show (priv->device_type_label);
+ gtk_widget_show (priv->device_type);
+ }
+
+ priv->device_category_label = gtk_label_new_with_mnemonic (_("Device _category:"));
+ gtk_label_set_justify (GTK_LABEL(priv->device_category_label), GTK_JUSTIFY_RIGHT);
+ priv->device_category = gtk_combo_box_new_text ();
+ for (i = 0; i < BLUETOOTH_CATEGORY_NUM_CATEGORIES; i++) {
+ gtk_combo_box_append_text (GTK_COMBO_BOX(priv->device_category),
+ _(bluetooth_device_category_to_string (i)));
+ }
+ g_signal_connect (G_OBJECT (priv->device_category), "changed",
+ G_CALLBACK(filter_category_changed_cb), self);
+ gtk_combo_box_set_active (GTK_COMBO_BOX(priv->device_category), priv->device_category_filter);
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (priv->device_category_label),
+ 0, 1, 1, 2,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ gtk_table_attach (GTK_TABLE (table), GTK_WIDGET (priv->device_category),
+ 1, 2, 1, 2,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ if (priv->show_device_category) {
+ gtk_widget_show (priv->device_category_label);
+ gtk_widget_show (priv->device_category);
+ }
+
+ /* Setup the search button */
hbox = gtk_hbox_new (FALSE, 0);
priv->search_button = gtk_button_new_with_label (_("Search"));
g_signal_connect (G_OBJECT(priv->search_button), "clicked",
G_CALLBACK(search_button_clicked), self);
gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
- if (priv->show_search == TRUE)
- gtk_box_pack_start (GTK_BOX(hbox), priv->search_button,
- FALSE, FALSE, 0);
+ gtk_widget_show_all (GTK_WIDGET (self));
- gtk_widget_show_all (scrolled);
+ gtk_box_pack_start (GTK_BOX(hbox), priv->search_button,
+ FALSE, FALSE, 0);
+ if (priv->show_search)
+ gtk_widget_show (priv->search_button);
bluetooth_device_selection_start_discovery (self);
}
@@ -335,7 +476,11 @@ enum {
PROP_TITLE,
PROP_DEVICE_SELECTED,
PROP_SHOW_BONDING,
- PROP_SHOW_SEARCH
+ PROP_SHOW_SEARCH,
+ PROP_SHOW_DEVICE_TYPE,
+ PROP_SHOW_DEVICE_CATEGORY,
+ PROP_DEVICE_TYPE_FILTER,
+ PROP_DEVICE_CATEGORY_FILTER
};
static void
@@ -364,8 +509,25 @@ bluetooth_device_selection_set_property
break;
case PROP_SHOW_SEARCH:
priv->show_search = g_value_get_boolean (value);
- if (priv->search_button != NULL)
- g_object_set (G_OBJECT (priv->search_button), "visible", priv->show_search, NULL);
+ g_object_set (G_OBJECT (priv->search_button), "visible", priv->show_search, NULL);
+ break;
+ case PROP_SHOW_DEVICE_TYPE:
+ 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);
+ 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);
+ break;
+ case PROP_DEVICE_TYPE_FILTER:
+ priv->device_type_filter = g_value_get_int (value);
+ gtk_combo_box_set_active (GTK_COMBO_BOX(priv->device_type), priv->device_type_filter);
+ break;
+ case PROP_DEVICE_CATEGORY_FILTER:
+ priv->device_category_filter = g_value_get_int (value);
+ gtk_combo_box_set_active (GTK_COMBO_BOX(priv->device_category), priv->device_category_filter);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -390,6 +552,18 @@ bluetooth_device_selection_get_property
case PROP_SHOW_SEARCH:
g_value_set_boolean (value, priv->show_search);
break;
+ case PROP_SHOW_DEVICE_TYPE:
+ g_value_set_boolean (value, priv->show_device_type);
+ break;
+ case PROP_SHOW_DEVICE_CATEGORY:
+ g_value_set_boolean (value, priv->show_device_category);
+ break;
+ case PROP_DEVICE_TYPE_FILTER:
+ g_value_set_int (value, priv->device_type_filter);
+ break;
+ case PROP_DEVICE_CATEGORY_FILTER:
+ g_value_set_int (value, priv->device_category_filter);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -427,6 +601,18 @@ bluetooth_device_selection_class_init (B
g_object_class_install_property (G_OBJECT_CLASS(klass),
PROP_SHOW_SEARCH, g_param_spec_boolean ("show-search",
NULL, NULL, FALSE, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS(klass),
+ PROP_SHOW_DEVICE_TYPE, g_param_spec_boolean ("show-device-type",
+ NULL, NULL, TRUE, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS(klass),
+ PROP_SHOW_DEVICE_CATEGORY, g_param_spec_boolean ("show-device-category",
+ NULL, NULL, TRUE, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS(klass),
+ PROP_DEVICE_TYPE_FILTER, g_param_spec_int ("device-type-filter", NULL, NULL,
+ 0, BLUETOOTH_TYPE_NUM_TYPES, 0, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS(klass),
+ PROP_DEVICE_CATEGORY_FILTER, g_param_spec_int ("device-category-filter", NULL, NULL,
+ 0, BLUETOOTH_CATEGORY_NUM_CATEGORIES, 0, G_PARAM_READWRITE));
}
GtkWidget *
Index: common/bluetooth-device-selection.h
===================================================================
RCS file: /cvsroot/bluez/gnome/common/bluetooth-device-selection.h,v
retrieving revision 1.5
diff -u -p -r1.5 bluetooth-device-selection.h
--- common/bluetooth-device-selection.h 9 Aug 2007 08:35:19 -0000 1.5
+++ common/bluetooth-device-selection.h 6 Nov 2007 18:38:02 -0000
@@ -41,6 +41,13 @@ G_BEGIN_DECLS
#define BLUETOOTH_GET_DEVICE_SELECTION_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), \
BLUETOOTH_TYPE_DEVICE_SELECTION, BluetoothDeviceSelectionClass))
+enum {
+ BLUETOOTH_CATEGORY_ALL,
+ BLUETOOTH_CATEGORY_BONDED,
+ BLUETOOTH_CATEGORY_TRUSTED,
+ BLUETOOTH_CATEGORY_NUM_CATEGORIES
+};
+
typedef struct _BluetoothDeviceSelection BluetoothDeviceSelection;
typedef struct _BluetoothDeviceSelectionClass BluetoothDeviceSelectionClass;
Index: common/client.c
===================================================================
RCS file: /cvsroot/bluez/gnome/common/client.c,v
retrieving revision 1.35
diff -u -p -r1.35 client.c
--- common/client.c 3 Aug 2007 12:37:55 -0000 1.35
+++ common/client.c 6 Nov 2007 18:38:02 -0000
@@ -25,6 +25,7 @@
#include <config.h>
#endif
+#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
#include <dbus/dbus-glib.h>
@@ -121,29 +122,31 @@ static void minor_changed(DBusGProxy *ob
{
}
-gchar *bluetooth_type_to_string(guint type)
+const gchar *bluetooth_type_to_string(guint type)
{
switch (type) {
+ case BLUETOOTH_TYPE_ANY:
+ return N_("All types");
case BLUETOOTH_TYPE_PHONE:
- return "Phone";
+ return N_("Phone");
case BLUETOOTH_TYPE_MODEM:
- return "Modem";
+ return N_("Modem");
case BLUETOOTH_TYPE_COMPUTER:
- return "Computer";
+ return N_("Computer");
case BLUETOOTH_TYPE_NETWORK:
- return "Network";
+ return N_("Network");
case BLUETOOTH_TYPE_HEADSET:
- return "Headset";
+ return N_("Headset");
case BLUETOOTH_TYPE_KEYBOARD:
- return "Keyboard";
+ return N_("Keyboard");
case BLUETOOTH_TYPE_MOUSE:
- return "Mouse";
+ return N_("Mouse");
case BLUETOOTH_TYPE_CAMERA:
- return "Camera";
+ return N_("Camera");
case BLUETOOTH_TYPE_PRINTER:
- return "Printer";
+ return N_("Printer");
default:
- return "Unknown";
+ return N_("Unknown");
}
}
@@ -1343,8 +1346,9 @@ GtkTreeModel *bluetooth_client_get_model
model = gtk_tree_model_filter_new(GTK_TREE_MODEL(store), path);
- gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),
- func, data, NULL);
+ if (func != NULL)
+ gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),
+ func, data, NULL);
gtk_tree_path_free(path);
Index: common/client.h
===================================================================
RCS file: /cvsroot/bluez/gnome/common/client.h,v
retrieving revision 1.20
diff -u -p -r1.20 client.h
--- common/client.h 2 Aug 2007 20:45:17 -0000 1.20
+++ common/client.h 6 Nov 2007 18:38:02 -0000
@@ -84,9 +84,10 @@ enum {
BLUETOOTH_TYPE_MOUSE,
BLUETOOTH_TYPE_CAMERA,
BLUETOOTH_TYPE_PRINTER,
+ BLUETOOTH_TYPE_NUM_TYPES
};
-gchar *bluetooth_type_to_string(guint type);
+const gchar *bluetooth_type_to_string(guint type);
gboolean bluetooth_client_register_passkey_agent(BluetoothClient *self,
const char *path, const char *address, const void *info);
Index: common/test-deviceselection.c
===================================================================
RCS file: /cvsroot/bluez/gnome/common/test-deviceselection.c,v
retrieving revision 1.2
diff -u -p -r1.2 test-deviceselection.c
--- common/test-deviceselection.c 25 Jul 2007 18:01:44 -0000 1.2
+++ common/test-deviceselection.c 6 Nov 2007 18:38:03 -0000
@@ -31,11 +31,23 @@
#include "bluetooth-device-selection.h"
static void device_selected_cb(GObject *object,
- GParamSpec *spec, gpointer user_data)
+ GParamSpec *spec, gpointer user_data)
{
g_message ("Property \"device-selected\" changed");
}
+static void device_type_filter_selected_cb(GObject *object,
+ GParamSpec *spec, gpointer user_data)
+{
+ g_message ("Property \"device-type-filter\" changed");
+}
+
+static void device_category_filter_selected_cb(GObject *object,
+ GParamSpec *spec, gpointer user_data)
+{
+ g_message ("Property \"device-category-filter\" changed");
+}
+
static void select_device_changed(BluetoothDeviceSelection *sel,
gchar *address, gpointer user_data)
{
@@ -61,12 +73,18 @@ int main(int argc, char **argv)
gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 300);
selector = bluetooth_device_selection_new("Select a device to setup");
+ gtk_widget_show(selector);
+ g_object_set(selector, "show-search", TRUE, NULL);
g_signal_connect(selector, "selected-device-changed",
G_CALLBACK(select_device_changed), dialog);
g_signal_connect(selector, "notify::device-selected",
G_CALLBACK(device_selected_cb), dialog);
+ g_signal_connect(selector, "notify::device-type-filter",
+ G_CALLBACK(device_type_filter_selected_cb), dialog);
+ g_signal_connect(selector, "notify::device-category-filter",
+ G_CALLBACK(device_category_filter_selected_cb), dialog);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), selector);
- gtk_widget_show_all(dialog);
+ gtk_widget_show(dialog);
response = gtk_dialog_run(GTK_DIALOG(dialog));
Index: po/POTFILES.in
===================================================================
RCS file: /cvsroot/bluez/gnome/po/POTFILES.in,v
retrieving revision 1.12
diff -u -p -r1.12 POTFILES.in
--- po/POTFILES.in 25 Aug 2007 16:12:32 -0000 1.12
+++ po/POTFILES.in 6 Nov 2007 18:38:03 -0000
@@ -1,4 +1,5 @@
common/bluetooth-device-selection.c
+common/client.c
applet/main.c
applet/bluetooth-applet.desktop.in
properties/main.c
[-- Attachment #3: Type: text/plain, Size: 314 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #4: Type: text/plain, Size: 164 bytes --]
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel
next prev parent reply other threads:[~2007-11-06 18:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-06 16:18 [Bluez-devel] [PATCH] allow the chooser widget to show search as an afterthought Bastien Nocera
2007-11-06 18:47 ` Bastien Nocera [this message]
2007-12-17 1:10 ` [Bluez-devel] Add filters to device selection (was Re: [PATCH] allow the chooser widget to show search as an afterthought) Marcel Holtmann
2007-12-17 1:30 ` Bastien Nocera
2007-12-17 1:46 ` Marcel Holtmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1194374872.15726.32.camel@cookie.hadess.net \
--to=hadess@hadess.net \
--cc=bluez-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox