From: "Shih-Yuan Lee (FourDollars)" <sy...@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

_______________________________________________
devkit-devel mailing list
devkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/devkit-devel

Reply via email to