diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index f690335831..973ec6b848 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -48,6 +48,7 @@ evas_eolian_pub_files = \ lib/evas/canvas/efl_input_key.eo \ lib/evas/canvas/efl_input_pointer.eo \ lib/evas/canvas/efl_input_hold.eo \ + lib/evas/canvas/efl_input_focus.eo \ lib/evas/canvas/efl_gfx_map.eo \ lib/evas/canvas/efl_canvas_output.eo \ $(NULL) @@ -208,6 +209,7 @@ lib/evas/canvas/efl_input_event.c \ lib/evas/canvas/efl_input_key.c \ lib/evas/canvas/efl_input_pointer.c \ lib/evas/canvas/efl_input_hold.c \ +lib/evas/canvas/efl_input_focus.c \ $(NULL) EXTRA_DIST2 += \ diff --git a/src/lib/efl/interfaces/efl_common_internal.h b/src/lib/efl/interfaces/efl_common_internal.h index dd1b29e719..c7ae160e09 100644 --- a/src/lib/efl/interfaces/efl_common_internal.h +++ b/src/lib/efl/interfaces/efl_common_internal.h @@ -17,6 +17,7 @@ typedef struct _Efl_Input_Pointer_Data Efl_Input_Pointer_Data; typedef struct _Efl_Input_Key_Data Efl_Input_Key_Data; typedef struct _Efl_Input_Device_Data Efl_Input_Device_Data; typedef struct _Efl_Input_Hold_Data Efl_Input_Hold_Data; +typedef struct _Efl_Input_Focus_Data Efl_Input_Focus_Data; #ifndef _EVAS_TYPES_EOT_H_ typedef struct _Evas_Modifier Evas_Modifier; @@ -110,6 +111,14 @@ struct _Efl_Input_Hold_Data Eina_Bool evas_done : 1; /* set by evas */ }; +struct _Efl_Input_Focus_Data +{ + Eo *eo; + Efl_Input_Device *device; //The seat + Eo *object; //The focused object - Efl.Canvas.Object or Efl.Canvas. + double timestamp; +}; + static inline Eina_Bool _efl_input_value_has(const Efl_Input_Pointer_Data *pd, Efl_Input_Value key) { diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index cc7273e59e..de9b786f69 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -307,4 +307,5 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x, #include "canvas/efl_input_key.eo.h" #include "canvas/efl_input_hold.eo.h" #include "canvas/efl_input_interface.eo.h" +#include "canvas/efl_input_focus.eo.h" #endif /* EFL_EO_API_SUPPORT */ diff --git a/src/lib/evas/canvas/efl_input_focus.c b/src/lib/evas/canvas/efl_input_focus.c new file mode 100644 index 0000000000..0bf4912364 --- /dev/null +++ b/src/lib/evas/canvas/efl_input_focus.c @@ -0,0 +1,161 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#define EFL_INPUT_EVENT_PROTECTED + +#include + +#define EFL_INTERNAL_UNSTABLE +#include "interfaces/efl_common_internal.h" + +#define MY_CLASS EFL_INPUT_FOCUS_CLASS + +static Efl_Input_Focus *s_cached_event = NULL; + +static void +_del_hook(Eo *evt) +{ + if (!s_cached_event) + { + if (efl_parent_get(evt)) + { + efl_ref(evt); + efl_parent_set(evt, NULL); + } + efl_reuse(evt); + s_cached_event = evt; + } + else + { + efl_del_intercept_set(evt, NULL); + efl_del(evt); + } +} + +static void +_efl_input_focus_free(Efl_Input_Focus_Data *pd) +{ + efl_unref(pd->device); +} + +EOLIAN static Efl_Object * +_efl_input_focus_efl_object_constructor(Eo *obj, + Efl_Input_Focus_Data *pd EINA_UNUSED) +{ + obj = efl_constructor(efl_super(obj, MY_CLASS)); + return obj; +} + +EOLIAN static void +_efl_input_focus_efl_object_destructor(Eo *obj, + Efl_Input_Focus_Data *pd) +{ + _efl_input_focus_free(pd); + efl_destructor(efl_super(obj, MY_CLASS)); +} + +EOLIAN static void +_efl_input_focus_class_destructor(Efl_Class *klass EINA_UNUSED) +{ + // this is a strange situation... + efl_del_intercept_set(s_cached_event, NULL); + efl_del(s_cached_event); + s_cached_event = NULL; +} + +EOLIAN static void +_efl_input_focus_object_set(Eo *obj EINA_UNUSED, Efl_Input_Focus_Data *pd, + Efl_Object *object) +{ + pd->object = object; +} + +EOLIAN static Efl_Object * +_efl_input_focus_object_get(Eo *obj EINA_UNUSED, Efl_Input_Focus_Data *pd) +{ + return pd->object; +} + +EOLIAN static void +_efl_input_focus_efl_input_event_device_set(Eo *obj EINA_UNUSED, + Efl_Input_Focus_Data *pd, + Efl_Input_Device *device) +{ + pd->device = efl_ref(device); +} + +EOLIAN static Efl_Input_Device * +_efl_input_focus_efl_input_event_device_get(Eo *obj EINA_UNUSED, + Efl_Input_Focus_Data *pd) +{ + return pd->device; +} + +EOLIAN static void +_efl_input_focus_efl_input_event_timestamp_set(Eo *obj EINA_UNUSED, + Efl_Input_Focus_Data *pd, + double ms) +{ + pd->timestamp = ms; +} + +EOLIAN static double +_efl_input_focus_efl_input_event_timestamp_get(Eo *obj EINA_UNUSED, + Efl_Input_Focus_Data *pd) +{ + return pd->timestamp; +} + +EOLIAN static Efl_Input_Focus * +_efl_input_focus_efl_input_event_dup(Eo *obj EINA_UNUSED, + Efl_Input_Focus_Data *pd) +{ + Efl_Input_Focus_Data *ev; + Efl_Input_Focus *evt; + + // no parent + evt = efl_input_instance_get(MY_CLASS, NULL, (void **) &ev); + if (!evt || !ev) return NULL; + + ev->eo = evt; + ev->object = pd->object; + ev->device = efl_ref(pd->device); + ev->timestamp = pd->timestamp; + return evt; +} + +EOLIAN static Efl_Input_Focus * +_efl_input_focus_efl_input_event_instance_get(Eo *klass EINA_UNUSED, void *_pd EINA_UNUSED, + Eo *owner, void **priv) +{ + Efl_Input_Focus_Data *ev; + Efl_Input_Focus *evt; + + if (s_cached_event) + { + evt = s_cached_event; + s_cached_event = NULL; + efl_input_reset(evt); + efl_parent_set(evt, owner); + } + else + { + evt = efl_add(MY_CLASS, owner); + efl_del_intercept_set(evt, _del_hook); + } + + ev = efl_data_scope_get(evt, MY_CLASS); + if (priv) *priv = ev; + return evt; +} + +EOLIAN static void +_efl_input_focus_efl_input_event_reset(Eo *obj, Efl_Input_Focus_Data *pd) +{ + _efl_input_focus_free(pd); + memset(pd, 0, sizeof(Efl_Input_Focus_Data)); + pd->eo = obj; +} + +#include "efl_input_focus.eo.c" diff --git a/src/lib/evas/canvas/efl_input_focus.eo b/src/lib/evas/canvas/efl_input_focus.eo new file mode 100644 index 0000000000..2d5a2d1bd5 --- /dev/null +++ b/src/lib/evas/canvas/efl_input_focus.eo @@ -0,0 +1,25 @@ +class Efl.Input.Focus(Efl.Object, Efl.Input.Event) +{ + [[Reprents a focus event. @since 1.19]] + methods { + @property object { + values { + object: Efl.Object; [[The focused object. + In case this represents a canvas + focus the object will be $null]] + } + } + } + implements { + class.destructor; + Efl.Object.constructor; + Efl.Object.destructor; + Efl.Input.Event.device.set; + Efl.Input.Event.device.get; + Efl.Input.Event.instance_get; + Efl.Input.Event.reset; + Efl.Input.Event.dup; + Efl.Input.Event.timestamp.set; + Efl.Input.Event.timestamp.get; + } +} \ No newline at end of file diff --git a/src/lib/evas/canvas/efl_input_interface.eo b/src/lib/evas/canvas/efl_input_interface.eo index 4f60188f2f..49a7f1ab00 100644 --- a/src/lib/evas/canvas/efl_input_interface.eo +++ b/src/lib/evas/canvas/efl_input_interface.eo @@ -99,5 +99,7 @@ interface Efl.Input.Interface () key,down: Efl.Input.Key; [[Keyboard key press.]] key,up: Efl.Input.Key; [[Keyboard key release.]] hold: Efl.Input.Hold; [[All input events are on hold or resumed.]] + focus,in: Efl.Input.Focus; [[A focus in event.]] + focus,out: Efl.Input.Focus; [[A focus out event.]] } }