[PATCH] Check if the battery comes from bluetooth keyboard or mouse.

Shih-Yuan Lee (FourDollars) sylee at canonical.com
Tue Aug 27 01:41:19 PDT 2013


Hi,

It seems this patch doesn't bring up much attention.
This patch is for upower.
I find some relative bug reports.
https://bugzilla.redhat.com/show_bug.cgi?id=816775
https://bugs.launchpad.net/bugs/1153488
https://bugs.launchpad.net/bugs/1066208
I think this patch might be able to fix them all.
Could you help to review my patch?

Regards,
$4

On Fri, Aug 2, 2013 at 6:07 PM, Shih-Yuan Lee (FourDollars)
<fourdollars at gmail.com> wrote:
> 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