[PATCH] Check if the battery comes from bluetooth keyboard or mouse.
Shih-Yuan Lee (FourDollars)
fourdollars at gmail.com
Fri Aug 2 03:07:53 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 | 52 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)
diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
index bd54801..f310dad 100644
--- a/src/linux/up-device-supply.c
+++ b/src/linux/up-device-supply.c
@@ -851,9 +851,15 @@ up_device_supply_coldplug (UpDevice *device)
UpDeviceSupply *supply = UP_DEVICE_SUPPLY (device);
gboolean ret = FALSE;
GUdevDevice *native;
+ const gchar *file;
const gchar *native_path;
const gchar *scope;
gchar *device_type = NULL;
+ gchar *device_path = NULL;
+ gchar *dir_name = NULL;
+ gchar *input_path = NULL;
+ GDir *dir = NULL;
+ GError *error = NULL;
UpDeviceKind type = UP_DEVICE_KIND_UNKNOWN;
up_device_supply_reset_values (supply);
@@ -883,7 +889,51 @@ 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. */
+ if (g_strstr_len (native_path, -1, "bluetooth") != NULL) {
+ device_path = sysfs_resolve_link (native_path, "device");
+ dir_name = g_path_get_dirname (device_path);
+ if (dir = g_dir_open (dir_name, 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 (dir_name, file, NULL);
+ break;
+ }
+ }
+ g_dir_close (dir);
+ } else {
+ g_warning ("Can not open folder %s: %s", dir_name, error->message);
+ g_error_free (error);
+ }
+ g_free (dir_name);
+ g_free (device_path);
+ }
+
+ 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