okra pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=20f94cec74b7a7d1c28eabba1704a95e7dcc261d
commit 20f94cec74b7a7d1c28eabba1704a95e7dcc261d Author: Stephen 'Okra' Houston <[email protected]> Date: Thu May 11 17:13:15 2017 -0500 Bryce/Gadgets: Add backlight, xkbswitch, and mixer gadgets. This should round out the core gadget ports. All three of these gadgets are ports of the existing modules of the same name and are contained within those directories. Once the move from shelves -> bryce and gadcon->gadgets is complete, backlight and mixer will likely need to go into the sysinfo gadget. --- src/modules/Makefile_backlight.mk | 5 +- src/modules/Makefile_mixer.mk | 3 + src/modules/Makefile_xkbswitch.mk | 5 +- src/modules/backlight/e_mod_main.c | 11 +- src/modules/backlight/gadget/backlight.c | 300 +++++++++ src/modules/backlight/gadget/backlight.h | 16 + src/modules/backlight/gadget/mod.c | 27 + src/modules/mixer/e_mod_main.c | 10 +- src/modules/mixer/{e_mod_main.c => gadget/mixer.c} | 723 +++++++-------------- src/modules/mixer/gadget/mixer.h | 31 + src/modules/mixer/gadget/mod.c | 49 ++ src/modules/pager/gadget/mod.c | 6 +- src/modules/pager/gadget/pager.h | 6 +- src/modules/xkbswitch/e_mod_main.c | 10 +- src/modules/xkbswitch/gadget/mod.c | 28 + src/modules/xkbswitch/gadget/xkbswitch.c | 284 ++++++++ src/modules/xkbswitch/gadget/xkbswitch.h | 25 + 17 files changed, 1028 insertions(+), 511 deletions(-) diff --git a/src/modules/Makefile_backlight.mk b/src/modules/Makefile_backlight.mk index 2fbb123..37d5a8e 100644 --- a/src/modules/Makefile_backlight.mk +++ b/src/modules/Makefile_backlight.mk @@ -12,7 +12,10 @@ backlightpkg_LTLIBRARIES = src/modules/backlight/module.la src_modules_backlight_module_la_LIBADD = $(MOD_LIBS) src_modules_backlight_module_la_CPPFLAGS = $(MOD_CPPFLAGS) src_modules_backlight_module_la_LDFLAGS = $(MOD_LDFLAGS) -src_modules_backlight_module_la_SOURCES = src/modules/backlight/e_mod_main.c +src_modules_backlight_module_la_SOURCES = src/modules/backlight/e_mod_main.c \ + src/modules/backlight/gadget/backlight.h \ + src/modules/backlight/gadget/backlight.c \ + src/modules/backlight/gadget/mod.c PHONIES += backlight install-backlight backlight: $(backlightpkg_LTLIBRARIES) $(backlight_DATA) diff --git a/src/modules/Makefile_mixer.mk b/src/modules/Makefile_mixer.mk index 4f90cf1..5a8f53b 100644 --- a/src/modules/Makefile_mixer.mk +++ b/src/modules/Makefile_mixer.mk @@ -34,6 +34,9 @@ src_modules_mixer_module_la_SOURCES = src/modules/mixer/e_mod_main.c \ src/modules/mixer/e_mod_main.h \ src/modules/mixer/e_mod_config.c \ src/modules/mixer/e_mod_config.h \ + src/modules/mixer/gadget/mixer.h \ + src/modules/mixer/gadget/mixer.c \ + src/modules/mixer/gadget/mod.c \ $(emixerlib) src_modules_mixer_module_la_LIBADD = $(MOD_LIBS) @PULSE_LIBS@ @ALSA_LIBS@ diff --git a/src/modules/Makefile_xkbswitch.mk b/src/modules/Makefile_xkbswitch.mk index 1b4df52..00ef2ec 100644 --- a/src/modules/Makefile_xkbswitch.mk +++ b/src/modules/Makefile_xkbswitch.mk @@ -16,7 +16,10 @@ src_modules_xkbswitch_module_la_SOURCES = src/modules/xkbswitch/e_mod_main.c \ src/modules/xkbswitch/e_mod_main.h \ src/modules/xkbswitch/e_mod_config.c \ src/modules/xkbswitch/e_mod_parse.c \ - src/modules/xkbswitch/e_mod_parse.h + src/modules/xkbswitch/e_mod_parse.h \ + src/modules/xkbswitch/gadget/xkbswitch.h \ + src/modules/xkbswitch/gadget/xkbswitch.c \ + src/modules/xkbswitch/gadget/mod.c PHONIES += xkbswitch install-xkbswitch xkbswitch: $(xkbswitchpkg_LTLIBRARIES) $(xkbswitch_DATA) diff --git a/src/modules/backlight/e_mod_main.c b/src/modules/backlight/e_mod_main.c index e7e16bd..75356ed 100644 --- a/src/modules/backlight/e_mod_main.c +++ b/src/modules/backlight/e_mod_main.c @@ -10,6 +10,7 @@ */ #include "e.h" +#include "gadget/backlight.h" /* gadcon requirements */ static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); @@ -469,6 +470,8 @@ E_API E_Module_Api e_modapi = E_API void * e_modapi_init(E_Module *m) { + e_modapi_gadget_init(m); + backlight_module = m; e_gadcon_provider_register(&_gadcon_class); E_LIST_HANDLER_APPEND(handlers, E_EVENT_BACKLIGHT_CHANGE, _backlight_cb_changed, NULL); @@ -484,8 +487,10 @@ e_modapi_init(E_Module *m) } E_API int -e_modapi_shutdown(E_Module *m EINA_UNUSED) +e_modapi_shutdown(E_Module *m) { + e_modapi_gadget_shutdown(m); + if (act) { e_action_predef_name_del("Screen", "Backlight Controls"); @@ -498,7 +503,9 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) } E_API int -e_modapi_save(E_Module *m EINA_UNUSED) +e_modapi_save(E_Module *m) { + e_modapi_gadget_save(m); + return 1; } diff --git a/src/modules/backlight/gadget/backlight.c b/src/modules/backlight/gadget/backlight.c new file mode 100644 index 0000000..3f49fd7 --- /dev/null +++ b/src/modules/backlight/gadget/backlight.c @@ -0,0 +1,300 @@ +#include "backlight.h" + +typedef struct _Instance Instance; + +struct _Instance +{ + Evas_Object *o_main; + Evas_Object *o_backlight, *o_table, *o_slider; + Evas_Object *popup, *box; + E_Gadget_Site_Orient orient; + double val; +}; + +static Eina_List *ginstances = NULL; +static E_Action *act = NULL; +static Eina_List *handlers; + +static void +_backlight_gadget_update(Instance *inst) +{ + Edje_Message_Float msg; + + msg.val = inst->val; + if (msg.val < 0.0) msg.val = 0.0; + else if (msg.val > 1.0) msg.val = 1.0; + edje_object_message_send(elm_layout_edje_get(inst->o_backlight), EDJE_MESSAGE_FLOAT, 0, &msg); +} + +static void +_backlight_level_set(Instance *inst, double val, Eina_Bool set_slider) +{ + if (val > 1.0) val = 1.0; + if (val < 0.0) val = 0.0; + if (set_slider) + e_widget_slider_value_double_set(inst->o_slider, val); + inst->val = val; + e_backlight_mode_set(e_zone_current_get(), E_BACKLIGHT_MODE_NORMAL); + e_backlight_level_set(e_zone_current_get(), val, 0.0); + e_config->backlight.normal = val; + e_config_save_queue(); +} + +static void +_backlight_settings_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) +{ + Instance *inst = data; + e_gadget_configure(inst->o_main); + elm_ctxpopup_dismiss(inst->popup); +} + +static void +_slider_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + inst->val = elm_slider_value_get(inst->o_slider); + _backlight_level_set(inst, inst->val, EINA_FALSE); +} + +static void +_backlight_popup_dismissed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + E_FREE_FUNC(obj, evas_object_del); + inst->popup = NULL; +} + +static void +_backlight_popup_deleted(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + inst->popup = NULL; +} + +static void +_backlight_popup_new(Instance *inst) +{ + Evas_Object *ic, *o; + + if (inst->popup) return; + + e_backlight_mode_set(e_zone_current_get(), E_BACKLIGHT_MODE_NORMAL); + inst->val = e_backlight_level_get(e_zone_current_get()); + _backlight_gadget_update(inst); + + inst->popup = elm_ctxpopup_add(e_comp->elm); + elm_object_style_set(inst->popup, "noblock"); + evas_object_smart_callback_add(inst->popup, "dismissed", _backlight_popup_dismissed, inst); + evas_object_event_callback_add(inst->popup, EVAS_CALLBACK_DEL, _backlight_popup_deleted, inst); + + inst->box = elm_box_add(e_comp->elm); + elm_box_horizontal_set(inst->box, EINA_FALSE); + evas_object_size_hint_weight_set(inst->box, 0.0, 1.0); + evas_object_size_hint_align_set(inst->box, 0.0, 0.0); + elm_object_content_set(inst->popup, inst->box); + evas_object_show(inst->box); + + o = elm_slider_add(inst->box); + elm_slider_horizontal_set(o, EINA_FALSE); + elm_slider_inverted_set(o, EINA_TRUE); + elm_slider_unit_format_set(o, NULL); + elm_slider_indicator_show_set(o, EINA_FALSE); + elm_slider_min_max_set(o, 0.05, 1.0); + elm_slider_step_set(o, 0.05); + elm_slider_span_size_set(o, 100); + elm_slider_value_set(o, inst->val); + evas_object_smart_callback_add(o, "changed", _slider_cb, inst); + elm_box_pack_end(inst->box, o); + evas_object_show(o); + inst->o_slider = o; + + ic = elm_icon_add(inst->box); + elm_icon_standard_set(ic, "preferences-system"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + + o = elm_button_add(inst->box); + elm_object_part_content_set(o, "icon", ic); + evas_object_smart_callback_add(o, "clicked", _backlight_settings_cb, inst); + elm_box_pack_end(inst->box, o); + evas_object_show(o); + + e_gadget_util_ctxpopup_place(inst->o_main, inst->popup, inst->o_backlight); + evas_object_show(inst->popup); +} + +static void +_backlight_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Instance *inst = data; + Evas_Event_Mouse_Down *ev = event; + + if (ev->button == 1) + { + if (inst->popup) elm_ctxpopup_dismiss(inst->popup); + else _backlight_popup_new(inst); + } + else if (ev->button == 3) + { + e_gadget_configure(inst->o_main); + } +} + +static void +_backlight_cb_mouse_wheel(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Evas_Event_Mouse_Wheel *ev = event; + Instance *inst = data; + + inst->val = e_backlight_level_get(e_zone_current_get()); + if (ev->z > 0) + _backlight_level_set(inst, inst->val - 0.1, EINA_FALSE); + else if (ev->z < 0) + _backlight_level_set(inst, inst->val + 0.1, EINA_FALSE); +} + +static void +_e_mod_action_cb(E_Object *obj EINA_UNUSED, + const char *params) +{ + Eina_List *l; + Instance *inst; + + EINA_LIST_FOREACH(ginstances, l, inst) + { + if (!params) + { + if (inst->popup) elm_ctxpopup_dismiss(inst->popup); + else _backlight_popup_new(inst); + } + else + { + _backlight_level_set(inst, inst->val + atof(params), EINA_FALSE); + if (inst->popup) elm_ctxpopup_dismiss(inst->popup); + _backlight_popup_new(inst); + } + } +} + +static Eina_Bool +_backlight_cb_mod_init_end(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED) +{ + Eina_List *l; + Instance *inst; + + EINA_LIST_FOREACH(ginstances, l, inst) + { + inst->val = e_backlight_level_get(e_zone_current_get()); + _backlight_gadget_update(inst); + } + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool +_backlight_cb_changed(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED) +{ + Eina_List *l; + Instance *inst; + + EINA_LIST_FOREACH(ginstances, l, inst) + { + inst->val = e_backlight_level_get(e_zone_current_get()); + _backlight_gadget_update(inst); + } + return ECORE_CALLBACK_RENEW; +} + +static Evas_Object * +_backlight_gadget_configure(Evas_Object *g EINA_UNUSED) +{ + if (e_configure_registry_exists("screen/power_management")) + { + e_configure_registry_call("screen/power_management", NULL, NULL); + } + return NULL; +} + +static void +_backlight_gadget_created_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + if (inst->o_main) + { + e_gadget_configure_cb_set(inst->o_main, _backlight_gadget_configure); +// _backlight_orient(inst, e_gadget_site_orient_get(obj)); + + inst->o_backlight = elm_layout_add(inst->o_main); + E_EXPAND(inst->o_backlight); + E_FILL(inst->o_backlight); + e_theme_edje_object_set(inst->o_backlight, + "base/theme/modules/backlight", + "e/modules/backlight/main"); + evas_object_event_callback_add(inst->o_backlight, + EVAS_CALLBACK_MOUSE_DOWN, + _backlight_cb_mouse_down, + inst); + evas_object_event_callback_add(inst->o_backlight, + EVAS_CALLBACK_MOUSE_WHEEL, + _backlight_cb_mouse_wheel, + inst); + elm_box_pack_end(inst->o_main, inst->o_backlight); + evas_object_show(inst->o_backlight); + } + evas_object_smart_callback_del_full(obj, "gadget_created", _backlight_gadget_created_cb, data); +} + +static void +backlight_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + if (inst->popup) + elm_ctxpopup_dismiss(inst->popup); + ginstances = eina_list_remove(ginstances, inst); + free(inst); +} + +EINTERN Evas_Object * +backlight_gadget_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient) +{ + Instance *inst; + + inst = E_NEW(Instance, 1); + inst->o_main = elm_box_add(parent); + inst->orient = orient; + E_EXPAND(inst->o_main); + E_FILL(inst->o_main); + evas_object_size_hint_aspect_set(inst->o_main, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + evas_object_smart_callback_add(parent, "gadget_created", _backlight_gadget_created_cb, inst); + evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_DEL, backlight_del, inst); + + ginstances = eina_list_append(ginstances, inst); + return inst->o_main; +} + +EINTERN void +backlight_init(void) +{ + E_LIST_HANDLER_APPEND(handlers, E_EVENT_BACKLIGHT_CHANGE, _backlight_cb_changed, NULL); + E_LIST_HANDLER_APPEND(handlers, E_EVENT_MODULE_INIT_END, _backlight_cb_mod_init_end, NULL); + act = e_action_add("backlight"); + if (act) + { + act->func.go = _e_mod_action_cb; + e_action_predef_name_set(N_("Screen"), N_("Backlight Controls"), "backlight", + NULL, "syntax: brightness change(-1.0 - 1.0), example: -0.1", 1); + } +} + +EINTERN void +backlight_shutdown(void) +{ + if (act) + { + e_action_predef_name_del("Screen", "Backlight Controls"); + e_action_del("backlight"); + act = NULL; + } + E_FREE_LIST(handlers, ecore_event_handler_del); +} diff --git a/src/modules/backlight/gadget/backlight.h b/src/modules/backlight/gadget/backlight.h new file mode 100644 index 0000000..7b26537 --- /dev/null +++ b/src/modules/backlight/gadget/backlight.h @@ -0,0 +1,16 @@ +#ifndef BACKLIGHT_H +#define BACKLIGHT_H + +#include "e.h" + +EINTERN void *e_modapi_gadget_init(E_Module *m EINA_UNUSED); +EINTERN int e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED); +EINTERN int e_modapi_gadget_save(E_Module *m EINA_UNUSED); + +EINTERN Evas_Object *backlight_gadget_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient); +EINTERN void backlight_init(void); +EINTERN void backlight_shutdown(void); + +extern E_Module *gm; + +#endif diff --git a/src/modules/backlight/gadget/mod.c b/src/modules/backlight/gadget/mod.c new file mode 100644 index 0000000..82b9d3a --- /dev/null +++ b/src/modules/backlight/gadget/mod.c @@ -0,0 +1,27 @@ +#include "backlight.h" + +E_Module *gm; + +EINTERN void * +e_modapi_gadget_init(E_Module *m) +{ + gm = m; + backlight_init(); + e_gadget_type_add("Backlight Gadget", backlight_gadget_create, NULL); + return m; +} + +EINTERN int +e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED) +{ + backlight_shutdown(); + e_gadget_type_del("Backlight Gadget"); + return 1; +} + +EINTERN int +e_modapi_gadget_save(E_Module *m EINA_UNUSED) +{ + return 1; +} + diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c index c6cb6e5..fe73337 100644 --- a/src/modules/mixer/e_mod_main.c +++ b/src/modules/mixer/e_mod_main.c @@ -3,6 +3,7 @@ #include "emix.h" #include "e_mod_main.h" #include "e_mod_config.h" +#include "gadget/mixer.h" #define VOLUME_STEP 5 @@ -1499,6 +1500,8 @@ e_modapi_init(E_Module *m) emix_config_init(_backend_changed, NULL); emix_event_callback_add(_events_cb, NULL); + e_modapi_gadget_init(m); + backend = emix_config_backend_get(); if (backend && emix_backend_set(backend)) backend_loaded = EINA_TRUE; @@ -1558,7 +1561,7 @@ err: } E_API int -e_modapi_shutdown(E_Module *m EINA_UNUSED) +e_modapi_shutdown(E_Module *m) { E_Client_Volume_Sink *sink; Client_Mixer *cm; @@ -1585,6 +1588,8 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) EINA_LIST_FREE(_client_sinks, sink) e_client_volume_sink_del(sink); + e_modapi_gadget_shutdown(m); + emix_event_callback_del(_events_cb); emix_shutdown(); emix_config_shutdown(); @@ -1592,8 +1597,9 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) } E_API int -e_modapi_save(E_Module *m EINA_UNUSED) +e_modapi_save(E_Module *m) { + e_modapi_gadget_save(m); emix_config_save(); return 1; } diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/gadget/mixer.c similarity index 67% copy from src/modules/mixer/e_mod_main.c copy to src/modules/mixer/gadget/mixer.c index c6cb6e5..3f58259 100644 --- a/src/modules/mixer/e_mod_main.c +++ b/src/modules/mixer/gadget/mixer.c @@ -1,8 +1,4 @@ -#include <e.h> -#include <Eina.h> -#include "emix.h" -#include "e_mod_main.h" -#include "e_mod_config.h" +#include "mixer.h" #define VOLUME_STEP 5 @@ -12,42 +8,10 @@ (new_val > EMIX_VOLUME_BARRIER) && \ (new_val < EMIX_VOLUME_BARRIER + 20) -int _e_emix_log_domain; static Eina_Bool init; static Eina_List *_client_sinks = NULL; static Eina_List *_client_mixers = NULL; static Eina_List *_client_handlers = NULL; -static E_Client_Menu_Hook *_border_hook = NULL; - -/* module requirements */ -E_API E_Module_Api e_modapi = - { - E_MODULE_API_VERSION, - "Mixer" - }; - -/* necessary forward delcaration */ -static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, - const char *id, const char *style); -static void _gc_shutdown(E_Gadcon_Client *gcc); -static void _gc_orient(E_Gadcon_Client *gcc, - E_Gadcon_Orient orient); -static const char *_gc_label(const E_Gadcon_Client_Class *client_class); -static Evas_Object *_gc_icon(const E_Gadcon_Client_Class *client_class, - Evas *evas); -static const char *_gc_id_new(const E_Gadcon_Client_Class *client_class); - -static const E_Gadcon_Client_Class _gadcon_class = - { - GADCON_CLIENT_CLASS_VERSION, - "mixer", - { - _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 - }; typedef struct _Context Context; struct _Context @@ -75,16 +39,12 @@ struct _Context typedef struct _Instance Instance; struct _Instance { - E_Gadcon_Client *gcc; - E_Gadcon_Orient orient; - - E_Gadcon_Popup *popup; - Evas *evas; - Evas_Object *gadget; + Evas_Object *o_main; + Evas_Object *o_mixer; + Evas_Object *popup; Evas_Object *list; Evas_Object *slider; Evas_Object *check; - Eina_Bool mute; }; @@ -99,12 +59,12 @@ struct _Client_Mixer Eina_List *sinks; }; -static Context *mixer_context = NULL; +static Context *gmixer_context = NULL; static void _notify_cb(void *data EINA_UNUSED, unsigned int id) { - mixer_context->notification_id = id; + gmixer_context->notification_id = id; } static void @@ -133,7 +93,7 @@ _notify(const int val) icon = "audio-volume-high"; n.app_name = _("Mixer"); - n.replaces_id = mixer_context->notification_id; + n.replaces_id = gmixer_context->notification_id; n.icon.icon = icon; n.summary = _("Volume changed"); n.body = buf; @@ -148,8 +108,6 @@ _mixer_popup_update(Instance *inst, int mute, int vol) elm_slider_value_set(inst->slider, vol); } -static void _popup_del(Instance *inst); - static void _mixer_gadget_update(void) { @@ -157,37 +115,37 @@ _mixer_gadget_update(void) Instance *inst; Eina_List *l; - EINA_LIST_FOREACH(mixer_context->instances, l, inst) + EINA_LIST_FOREACH(gmixer_context->instances, l, inst) { msg = alloca(sizeof(Edje_Message_Int_Set) + (2 * sizeof(int))); msg->count = 3; - if (!mixer_context->sink_default) + if (!gmixer_context->sink_default) { msg->val[0] = EINA_FALSE; msg->val[1] = 0; msg->val[2] = 0; if (inst->popup) - _popup_del(inst); + elm_ctxpopup_dismiss(inst->popup); } else { int vol = 0; unsigned int i = 0; for (i = 0; i < - mixer_context->sink_default->volume.channel_count; i++) - vol += mixer_context->sink_default->volume.volumes[i]; - if (mixer_context->sink_default->volume.channel_count) - vol /= mixer_context->sink_default->volume.channel_count; - msg->val[0] = mixer_context->sink_default->mute; + gmixer_context->sink_default->volume.channel_count; i++) + vol += gmixer_context->sink_default->volume.volumes[i]; + if (gmixer_context->sink_default->volume.channel_count) + vol /= gmixer_context->sink_default->volume.channel_count; + msg->val[0] = gmixer_context->sink_default->mute; msg->val[1] = vol; msg->val[2] = msg->val[1]; if (inst->popup) - _mixer_popup_update(inst, mixer_context->sink_default->mute, + _mixer_popup_update(inst, gmixer_context->sink_default->mute, msg->val[1]); } - edje_object_message_send(inst->gadget, EDJE_MESSAGE_INT_SET, 0, msg); - edje_object_signal_emit(inst->gadget, "e,action,volume,change", "e"); + edje_object_message_send(elm_layout_edje_get(inst->o_mixer), EDJE_MESSAGE_INT_SET, 0, msg); + elm_layout_signal_emit(inst->o_mixer, "e,action,volume,change", "e"); } } @@ -197,8 +155,8 @@ _volume_increase_cb(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) unsigned int i; Emix_Volume volume; - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - Emix_Sink *s = (Emix_Sink *)mixer_context->sink_default; + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + Emix_Sink *s = (Emix_Sink *)gmixer_context->sink_default; if (!s->volume.channel_count) return; @@ -229,8 +187,8 @@ _volume_decrease_cb(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) unsigned int i; Emix_Volume volume; - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - Emix_Sink *s = (Emix_Sink *)mixer_context->sink_default; + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + Emix_Sink *s = (Emix_Sink *)gmixer_context->sink_default; volume.channel_count = s->volume.channel_count; volume.volumes = calloc(s->volume.channel_count, sizeof(int)); for (i = 0; i < volume.channel_count; i++) @@ -252,8 +210,8 @@ _volume_decrease_cb(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) static void _volume_mute_cb(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) { - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - Emix_Sink *s = (Emix_Sink *)mixer_context->sink_default; + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + Emix_Sink *s = (Emix_Sink *)gmixer_context->sink_default; Eina_Bool mute = !s->mute; emix_sink_mute_set(s, mute); emix_config_save_state_get(); @@ -299,49 +257,49 @@ _volume_mute_app_cb(E_Object *obj EINA_UNUSED, const char *params EINA_UNUSED) static void _actions_register(void) { - mixer_context->actions.incr = e_action_add("volume_increase"); - if (mixer_context->actions.incr) + gmixer_context->actions.incr = e_action_add("volume_increase"); + if (gmixer_context->actions.incr) { - mixer_context->actions.incr->func.go = _volume_increase_cb; + gmixer_context->actions.incr->func.go = _volume_increase_cb; e_action_predef_name_set("Mixer", _("Increase Volume"), "volume_increase", NULL, NULL, 0); } - mixer_context->actions.decr = e_action_add("volume_decrease"); - if (mixer_context->actions.decr) + gmixer_context->actions.decr = e_action_add("volume_decrease"); + if (gmixer_context->actions.decr) { - mixer_context->actions.decr->func.go = _volume_decrease_cb; + gmixer_context->actions.decr->func.go = _volume_decrease_cb; e_action_predef_name_set("Mixer", _("Decrease Volume"), "volume_decrease", NULL, NULL, 0); } - mixer_context->actions.mute = e_action_add("volume_mute"); - if (mixer_context->actions.mute) + gmixer_context->actions.mute = e_action_add("volume_mute"); + if (gmixer_context->actions.mute) { - mixer_context->actions.mute->func.go = _volume_mute_cb; + gmixer_context->actions.mute->func.go = _volume_mute_cb; e_action_predef_name_set("Mixer", _("Mute volume"), "volume_mute", NULL, NULL, 0); } - mixer_context->actions.incr_app = e_action_add("volume_increase_app"); - if (mixer_context->actions.incr_app) + gmixer_context->actions.incr_app = e_action_add("volume_increase_app"); + if (gmixer_context->actions.incr_app) { - mixer_context->actions.incr_app->func.go = _volume_increase_app_cb; + gmixer_context->actions.incr_app->func.go = _volume_increase_app_cb; e_action_predef_name_set("Mixer", _("Increase Volume of Focused Application"), "volume_increase_app", NULL, NULL, 0); } - mixer_context->actions.decr_app = e_action_add("volume_decrease_app"); - if (mixer_context->actions.decr_app) + gmixer_context->actions.decr_app = e_action_add("volume_decrease_app"); + if (gmixer_context->actions.decr_app) { - mixer_context->actions.decr_app->func.go = _volume_decrease_app_cb; + gmixer_context->actions.decr_app->func.go = _volume_decrease_app_cb; e_action_predef_name_set("Mixer", _("Decrease Volume of Focused Application"), "volume_decrease_app", NULL, NULL, 0); } - mixer_context->actions.mute_app = e_action_add("volume_mute_app"); - if (mixer_context->actions.mute_app) + gmixer_context->actions.mute_app = e_action_add("volume_mute_app"); + if (gmixer_context->actions.mute_app) { - mixer_context->actions.mute_app->func.go = _volume_mute_app_cb; + gmixer_context->actions.mute_app->func.go = _volume_mute_app_cb; e_action_predef_name_set("Mixer", _("Mute Volume of Focused Application"), "volume_mute_app", NULL, NULL, 0); @@ -354,84 +312,62 @@ _actions_register(void) static void _actions_unregister(void) { - if (mixer_context->actions.incr) + if (gmixer_context->actions.incr) { e_action_predef_name_del("Mixer", _("Increase Volume")); e_action_del("volume_increase"); - mixer_context->actions.incr = NULL; + gmixer_context->actions.incr = NULL; } - if (mixer_context->actions.decr) + if (gmixer_context->actions.decr) { e_action_predef_name_del("Mixer", _("Decrease Volume")); e_action_del("volume_decrease"); - mixer_context->actions.decr = NULL; + gmixer_context->actions.decr = NULL; } - if (mixer_context->actions.mute) + if (gmixer_context->actions.mute) { e_action_predef_name_del("Mixer", _("Mute Volume")); e_action_del("volume_mute"); - mixer_context->actions.mute = NULL; + gmixer_context->actions.mute = NULL; } - if (mixer_context->actions.incr_app) + if (gmixer_context->actions.incr_app) { e_action_predef_name_del("Mixer", _("Increase Volume of Focuse Application")); e_action_del("volume_increase_app"); - mixer_context->actions.incr_app = NULL; + gmixer_context->actions.incr_app = NULL; } - if (mixer_context->actions.decr_app) + if (gmixer_context->actions.decr_app) { e_action_predef_name_del("Mixer", _("Decrease Volume of Focuse Application")); e_action_del("volume_decrease_app"); - mixer_context->actions.decr_app = NULL; + gmixer_context->actions.decr_app = NULL; } - if (mixer_context->actions.mute_app) + if (gmixer_context->actions.mute_app) { e_action_predef_name_del("Mixer", _("Mute Volume of Focuse Application")); e_action_del("volume_mute_app"); - mixer_context->actions.mute_app = NULL; + gmixer_context->actions.mute_app = NULL; } e_comp_canvas_keys_ungrab(); e_comp_canvas_keys_grab(); } -static void -_popup_del(Instance *inst) -{ - inst->slider = NULL; - inst->check = NULL; - E_FREE_FUNC(inst->popup, e_object_del); -} - -static void -_popup_del_cb(void *obj) -{ - _popup_del(e_object_data_get(obj)); -} - -static void -_popup_comp_del_cb(void *data, Evas_Object *obj EINA_UNUSED) -{ - Instance *inst = data; - - E_FREE_FUNC(inst->popup, e_object_del); -} - static Eina_Bool _emixer_del_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *info EINA_UNUSED) { - mixer_context->emixer = NULL; - if (mixer_context->emix_event_handler) - ecore_event_handler_del(mixer_context->emix_event_handler); + gmixer_context->emixer = NULL; + if (gmixer_context->emix_event_handler) + ecore_event_handler_del(gmixer_context->emix_event_handler); return EINA_TRUE; } @@ -441,13 +377,13 @@ _emixer_exec_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_ { Instance *inst = data; - _popup_del(inst); - if (mixer_context->emixer) return; + elm_ctxpopup_dismiss(inst->popup); + if (gmixer_context->emixer) return; - mixer_context->emixer = ecore_exe_run("emixer", NULL); - if (mixer_context->emix_event_handler) - ecore_event_handler_del(mixer_context->emix_event_handler); - mixer_context->emix_event_handler = + gmixer_context->emixer = ecore_exe_run("emixer", NULL); + if (gmixer_context->emix_event_handler) + ecore_event_handler_del(gmixer_context->emix_event_handler); + gmixer_context->emix_event_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _emixer_del_cb, NULL); } @@ -455,8 +391,8 @@ static void _check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - Emix_Sink *s = (Emix_Sink *)mixer_context->sink_default; + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + Emix_Sink *s = (Emix_Sink *)gmixer_context->sink_default; emix_sink_mute_set(s, !s->mute); emix_config_save_state_get(); if (emix_config_save_get()) e_config_save_queue(); @@ -473,8 +409,8 @@ _slider_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, { int val; - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - Emix_Sink *s = (Emix_Sink *)mixer_context->sink_default; + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + Emix_Sink *s = (Emix_Sink *)gmixer_context->sink_default; val = (int)elm_slider_value_get(obj); VOLSET(val, s->volume, s, emix_sink_volume_set); @@ -487,12 +423,27 @@ _sink_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EIN { Emix_Sink *s = data; - mixer_context->sink_default = s; + gmixer_context->sink_default = s; if (s) emix_config_save_sink_set(s->name); _mixer_gadget_update(); } static void +_mixer_popup_dismissed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + E_FREE_FUNC(obj, evas_object_del); + inst->popup = NULL; +} + +static void +_mixer_popup_deleted(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + inst->popup = NULL; +} + +static void _popup_new(Instance *inst) { Evas_Object *button, *list, *slider, *bx; @@ -502,10 +453,16 @@ _popup_new(Instance *inst) Elm_Object_Item *default_it = NULL; unsigned int volume = 0, i; - EINA_SAFETY_ON_NULL_RETURN(mixer_context->sink_default); - unsigned int channels = mixer_context->sink_default->volume.channel_count; - inst->popup = e_gadcon_popup_new(inst->gcc, 0); + EINA_SAFETY_ON_NULL_RETURN(gmixer_context->sink_default); + unsigned int channels = gmixer_context->sink_default->volume.channel_count; + + inst->popup = elm_ctxpopup_add(e_comp->elm); + elm_object_style_set(inst->popup, "noblock"); + evas_object_smart_callback_add(inst->popup, "dismissed", _mixer_popup_dismissed, inst); + evas_object_event_callback_add(inst->popup, EVAS_CALLBACK_DEL, _mixer_popup_deleted, inst); + list = elm_box_add(e_comp->elm); + elm_object_content_set(inst->popup, list); inst->list = elm_list_add(e_comp->elm); elm_list_mode_set(inst->list, ELM_LIST_COMPRESS); @@ -518,7 +475,7 @@ _popup_new(Instance *inst) Elm_Object_Item *it; it = elm_list_item_append(inst->list, s->name, NULL, NULL, _sink_selected_cb, s); - if (mixer_context->sink_default == s) + if (gmixer_context->sink_default == s) default_it = it; num++; } @@ -526,7 +483,7 @@ _popup_new(Instance *inst) elm_box_pack_end(list, inst->list); for (volume = 0, i = 0; i < channels; i++) - volume += mixer_context->sink_default->volume.volumes[i]; + volume += gmixer_context->sink_default->volume.volumes[i]; if (channels) volume = volume / channels; bx = elm_box_add(e_comp->elm); @@ -550,7 +507,7 @@ _popup_new(Instance *inst) elm_box_pack_end(bx, slider); evas_object_show(slider); - inst->mute = mixer_context->sink_default->mute; + inst->mute = gmixer_context->sink_default->mute; inst->check = elm_check_add(e_comp->elm); evas_object_size_hint_align_set(inst->check, 0.5, EVAS_HINT_FILL); elm_object_text_set(inst->check, _("Mute")); @@ -569,74 +526,31 @@ _popup_new(Instance *inst) evas_object_show(button); evas_object_size_hint_min_set(list, 208, 208); - - - e_gadcon_popup_content_set(inst->popup, list); - e_comp_object_util_autoclose(inst->popup->comp_object, - _popup_comp_del_cb, NULL, inst); - e_gadcon_popup_show(inst->popup); - e_object_data_set(E_OBJECT(inst->popup), inst); - E_OBJECT_DEL_SET(inst->popup, _popup_del_cb); + + e_gadget_util_ctxpopup_place(inst->o_main, inst->popup, inst->o_mixer); + evas_object_show(inst->popup); if (default_it) elm_list_item_selected_set(default_it, EINA_TRUE); } static void -_menu_cb(void *data, E_Menu *menu EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED) -{ - _emixer_exec_cb(data, NULL, NULL); -} - -static void -_settings_cb(void *data EINA_UNUSED, E_Menu *menu EINA_UNUSED, - E_Menu_Item *mi EINA_UNUSED) -{ - emix_config_popup_new(NULL, NULL); -} - -static void -_menu_new(Instance *inst, Evas_Event_Mouse_Down *ev) -{ - E_Zone *zone; - E_Menu *m; - E_Menu_Item *mi; - int x, y; - - zone = e_zone_current_get(); - - m = e_menu_new(); - - mi = e_menu_item_new(m); - e_menu_item_label_set(mi, _("Advanced")); - e_util_menu_item_theme_icon_set(mi, "configure"); - e_menu_item_callback_set(mi, _menu_cb, inst); - - 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, _settings_cb, 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 _mouse_down_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) { Instance *inst = data; Evas_Event_Mouse_Down *ev = event; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + if (ev->button == 1) { - if (!inst->popup) - _popup_new(inst); + if (inst->popup) + { + elm_ctxpopup_dismiss(inst->popup); + return; + } + _popup_new(inst); } else if (ev->button == 2) { @@ -644,7 +558,8 @@ _mouse_down_cb(void *data, Evas *evas EINA_UNUSED, } else if (ev->button == 3) { - _menu_new(inst, ev); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + e_gadget_configure(inst->o_main); } } @@ -660,81 +575,64 @@ _mouse_wheel_cb(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, _volume_increase_cb(NULL, NULL); } -/* - * Gadcon functions - */ -static E_Gadcon_Client * -_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +static Evas_Object * +_mixer_gadget_configure(Evas_Object *g EINA_UNUSED) { - E_Gadcon_Client *gcc; - Instance *inst; - - inst = E_NEW(Instance, 1); + if (e_configure_registry_exists("extensions/emix")) + { + e_configure_registry_call("extensions/emix", NULL, NULL); + } + return NULL; +} - inst->gadget = edje_object_add(gc->evas); - inst->evas = gc->evas; - e_theme_edje_object_set(inst->gadget, - "base/theme/modules/mixer", - "e/modules/mixer/main"); +static void +_mixer_gadget_created_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; - gcc = e_gadcon_client_new(gc, name, id, style, inst->gadget); - gcc->data = inst; - inst->gcc = gcc; + if (inst->o_main) + { + e_gadget_configure_cb_set(inst->o_main, _mixer_gadget_configure); - evas_object_event_callback_add(inst->gadget, EVAS_CALLBACK_MOUSE_DOWN, + inst->o_mixer = elm_layout_add(inst->o_main); + E_EXPAND(inst->o_mixer); + E_FILL(inst->o_mixer); + e_theme_edje_object_set(inst->o_mixer, "base/theme/modules/mixer", "e/modules/mixer/main"); + evas_object_event_callback_add(inst->o_mixer, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, inst); - evas_object_event_callback_add(inst->gadget, EVAS_CALLBACK_MOUSE_WHEEL, + evas_object_event_callback_add(inst->o_mixer, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, inst); - mixer_context->instances = eina_list_append(mixer_context->instances, inst); - - if (mixer_context->sink_default) - _mixer_gadget_update(); - - return gcc; + elm_box_pack_end(inst->o_main, inst->o_mixer); + evas_object_show(inst->o_mixer); + gmixer_context->instances = eina_list_append(gmixer_context->instances, inst); + } + evas_object_smart_callback_del_full(obj, "gadget_created", _mixer_gadget_created_cb, data); } static void -_gc_shutdown(E_Gadcon_Client *gcc) +mixer_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Instance *inst; + Instance *inst = data; - inst = gcc->data; - evas_object_del(inst->gadget); - mixer_context->instances = eina_list_remove(mixer_context->instances, inst); + gmixer_context->instances = eina_list_remove(gmixer_context->instances, inst); free(inst); } -static void -_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient EINA_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 EINA_UNUSED) -{ - return "Mixer"; -} - -static Evas_Object * -_gc_icon(const E_Gadcon_Client_Class *client_class EINA_UNUSED, Evas *evas) +EINTERN Evas_Object * +mixer_gadget_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient EINA_UNUSED) { - Evas_Object *o; - char buf[4096] = { 0 }; + Instance *inst; - o = edje_object_add(evas); - snprintf(buf, sizeof(buf), "%s/e-module-mixer.edj", - e_module_dir_get(mixer_context->module)); - edje_object_file_set(o, buf, "icon"); + inst = E_NEW(Instance, 1); + inst->o_main = elm_box_add(parent); + E_EXPAND(inst->o_main); + E_FILL(inst->o_main); + evas_object_size_hint_aspect_set(inst->o_main, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + evas_object_show(inst->o_main); - return o; -} - -static const char * -_gc_id_new(const E_Gadcon_Client_Class *client_class EINA_UNUSED) -{ - return _gadcon_class.name; + evas_object_smart_callback_add(parent, "gadget_created", _mixer_gadget_created_cb, inst); + evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_DEL, mixer_del, inst); + return inst->o_main; } static void @@ -745,20 +643,20 @@ _sink_event(int type, void *info) if (type == EMIX_SINK_REMOVED_EVENT) { - if (sink == mixer_context->sink_default) + if (sink == gmixer_context->sink_default) { l = emix_sinks_get(); if (l) - mixer_context->sink_default = l->data; + gmixer_context->sink_default = l->data; else - mixer_context->sink_default = NULL; + gmixer_context->sink_default = NULL; if (emix_config_save_get()) e_config_save_queue(); _mixer_gadget_update(); } } else if (type == EMIX_SINK_CHANGED_EVENT) { - if (mixer_context->sink_default == sink) + if (gmixer_context->sink_default == sink) { int vol; @@ -791,21 +689,20 @@ _sink_event(int type, void *info) static void _disconnected(void) { - if (mixer_context) mixer_context->sink_default = NULL; + if (gmixer_context) gmixer_context->sink_default = NULL; _mixer_gadget_update(); } - static void _ready(void) { init = EINA_TRUE; if (emix_sink_default_support()) - mixer_context->sink_default = emix_sink_default_get(); + gmixer_context->sink_default = emix_sink_default_get(); else { if (emix_sinks_get()) - mixer_context->sink_default = emix_sinks_get()->data; + gmixer_context->sink_default = emix_sinks_get()->data; } if (emix_config_save_get()) @@ -823,7 +720,7 @@ _ready(void) { if ((s->name) && (!strcmp(s->name, sinkname))) { - mixer_context->sink_default = s; + gmixer_context->sink_default = s; break; } } @@ -1007,24 +904,24 @@ _desklock_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *info) if (emix_config_desklock_mute_get() == EINA_FALSE) return ECORE_CALLBACK_PASS_ON; - if (!mixer_context) + if (!gmixer_context) return ECORE_CALLBACK_PASS_ON; if (ev->on) { - if (mixer_context->sink_default) + if (gmixer_context->sink_default) { - _was_mute = mixer_context->sink_default->mute; + _was_mute = gmixer_context->sink_default->mute; if (!_was_mute) - emix_sink_mute_set((Emix_Sink *)mixer_context->sink_default, EINA_TRUE); + emix_sink_mute_set((Emix_Sink *)gmixer_context->sink_default, EINA_TRUE); } } else { - if (mixer_context->sink_default) + if (gmixer_context->sink_default) { if (!_was_mute) - emix_sink_mute_set((Emix_Sink *)mixer_context->sink_default, EINA_FALSE); + emix_sink_mute_set((Emix_Sink *)gmixer_context->sink_default, EINA_FALSE); } } @@ -1040,84 +937,6 @@ _backend_changed(const char *backend, void *data EINA_UNUSED) ERR("Could not load backend: %s", backend); } -static void -_bd_hook_volume_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - E_Client *ec; - - ec = data; - - e_client_volume_set(ec, elm_slider_value_get(obj)); -} - -static void -_bd_hook_volume_drag_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - E_Client *ec; - - ec = data; - - elm_slider_value_set(obj, ec->volume); -} - - -static void -_bd_hook_mute_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - E_Client *ec; - - ec = data; - - e_client_volume_mute_set(ec, elm_check_state_get(obj)); -} - -static void -_bd_hook_sink_volume_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - E_Client_Volume_Sink *sink; - Evas_Object *check; - - sink = data; - - check = evas_object_data_get(obj, "e_sink_check"); - - e_client_volume_sink_set(sink, - elm_slider_value_get(obj), - elm_check_state_get(check)); -} - -static void -_bd_hook_sink_volume_drag_stop(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - E_Client_Volume_Sink *sink; - Evas_Object *check; - Eina_Bool mute; - int vol; - - sink = data; - - check = evas_object_data_get(obj, "e_sink_check"); - - e_client_volume_sink_get(sink, &vol, &mute); - elm_slider_value_set(obj, vol); - elm_check_state_set(check, mute); -} - - -static void -_bd_hook_sink_mute_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - E_Client_Volume_Sink *sink; - Evas_Object *slider; - - sink = data; - slider = evas_object_data_get(obj, "e_sink_volume"); - - e_client_volume_sink_set(sink, - elm_slider_value_get(slider), - elm_check_state_get(obj)); -} - static Eina_Bool _e_client_volume_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) { @@ -1182,6 +1001,53 @@ _e_client_mute_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event } static void +_bd_hook_sink_volume_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + E_Client_Volume_Sink *sink; + Evas_Object *check; + + sink = data; + + check = evas_object_data_get(obj, "e_sink_check"); + + e_client_volume_sink_set(sink, + elm_slider_value_get(obj), + elm_check_state_get(check)); +} + +static void +_bd_hook_sink_volume_drag_stop(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + E_Client_Volume_Sink *sink; + Evas_Object *check; + Eina_Bool mute; + int vol; + + sink = data; + + check = evas_object_data_get(obj, "e_sink_check"); + + e_client_volume_sink_get(sink, &vol, &mute); + elm_slider_value_set(obj, vol); + elm_check_state_set(check, mute); +} + + +static void +_bd_hook_sink_mute_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + E_Client_Volume_Sink *sink; + Evas_Object *slider; + + sink = data; + slider = evas_object_data_get(obj, "e_sink_volume"); + + e_client_volume_sink_set(sink, + elm_slider_value_get(slider), + elm_check_state_get(obj)); +} + +static void _e_client_mixer_sink_append(E_Client_Volume_Sink *sink, Client_Mixer *cm) { Evas_Object *lbl, *slider, *check, *sep; @@ -1366,136 +1232,26 @@ _e_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) return ECORE_CALLBACK_PASS_ON; } -static void -_bd_hook_cb(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *it EINA_UNUSED) -{ - E_Client *ec; - Client_Mixer *cm; - E_Client_Volume_Sink *sink; - Evas_Object *win, *popup, *bx, *o; - Eina_List *l; - int w, h; - - ec = data; - - EINA_LIST_FOREACH(_client_mixers, l, cm) - { - if (cm->ec == ec) - return; - } - cm = E_NEW(Client_Mixer, 1); - cm->ec = ec; - - win = elm_popup_add(e_comp->elm); - elm_popup_allow_events_set(win, EINA_TRUE); - - bx = elm_box_add(win); - elm_box_horizontal_set(bx, EINA_FALSE); - elm_object_content_set(win, bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - cm->bx = bx; - - o = elm_label_add(bx); - elm_object_text_set(o, _("Main")); - evas_object_size_hint_align_set(o, 0.0, EVAS_HINT_FILL); - elm_box_pack_end(bx, o); - evas_object_show(o); - - o = elm_slider_add(bx); - elm_slider_horizontal_set(o, EINA_TRUE); - elm_slider_min_max_set(o, ec->volume_min, ec->volume_max); - elm_slider_span_size_set(o, ec->volume_max * elm_config_scale_get()); - elm_slider_unit_format_set(o, "%.0f"); - elm_slider_indicator_format_set(o, "%.0f"); - evas_object_size_hint_weight_set(o, 0.0, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_slider_value_set(o, ec->volume); - evas_object_smart_callback_add(o, "changed", _bd_hook_volume_changed, ec); - evas_object_smart_callback_add(o, "slider,drag,stop", - _bd_hook_volume_drag_stop, ec); - elm_box_pack_end(bx, o); - evas_object_show(o); - cm->volume = o; - - o = elm_check_add(bx); - elm_object_text_set(o, _("Mute")); - evas_object_size_hint_align_set(o, 0.0, EVAS_HINT_FILL); - elm_check_state_set(o, !!ec->mute); - elm_object_disabled_set(o, !!ec->mute); - evas_object_smart_callback_add(o, "changed", _bd_hook_mute_changed, ec); - elm_box_pack_end(bx, o); - evas_object_show(o); - cm->mute = o; - - EINA_LIST_FOREACH(ec->sinks, l, sink) - { - _e_client_mixer_sink_append(sink, cm); - } - - evas_object_show(bx); - evas_object_size_hint_min_get(bx, &w, &h); - evas_object_resize(win, w, h); - evas_object_show(win); - popup = e_comp_object_util_add(win, E_COMP_OBJECT_TYPE_NONE); - evas_object_layer_set(popup, E_LAYER_POPUP); - e_comp_object_util_center_on_zone(popup, ec->zone); - evas_object_show(popup); - e_comp_object_util_autoclose(popup, NULL, NULL, NULL); - _client_mixers = eina_list_append(_client_mixers, cm); - evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _client_mixer_del, cm); - cm->win = popup; -} - -static void -_bd_hook(void *data EINA_UNUSED, E_Client *ec) -{ - E_Menu_Item *it; - E_Menu *m; - Eina_List *l; - - if (!ec->volume_control_enabled) return; - m = ec->border_menu; - - /* Find the first separator and add us below him */ - EINA_LIST_FOREACH(m->items, l, it) - { - if (it->separator) break; - } - if ((!it) || (!it->separator)) return; - - it = e_menu_item_new_relative(m, it); - e_menu_item_label_set(it, _("Volume")); - e_util_menu_item_theme_icon_set(it, "preferences-desktop-mixer"); - e_menu_item_callback_set(it, _bd_hook_cb, ec); - - it = e_menu_item_new_relative(m, it); - e_menu_item_separator_set(it, EINA_TRUE); -} - -E_API void * -e_modapi_init(E_Module *m) +EINTERN Eina_Bool +mixer_init(void) { Eina_List *l; char buf[4096]; const char *backend; Eina_Bool backend_loaded = EINA_FALSE; - _e_emix_log_domain = eina_log_domain_register("mixer", EINA_COLOR_RED); - - if (!mixer_context) + if (!gmixer_context) { - mixer_context = E_NEW(Context, 1); + gmixer_context = E_NEW(Context, 1); - mixer_context->desklock_handler = + gmixer_context->desklock_handler = ecore_event_handler_add(E_EVENT_DESKLOCK, _desklock_cb, NULL); - mixer_context->module = m; + gmixer_context->module = gm; snprintf(buf, sizeof(buf), "%s/mixer.edj", - e_module_dir_get(mixer_context->module)); - mixer_context->theme = strdup(buf); + e_module_dir_get(gmixer_context->module)); + gmixer_context->theme = strdup(buf); } - - EINA_SAFETY_ON_FALSE_RETURN_VAL(emix_init(), NULL); emix_config_init(_backend_changed, NULL); emix_event_callback_add(_events_cb, NULL); @@ -1519,21 +1275,13 @@ e_modapi_init(E_Module *m) } } - if (!backend_loaded) goto err; - - e_configure_registry_category_add("extensions", 90, _("Extensions"), NULL, - "preferences-extensions"); - e_configure_registry_item_add("extensions/emix", 30, _("Mixer"), NULL, - "preferences-desktop-mixer", - emix_config_popup_new); + if (!backend_loaded) return EINA_FALSE; if (emix_sink_default_support()) - mixer_context->sink_default = emix_sink_default_get(); + gmixer_context->sink_default = emix_sink_default_get(); - e_gadcon_provider_register(&_gadcon_class); _actions_register(); - _border_hook = e_int_client_menu_hook_add(_bd_hook, NULL); E_LIST_HANDLER_APPEND(_client_handlers, E_EVENT_CLIENT_VOLUME, _e_client_volume_changed, NULL); E_LIST_HANDLER_APPEND(_client_handlers, E_EVENT_CLIENT_MUTE, @@ -1549,16 +1297,11 @@ e_modapi_init(E_Module *m) E_LIST_HANDLER_APPEND(_client_handlers, E_EVENT_CLIENT_VOLUME_SINK_CHANGED, _e_client_volume_sink_changed, NULL); - return m; - -err: - emix_config_shutdown(); - emix_shutdown(); - return NULL; + return EINA_TRUE; } -E_API int -e_modapi_shutdown(E_Module *m EINA_UNUSED) +EINTERN void +mixer_shutdown(void) { E_Client_Volume_Sink *sink; Client_Mixer *cm; @@ -1572,29 +1315,15 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) free(cm); } - e_int_client_menu_hook_del(_border_hook); _actions_unregister(); - e_gadcon_provider_unregister((const E_Gadcon_Client_Class *)&_gadcon_class); - if (mixer_context) + if (gmixer_context) { - free(mixer_context->theme); - E_FREE(mixer_context); + free(gmixer_context->theme); + E_FREE(gmixer_context); } - EINA_LIST_FREE(_client_sinks, sink) e_client_volume_sink_del(sink); - emix_event_callback_del(_events_cb); - emix_shutdown(); - emix_config_shutdown(); - return 1; -} - -E_API int -e_modapi_save(E_Module *m EINA_UNUSED) -{ - emix_config_save(); - return 1; } diff --git a/src/modules/mixer/gadget/mixer.h b/src/modules/mixer/gadget/mixer.h new file mode 100644 index 0000000..014a0e5 --- /dev/null +++ b/src/modules/mixer/gadget/mixer.h @@ -0,0 +1,31 @@ +#ifndef MIXER_H +#define MIXER_H + +#include "e.h" +#include <Eina.h> +#include "emix.h" +#include "../e_mod_config.h" + +EINTERN void *e_modapi_gadget_init(E_Module *m); +EINTERN int e_modapi_gadget_shutdown(E_Module *m); +EINTERN int e_modapi_gadget_save(E_Module *m); + +extern int _e_gemix_log_domain; +extern E_Module *gm; + +#undef GDBG +#undef GINF +#undef GWRN +#undef GERR +#undef GCRIT +#define GDBG(...) EINA_LOG_DOM_DBG(_e_gemix_log_domain, __VA_ARGS__) +#define GINF(...) EINA_LOG_DOM_INF(_e_gemix_log_domain, __VA_ARGS__) +#define GWRN(...) EINA_LOG_DOM_WARN(_e_gemix_log_domain, __VA_ARGS__) +#define GERR(...) EINA_LOG_DOM_ERR(_e_gemix_log_domain, __VA_ARGS__) +#define GCRIT(...) EINA_LOG_DOM_CRIT(_e_gemix_log_domain, __VA_ARGS__) + +EINTERN Eina_Bool mixer_init(void); +EINTERN void mixer_shutdown(void); +EINTERN Evas_Object *mixer_gadget_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient EINA_UNUSED); + +#endif diff --git a/src/modules/mixer/gadget/mod.c b/src/modules/mixer/gadget/mod.c new file mode 100644 index 0000000..bff5ba1 --- /dev/null +++ b/src/modules/mixer/gadget/mod.c @@ -0,0 +1,49 @@ +#include "mixer.h" + +int _e_gemix_log_domain; +E_Module *gm; + +EINTERN void * +e_modapi_gadget_init(E_Module *m) +{ + Eina_Bool loaded = EINA_FALSE; + + _e_gemix_log_domain = eina_log_domain_register("mixer_gadget", EINA_COLOR_RED); + + EINA_SAFETY_ON_FALSE_RETURN_VAL(emix_init(), NULL); + + gm = m; + + loaded = mixer_init(); + if (!loaded) + goto err; + + e_gadget_type_add("Mixer Gadget", mixer_gadget_create, NULL); + + return m; +err: +// emix_config_shutdown(); + emix_shutdown(); + return NULL; +} + +EINTERN int +e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED) +{ + mixer_shutdown(); + + e_gadget_type_del("Mixer Gadget"); + + + emix_shutdown(); +// emix_config_shutdown(); + return 1; +} + +EINTERN int +e_modapi_gadget_save(E_Module *m EINA_UNUSED) +{ + emix_config_save(); + return 1; +} + diff --git a/src/modules/pager/gadget/mod.c b/src/modules/pager/gadget/mod.c index af4c370..0b6f1e6 100644 --- a/src/modules/pager/gadget/mod.c +++ b/src/modules/pager/gadget/mod.c @@ -5,7 +5,7 @@ E_Module *gmodule; Evas_Object *cfg_dialog; Eina_List *ginstances, *ghandlers; -E_API void * +EINTERN void * e_modapi_gadget_init(E_Module *m) { conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config); @@ -69,7 +69,7 @@ e_modapi_gadget_init(E_Module *m) return m; } -E_API int +EINTERN int e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED) { if (cfg_dialog) @@ -96,7 +96,7 @@ e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED) return 1; } -E_API int +EINTERN int e_modapi_gadget_save(E_Module *m EINA_UNUSED) { e_config_domain_save("module.pager", conf_edd, pager_config); diff --git a/src/modules/pager/gadget/pager.h b/src/modules/pager/gadget/pager.h index b75c53b..6d22be4 100644 --- a/src/modules/pager/gadget/pager.h +++ b/src/modules/pager/gadget/pager.h @@ -3,9 +3,9 @@ #include "e.h" -E_API void *e_modapi_gadget_init(E_Module *m); -E_API int e_modapi_gadget_shutdown(E_Module *m); -E_API int e_modapi_gadget_save(E_Module *m); +EINTERN void *e_modapi_gadget_init(E_Module *m); +EINTERN int e_modapi_gadget_shutdown(E_Module *m); +EINTERN int e_modapi_gadget_save(E_Module *m); typedef struct _Config Config; struct _Config diff --git a/src/modules/xkbswitch/e_mod_main.c b/src/modules/xkbswitch/e_mod_main.c index e59f00c..21cd4d3 100644 --- a/src/modules/xkbswitch/e_mod_main.c +++ b/src/modules/xkbswitch/e_mod_main.c @@ -1,6 +1,7 @@ #include "e.h" #include "e_mod_main.h" #include "e_mod_parse.h" +#include "gadget/xkbswitch.h" /* GADCON */ static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); @@ -76,6 +77,7 @@ e_modapi_init(E_Module *m) _("Keyboard"), NULL, "preferences-desktop-keyboard", _xkb_cfg_dialog); + e_modapi_gadget_init(m); _xkb.module = m; xkb_change_handle = ecore_event_handler_add(E_EVENT_XKB_CHANGED, _xkb_changed_state, NULL); @@ -89,11 +91,13 @@ e_modapi_init(E_Module *m) * and frees up the config. */ E_API int -e_modapi_shutdown(E_Module *m EINA_UNUSED) +e_modapi_shutdown(E_Module *m) { e_configure_registry_item_del("keyboard_and_mouse/xkbswitch"); e_configure_registry_category_del("keyboard_and_mouse"); + e_modapi_gadget_shutdown(m); + if (_xkb.evh) ecore_event_handler_del(_xkb.evh); if (_xkb.cfd) e_object_del(E_OBJECT(_xkb.cfd)); _xkb.cfd = NULL; @@ -108,8 +112,10 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED) * Used to save the configuration file. */ E_API int -e_modapi_save(E_Module *m EINA_UNUSED) +e_modapi_save(E_Module *m) { + e_modapi_gadget_save(m); + return 1; } diff --git a/src/modules/xkbswitch/gadget/mod.c b/src/modules/xkbswitch/gadget/mod.c new file mode 100644 index 0000000..0c6e2fe --- /dev/null +++ b/src/modules/xkbswitch/gadget/mod.c @@ -0,0 +1,28 @@ +#include "xkbswitch.h" + +Xkbg _xkbg = { NULL, NULL, NULL }; + +EINTERN void * +e_modapi_gadget_init(E_Module *m) +{ + _xkbg.module = m; + xkbg_init(); + e_gadget_type_add("Xkbswitch Gadget", xkbg_gadget_create, NULL); + return m; +} + +EINTERN int +e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED) +{ + xkbg_shutdown(); + _xkbg.module = NULL; + e_gadget_type_del("Xkbswitch Gadget"); + + return 1; +} + +EINTERN int +e_modapi_gadget_save(E_Module *m EINA_UNUSED) +{ + return 1; +} diff --git a/src/modules/xkbswitch/gadget/xkbswitch.c b/src/modules/xkbswitch/gadget/xkbswitch.c new file mode 100644 index 0000000..68f991d --- /dev/null +++ b/src/modules/xkbswitch/gadget/xkbswitch.c @@ -0,0 +1,284 @@ +#include "xkbswitch.h" + +typedef struct _Instance +{ + Evas_Object *o_main; + Evas_Object *o_xkbswitch; + Evas_Object *o_xkbflag; + Evas_Object *menu; + Evas_Object *popup; + E_Gadget_Site_Orient orient; + E_Config_XKB_Layout *layout; +} Instance; + +static Eina_List *ginstances = NULL; +static Ecore_Event_Handler *xkbg_change_handle = NULL; + +void +_xkbg_update_icon(int cur_group) +{ + Instance *inst; + Eina_List *l; + E_Config_XKB_Layout *cl; + + EINA_SAFETY_ON_NULL_RETURN(e_config->xkb.used_layouts); + //INF("ui: %d", cur_group); + cl = eina_list_nth(e_config->xkb.used_layouts, cur_group); + EINA_SAFETY_ON_NULL_RETURN(cl); + if (!e_config_xkb_layout_eq(cl, e_config->xkb.current_layout)) + { + e_config_xkb_layout_free(e_config->xkb.current_layout); + e_config->xkb.current_layout = e_config_xkb_layout_dup(cl); + } + + if (e_config->xkb.only_label) + { + EINA_LIST_FOREACH(ginstances, l, inst) + { + if (!e_config_xkb_layout_eq(e_config->xkb.current_layout, inst->layout)) + inst->layout = e_config->xkb.current_layout; + E_FREE_FUNC(inst->o_xkbflag, evas_object_del); + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "e/modules/xkbswitch/noflag"); + elm_layout_text_set(inst->o_xkbswitch, + "e.text.label", cl->name); + } + } + else + { + EINA_LIST_FOREACH(ginstances, l, inst) + { + if (!e_config_xkb_layout_eq(e_config->xkb.current_layout, inst->layout)) + inst->layout = e_config->xkb.current_layout; + if (!inst->o_xkbflag) + inst->o_xkbflag = e_icon_add(evas_object_evas_get(inst->o_xkbswitch)); + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "e/modules/xkbswitch/main"); + e_xkb_e_icon_flag_setup(inst->o_xkbflag, cl->name); + elm_layout_content_set(inst->o_xkbswitch, "e.swallow.flag", + inst->o_xkbflag); + elm_layout_text_set(inst->o_xkbswitch, "e.text.label", + e_xkb_layout_name_reduce(cl->name)); + } + } +} + +static Eina_Bool +_xkbg_changed_state(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) +{ + _xkbg_update_icon(e_config->xkb.cur_group); + return ECORE_CALLBACK_PASS_ON; +} + +static Evas_Object * +_xkbg_gadget_configure(Evas_Object *g EINA_UNUSED) +{ + if (e_configure_registry_exists("keyboard_and_mouse/xkbswitch")) + { + e_configure_registry_call("keyboard_and_mouse/xkbswitch", NULL, NULL); + } + return NULL; +} + +static void +_xkbg_cb_menu_set(void *data, Evas_Object *obj, void *event_data EINA_UNUSED) +{ + Instance *inst = evas_object_data_get(obj, "inst"); + Eina_List *l; + int cur_group = -1, grp = -1; + E_Config_XKB_Layout *cl2, *cl = data; + + if (inst->popup) + elm_ctxpopup_dismiss(inst->popup); + + EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl2) + { + grp++; + if (cl2 == cl) cur_group = grp; + } + if (cur_group == -1) return; + if (e_config_xkb_layout_eq(cl, e_xkb_layout_get())) return; + e_xkb_layout_set(cl); + e_config_xkb_layout_free(e_config->xkb.sel_layout); + e_config->xkb.sel_layout = e_config_xkb_layout_dup(cl); +} + +static void +_xkbg_popup_dismissed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + E_FREE_FUNC(obj, evas_object_del); + inst->popup = NULL; +} + +static void +_xkbg_popup_deleted(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + inst->popup = NULL; +} + +static void +_xkbg_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + Evas_Event_Mouse_Down *ev = event; + Instance *inst = data; + + if (!inst) return; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + if (ev->button == 3) + { + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + e_gadget_configure(inst->o_main); + } + else if ((ev->button == 1) && (inst->popup)) + { + elm_ctxpopup_dismiss(inst->popup); + return; + } + else if ((ev->button == 1) && (!inst->popup)) /* Left-click layout menu */ + { + if (!e_config->xkb.dont_touch_my_damn_keyboard) + { + E_Config_XKB_Layout *cl, *cur; + Eina_List *l; + Elm_Object_Item *mi; + char buf[4096], buf2[4096]; + + cur = e_xkb_layout_get(); + + inst->popup = elm_ctxpopup_add(e_comp->elm); + elm_object_style_set(inst->popup, "noblock"); + evas_object_smart_callback_add(inst->popup, "dismissed", _xkbg_popup_dismissed, inst); + evas_object_event_callback_add(inst->popup, EVAS_CALLBACK_DEL, _xkbg_popup_deleted, inst); + + inst->menu = elm_list_add(inst->popup); + elm_list_select_mode_set(inst->menu, ELM_OBJECT_SELECT_MODE_ALWAYS); + evas_object_data_set(inst->menu, "inst", inst); + elm_object_content_set(inst->popup, inst->menu); + E_EXPAND(inst->menu); + E_FILL(inst->menu); + + /* Append all the layouts */ + EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl) + { + const char *name = cl->name; + Evas_Object *ic; + + e_xkb_flag_file_get(buf, sizeof(buf), name); + if (cl->variant) + snprintf(buf2, sizeof(buf2), "%s (%s, %s)", cl->name, cl->model, cl->variant); + else + snprintf(buf2, sizeof(buf2), "%s (%s)", cl->name, cl->model); + + ic = elm_icon_add(inst->menu); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + + mi = elm_list_item_append(inst->menu, buf2, ic, NULL, _xkbg_cb_menu_set, cl); + + if (e_config_xkb_layout_eq(cur, cl)) + elm_list_item_selected_set(mi, EINA_TRUE); + } + + evas_object_show(inst->menu); + evas_object_size_hint_min_set(inst->popup, 200 * e_scale, 100 * e_scale); + e_gadget_util_ctxpopup_place(inst->o_main, inst->popup, inst->o_xkbswitch); + evas_object_show(inst->popup); + } + } + else if (ev->button == 2) + e_xkb_layout_next(); +} + +static void +_xkbg_gadget_created_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + if (inst->o_main) + { + e_gadget_configure_cb_set(inst->o_main, _xkbg_gadget_configure); +// _xkbdswitch_orient(inst, e_gadget_site_orient_get(obj)); + + inst->o_xkbswitch = elm_layout_add(inst->o_main); + E_EXPAND(inst->o_xkbswitch); + E_FILL(inst->o_xkbswitch); + + inst->layout = e_xkb_layout_get(); + if (e_config->xkb.only_label || (!inst->layout)) + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "e/modules/xkbswitch/noflag"); + else + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "e/modules/xkbswitch/main"); + elm_layout_text_set(inst->o_xkbswitch, "e.text.label", + inst->layout ? e_xkb_layout_name_reduce(inst->layout->name) : _("NONE")); + if (inst->layout && (!e_config->xkb.only_label)) + { + inst->o_xkbflag = e_icon_add(evas_object_evas_get(inst->o_xkbswitch)); + E_EXPAND(inst->o_xkbflag); + E_FILL(inst->o_xkbflag); + e_xkb_e_icon_flag_setup(inst->o_xkbflag, inst->layout->name); + /* The icon is part of the gadget. */ + elm_layout_content_set(inst->o_xkbswitch, "e.swallow.flag", + inst->o_xkbflag); + } + else inst->o_xkbflag = NULL; + evas_object_event_callback_add(inst->o_xkbswitch, EVAS_CALLBACK_MOUSE_DOWN, + _xkbg_cb_mouse_down, inst); + elm_box_pack_end(inst->o_main, inst->o_xkbswitch); + evas_object_show(inst->o_xkbswitch); + } + evas_object_smart_callback_del_full(obj, "gadget_created", _xkbg_gadget_created_cb, data); +} + +static void +xkbg_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Instance *inst = data; + + if (inst->popup) + elm_ctxpopup_dismiss(inst->popup); + ginstances = eina_list_remove(ginstances, inst); + free(inst); +} + +EINTERN Evas_Object * +xkbg_gadget_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient orient) +{ + Instance *inst; + + inst = E_NEW(Instance, 1); + inst->o_main = elm_box_add(parent); + inst->orient = orient; + E_EXPAND(inst->o_main); + E_FILL(inst->o_main); + evas_object_size_hint_aspect_set(inst->o_main, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + evas_object_smart_callback_add(parent, "gadget_created", _xkbg_gadget_created_cb, inst); + evas_object_event_callback_add(inst->o_main, EVAS_CALLBACK_DEL, xkbg_del, inst); + + ginstances = eina_list_append(ginstances, inst); + return inst->o_main; +} + +EINTERN void +xkbg_init(void) +{ + xkbg_change_handle = ecore_event_handler_add(E_EVENT_XKB_CHANGED, _xkbg_changed_state, NULL); +} + +EINTERN void +xkbg_shutdown(void) +{ + if (_xkbg.evh) ecore_event_handler_del(_xkbg.evh); + if (_xkbg.cfd) e_object_del(E_OBJECT(_xkbg.cfd)); + _xkbg.cfd = NULL; + ecore_event_handler_del(xkbg_change_handle); +} + diff --git a/src/modules/xkbswitch/gadget/xkbswitch.h b/src/modules/xkbswitch/gadget/xkbswitch.h new file mode 100644 index 0000000..698773d --- /dev/null +++ b/src/modules/xkbswitch/gadget/xkbswitch.h @@ -0,0 +1,25 @@ +#ifndef XKBSWITCH_H +#define XKBSWITCH_H + +#include "e.h" + +typedef struct _Xkbg +{ + E_Module *module; + E_Config_Dialog *cfd; + Ecore_Event_Handler *evh; +} Xkbg; + +void _xkbg_update_icon(int); +E_Config_Dialog *_xkbg_cfg_dialog(Evas_Object *, const char *params); + +extern Xkbg _xkbg; + +EINTERN void *e_modapi_gadget_init(E_Module *m); +EINTERN int e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED); +EINTERN int e_modapi_gadget_save(E_Module *m EINA_UNUSED); +EINTERN Evas_Object *xkbg_gadget_create(Evas_Object *parent, int *id, E_Gadget_Site_Orient orient); +EINTERN void xkbg_init(void); +EINTERN void xkbg_shutdown(void); + +#endif --
