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