}
static void
+_ebluez4_cb_disconnect(void *data, E_Menu *m, E_Menu_Item *mi)
+{
+ ebluez4_disconnect_device(data);
+}
+
+static void
_ebluez4_cb_forget(void *data, E_Menu *m, E_Menu_Item *mi)
{
Device *dev = data;
NULL);
e_menu_item_submenu_set(mi, subm);
mi = e_menu_item_new(subm);
- e_menu_item_label_set(mi, "Connect");
- e_menu_item_callback_set(mi, _ebluez4_cb_connect, dev);
+ if (dev->connected)
+ {
+ e_menu_item_label_set(mi, "Disconnect");
+ e_menu_item_callback_set(mi, _ebluez4_cb_disconnect, dev);
+ }
+ else
+ {
+ e_menu_item_label_set(mi, "Connect");
+ e_menu_item_callback_set(mi, _ebluez4_cb_connect, dev);
+ }
mi = e_menu_item_new(subm);
e_menu_item_label_set(mi, "Forget");
e_menu_item_callback_set(mi, _ebluez4_cb_forget, dev);
}
static void
+_on_disconnected(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
+{
+ const char *err_name, *err_msg;
+
+ if (edbus_message_error_get(msg, &err_name, &err_msg))
+ {
+ ERR("%s: %s", err_name, err_msg);
+ ebluez4_show_error(err_name, err_msg);
+ return;
+ }
+}
+
+static void
+_try_to_disconnect(EDBus_Proxy *proxy)
+{
+ if (proxy)
+ edbus_proxy_call(proxy, "Disconnect", _on_disconnected, NULL, -1, "");
+}
+
+static void
_on_paired(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
{
const char *err_name, *err_msg;
}
void
+ebluez4_disconnect_device(Device *dev)
+{
+ _try_to_disconnect(dev->proxy.input);
+ _try_to_disconnect(dev->proxy.audio_source);
+ _try_to_disconnect(dev->proxy.audio_sink);
+}
+
+void
ebluez4_pair_with_device(const char *addr)
{
edbus_proxy_call(ctxt->adap_proxy, "CreatePairedDevice", _on_paired, NULL,
void ebluez4_start_discovery();
void ebluez4_stop_discovery();
void ebluez4_connect_to_device(Device *dev);
+void ebluez4_disconnect_device(Device *dev);
void ebluez4_pair_with_device(const char *addr);
void ebluez4_remove_device(EDBus_Object *obj);
int ebluez4_path_cmp(const void *d1, const void *d2);