diff --git a/src/modules/bluez4/e_mod_main.c b/src/modules/bluez4/e_mod_main.c index 7fff13343..1daa7319e 100644 --- a/src/modules/bluez4/e_mod_main.c +++ b/src/modules/bluez4/e_mod_main.c @@ -8,6 +8,10 @@ static Eina_List *instances = NULL; static E_Module *mod = NULL; static char tmpbuf[1024]; +/* Local config */ +static E_Config_DD *conf_edd = NULL; +Config *ebluez4_config = NULL; + EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, "Bluez4"}; /* Local Functions */ @@ -249,6 +253,32 @@ _ebluez4_cb_forget(void *data, E_Menu *m, E_Menu_Item *mi) ebluez4_remove_device(dev->obj); } +static void +_ebluez4_cb_lock(void *data, + E_Menu *m __UNUSED__, + E_Menu_Item *mi) +{ + Device *dev = data; + int tog; + + tog = e_menu_item_toggle_get(mi); + eina_stringshare_replace(&ebluez4_config->lock_dev_name, + tog ? dev->name : NULL); +} + +static void +_ebluez4_cb_unlock(void *data, + E_Menu *m __UNUSED__, + E_Menu_Item *mi) +{ + Device *dev = data; + int tog; + + tog = e_menu_item_toggle_get(mi); + eina_stringshare_replace(&ebluez4_config->unlock_dev_name, + tog ? dev->name : NULL); +} + static void _menu_post_deactivate(void *data __UNUSED__, E_Menu *m) { @@ -290,7 +320,9 @@ _ebluez4_add_devices(Instance *inst) EINA_LIST_FOREACH(ctxt->devices, iter, dev) if (dev->paired) { - mi = e_menu_item_new(m); + Eina_Bool chk; + + mi = e_menu_item_new(m); e_menu_item_label_set(mi, dev->name); e_menu_item_check_set(mi, 1); subm = e_menu_new(); @@ -313,6 +345,23 @@ _ebluez4_add_devices(Instance *inst) submi = e_menu_item_new(subm); e_menu_item_label_set(submi, "Forget"); e_menu_item_callback_set(submi, _ebluez4_cb_forget, dev); + + /* Auto lock when away */ + submi = e_menu_item_new(subm); + e_menu_item_check_set(submi, 1); + e_menu_item_label_set(submi, "Lock on disconnect"); + e_menu_item_callback_set(submi, _ebluez4_cb_lock, dev); + chk = ebluez4_config->lock_dev_name && dev->name && + !strcmp(dev->name, ebluez4_config->lock_dev_name); + e_menu_item_toggle_set(submi, !!chk); + + submi = e_menu_item_new(subm); + e_menu_item_check_set(submi, 1); + e_menu_item_label_set(submi, "Unlock on disconnect"); + e_menu_item_callback_set(submi, _ebluez4_cb_unlock, dev); + chk = ebluez4_config->unlock_dev_name && dev->name && + !strcmp(dev->name, ebluez4_config->unlock_dev_name); + e_menu_item_toggle_set(submi, !!chk); } return ret; @@ -475,6 +524,18 @@ e_modapi_init(E_Module *m) { mod = m; + conf_edd = E_CONFIG_DD_NEW("Config", Config); +#undef T +#undef D +#define T Config +#define D conf_edd + E_CONFIG_VAL(D, T, lock_dev_name, STR); + E_CONFIG_VAL(D, T, unlock_dev_name, STR); + + ebluez4_config = e_config_domain_load("module.ebluez4", conf_edd); + if (!ebluez4_config) + ebluez4_config = E_NEW(Config, 1); + ebluez4_edbus_init(); e_gadcon_provider_register(&_gc_class); @@ -485,6 +546,13 @@ e_modapi_init(E_Module *m) EAPI int e_modapi_shutdown(E_Module *m) { + E_CONFIG_DD_FREE(conf_edd); + + eina_stringshare_del(ebluez4_config->lock_dev_name); + eina_stringshare_del(ebluez4_config->unlock_dev_name); + free(ebluez4_config); + ebluez4_config = NULL; + ebluez4_edbus_shutdown(); e_gadcon_provider_unregister(&_gc_class); return 1; diff --git a/src/modules/bluez4/e_mod_main.h b/src/modules/bluez4/e_mod_main.h index 65aad7a91..c8d713b60 100644 --- a/src/modules/bluez4/e_mod_main.h +++ b/src/modules/bluez4/e_mod_main.h @@ -13,6 +13,15 @@ struct _Instance E_Dialog *adapters_dialog; }; +typedef struct _Config Config; +struct _Config +{ + const char *lock_dev_name; + const char *unlock_dev_name; +}; + +extern Config *ebluez4_config; + EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init(E_Module *m); diff --git a/src/modules/bluez4/ebluez4.c b/src/modules/bluez4/ebluez4.c index 58fed0672..2347808d1 100644 --- a/src/modules/bluez4/ebluez4.c +++ b/src/modules/bluez4/ebluez4.c @@ -384,6 +384,11 @@ _on_removed(void *context, const EDBus_Message *msg) dev = eina_list_search_unsorted(ctxt->devices, ebluez4_dev_path_cmp, path); fdev = eina_list_search_unsorted(ctxt->found_devices, _dev_addr_cmp, dev->addr); + + if (dev->name && ebluez4_config->lock_dev_name && + !strcmp(dev->name, ebluez4_config->lock_dev_name)) + e_desklock_show(EINA_FALSE); + _unset_dev(dev, &ctxt->devices); _unset_dev(fdev, &ctxt->found_devices); } @@ -422,6 +427,10 @@ _on_device_found(void *context, const EDBus_Message *msg) dev->paired = paired; ctxt->found_devices = eina_list_append(ctxt->found_devices, dev); + if (dev->name && ebluez4_config->unlock_dev_name && + !strcmp(dev->name, ebluez4_config->unlock_dev_name)) + e_desklock_hide(); + ebluez4_update_instances(ctxt->found_devices); }