From e0920a6d0d1ddc04d0e982a645761daffd3496a4 Mon Sep 17 00:00:00 2001 From: Lucas Joia Date: Fri, 4 Jan 2013 16:13:07 +0000 Subject: [PATCH] e/bluez4: Change adapter properties Patch by: Lucas Joia SVN revision: 82200 --- src/modules/bluez4/e_mod_main.c | 141 ++++++++++++++++++++++++++++++-- src/modules/bluez4/e_mod_main.h | 4 +- src/modules/bluez4/ebluez4.c | 25 +++++- src/modules/bluez4/ebluez4.h | 5 ++ 4 files changed, 165 insertions(+), 10 deletions(-) diff --git a/src/modules/bluez4/e_mod_main.c b/src/modules/bluez4/e_mod_main.c index cde64b95f..dfa405828 100644 --- a/src/modules/bluez4/e_mod_main.c +++ b/src/modules/bluez4/e_mod_main.c @@ -87,12 +87,108 @@ _ebluez4_cb_search(void *data, E_Menu *m, E_Menu_Item *mi) DBG("Starting discovery..."); } +static void +_ebluez4_cb_adap_settings_dialog_del(E_Win *win) +{ + E_Dialog *dialog = win->data; + ebluez4_adapter_settings_del(dialog); +} + +static void +_ebluez4_check_changed(void *data, Evas_Object *obj, const char *prop_name) +{ + Adapter *adap = data; + Eina_Bool value = e_widget_check_checked_get(obj); + ebluez4_adapter_property_set(adap, prop_name, value); +} + +static void +_ebluez4_powered_changed(void *data, Evas_Object *obj, void *info __UNUSED__) +{ + _ebluez4_check_changed(data, obj, "Powered"); +} + +static void +_ebluez4_visible_changed(void *data, Evas_Object *obj, void *info __UNUSED__) +{ + _ebluez4_check_changed(data, obj, "Discoverable"); +} + +static void +_ebluez4_pairable_changed(void *data, Evas_Object *obj, void *info __UNUSED__) +{ + _ebluez4_check_changed(data, obj, "Pairable"); +} + + +static void +_ebluez4_cb_adap_settings(void *data) +{ + Adapter *adap = data; + E_Container *con; + E_Dialog *dialog; + Evas *evas; + Evas_Object *list; + Evas_Object *ck; + int mw, mh; + Eina_List *ck_list = NULL; + + if (adap->dialog) + ebluez4_adapter_settings_del(adap->dialog); + + con = e_container_current_get(e_manager_current_get()); + + dialog = e_dialog_new(con, "Adapter Dialog", "adapter"); + e_dialog_title_set(dialog, "Adapter Settings"); + e_dialog_resizable_set(dialog, EINA_TRUE); + e_win_delete_callback_set(dialog->win, _ebluez4_cb_adap_settings_dialog_del); + + evas = e_win_evas_get(dialog->win); + + list = e_widget_list_add(evas, 0, 0); + + ck = e_widget_check_add(evas, "Default", NULL); + e_widget_check_checked_set(ck, adap->is_default); + e_widget_list_object_append(list, ck, 0, 0, 0); + + ck = e_widget_check_add(evas, "Powered", &(adap->powered_checked)); + e_widget_check_checked_set(ck, adap->powered); + e_widget_list_object_append(list, ck, 0, 0, 0); + evas_object_smart_callback_add(ck, "changed", _ebluez4_powered_changed, + adap); + ck_list = eina_list_append(ck_list, ck); + + + ck = e_widget_check_add(evas, "Visible", &(adap->visible_checked)); + e_widget_check_checked_set(ck, adap->visible); + e_widget_list_object_append(list, ck, 0, 0, 0); + evas_object_smart_callback_add(ck, "changed", + _ebluez4_visible_changed, adap); + ck_list = eina_list_append(ck_list, ck); + + ck = e_widget_check_add(evas, "Pairable", &(adap->pairable_checked)); + e_widget_check_checked_set(ck, adap->pairable); + e_widget_list_object_append(list, ck, 0, 0, 0); + evas_object_smart_callback_add(ck, "changed", + _ebluez4_pairable_changed, adap); + ck_list = eina_list_append(ck_list, ck); + + e_dialog_show(dialog); + e_widget_size_min_get(list, &mw, &mh); + if(mw < 150) mw = 150; + e_dialog_content_set(dialog, list, mw, mh); + + dialog->data = adap; + adap->dialog = dialog; + e_object_data_set(E_OBJECT(dialog), ck_list); +} + static void _ebluez4_adap_list_dialog_del(Instance *inst) { - if (!inst->adap_dialog) return; - e_object_del(E_OBJECT(inst->adap_dialog)); - inst->adap_dialog = NULL; + if (!inst->adapters_dialog) return; + e_object_del(E_OBJECT(inst->adapters_dialog)); + inst->adapters_dialog = NULL; inst->adap_list = NULL; } @@ -111,7 +207,7 @@ _ebluez4_cb_adap_list(void *data, E_Menu *m, E_Menu_Item *mi) E_Dialog *dialog; Evas *evas; - if (inst->adap_dialog) + if (inst->adapters_dialog) _ebluez4_adap_list_dialog_del(inst); con = e_container_current_get(e_manager_current_get()); @@ -131,7 +227,7 @@ _ebluez4_cb_adap_list(void *data, E_Menu *m, E_Menu_Item *mi) e_dialog_show(dialog); dialog->data = inst; - inst->adap_dialog = dialog; + inst->adapters_dialog = dialog; } static void @@ -412,8 +508,8 @@ ebluez4_update_inst(Evas_Object *dest, Eina_List *src, Instance *inst) else if (src == ctxt->adapters) { EINA_LIST_FOREACH(src, iter, adap) - e_widget_ilist_append(dest, NULL, adap->name, NULL, NULL, //FIXME: use correct cb for selecting adapter - edbus_object_path_get(adap->obj)); + e_widget_ilist_append(dest, NULL, adap->name, + _ebluez4_cb_adap_settings, adap, NULL); } e_widget_ilist_thaw(dest); @@ -474,3 +570,34 @@ ebluez4_show_error(const char *err_name, const char *err_msg) e_dialog_show(dialog); e_dialog_border_icon_set(dialog, "dialog-error"); } + +void +ebluez4_adapter_settings_del(E_Dialog *dialog) +{ + Adapter *adap; + Eina_List *ck_list; + + if (!dialog) return; + adap = dialog->data; + ck_list = e_object_data_get(E_OBJECT(dialog)); + eina_list_free(ck_list); + e_object_del(E_OBJECT(dialog)); + adap->dialog = NULL; +} + +void +ebluez4_adapter_properties_update(void *data) +{ + Eina_List *ck_list; + Evas_Object *ck; + Adapter *adap = data; + + if (!adap->dialog) return; + ck_list = e_object_data_get(E_OBJECT(adap->dialog)); + ck = eina_list_nth(ck_list, 0); + e_widget_check_checked_set(ck, adap->powered); + ck = eina_list_nth(ck_list, 1); + e_widget_check_checked_set(ck, adap->visible); + ck = eina_list_nth(ck_list, 2); + e_widget_check_checked_set(ck, adap->pairable); +} diff --git a/src/modules/bluez4/e_mod_main.h b/src/modules/bluez4/e_mod_main.h index 95621455a..421767082 100644 --- a/src/modules/bluez4/e_mod_main.h +++ b/src/modules/bluez4/e_mod_main.h @@ -10,7 +10,7 @@ struct _Instance Evas_Object *found_list; E_Dialog *search_dialog; Evas_Object *adap_list; - E_Dialog *adap_dialog; + E_Dialog *adapters_dialog; }; EAPI extern E_Module_Api e_modapi; @@ -23,5 +23,7 @@ void ebluez4_update_inst(Evas_Object *dest, Eina_List *src, Instance *inst); void ebluez4_update_instances(Eina_List *src); void ebluez4_update_all_gadgets_visibility(); void ebluez4_show_error(const char *err_name, const char *err_msg); +void ebluez4_adapter_settings_del(E_Dialog *dialog); +void ebluez4_adapter_properties_update(void *data); #endif diff --git a/src/modules/bluez4/ebluez4.c b/src/modules/bluez4/ebluez4.c index d2f9f8e7f..95061e64f 100644 --- a/src/modules/bluez4/ebluez4.c +++ b/src/modules/bluez4/ebluez4.c @@ -53,6 +53,7 @@ _free_adap(Adapter *adap) edbus_object_unref(adap->obj); eina_stringshare_del(adap->name); adap->name = NULL; + ebluez4_adapter_settings_del(adap->dialog); free(adap); } @@ -419,6 +420,8 @@ _on_adap_property_changed(void *context, const EDBus_Message *msg) DBG("'%s' property of %s changed to %s", key, adap->name, name); eina_stringshare_del(adap->name); adap->name = eina_stringshare_add(name); + ebluez4_update_instances(ctxt->adapters); + return; } else if (!strcmp(key, "Discoverable")) { @@ -442,7 +445,7 @@ _on_adap_property_changed(void *context, const EDBus_Message *msg) adap->powered = powered; } - ebluez4_update_instances(ctxt->adapters); + ebluez4_adapter_properties_update(adap); } static void @@ -487,6 +490,7 @@ _on_adap_properties(void *data, const EDBus_Message *msg, EDBus_Pending *pending adap->visible = visible; adap->pairable = pairable; adap->powered = powered; + ebluez4_update_instances(ctxt->adapters); } static void @@ -533,7 +537,6 @@ _set_adapter(const char *path) edbus_proxy_signal_handler_add(adap->proxy, "PropertyChanged", _on_adap_property_changed, adap); ctxt->adapters = eina_list_append(ctxt->adapters, adap); - ebluez4_update_instances(ctxt->adapters); } static void @@ -761,3 +764,21 @@ ebluez4_dev_path_cmp(const void *d1, const void *d2) return strcmp(edbus_object_path_get(dev->obj), path); } + +void +ebluez4_adapter_property_set(Adapter *adap, const char *prop_name, Eina_Bool value) +{ + EDBus_Message_Iter *variant, *iter; + EDBus_Message *new_msg; + + if (!adap) return; + if (!adap->obj) return; + new_msg = edbus_proxy_method_call_new(adap->proxy, "SetProperty"); + iter = edbus_message_iter_get(new_msg); + edbus_message_iter_basic_append(iter, 's', prop_name); + variant = edbus_message_iter_container_new(iter, 'v', "b"); + edbus_message_iter_basic_append(variant, 'b', value); + edbus_message_iter_container_close(iter, variant); + edbus_proxy_send(adap->proxy, new_msg, NULL, NULL, -1); + edbus_message_unref(new_msg); +} diff --git a/src/modules/bluez4/ebluez4.h b/src/modules/bluez4/ebluez4.h index 43a52cf37..a84b23285 100644 --- a/src/modules/bluez4/ebluez4.h +++ b/src/modules/bluez4/ebluez4.h @@ -49,7 +49,11 @@ typedef struct _Adapter Eina_Bool visible; Eina_Bool pairable; Eina_Bool powered; + int visible_checked; + int pairable_checked; + int powered_checked; Eina_Bool is_default; + E_Dialog *dialog; EDBus_Object *obj; EDBus_Proxy *proxy; } Adapter; @@ -76,3 +80,4 @@ void ebluez4_disconnect_device(Device *dev); void ebluez4_pair_with_device(const char *addr, void (*cb)(void *, Eina_Bool, const char *), void *data); void ebluez4_remove_device(EDBus_Object *obj); int ebluez4_dev_path_cmp(const void *d1, const void *d2); +void ebluez4_adapter_property_set(Adapter *adap, const char *prop_name, Eina_Bool value);