e/bluez4: Change adapter properties

Patch by: Lucas Joia <lucasjoia@profusion.mobi>



SVN revision: 82200
This commit is contained in:
Lucas Joia 2013-01-04 16:13:07 +00:00 committed by Lucas De Marchi
parent d638ebd2cd
commit e0920a6d0d
4 changed files with 165 additions and 10 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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);