forked from enlightenment/efl
Evas: Add Focus event type.
This commit is contained in:
parent
ec75c62369
commit
ed9c635152
|
@ -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 += \
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -0,0 +1,161 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#define EFL_INPUT_EVENT_PROTECTED
|
||||
|
||||
#include <Evas.h>
|
||||
|
||||
#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"
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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.]]
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue