diff --git a/profiles/input/device.c b/profiles/input/device.c
index 6ec0a4c..ee0b240 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
uint8_t report_req_pending;
guint report_req_timer;
uint32_t report_rsp_id;
+ bool virtual_cable_unplug;
};
static int idle_timeout = 0;
g_free(idev);
}
+static void virtual_cable_unplug(struct input_device *idev)
+{
+ device_remove_bonding(idev->device,
+ btd_device_get_bdaddr_type(idev->device));
+
+ idev->virtual_cable_unplug = false;
+}
+
static bool hidp_send_message(GIOChannel *chan, uint8_t hdr,
const uint8_t *data, size_t size)
{
static bool hidp_send_ctrl_message(struct input_device *idev, uint8_t hdr,
const uint8_t *data, size_t size)
{
+ if (hdr == (HIDP_TRANS_HID_CONTROL | HIDP_CTRL_VIRTUAL_CABLE_UNPLUG))
+ idev->virtual_cable_unplug = true;
+
return hidp_send_message(idev->ctrl_io, hdr, data, size);
}
/* Enter the auto-reconnect mode if needed */
input_device_enter_reconnect_mode(idev);
+ if (!idev->ctrl_io && idev->virtual_cable_unplug)
+ virtual_cable_unplug(idev);
+
return FALSE;
}
DBG("");
if (param == HIDP_CTRL_VIRTUAL_CABLE_UNPLUG)
- connection_disconnect(idev, 0);
+ connection_disconnect(idev, (1 << HIDP_VIRTUAL_CABLE_UNPLUG));
}
static void hidp_recv_ctrl_data(struct input_device *idev, uint8_t param,
if (idev->intr_io && !(cond & G_IO_NVAL))
g_io_channel_shutdown(idev->intr_io, TRUE, NULL);
+ if (!idev->intr_io && idev->virtual_cable_unplug)
+ virtual_cable_unplug(idev);
+
return FALSE;
}
shutdown(sock, SHUT_WR);
}
+ if (flags & (1 << HIDP_VIRTUAL_CABLE_UNPLUG))
+ idev->virtual_cable_unplug = true;
+
if (idev->uhid)
return 0;
else