diff options
Diffstat (limited to 'source/a/upower/patches/linux-Properly-detect-bluetooth-mice-and-keyboards-t.patch')
-rw-r--r-- | source/a/upower/patches/linux-Properly-detect-bluetooth-mice-and-keyboards-t.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/source/a/upower/patches/linux-Properly-detect-bluetooth-mice-and-keyboards-t.patch b/source/a/upower/patches/linux-Properly-detect-bluetooth-mice-and-keyboards-t.patch new file mode 100644 index 00000000..55de33b7 --- /dev/null +++ b/source/a/upower/patches/linux-Properly-detect-bluetooth-mice-and-keyboards-t.patch @@ -0,0 +1,141 @@ +From 6c706ff03365e462e1b076155428decbed0f55c6 Mon Sep 17 00:00:00 2001 +From: Marc Deslauriers <marc.deslauriers@ubuntu.com> +Date: Mon, 4 May 2015 19:31:31 -0400 +Subject: [PATCH] linux: Properly detect bluetooth mice and keyboards that are + HID devices + +https://bugs.freedesktop.org/show_bug.cgi?id=90222 +--- + src/linux/integration-test | 41 +++++++++++++++++++++++++++++++++++++ + src/linux/up-device-supply.c | 48 ++++++++++++++++++++++++++++---------------- + 2 files changed, 72 insertions(+), 17 deletions(-) + +diff --git a/src/linux/integration-test b/src/linux/integration-test +index ad7152a..b83f80d 100755 +--- a/src/linux/integration-test ++++ b/src/linux/integration-test +@@ -761,6 +761,47 @@ class Tests(unittest.TestCase): + self.assertEqual(self.get_dbus_dev_property(mb1_up, 'Percentage'), 30) + self.assertEqual(self.get_dbus_dev_property(mb1_up, 'PowerSupply'), False) + ++ def test_bluetooth_hid_mouse(self): ++ '''bluetooth HID mouse battery''' ++ ++ self.testbed.add_device('hid', ++ 'usb1/bluetooth/hci0/hci0:01', ++ None, ++ [], []) ++ ++ self.testbed.add_device( ++ 'input', ++ 'usb1/bluetooth/hci0/hci0:01/input/input2/mouse3', ++ None, ++ [], ['DEVNAME', 'input/mouse3', 'ID_INPUT_MOUSE', '1']) ++ ++ self.testbed.add_device( ++ 'power_supply', ++ 'usb1/bluetooth/hci0/hci0:01/1/power_supply/hid-00:11:22:33:44:55-battery', ++ None, ++ ['type', 'Battery', ++ 'scope', 'Device', ++ 'present', '1', ++ 'online', '1', ++ 'status', 'Discharging', ++ 'capacity', '30', ++ 'model_name', 'Fancy BT mouse'], ++ []) ++ ++ self.start_daemon() ++ devs = self.proxy.EnumerateDevices() ++ self.assertEqual(len(devs), 1) ++ mousebat0_up = devs[0] ++ ++ self.assertEqual(self.get_dbus_dev_property(mousebat0_up, 'Model'), 'Fancy BT mouse') ++ self.assertEqual(self.get_dbus_dev_property(mousebat0_up, 'Percentage'), 30) ++ self.assertEqual(self.get_dbus_dev_property(mousebat0_up, 'PowerSupply'), False) ++ # 5 == mouse ++ self.assertEqual(self.get_dbus_dev_property(mousebat0_up, 'Type'), 5) ++ self.assertEqual(self.get_dbus_property('OnBattery'), False) ++ self.assertEqual(self.get_dbus_display_property('WarningLevel'), UP_DEVICE_LEVEL_NONE) ++ self.stop_daemon() ++ + def test_bluetooth_keyboard(self): + '''bluetooth keyboard battery''' + +diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c +index 1f86382..b96080b 100644 +--- a/src/linux/up-device-supply.c ++++ b/src/linux/up-device-supply.c +@@ -932,9 +932,12 @@ up_device_supply_coldplug (UpDevice *device) + const gchar *scope; + gchar *device_type = NULL; + gchar *input_path = NULL; ++ gchar *subdir = NULL; + GDir *dir = NULL; + GError *error = NULL; + UpDeviceKind type = UP_DEVICE_KIND_UNKNOWN; ++ guint i; ++ const char *class[] = { "hid", "bluetooth" }; + + up_device_supply_reset_values (supply); + +@@ -970,28 +973,39 @@ 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) { ++ for (i = 0; i < G_N_ELEMENTS(class) && type == UP_DEVICE_KIND_UNKNOWN; i++) { ++ /* Detect if the battery comes from bluetooth keyboard or mouse. */ ++ bluetooth = g_udev_device_get_parent_with_subsystem (native, class[i], NULL); ++ if (bluetooth != NULL) { ++ device_path = g_udev_device_get_sysfs_path (bluetooth); ++ ++ /* There may be an extra subdirectory here */ ++ subdir = g_build_filename (device_path, "input", NULL); ++ if (!g_file_test (subdir, G_FILE_TEST_IS_DIR)) { ++ g_free(subdir); ++ subdir = g_strdup (device_path); ++ } + +- /* 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; ++ if ((dir = g_dir_open (subdir, 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 (subdir, 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_dir_close (dir); +- } else { +- g_warning ("Can not open folder %s: %s", device_path, error->message); +- g_error_free (error); ++ g_free (subdir); ++ g_object_unref (bluetooth); + } +- g_object_unref (bluetooth); +- } + +- if (input_path != NULL) { ++ if (input_path == NULL) ++ continue; ++ + if ((dir = g_dir_open (input_path, 0, &error))) { + while ((file = g_dir_read_name (dir))) { + /* Check if it is a mouse device. */ +-- +2.6.3 + |