From cdd71b50a23231fd4807929caa65b7e6f6d18a9c Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Thu, 11 Apr 2013 08:33:01 +0100 Subject: [PATCH] Add key up/down events for surface and raise the callbacks when they happen. Be sure to set focus on the input object else we do not get any key events from Evas. Signed-off-by: Chris Michael --- src/bin/e_surface.c | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/bin/e_surface.c b/src/bin/e_surface.c index 33f47635a..4ad905f96 100644 --- a/src/bin/e_surface.c +++ b/src/bin/e_surface.c @@ -39,13 +39,15 @@ static void _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip); static void _e_smart_clip_unset(Evas_Object *obj); /* local function prototypes */ -static void _e_surface_cb_focus_in(void *data, Evas *evas EINA_UNUSED, void *event); -static void _e_surface_cb_focus_out(void *data, Evas *evas EINA_UNUSED, void *event); -static void _e_surface_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); -static void _e_surface_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); +static void _e_surface_cb_focus_in(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED); +static void _e_surface_cb_focus_out(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED); +static void _e_surface_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED); +static void _e_surface_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED); static void _e_surface_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); static void _e_surface_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); static void _e_surface_cb_mouse_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); +static void _e_surface_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); +static void _e_surface_cb_key_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event); EAPI Evas_Object * e_surface_add(Evas *evas) @@ -169,6 +171,12 @@ _e_smart_add(Evas_Object *obj) /* create the base input rectangle */ sd->o_input = evas_object_rectangle_add(sd->evas); evas_object_color_set(sd->o_input, 0, 0, 0, 0); + + /* we have to set focus to the input object first, or else Evas will + * never report any key events (up/down) to us */ + evas_object_focus_set(sd->o_input, EINA_TRUE); + + /* add the event callbacks we need to listen for */ evas_object_event_callback_add(sd->o_input, EVAS_CALLBACK_MOUSE_IN, _e_surface_cb_mouse_in, obj); evas_object_event_callback_add(sd->o_input, EVAS_CALLBACK_MOUSE_OUT, @@ -179,6 +187,10 @@ _e_smart_add(Evas_Object *obj) _e_surface_cb_mouse_down, obj); evas_object_event_callback_add(sd->o_input, EVAS_CALLBACK_MOUSE_UP, _e_surface_cb_mouse_up, obj); + evas_object_event_callback_add(sd->o_input, EVAS_CALLBACK_KEY_DOWN, + _e_surface_cb_key_down, obj); + evas_object_event_callback_add(sd->o_input, EVAS_CALLBACK_KEY_UP, + _e_surface_cb_key_up, obj); evas_object_smart_member_add(sd->o_input, obj); /* create the image object */ @@ -217,6 +229,11 @@ _e_smart_del(Evas_Object *obj) _e_surface_cb_mouse_down); evas_object_event_callback_del(sd->o_input, EVAS_CALLBACK_MOUSE_UP, _e_surface_cb_mouse_up); + evas_object_event_callback_del(sd->o_input, EVAS_CALLBACK_KEY_DOWN, + _e_surface_cb_key_down); + evas_object_event_callback_del(sd->o_input, EVAS_CALLBACK_KEY_UP, + _e_surface_cb_key_up); + evas_object_del(sd->o_input); } @@ -341,25 +358,25 @@ _e_smart_clip_unset(Evas_Object *obj) /* local functions */ static void -_e_surface_cb_focus_in(void *data, Evas *evas EINA_UNUSED, void *event) +_e_surface_cb_focus_in(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED) { evas_object_smart_callback_call(data, "focus_in", NULL); } static void -_e_surface_cb_focus_out(void *data, Evas *evas EINA_UNUSED, void *event) +_e_surface_cb_focus_out(void *data, Evas *evas EINA_UNUSED, void *event EINA_UNUSED) { evas_object_smart_callback_call(data, "focus_out", NULL); } static void -_e_surface_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +_e_surface_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { evas_object_smart_callback_call(data, "mouse_in", NULL); } static void -_e_surface_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +_e_surface_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { evas_object_smart_callback_call(data, "mouse_out", NULL); } @@ -381,3 +398,15 @@ _e_surface_cb_mouse_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA { evas_object_smart_callback_call(data, "mouse_up", event); } + +static void +_e_surface_cb_key_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + evas_object_smart_callback_call(data, "key_down", event); +} + +static void +_e_surface_cb_key_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event) +{ + evas_object_smart_callback_call(data, "key_up", event); +}