From 5d3cff7af87bf955b9f8acc52f701210c3c8d3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Wed, 2 Jan 2013 13:22:22 +0000 Subject: [PATCH] e/music-control: Close popup of when user click out or type a key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by: José Roberto de Souza SVN revision: 81995 --- src/modules/music-control/private.h | 3 ++ src/modules/music-control/ui.c | 55 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/modules/music-control/private.h b/src/modules/music-control/private.h index 99c3bc2aa..f36c37119 100644 --- a/src/modules/music-control/private.h +++ b/src/modules/music-control/private.h @@ -28,6 +28,9 @@ typedef struct _E_Music_Control_Instance Evas_Object *gadget; E_Gadcon_Popup *popup; Evas_Object *content_popup; + Ecore_X_Window win; + Ecore_Event_Handler *mouse_up; + Ecore_Event_Handler *key_down; } E_Music_Control_Instance; void music_control_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event); diff --git a/src/modules/music-control/ui.c b/src/modules/music-control/ui.c index b2320ea90..3a6531ff9 100644 --- a/src/modules/music-control/ui.c +++ b/src/modules/music-control/ui.c @@ -56,6 +56,59 @@ _player_name_update(E_Music_Control_Instance *inst) edje_object_message_send(inst->content_popup, EDJE_MESSAGE_STRING, 0, &msg); } +static Eina_Bool +_popup_input_window_mouse_up_cb(void *data, int type __UNUSED__, void *event) +{ + Ecore_Event_Mouse_Button *ev = event; + E_Music_Control_Instance *inst = data; + if (ev->window == inst->win) + music_control_popup_del(inst); + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +_popup_input_window_key_down_cb(void *data, int type __UNUSED__, void *event) +{ + Ecore_Event_Key *ev = event; + E_Music_Control_Instance *inst = data; + if (ev->window == inst->win) + music_control_popup_del(inst); + return ECORE_CALLBACK_PASS_ON; +} + +static void +_popup_input_window_create(E_Music_Control_Instance *inst) +{ + Ecore_X_Window_Configure_Mask mask; + Ecore_X_Window popup_w; + E_Manager *man = e_manager_current_get(); + + inst->win = 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(inst->win, mask, 0, 0, 0, 0, 0, popup_w, + ECORE_X_WINDOW_STACK_BELOW); + ecore_x_window_show(inst->win); + + inst->mouse_up = + ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, + _popup_input_window_mouse_up_cb, inst); + inst->key_down = + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + _popup_input_window_key_down_cb, inst); + e_grabinput_get(0, 0, inst->win); +} + +static void +_popup_input_window_destroy(E_Music_Control_Instance *inst) +{ + e_grabinput_release(0, inst->win); + ecore_x_window_free(inst->win); + ecore_event_handler_del(inst->mouse_up); + ecore_event_handler_del(inst->key_down); +} + static void _popup_new(E_Music_Control_Instance *inst) { @@ -74,12 +127,14 @@ _popup_new(E_Music_Control_Instance *inst) _player_name_update(inst); _play_state_update(inst, EINA_TRUE); e_gadcon_popup_show(inst->popup); + _popup_input_window_create(inst); } void music_control_popup_del(E_Music_Control_Instance *inst) { e_gadcon_popup_hide(inst->popup); + _popup_input_window_destroy(inst); e_object_del(E_OBJECT(inst->popup)); inst->popup = NULL; }