[PATCH v2] linux: Detect the battery of bluetooth input devices.

Shih-Yuan Lee (FourDollars) sylee at canonical.com
Mon Sep 2 01:53:14 PDT 2013


From: "Shih-Yuan Lee (FourDollars)" <sylee at canonical.com>

First, checking the device path. If it contains 'bluetooth', it is a bluetooth
devices. Second, checking if there is an input folder. If there is mouse
folder under the input folder, it is a mouse device. Otherwise, it is a
keyboard device.
---
 src/linux/up-device-supply.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
index 98536f4..41a49ff 100644
--- a/src/linux/up-device-supply.c
+++ b/src/linux/up-device-supply.c
@@ -861,10 +861,16 @@ up_device_supply_coldplug (UpDevice *device)
 {
 	UpDeviceSupply *supply = UP_DEVICE_SUPPLY (device);
 	gboolean ret = FALSE;
+	GUdevDevice *bluetooth;
 	GUdevDevice *native;
+	const gchar *file;
 	const gchar *native_path;
 	const gchar *scope;
 	gchar *device_type = NULL;
+	gchar *device_path = NULL;
+	gchar *input_path = NULL;
+	GDir *dir = NULL;
+	GError *error = NULL;
 	UpDeviceKind type = UP_DEVICE_KIND_UNKNOWN;
 
 	up_device_supply_reset_values (supply);
@@ -894,7 +900,50 @@ up_device_supply_coldplug (UpDevice *device)
 		if (g_ascii_strcasecmp (device_type, "mains") == 0) {
 			type = UP_DEVICE_KIND_LINE_POWER;
 		} else if (g_ascii_strcasecmp (device_type, "battery") == 0) {
-			type = UP_DEVICE_KIND_BATTERY;
+
+			/* Detect if the battery comes from bluetooth keyboard or mouse. */
+			bluetooth = g_udev_device_get_parent_with_subsystem (native, "bluetooth", NULL);
+			if (bluetooth != NULL) {
+				device_path = g_udev_device_get_sysfs_path (bluetooth);
+				if (dir = g_dir_open (device_path, 0, &error)) {
+					while (file = g_dir_read_name (dir)) {
+						/* Check if it is an input device. */
+						if (g_str_has_prefix (file, "input")) {
+							input_path = g_build_filename (device_path, file, NULL);
+							break;
+						}
+					}
+					g_dir_close (dir);
+				} else {
+					g_warning ("Can not open folder %s: %s", device_path, error->message);
+					g_error_free (error);
+				}
+				g_object_unref (bluetooth);
+			}
+
+			if (input_path != NULL) {
+				if (dir = g_dir_open (input_path, 0, &error)) {
+					while (file = g_dir_read_name (dir)) {
+						/* Check if it is a mouse device. */
+						if (g_str_has_prefix (file, "mouse")) {
+							type = UP_DEVICE_KIND_MOUSE;
+							break;
+						}
+					}
+					g_dir_close (dir);
+				} else {
+					g_warning ("Can not open folder %s: %s", input_path, error->message);
+					g_error_free (error);
+				}
+				g_free (input_path);
+				if (type == UP_DEVICE_KIND_UNKNOWN) {
+					type = UP_DEVICE_KIND_KEYBOARD;
+				}
+			}
+
+			if (type == UP_DEVICE_KIND_UNKNOWN) {
+				type = UP_DEVICE_KIND_BATTERY;
+			}
 		} else if (g_ascii_strcasecmp (device_type, "USB") == 0) {
 
 			/* use a heuristic to find the device type */
-- 
1.8.1.2



More information about the devkit-devel mailing list