diff --git a/.gitignore b/.gitignore index ca4f6f7ac..d7e3d2d73 100644 --- a/.gitignore +++ b/.gitignore @@ -114,7 +114,6 @@ src/bin/enlightenment_open src/modules/access/module.desktop src/modules/backlight/module.desktop src/modules/battery/module.desktop -src/modules/bluez/module.desktop src/modules/clock/module.desktop src/modules/comp/module.desktop src/modules/conf/module.desktop diff --git a/configure.ac b/configure.ac index 1df423e77..8108b763d 100644 --- a/configure.ac +++ b/configure.ac @@ -804,14 +804,6 @@ dnl AC_E_CHECK_PKG(DUMMY, [ connman >= 1.0 ], [], [CONNMAN=false]) AC_SUBST(ECONNMAN_CFLAGS) AC_SUBST(ECONNMAN_LIBS) -AM_CONDITIONAL(HAVE_EBLUEZ, false) -define([CHECK_MODULE_BLUEZ], -[ - AC_E_CHECK_PKG(EBLUEZ, [ edbus >= 1.2.0 ebluez >= 1.2.0 ], [], [BLUEZ=false]) -]) -AC_SUBST(EBLUEZ_CFLAGS) -AC_SUBST(EBLUEZ_LIBS) - AM_CONDITIONAL(HAVE_EOFONO, false) define([CHECK_MODULE_OFONO], [ @@ -877,7 +869,6 @@ AC_E_OPTIONAL_MODULE([conf_interaction], true) AC_E_OPTIONAL_MODULE([gadman], true) AC_E_OPTIONAL_MODULE([mixer], true, [CHECK_MODULE_MIXER]) AC_E_OPTIONAL_MODULE([connman], true, [CHECK_MODULE_CONNMAN]) -AC_E_OPTIONAL_MODULE([bluez], true, [CHECK_MODULE_BLUEZ]) AC_E_OPTIONAL_MODULE([ofono], true, [CHECK_MODULE_OFONO]) AC_E_OPTIONAL_MODULE([illume2], true) AC_E_OPTIONAL_MODULE([syscon], true) @@ -1010,8 +1001,6 @@ src/modules/mixer/Makefile src/modules/mixer/module.desktop src/modules/connman/Makefile src/modules/connman/module.desktop -src/modules/bluez/Makefile -src/modules/bluez/module.desktop src/modules/ofono/Makefile src/modules/ofono/module.desktop src/modules/illume2/Makefile diff --git a/data/themes/default.edc b/data/themes/default.edc index 01e4fa559..f18b5b20e 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -8333,273 +8333,7 @@ CONNMAN_ICON(ethernet) #undef CONNMAN_STATE_PART_ADD #undef CONNMAN_IMAGES_SET -///////////////////////////////////////////////////////////////////////////// -/*** MOD: BLUEZ ***/ - - group { - name: "e/modules/bluez/main"; - images { - image: "bluetooth-powered.png" COMP; - image: "bluetooth-inactive.png" COMP; - image: "bluetooth-hidden.png" COMP; - } - //max: 128 128; - min: 16 16; - parts { - part { - name: "eventarea"; - type: RECT; - mouse_events: 1; - description { - state: "default" 0.0; - color: 255 255 255 0; - } - } - part { - name: "state-clipper"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - } - } - part { - name: "state"; - type: IMAGE; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - fixed: 1 1; - image.normal: "bluetooth-inactive.png"; - } - description { - state: "powered" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-powered.png"; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-hidden.png"; - } - } - programs { - program { - signal: "e,changed,service,none"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,off"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,powered"; - source: "e"; - action: STATE_SET "powered" 0.0; - target: "state"; - } - program { - signal: "e,changed,hidden"; - source: "e"; - action: STATE_SET "hidden" 0.0; - target: "state"; - } - } - part { - name: "e.text.name"; - type: TEXT; - mouse_events: 0; - effect: SOFT_SHADOW; - description { - state: "default" 0.0; - color: 224 224 224 255; - color3: 0 0 0 64; - align: 0.5 1.0; - rel1 { - relative: 0.0 1.0; - offset: 0 -20; - } - rel2 { - relative: 1.0 1.0; - offset: -1 -1; - } - text { - font: "Sans"; - size: 8; - align: 0.5 1.0; - text: ""; - min: 1 1; - } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - programs { - program { - name: "resize"; - signal: "resize"; - script { - new x, y, w, h, tx, ty, tw, th; - get_geometry(PART:"eventarea", x, y, w, h); - get_geometry(PART:"e.text.name", tx, ty, tw, th); - if ((w <= 32) || (tw >= w)) - set_state(PART:"e.text.name", "hidden", 0.0); - else - set_state(PART:"e.text.name", "default", 0.0); - } - } - program { - signal: "e,changed,name"; - source: "e"; - action: STATE_SET "default" 0.0; - // show so calcs take effect! - target: "e.text.name"; - after: "resize"; - } - } - } - } - group { - name: "e/modules/bluez/tip"; - images { - image: "bluetooth-powered.png" COMP; - image: "bluetooth-inactive.png" COMP; - image: "bluetooth-hidden.png" COMP; - } - min: 200 84; - parts { - part { - name: "state-clipper"; - type: RECT; - mouse_events: 0; - description { - state: "default" 0.0; - color: 255 255 255 255; - } - } - part { - name: "state"; - type: IMAGE; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - aspect: 1.0 1.0; - aspect_preference: BOTH; - fixed: 1 1; - rel1 { - relative: 0.0 0.0; - offset: 10 10; - } - rel2 { - relative: 0.0 0.0; - offset: 73 73; - } - image.normal: "bluetooth-inactive.png"; - } - description { - state: "powered" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-powered.png"; - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - image.normal: "bluetooth-hidden.png"; - } - } - programs { - program { - signal: "e,changed,off"; - source: "e"; - action: STATE_SET "default" 0.0; - target: "state"; - } - program { - signal: "e,changed,powered"; - source: "e"; - action: STATE_SET "powered" 0.0; - target: "state"; - } - program { - signal: "e,changed,hidden"; - source: "e"; - action: STATE_SET "hidden" 0.0; - target: "state"; - } - } - part { - name: "e.text.name"; - type: TEXT; - mouse_events: 0; - effect: SOFT_SHADOW; - description { - state: "default" 0.0; - color: 240 240 240 255; - color3: 0 0 0 64; - align: 0.0 0.0; - rel1 { - to_x: "state"; - relative: 1.0 0.0; - offset: 10 20; - } - rel2 { - relative: 1.0 0.0; - offset: -10 40; - } - text { - font: "Sans:style=Bold"; - size: 16; - align: 0.0 0.0; - text: "Bluetooth Manager"; - min: 1 0; - } - } - } - part { - name: "e.text.status"; - type: TEXT; - mouse_events: 0; - clip_to: "state-clipper"; - description { - state: "default" 0.0; - color: 16 16 16 255; - rel1 { - to_y: "e.text.name"; - to_x: "state"; - relative: 1.0 1.0; - offset: 10 10; - } - rel2 { - to_y: "e.text.name"; - relative: 1.0 1.0; - offset: -10 25; - } - text { - font: "Sans"; - size: 10; - align: 0.0 0.0; - text: ""; - min: 1 0; - } - } - } - } - } - - -///////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// /*** MOD: OFONO ***/ // GADGET and TIP all have the same parts and signals: diff --git a/data/themes/images/Makefile.am b/data/themes/images/Makefile.am index dfdcbfb1d..efb8f01ce 100644 --- a/data/themes/images/Makefile.am +++ b/data/themes/images/Makefile.am @@ -25,9 +25,6 @@ bd_top_hilight.png \ bd_top.png \ big_arrow_down.png \ big_arrow_up.png \ -bluetooth-powered.png \ -bluetooth-inactive.png \ -bluetooth-hidden.png \ bnw.png \ bt_base1.png \ bt_base2.png \ diff --git a/data/themes/images/bluetooth-hidden.png b/data/themes/images/bluetooth-hidden.png deleted file mode 100644 index 1cb6390c7..000000000 Binary files a/data/themes/images/bluetooth-hidden.png and /dev/null differ diff --git a/data/themes/images/bluetooth-inactive.png b/data/themes/images/bluetooth-inactive.png deleted file mode 100644 index d58be9f12..000000000 Binary files a/data/themes/images/bluetooth-inactive.png and /dev/null differ diff --git a/data/themes/images/bluetooth-powered.png b/data/themes/images/bluetooth-powered.png deleted file mode 100644 index 1d5696e12..000000000 Binary files a/data/themes/images/bluetooth-powered.png and /dev/null differ diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 6215dd443..475a2e56f 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -142,10 +142,6 @@ if USE_MODULE_CONNMAN SUBDIRS += connman endif -if USE_MODULE_BLUEZ -SUBDIRS += bluez -endif - if USE_MODULE_ILLUME2 SUBDIRS += \ illume2 \ diff --git a/src/modules/bluez/Makefile.am b/src/modules/bluez/Makefile.am deleted file mode 100644 index 3613626e0..000000000 --- a/src/modules/bluez/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -MAINTAINERCLEANFILES = Makefile.in -MODULE = bluez - -# data files for the module -filesdir = $(libdir)/enlightenment/modules/$(MODULE) -files_DATA = \ -e-module-$(MODULE).edj module.desktop - -EXTRA_DIST = $(files_DATA) - -# the module .so file -INCLUDES = -I. \ - -I$(top_srcdir) \ - -I$(top_srcdir)/src/modules/$(MODULE) \ - -I$(top_srcdir)/src/bin \ - -I$(top_builddir)/src/bin \ - -I$(top_srcdir)/src/modules \ - @e_cflags@ @EBLUEZ_CFLAGS@ - -pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) - -pkg_LTLIBRARIES = module.la - -module_la_SOURCES = e_mod_main.h \ - e_mod_main.c \ - e_mod_config.c - -module_la_LIBADD = @e_libs@ @dlopen_libs@ @EBLUEZ_LIBS@ -module_la_LDFLAGS = -module -avoid-version -module_la_DEPENDENCIES = $(top_builddir)/config.h - -uninstall: - rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/bluez/e-module-bluez.edj b/src/modules/bluez/e-module-bluez.edj deleted file mode 100644 index c20ad2118..000000000 Binary files a/src/modules/bluez/e-module-bluez.edj and /dev/null differ diff --git a/src/modules/bluez/e_mod_config.c b/src/modules/bluez/e_mod_config.c deleted file mode 100644 index 1514e62dd..000000000 --- a/src/modules/bluez/e_mod_config.c +++ /dev/null @@ -1,188 +0,0 @@ -#include "e_mod_main.h" - -extern const char _e_bluez_Name[]; - -struct _E_Config_Dialog_Data -{ - E_Bluez_Instance *inst; - const char *name; - Eina_Bool mode; - unsigned int timeout; - struct - { - Evas_Object *label; - Evas_Object *slider; - Evas_Object *help; - } gui; -}; - -/* Local Function Prototypes */ -static void *_create_data(E_Config_Dialog *dialog); -static void _free_data(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create(E_Config_Dialog *dialog, - Evas *evas, - E_Config_Dialog_Data *cfdata); -static int _basic_apply(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata); - -E_Config_Dialog * -e_bluez_config_dialog_new(E_Container *con, - E_Bluez_Instance *inst) -{ - E_Config_Dialog *dialog; - E_Config_Dialog_View *view; - - if (inst->conf_dialog) - return inst->conf_dialog; - - view = E_NEW(E_Config_Dialog_View, 1); - if (!view) - return NULL; - - view->create_cfdata = _create_data; - view->free_cfdata = _free_data; - view->basic.create_widgets = _basic_create; - view->basic.apply_cfdata = _basic_apply; - - dialog = e_config_dialog_new(con, _("Bluetooth Settings"), - _e_bluez_Name, "e_bluez_config_dialog_new", - e_bluez_theme_path(), 0, view, inst); - - return dialog; -} - -static void * -_create_data(E_Config_Dialog *dialog) -{ - E_Config_Dialog_Data *cfdata; - E_Bluez_Instance *inst; - - cfdata = E_NEW(E_Config_Dialog_Data, 1); - if (!cfdata) - return NULL; - - cfdata->inst = dialog->data; - inst = cfdata->inst; - if (!e_bluez_adapter_discoverable_get(inst->adapter, &cfdata->mode)) - cfdata->mode = 0; - - if (!e_bluez_adapter_discoverable_timeout_get - (inst->adapter, &cfdata->timeout)) - cfdata->timeout = 0; - cfdata->timeout /= 60; - - if (!e_bluez_adapter_name_get(inst->adapter, &cfdata->name)) - cfdata->name = NULL; - else - cfdata->name = strdup(cfdata->name); - - return cfdata; -} - -static void -_free_data(E_Config_Dialog *dialog, - E_Config_Dialog_Data *cfdata) -{ - E_Bluez_Instance *inst = dialog->data; - - inst->conf_dialog = NULL; - E_FREE(cfdata); -} - -static void -_cb_disable_timeout(void *data, - Evas_Object *obj __UNUSED__) -{ - E_Config_Dialog_Data *cfdata = data; - Eina_Bool disable = !cfdata->mode; - - e_widget_disabled_set(cfdata->gui.label, disable); - e_widget_disabled_set(cfdata->gui.slider, disable); - e_widget_disabled_set(cfdata->gui.help, disable); -} - -static Evas_Object * -_basic_create(E_Config_Dialog *dialog __UNUSED__, - Evas *evas, - E_Config_Dialog_Data *cfdata) -{ - Evas_Object *o, *ob; - Evas_Object *check; - char buf[48]; - const char *address; - - o = e_widget_list_add(evas, 0, 0); - - if (!e_bluez_adapter_address_get(cfdata->inst->adapter, &address)) - address = NULL; - - ob = e_widget_label_add(evas, _("Name")); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - ob = e_widget_entry_add(evas, (char **)&cfdata->name, NULL, NULL, NULL); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - check = e_widget_check_add - (evas, _("Discoverable mode"), (int *)&cfdata->mode); - e_widget_list_object_append(o, check, 1, 1, 0.5); - - ob = e_widget_label_add(evas, _("Discovarable Timeout")); - cfdata->gui.label = ob; - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - ob = e_widget_slider_add(evas, 1, 0, _("%1.0f minutes"), 0, 30, 1, 0, - NULL, (int *)&cfdata->timeout, 100); - e_widget_slider_special_value_add(ob, 0.0, 0.0, _("Forever")); - cfdata->gui.slider = ob; - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - e_widget_on_change_hook_set(check, _cb_disable_timeout, cfdata); - _cb_disable_timeout(cfdata, NULL); - - snprintf(buf, sizeof(buf), _("MAC Address: %s"), address); - ob = e_widget_label_add(evas, buf); - e_widget_list_object_append(o, ob, 1, 1, 0.5); - - return o; -} - -static void -_method_success_check(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - const char *name = data; - - if ((!error) || (!dbus_error_is_set(error))) - return; - - ERR("method %s() finished with error: %s %s\n", - name, error->name, error->message); - dbus_error_free(error); -} - -static int -_basic_apply(E_Config_Dialog *dialog __UNUSED__, - E_Config_Dialog_Data *cfdata) -{ - E_Bluez_Instance *inst = cfdata->inst; - - if (!e_bluez_adapter_discoverable_set - (inst->adapter, cfdata->mode, - _method_success_check, "e_bluez_adapter_discoverable_get")) - ERR("Can't set Discoverable on adapter"); - - if (!e_bluez_adapter_discoverable_timeout_set - (inst->adapter, cfdata->timeout * 60, - _method_success_check, "e_bluez_adapter_discoverable_timeout_get")) - ERR("Can't set DiscoverableTimeout on adapter"); - - if (!e_bluez_adapter_name_set - (inst->adapter, cfdata->name, - _method_success_check, "e_bluez_adapter_name_get")) - ERR("Can't set Name on adapter"); - - return 1; -} - diff --git a/src/modules/bluez/e_mod_main.c b/src/modules/bluez/e_mod_main.c deleted file mode 100644 index 106d3185c..000000000 --- a/src/modules/bluez/e_mod_main.c +++ /dev/null @@ -1,1439 +0,0 @@ -/* - * TODO: - * - * HIGH: - * - * - check why return NULL from method call triggers cancel error - * after timeout. - * - find out why alias == address in _bluez_request_pincode_cb - * - more complete agent support (handle requests from devices) - * - handle device-disappeared events - * - icon with device state (trusted, connected, paired) - * - * LOW: - * - * - configure (probably module) timeout to trigger automatic rescan. - * - gadgets to show different adapters (see mixer module configuration) - * - module to choose the default adapter (see mixer module configuration) - * - icon with device class - */ -#include "e.h" -#include "e_mod_main.h" - -static E_Module *bluez_mod = NULL; -static char tmpbuf[4096]; /* general purpose buffer, just use immediately */ - -static const char _e_bluez_agent_path[] = "/org/enlightenment/bluez/Agent"; -const char _e_bluez_name[] = "bluez"; -const char _e_bluez_Name[] = "Bluetooth Manager"; -int _e_bluez_log_dom = -1; - -static void _bluez_gadget_update(E_Bluez_Instance *inst); -static void _bluez_tip_update(E_Bluez_Instance *inst); -static void _bluez_popup_update(E_Bluez_Instance *inst); - -struct bluez_pincode_data -{ - void (*cb)(struct bluez_pincode_data *d); - DBusMessage *msg; - E_Bluez_Module_Context *ctxt; - char *pincode; - const char *alias; - E_Dialog *dia; - Evas_Object *entry; - Eina_Bool canceled; -}; - -const char * -e_bluez_theme_path(void) -{ -#define TF "/e-module-bluez.edj" - size_t dirlen; - - dirlen = strlen(bluez_mod->dir); - if (dirlen >= sizeof(tmpbuf) - sizeof(TF)) - return NULL; - - memcpy(tmpbuf, bluez_mod->dir, dirlen); - memcpy(tmpbuf + dirlen, TF, sizeof(TF)); - - return tmpbuf; -#undef TF -} - -static void -_bluez_devices_clear(E_Bluez_Instance *inst) -{ - E_Bluez_Instance_Device *d; - EINA_LIST_FREE(inst->devices, d) - { - eina_stringshare_del(d->address); - eina_stringshare_del(d->alias); - free(d); - } - inst->address = NULL; - inst->alias = NULL; -} - -static void -_bluez_discovery_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - E_Bluez_Instance *inst = data; - char *label; - - if (error && dbus_error_is_set(error)) - { - _bluez_dbus_error_show(_("Cannot change adapter's discovery."), error); - dbus_error_free(error); - return; - } - - inst->discovering = !inst->discovering; - - label = !inst->discovering ? _("Start Scan") : _("Stop Scan"); - e_widget_button_label_set(inst->ui.button, label); -} - -static void -_bluez_create_paired_device_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - const char *alias = data; - - if (error && dbus_error_is_set(error)) - { - if (strcmp(error->name, "org.bluez.Error.AlreadyExists") != 0) - _bluez_dbus_error_show(_("Cannot pair with device."), error); - dbus_error_free(error); - eina_stringshare_del(alias); - return; - } - - e_util_dialog_show - (_("Bluetooth Manager"), _("Device '%s' successfully paired."), alias); - eina_stringshare_del(alias); -} - -static void -_bluez_toggle_powered_cb(void *data, - DBusMessage *msg __UNUSED__, - DBusError *error) -{ - E_Bluez_Instance *inst = data; - - if ((!error) || (!dbus_error_is_set(error))) - { - inst->powered_pending = EINA_FALSE; - inst->powered = !inst->powered; - - if (!inst->powered) - { - _bluez_devices_clear(inst); - - if (inst->popup) - _bluez_popup_update(inst); - } - - _bluez_gadget_update(inst); - return; - } - - _bluez_dbus_error_show(_("Cannot toggle adapter's powered."), error); - dbus_error_free(error); -} - -void -_bluez_toggle_powered(E_Bluez_Instance *inst) -{ - Eina_Bool powered; - - if ((!inst) || (!inst->ctxt->has_manager)) - { - _bluez_operation_error_show(_("BlueZ Daemon is not running.")); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_powered_get(inst->adapter, &powered)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } - - powered = !powered; - - if (!e_bluez_adapter_powered_set - (inst->adapter, powered, _bluez_toggle_powered_cb, inst)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } -} - -static void -_bluez_cb_toggle_powered(E_Object *obj __UNUSED__, - const char *params __UNUSED__) -{ - E_Bluez_Module_Context *ctxt; - const Eina_List *l; - E_Bluez_Instance *inst; - - if (!bluez_mod) - return; - - ctxt = bluez_mod->data; - EINA_LIST_FOREACH(ctxt->instances, l, inst) - if (inst->adapter) _bluez_toggle_powered(inst); -} - -static void _bluez_popup_del(E_Bluez_Instance *inst); - -static Eina_Bool -_bluez_popup_input_window_mouse_up_cb(void *data, - int type __UNUSED__, - void *event) -{ - Ecore_Event_Mouse_Button *ev = event; - E_Bluez_Instance *inst = data; - - if (ev->window != inst->ui.input.win) - return ECORE_CALLBACK_PASS_ON; - - _bluez_popup_del(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_popup_input_window_key_down_cb(void *data, - int type __UNUSED__, - void *event) -{ - Ecore_Event_Key *ev = event; - E_Bluez_Instance *inst = data; - const char *keysym; - - if (ev->window != inst->ui.input.win) - return ECORE_CALLBACK_PASS_ON; - - keysym = ev->key; - if (strcmp(keysym, "Escape") == 0) - _bluez_popup_del(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static void -_bluez_popup_input_window_destroy(E_Bluez_Instance *inst) -{ - ecore_x_window_free(inst->ui.input.win); - inst->ui.input.win = 0; - - ecore_event_handler_del(inst->ui.input.mouse_up); - inst->ui.input.mouse_up = NULL; - - ecore_event_handler_del(inst->ui.input.key_down); - inst->ui.input.key_down = NULL; -} - -static void -_bluez_popup_input_window_create(E_Bluez_Instance *inst) -{ - Ecore_X_Window_Configure_Mask mask; - Ecore_X_Window w, popup_w; - E_Manager *man; - - man = e_manager_current_get(); - - w = ecore_x_window_input_new(man->root, 0, 0, man->w, man->h); - mask = (ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE | - ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING); - popup_w = inst->popup->win->evas_win; - ecore_x_window_configure(w, mask, 0, 0, 0, 0, 0, popup_w, - ECORE_X_WINDOW_STACK_BELOW); - ecore_x_window_show(w); - - inst->ui.input.mouse_up = - ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, - _bluez_popup_input_window_mouse_up_cb, inst); - - inst->ui.input.key_down = - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - _bluez_popup_input_window_key_down_cb, inst); - - inst->ui.input.win = w; -} - -static void -_bluez_popup_cb_powered_changed(void *data, - Evas_Object *obj) -{ - E_Bluez_Instance *inst = data; - E_Bluez_Module_Context *ctxt = inst->ctxt; - Eina_Bool powered = e_widget_check_checked_get(obj); - - if ((!ctxt) || (!ctxt->has_manager)) - { - _bluez_operation_error_show(_("BlueZ Daemon is not running.")); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_powered_set - (inst->adapter, powered, _bluez_toggle_powered_cb, inst)) - { - _bluez_operation_error_show - (_("Cannot toggle adapter's powered.")); - return; - } - - inst->powered_pending = EINA_TRUE; -} - -static void -_bluez_pincode_ask_cb(struct bluez_pincode_data *d) -{ - DBusMessage *reply; - - if (!d->pincode) - { - e_util_dialog_show(_("Bluetooth Manager"), _("Invalid Pin Code.")); - return; - } - - reply = dbus_message_new_method_return(d->msg); - dbus_message_append_args - (reply, DBUS_TYPE_STRING, &d->pincode, DBUS_TYPE_INVALID); - - dbus_message_set_no_reply(reply, EINA_TRUE); - e_dbus_message_send(d->ctxt->agent.conn, reply, NULL, -1, NULL); -} - -static void -bluez_pincode_ask_ok(void *data, - E_Dialog *dia) -{ - struct bluez_pincode_data *d = data; - d->canceled = EINA_FALSE; - e_object_del(E_OBJECT(dia)); -} - -static void -bluez_pincode_ask_cancel(void *data, - E_Dialog *dia) -{ - struct bluez_pincode_data *d = data; - d->canceled = EINA_TRUE; - e_object_del(E_OBJECT(dia)); -} - -static void -bluez_pincode_ask_del(void *data) -{ - E_Dialog *dia = data; - struct bluez_pincode_data *d = e_object_data_get(E_OBJECT(dia)); - - if (!d->canceled) - d->cb(d); - - d->ctxt->agent.pending = eina_list_remove(d->ctxt->agent.pending, dia); - - free(d->pincode); - dbus_message_unref(d->msg); - eina_stringshare_del(d->alias); - E_FREE(d); -} - -static void -bluez_pincode_ask_key_down(void *data, - Evas *e __UNUSED__, - Evas_Object *o __UNUSED__, - void *event) -{ - Evas_Event_Key_Down *ev = event; - struct bluez_pincode_data *d = data; - - if (strcmp(ev->keyname, "Return") == 0) - bluez_pincode_ask_ok(d, d->dia); - else if (strcmp(ev->keyname, "Escape") == 0) - bluez_pincode_ask_cancel(d, d->dia); -} - -static void -bluez_pincode_ask(void (*cb)(struct bluez_pincode_data *), - DBusMessage *msg, - const char *alias, - E_Bluez_Module_Context *ctxt) -{ - struct bluez_pincode_data *d; - Evas_Object *list, *o; - Evas *evas; - char buf[512]; - int mw, mh; - - if (!cb) - return; - - d = E_NEW(struct bluez_pincode_data, 1); - if (!d) - return; - - d->cb = cb; - d->ctxt = ctxt; - d->alias = eina_stringshare_add(alias); - d->msg = dbus_message_ref(msg); - d->canceled = EINA_TRUE; /* closing the dialog defaults to cancel */ - d->dia = e_dialog_new(NULL, "E", "bluez_ask_pincode"); - - snprintf(buf, sizeof(buf), _("Pairing with device '%s'"), alias); - e_dialog_title_set(d->dia, buf); - e_dialog_icon_set(d->dia, "dialog-ask", 32); - e_dialog_border_icon_set(d->dia, "dialog-ask"); - - evas = d->dia->win->evas; - - list = e_widget_list_add(evas, 0, 0); - - o = edje_object_add(evas); - e_theme_edje_object_set(o, "base/theme/dialog", - "e/widgets/dialog/text"); - snprintf(buf, sizeof(buf), - _("Enter the PIN code: ")); - edje_object_part_text_set(o, "e.textblock.message", buf); - edje_object_size_min_calc(o, &mw, &mh); - evas_object_size_hint_min_set(o, mw, mh); - evas_object_resize(o, mw, mh); - evas_object_show(o); - e_widget_list_object_append(list, o, 1, 1, 0.5); - - d->entry = o = e_widget_entry_add(evas, &d->pincode, NULL, NULL, NULL); - e_widget_entry_password_set(o, 0); - evas_object_show(o); - e_widget_list_object_append(list, o, 1, 0, 0.0); - - e_widget_size_min_get(list, &mw, &mh); - if (mw < 200) - mw = 200; - if (mh < 60) - mh = 60; - e_dialog_content_set(d->dia, list, mw, mh); - - e_dialog_button_add - (d->dia, _("Ok"), NULL, bluez_pincode_ask_ok, d); - e_dialog_button_add - (d->dia, _("Cancel"), NULL, bluez_pincode_ask_cancel, d); - - evas_object_event_callback_add - (d->dia->bg_object, EVAS_CALLBACK_KEY_DOWN, - bluez_pincode_ask_key_down, d); - - e_object_del_attach_func_set - (E_OBJECT(d->dia), bluez_pincode_ask_del); - e_object_data_set(E_OBJECT(d->dia), d); - - e_dialog_button_focus_num(d->dia, 0); - e_widget_focus_set(d->entry, 1); - - e_win_centered_set(d->dia->win, 1); - e_dialog_show(d->dia); - - ctxt->agent.pending = eina_list_append(ctxt->agent.pending, d->dia); -} - -static DBusMessage * -_bluez_request_pincode_cb(E_DBus_Object *obj, - DBusMessage *msg) -{ - E_Bluez_Module_Context *ctxt = e_dbus_object_data_get(obj); - E_Bluez_Element *element; - const char *path; - const char *alias; - - // TODO: seems that returning NULL is causing pin code rquest to be canceled! - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID) == FALSE) - return NULL; - - element = e_bluez_device_get(path); - if (!element) - alias = path; - else - { - if (!e_bluez_device_alias_get(element, &alias)) - { - if (!e_bluez_device_name_get(element, &alias)) - alias = path; - } - } - // TODO: find out why alias == address, then remove debug: - fprintf(stderr, ">>> request pin code of '%s' (%s)\n", alias, path); - bluez_pincode_ask(_bluez_pincode_ask_cb, msg, alias, ctxt); - return NULL; -} - -static void -_bluez_popup_cb_scan(void *data, - void *data2 __UNUSED__) -{ - E_Bluez_Instance *inst = data; - int ret; - - if (!inst->adapter) - ret = 0; - else if (inst->discovering) - ret = e_bluez_adapter_stop_discovery - (inst->adapter, _bluez_discovery_cb, inst); - else - { - inst->last_scan = ecore_loop_time_get(); - - _bluez_devices_clear(inst); - - ret = e_bluez_adapter_start_discovery - (inst->adapter, _bluez_discovery_cb, inst); - - _bluez_popup_update(inst); - } - - if (!ret) - ERR("Failed on discovery procedure"); -} - -static void -_bluez_popup_cb_controls(void *data, - void *data2 __UNUSED__) -{ - E_Bluez_Instance *inst = data; - if (inst->popup) - _bluez_popup_del(inst); - if (inst->conf_dialog) - return; - if (!inst->adapter) - return; - inst->conf_dialog = e_bluez_config_dialog_new(NULL, inst); -} - -static void -_bluez_popup_device_selected(void *data) -{ - E_Bluez_Instance *inst = data; - const char *address = inst->address; - const char *alias; - const char *cap = "DisplayYesNo"; - const E_Bluez_Instance_Device *d; - const Eina_List *l; - - if (inst->popup) - _bluez_popup_del(inst); - - if (!address) - { - ERR("no device selected for pairing."); - return; - } - - inst->alias = address; - EINA_LIST_FOREACH(inst->devices, l, d) - { - if (address == d->alias) - { - inst->alias = d->alias; - break; - } - } - - if (!inst->alias) - { - ERR("device %s does not have an alias.", address); - return; - } - - alias = eina_stringshare_ref(inst->alias); - if (!e_bluez_adapter_create_paired_device - (inst->adapter, _e_bluez_agent_path, cap, address, - _bluez_create_paired_device_cb, alias)) - { - eina_stringshare_del(alias); - return; - } -} - -static Eina_Bool -_bluez_event_devicefound(void *data, - int type __UNUSED__, - void *event) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Device_Found *device = event; - E_Bluez_Instance *inst; - const Eina_List *l_inst; - const char *alias; - - // TODO: get properties such as paired, connected, trusted, class, icon... - // TODO: check if the adapter contains device->name and if so get path. - - alias = e_bluez_devicefound_alias_get(device); - - EINA_LIST_FOREACH(ctxt->instances, l_inst, inst) - { - const Eina_List *l_dev; - E_Bluez_Instance_Device *dev; - Eina_Bool found = EINA_FALSE; - - if (inst->adapter != device->adapter) continue; - - EINA_LIST_FOREACH(inst->devices, l_dev, dev) - { - if (dev->address == device->name) - { - found = EINA_TRUE; - break; - } - } - - if (found) continue; - - dev = malloc(sizeof(E_Bluez_Instance_Device)); - if (!dev) continue; - - dev->address = eina_stringshare_ref(device->name); - dev->alias = eina_stringshare_ref(alias); - - inst->devices = eina_list_append(inst->devices, dev); - - if (inst->ui.list) - { - e_widget_ilist_append - (inst->ui.list, NULL, dev->alias, - _bluez_popup_device_selected, inst, dev->address); - e_widget_ilist_go(inst->ui.list); - } - } - - return 1; -} - -static void -_bluez_popup_update(E_Bluez_Instance *inst) -{ - Evas_Object *list = inst->ui.list; - int selected; - const char *label; - E_Bluez_Instance_Device *d; - Eina_List *l; - - /* TODO: replace this with a scroller + list of edje - * objects that are more full of features - */ - selected = e_widget_ilist_selected_get(list); - e_widget_ilist_freeze(list); - e_widget_ilist_clear(list); - - EINA_LIST_FOREACH(inst->devices, l, d) - { - e_widget_ilist_append - (inst->ui.list, NULL, d->alias, - _bluez_popup_device_selected, inst, d->address); - } - - if (selected >= 0) - { - inst->first_selection = EINA_TRUE; - e_widget_ilist_selected_set(list, selected); - } - else - inst->first_selection = EINA_FALSE; - - e_widget_ilist_go(list); - - e_widget_check_checked_set(inst->ui.powered, inst->powered); - label = inst->discovering ? _("Stop Scan") : _("Start Scan"); - e_widget_button_label_set(inst->ui.button, label); - e_widget_disabled_set(inst->ui.button, !inst->powered); -} - -static void -_bluez_popup_del(E_Bluez_Instance *inst) -{ - _bluez_popup_input_window_destroy(inst); - e_object_del(E_OBJECT(inst->popup)); - inst->popup = NULL; -} - -static void -_bluez_popup_new(E_Bluez_Instance *inst) -{ - Evas_Object *ol; - Evas *evas; - Evas_Coord mw, mh; - const char *label; - Eina_Bool b, needs_scan = EINA_FALSE; - - if (inst->popup) - { - e_gadcon_popup_show(inst->popup); - return; - } - - if (!inst->adapter) - { - _bluez_operation_error_show(_("No bluetooth adapter.")); - return; - } - - if (!e_bluez_adapter_discovering_get(inst->adapter, &b)) - { - _bluez_operation_error_show(_("Can't get Discovering property")); - return; - } - inst->discovering = b; - // maybe auto-scan if did not in the last 30 minutes? - // seems scan will hurt things like bluetooth audio playback, so don't do it - if ((!inst->discovering) && (inst->last_scan <= 0.0) && (inst->ui.powered)) - { - label = _("Stop Scan"); - needs_scan = EINA_TRUE; - } - else - label = inst->discovering ? _("Stop Scan") : _("Start Scan"); - - inst->popup = e_gadcon_popup_new(inst->gcc); - evas = inst->popup->win->evas; - - ol = e_widget_list_add(evas, 0, 0); - - // TODO: get this size from edj - inst->ui.list = e_widget_ilist_add(evas, 32, 32, &inst->address); - e_widget_size_min_set(inst->ui.list, 180, 100); - e_widget_list_object_append(ol, inst->ui.list, 1, 1, 0.5); - - inst->ui.powered = e_widget_check_add(evas, _("Powered"), &inst->powered); - e_widget_on_change_hook_set - (inst->ui.powered, _bluez_popup_cb_powered_changed, inst); - e_widget_list_object_append(ol, inst->ui.powered, 1, 0, 0.5); - - inst->ui.button = e_widget_button_add - (evas, label, NULL, _bluez_popup_cb_scan, inst, NULL); - e_widget_list_object_append(ol, inst->ui.button, 1, 0, 0.5); - - inst->ui.control = e_widget_button_add - (evas, _("Controls"), NULL, _bluez_popup_cb_controls, inst, NULL); - e_widget_list_object_append(ol, inst->ui.control, 1, 0, 0.5); - - _bluez_popup_update(inst); - - e_widget_size_min_get(ol, &mw, &mh); - if (mh < 200) mh = 200; - if (mw < 200) mw = 200; - e_widget_size_min_set(ol, mw, mh); - - e_gadcon_popup_content_set(inst->popup, ol); - e_gadcon_popup_show(inst->popup); - _bluez_popup_input_window_create(inst); - - if (needs_scan) _bluez_popup_cb_scan(inst, NULL); -} - -static void -_bluez_menu_cb_cfg(void *data, - E_Menu *menu __UNUSED__, - E_Menu_Item *mi __UNUSED__) -{ - E_Bluez_Instance *inst = data; - if (inst->popup) - _bluez_popup_del(inst); - if (inst->conf_dialog) - return; - if (!inst->adapter) - return; - inst->conf_dialog = e_bluez_config_dialog_new(NULL, inst); -} - -static void -_bluez_menu_new(E_Bluez_Instance *inst, - Evas_Event_Mouse_Down *ev) -{ - E_Zone *zone; - E_Menu *m; - E_Menu_Item *mi; - int x, y; - - zone = e_util_zone_current_get(e_manager_current_get()); - - m = e_menu_new(); - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Settings")); - e_util_menu_item_theme_icon_set(mi, "configure"); - e_menu_item_callback_set(mi, _bluez_menu_cb_cfg, inst); - - m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0); - - e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, NULL, NULL); - e_menu_activate_mouse(m, zone, x + ev->output.x, y + ev->output.y, - 1, 1, E_MENU_POP_DIRECTION_AUTO, ev->timestamp); - evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, - EVAS_BUTTON_NONE, ev->timestamp, NULL); -} - -static void -_bluez_tip_new(E_Bluez_Instance *inst) -{ - Evas *e; - - inst->tip = e_gadcon_popup_new(inst->gcc); - if (!inst->tip) return; - - e = inst->tip->win->evas; - - inst->o_tip = edje_object_add(e); - e_theme_edje_object_set(inst->o_tip, "base/theme/modules/bluez/tip", - "e/modules/bluez/tip"); - - _bluez_tip_update(inst); - - e_gadcon_popup_content_set(inst->tip, inst->o_tip); - e_gadcon_popup_show(inst->tip); -} - -static void -_bluez_tip_del(E_Bluez_Instance *inst) -{ - evas_object_del(inst->o_tip); - e_object_del(E_OBJECT(inst->tip)); - inst->tip = NULL; - inst->o_tip = NULL; -} - -static void -_bluez_cb_mouse_down(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event) -{ - E_Bluez_Instance *inst; - Evas_Event_Mouse_Down *ev; - - inst = data; - if (!inst) - return; - - ev = event; - if (ev->button == 1) - { - if (!inst->popup) - _bluez_popup_new(inst); - else - _bluez_popup_del(inst); - } - else if (ev->button == 2) - _bluez_toggle_powered(inst); - else if (ev->button == 3) - _bluez_menu_new(inst, ev); -} - -static void -_bluez_cb_mouse_in(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Instance *inst = data; - - if (inst->tip) - return; - - _bluez_tip_new(inst); -} - -static void -_bluez_cb_mouse_out(void *data, - Evas *evas __UNUSED__, - Evas_Object *obj __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Instance *inst = data; - - if (!inst->tip) - return; - - _bluez_tip_del(inst); -} - -static void -_bluez_edje_view_update(E_Bluez_Instance *inst, - Evas_Object *o) -{ - E_Bluez_Module_Context *ctxt = inst->ctxt; - const char *name; - - if (!ctxt->has_manager) - { - edje_object_part_text_set(o, "e.text.powered", ""); - edje_object_part_text_set(o, "e.text.status", ""); - edje_object_signal_emit(o, "e,changed,service,none", "e"); - edje_object_part_text_set(o, "e.text.name", _("No Bluetooth daemon")); - edje_object_signal_emit(o, "e,changed,name", "e"); - return; - } - - if (!inst->adapter) - { - edje_object_part_text_set(o, "e.text.powered", ""); - edje_object_part_text_set(o, "e.text.status", ""); - edje_object_signal_emit(o, "e,changed,off", "e"); - edje_object_part_text_set(o, "e.text.name", _("No Bluetooth adapter")); - edje_object_signal_emit(o, "e,changed,name", "e"); - return; - } - - if (!e_bluez_adapter_name_get(inst->adapter, &name)) - name = ""; - edje_object_part_text_set(o, "e.text.name", name); - edje_object_signal_emit(o, "e,changed,name", "e"); - - if (inst->powered) - { - if (inst->discoverable) - { - edje_object_signal_emit(o, "e,changed,powered", "e"); - edje_object_part_text_set - (o, "e.text.status", - _("Bluetooth is powered and discoverable.")); - } - else - { - edje_object_signal_emit(o, "e,changed,hidden", "e"); - edje_object_part_text_set - (o, "e.text.status", _("Bluetooth is powered and hidden.")); - } - } - else - { - edje_object_signal_emit(o, "e,changed,off", "e"); - edje_object_part_text_set(o, "e.text.status", _("Bluetooth is off.")); - } -} - -static void -_bluez_tip_update(E_Bluez_Instance *inst) -{ - _bluez_edje_view_update(inst, inst->o_tip); -} - -static void -_bluez_gadget_update(E_Bluez_Instance *inst) -{ - E_Bluez_Module_Context *ctxt = inst->ctxt; - - if (inst->popup && ((!ctxt->has_manager) || (!inst->adapter))) - _bluez_popup_del(inst); - - if (inst->popup) - _bluez_popup_update(inst); - if (inst->tip) - _bluez_tip_update(inst); - - _bluez_edje_view_update(inst, inst->ui.gadget); -} - -/* Gadcon Api Functions */ - -static E_Gadcon_Client * -_gc_init(E_Gadcon *gc, - const char *name, - const char *id, - const char *style) -{ - E_Bluez_Instance *inst; - E_Bluez_Module_Context *ctxt; - - if (!bluez_mod) - return NULL; - - ctxt = bluez_mod->data; - - inst = E_NEW(E_Bluez_Instance, 1); - inst->ctxt = ctxt; - inst->ui.gadget = edje_object_add(gc->evas); - e_theme_edje_object_set(inst->ui.gadget, "base/theme/modules/bluez", - "e/modules/bluez/main"); - - inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->ui.gadget); - inst->gcc->data = inst; - - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_DOWN, _bluez_cb_mouse_down, inst); - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _bluez_cb_mouse_in, inst); - evas_object_event_callback_add - (inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _bluez_cb_mouse_out, inst); - - // TODO: instead of getting the default adapter, get the adapter for - // each instance. See the mixer module. - if (ctxt->default_adapter) - inst->adapter = e_bluez_adapter_get(ctxt->default_adapter); - else - inst->adapter = NULL; - - if (inst->adapter) - { - Eina_Bool powered, discoverable, discovering; - - if (e_bluez_adapter_powered_get(inst->adapter, &powered)) - inst->powered = powered; - - if (e_bluez_adapter_discoverable_get(inst->adapter, &discoverable)) - inst->discoverable = discoverable; - - if (e_bluez_adapter_discovering_get(inst->adapter, &discovering)) - inst->discovering = discovering; - } - - _bluez_gadget_update(inst); - - ctxt->instances = eina_list_append(ctxt->instances, inst); - - return inst->gcc; -} - -static void -_gc_shutdown(E_Gadcon_Client *gcc) -{ - E_Bluez_Module_Context *ctxt; - E_Bluez_Instance *inst; - - if (!bluez_mod) - return; - - ctxt = bluez_mod->data; - if (!ctxt) - return; - - inst = gcc->data; - if (!inst) - return; - - evas_object_del(inst->ui.gadget); - - _bluez_devices_clear(inst); - - ctxt->instances = eina_list_remove(ctxt->instances, inst); - - E_FREE(inst); -} - -static void -_gc_orient(E_Gadcon_Client *gcc, - E_Gadcon_Orient orient __UNUSED__) -{ - e_gadcon_client_aspect_set(gcc, 16, 16); - e_gadcon_client_min_size_set(gcc, 16, 16); -} - -static const char * -_gc_label(const E_Gadcon_Client_Class *client_class __UNUSED__) -{ - return _(_e_bluez_Name); -} - -static Evas_Object * -_gc_icon(const E_Gadcon_Client_Class *client_class __UNUSED__, - Evas *evas) -{ - Evas_Object *o; - - o = edje_object_add(evas); - edje_object_file_set(o, e_bluez_theme_path(), "icon"); - return o; -} - -static const char * -_gc_id_new(const E_Gadcon_Client_Class *client_class __UNUSED__) -{ - E_Bluez_Module_Context *ctxt; - - if (!bluez_mod) - return NULL; - - ctxt = bluez_mod->data; - if (!ctxt) - return NULL; - - snprintf(tmpbuf, sizeof(tmpbuf), "bluez.%d", - eina_list_count(ctxt->instances)); - return tmpbuf; -} - -static const E_Gadcon_Client_Class _gc_class = -{ - GADCON_CLIENT_CLASS_VERSION, _e_bluez_name, - { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, - e_gadcon_site_is_not_toolbar - }, - E_GADCON_CLIENT_STYLE_PLAIN -}; - -EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, _e_bluez_Name}; - -static const char _act_toggle_powered[] = "toggle_powered"; -static const char _lbl_toggle_powered[] = "Toggle Powered"; - -static void -_bluez_actions_register(E_Bluez_Module_Context *ctxt) -{ - ctxt->actions.toggle_powered = e_action_add(_act_toggle_powered); - if (ctxt->actions.toggle_powered) - { - ctxt->actions.toggle_powered->func.go = - _bluez_cb_toggle_powered; - e_action_predef_name_set - (_(_e_bluez_Name), _(_lbl_toggle_powered), _act_toggle_powered, - NULL, NULL, 0); - } -} - -static void -_bluez_actions_unregister(E_Bluez_Module_Context *ctxt) -{ - if (ctxt->actions.toggle_powered) - { - e_action_predef_name_del(_(_e_bluez_Name), _(_lbl_toggle_powered)); - e_action_del(_act_toggle_powered); - } -} - -static Eina_Bool -_bluez_manager_changed_do(void *data) -{ - E_Bluez_Module_Context *ctxt = data; - - //FIXME: reload the default adapter maybe? - - ctxt->poller.manager_changed = NULL; - return ECORE_CALLBACK_CANCEL; -} - -static void -_bluez_manager_changed(void *data, - const E_Bluez_Element *element __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - if (ctxt->poller.manager_changed) - ecore_poller_del(ctxt->poller.manager_changed); - ctxt->poller.manager_changed = ecore_poller_add - (ECORE_POLLER_CORE, 1, _bluez_manager_changed_do, ctxt); -} - -static void -_properties_sync_callback(void *data, - DBusMessage *msg __UNUSED__, - DBusError *err) -{ - E_Bluez_Instance *inst = data; - Eina_Bool powered; - Eina_Bool discoverable; - - if (err && dbus_error_is_set(err)) - { - dbus_error_free(err); - return; - } - - if (!e_bluez_adapter_powered_get(inst->adapter, &powered)) - { - _bluez_operation_error_show(_("Query adapter's powered.")); - return; - } - - inst->powered = powered; - - if (!e_bluez_adapter_discoverable_get(inst->adapter, &discoverable)) - { - _bluez_operation_error_show(_("Query adapter's discoverable.")); - return; - } - - inst->discoverable = discoverable; -} - -static void -_default_adapter_callback(void *data, - DBusMessage *msg, - DBusError *err __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - const Eina_List *l; - E_Bluez_Instance *inst; - const char *path; - - if (err && dbus_error_is_set(err)) - { - dbus_error_free(err); - return; - } - - if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID) == FALSE) - return; - - eina_stringshare_replace(&ctxt->default_adapter, path); - - // TODO: instead of getting the default adapter, get the adapter for - // each instance. See the mixer module. - EINA_LIST_FOREACH(ctxt->instances, l, inst) - { - inst->adapter = e_bluez_adapter_get(path); - - e_bluez_element_properties_sync_full - (inst->adapter, _properties_sync_callback, inst); - } -} - -static Eina_Bool -_bluez_event_manager_in(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Element *element; - Eina_List *l; - E_Bluez_Instance *inst; - - ctxt->has_manager = EINA_TRUE; - - element = e_bluez_manager_get(); - if (!e_bluez_manager_default_adapter(_default_adapter_callback, ctxt)) - return ECORE_CALLBACK_DONE; - - e_bluez_element_listener_add(element, _bluez_manager_changed, ctxt, NULL); - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - _bluez_gadget_update(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_event_manager_out(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Instance *inst; - Eina_List *l; - - ctxt->has_manager = EINA_FALSE; - eina_stringshare_replace(&ctxt->default_adapter, NULL); - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - _bluez_gadget_update(inst); - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_bluez_event_element_updated(void *data, - int type __UNUSED__, - void *event __UNUSED__) -{ - E_Bluez_Module_Context *ctxt = data; - E_Bluez_Element *element = event; - Eina_Bool powered, discoverable, discovering; - E_Bluez_Instance *inst; - Eina_List *l; - - if (!e_bluez_element_is_adapter(element)) return ECORE_CALLBACK_PASS_ON; - - if (!e_bluez_adapter_powered_get(element, &powered)) - powered = EINA_FALSE; - - if (!e_bluez_adapter_discoverable_get(element, &discoverable)) - discoverable = EINA_FALSE; - - if (!e_bluez_adapter_discovering_get(element, &discovering)) - discovering = EINA_FALSE; - - EINA_LIST_FOREACH(ctxt->instances, l, inst) - { - if (inst->adapter != element) continue; - - inst->powered = powered; - inst->discoverable = discoverable; - inst->discovering = discovering; - _bluez_gadget_update(inst); - } - - return ECORE_CALLBACK_PASS_ON; -} - -static void -_bluez_events_register(E_Bluez_Module_Context *ctxt) -{ - ctxt->event.manager_in = ecore_event_handler_add - (E_BLUEZ_EVENT_MANAGER_IN, _bluez_event_manager_in, ctxt); - ctxt->event.manager_out = ecore_event_handler_add - (E_BLUEZ_EVENT_MANAGER_OUT, _bluez_event_manager_out, ctxt); - ctxt->event.element_updated = ecore_event_handler_add - (E_BLUEZ_EVENT_ELEMENT_UPDATED, _bluez_event_element_updated, ctxt); - ctxt->event.device_found = ecore_event_handler_add - (E_BLUEZ_EVENT_DEVICE_FOUND, _bluez_event_devicefound, ctxt); - - // TODO: E_BLUEZ_EVENT_DEVICE_DISAPPEARED -} - -static void -_bluez_events_unregister(E_Bluez_Module_Context *ctxt) -{ - if (ctxt->event.manager_in) - ecore_event_handler_del(ctxt->event.manager_in); - if (ctxt->event.manager_out) - ecore_event_handler_del(ctxt->event.manager_out); - if (ctxt->event.device_found) - ecore_event_handler_del(ctxt->event.device_found); -} - -static void -_bluez_agent_register(E_Bluez_Module_Context *ctxt) -{ - E_DBus_Object *o; - - ctxt->agent.iface = e_dbus_interface_new("org.bluez.Agent"); - if (!ctxt->agent.iface) - return; - - o = e_dbus_object_add(ctxt->agent.conn, _e_bluez_agent_path, ctxt); - e_dbus_object_interface_attach(o, ctxt->agent.iface); - e_dbus_interface_method_add - (ctxt->agent.iface, "RequestPinCode", "o", "s", _bluez_request_pincode_cb); - // TODO: RequestPasskey - // TODO: RequestConfirmation - // TODO: Authorize - // TODO: DisplayPasskey - // TODO: ConfirmModeChange - // TODO: Cancel - // TODO: Release - - ctxt->agent.obj = o; -} - -static void -_bluez_agent_unregister(E_Bluez_Module_Context *ctxt) -{ - E_Object *o; - - EINA_LIST_FREE(ctxt->agent.pending, o) - e_object_del(o); - - e_dbus_object_interface_detach(ctxt->agent.obj, ctxt->agent.iface); - e_dbus_object_free(ctxt->agent.obj); - e_dbus_interface_unref(ctxt->agent.iface); -} - -EAPI void * -e_modapi_init(E_Module *m) -{ - E_Bluez_Module_Context *ctxt = E_NEW(E_Bluez_Module_Context, 1); - if (!ctxt) - return NULL; - - ctxt->agent.conn = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if ((!ctxt->agent.conn) || (!e_bluez_system_init(ctxt->agent.conn))) - goto error_bluez_system_init; - - bluez_mod = m; - - if (_e_bluez_log_dom < 0) - { - _e_bluez_log_dom = eina_log_domain_register("ebluez", EINA_COLOR_ORANGE); - if (_e_bluez_log_dom < 0) - { - //EINA_LOG_CRIT("could not register logging domain ebluez"); - goto error_log_domain; - } - } - - _bluez_agent_register(ctxt); - _bluez_actions_register(ctxt); - e_gadcon_provider_register(&_gc_class); - - _bluez_events_register(ctxt); - - return ctxt; - -error_log_domain: - _e_bluez_log_dom = -1; - bluez_mod = NULL; - e_bluez_system_shutdown(); -error_bluez_system_init: - E_FREE(ctxt); - return NULL; -} - -static void -_bluez_instances_free(E_Bluez_Module_Context *ctxt) -{ - E_Bluez_Instance *inst; - EINA_LIST_FREE(ctxt->instances, inst) - { - if (inst->popup) - _bluez_popup_del(inst); - if (inst->tip) - _bluez_tip_del(inst); - - e_object_del(E_OBJECT(inst->gcc)); - } -} - -EAPI int -e_modapi_shutdown(E_Module *m) -{ - E_Bluez_Module_Context *ctxt = m->data; - E_Bluez_Element *element; - - if (!ctxt) - return 0; - - element = e_bluez_manager_get(); - e_bluez_element_listener_del(element, _bluez_manager_changed, ctxt); - - _bluez_events_unregister(ctxt); - _bluez_instances_free(ctxt); - - _bluez_actions_unregister(ctxt); - _bluez_agent_unregister(ctxt); - e_gadcon_provider_unregister(&_gc_class); - - if (ctxt->poller.manager_changed) - ecore_poller_del(ctxt->poller.manager_changed); - - eina_stringshare_del(ctxt->default_adapter); - - E_FREE(ctxt); - bluez_mod = NULL; - - e_bluez_system_shutdown(); - - return 1; -} - -EAPI int -e_modapi_save(E_Module *m __UNUSED__) -{ - return 1; -} - diff --git a/src/modules/bluez/e_mod_main.h b/src/modules/bluez/e_mod_main.h deleted file mode 100644 index 7849ce51c..000000000 --- a/src/modules/bluez/e_mod_main.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef E_MOD_MAIN_H -#define E_MOD_MAIN_H - -#include "config.h" -#include -#include -#include - -#define MOD_CONF_VERSION 2 - -extern int _e_bluez_log_dom; -#undef DBG -#undef WRN -#undef ERR -#define DBG(...) EINA_LOG_DOM_DBG(_e_bluez_log_dom, __VA_ARGS__) -#define WRN(...) EINA_LOG_DOM_WARN(_e_bluez_log_dom, __VA_ARGS__) -#define ERR(...) EINA_LOG_DOM_ERR(_e_bluez_log_dom, __VA_ARGS__) - -typedef struct E_Bluez_Instance E_Bluez_Instance; -typedef struct E_Bluez_Instance_Device E_Bluez_Instance_Device; -typedef struct E_Bluez_Module_Context E_Bluez_Module_Context; - -struct E_Bluez_Instance -{ - E_Bluez_Module_Context *ctxt; - E_Gadcon_Client *gcc; - E_Gadcon_Popup *popup; - - /* used by popup */ - int powered; - Eina_Bool first_selection; - const char *address; - const char *alias; - - Eina_List *devices; - E_Bluez_Element *adapter; - double last_scan; - Eina_Bool discovering : 1; - Eina_Bool powered_pending : 1; - Eina_Bool discoverable : 1; - - struct - { - Evas_Object *gadget; - Evas_Object *list; - Evas_Object *powered; - Evas_Object *button; - Evas_Object *control; - struct - { - Ecore_X_Window win; - Ecore_Event_Handler *mouse_up; - Ecore_Event_Handler *key_down; - } input; - } ui; - - E_Gadcon_Popup *tip; - Evas_Object *o_tip; - - E_Config_Dialog *conf_dialog; -}; - -struct E_Bluez_Instance_Device -{ - const char *address; - const char *alias; - // TODO (and also show list icon!): Eina_Bool paired:1; - // TODO (and also show list icon!): Eina_Bool trusted:1; - // TODO (and also show list icon!): Eina_Bool connected:1; - // TODO ... class, icon -}; - -struct E_Bluez_Module_Context -{ - Eina_List *instances; - const char *default_adapter; - - struct - { - E_DBus_Connection *conn; - E_DBus_Interface *iface; - E_DBus_Object *obj; - Eina_List *pending; - } agent; - - struct - { - E_Action *toggle_powered; - } actions; - - struct - { - Ecore_Event_Handler *manager_in; - Ecore_Event_Handler *manager_out; - Ecore_Event_Handler *device_found; - Ecore_Event_Handler *element_updated; - } event; - - struct - { - Ecore_Poller *manager_changed; - } poller; - - Eina_Bool has_manager : 1; -}; - -EAPI extern E_Module_Api e_modapi; -EAPI void *e_modapi_init(E_Module *m); -EAPI int e_modapi_shutdown(E_Module *m); -EAPI int e_modapi_save(E_Module *m); - -const char *e_bluez_theme_path(void); -E_Config_Dialog *e_bluez_config_dialog_new(E_Container *con, - E_Bluez_Instance *inst); -void _bluez_toggle_powered(E_Bluez_Instance *inst); - -static inline void -_bluez_dbus_error_show(const char *msg, - const DBusError *error) -{ - const char *name; - - if ((!error) || (!dbus_error_is_set(error))) - return; - - name = error->name; - if (strncmp(name, "org.bluez.Error.", - sizeof("org.bluez.Error.") - 1) == 0) - name += sizeof("org.bluez.Error.") - 1; - - e_util_dialog_show(_("Bluez Server Operation Failed"), - _("Could not execute remote operation:
" - "%s
" - "Server Error %s: %s"), - msg, name, error->message); -} - -static inline void -_bluez_operation_error_show(const char *msg) -{ - e_util_dialog_show(_("Bluez Operation Failed"), - _("Could not execute local operation:
%s"), - msg); -} - - -/** - * @addtogroup Optional_Devices - * @{ - * - * @defgroup Module_Bluez BlueZ (Bluetooth) - * - * Controls bluetooth visibility, scan and pair devices. - * - * @see http://www.bluez.org/ - * @} - */ - -#endif diff --git a/src/modules/bluez/module.desktop.in b/src/modules/bluez/module.desktop.in deleted file mode 100644 index 2f84a4211..000000000 --- a/src/modules/bluez/module.desktop.in +++ /dev/null @@ -1,17 +0,0 @@ -[Desktop Entry] -Type=Link -Name=Bluetooth Manager -Name[ru]=Менеджер Bluetooth -Name[de]=Bluetooth-Manager -Name[fr]=Gestionnaire Bluetooth -Name[it]=Gestore Bluetooth -Name[pt]=Gestor de bluetooth -Name[tr]=Bluetooth Yöneticisi -Icon=e-module-bluez -Comment=Configure Bluetooth devices. -Comment[ru]=Управление Bluetooth устройствами. -Comment[de]=Bluetooth-Verbindungen verwalten -Comment[fr]=Configure les périphériques Bluetooth. -Comment[it]=Configura i dispositivi Bluetooth. -Comment[pt]=Configuração dos dispositivos Bluetooth -X-Enlightenment-ModuleType=system