Evas: Add storage class for Key events

This is for key up/down events' info.
This commit is contained in:
Jean-Philippe Andre 2016-05-31 20:08:22 +09:00
parent 45b12224ec
commit 95628c1efa
9 changed files with 367 additions and 35 deletions

View File

@ -43,6 +43,8 @@ evas_eolian_pub_files = \
lib/evas/canvas/efl_canvas_surface_wayland.eo \
lib/evas/canvas/evas_filter.eo \
lib/evas/canvas/evas_smart_clipped.eo \
lib/evas/canvas/efl_event_input.eo \
lib/evas/canvas/efl_event_key.eo \
lib/evas/canvas/efl_event_pointer.eo \
$(NULL)
@ -198,6 +200,8 @@ lib/evas/canvas/efl_canvas_surface.c \
lib/evas/canvas/efl_canvas_surface_tbm.c \
lib/evas/canvas/efl_canvas_surface_x11.c \
lib/evas/canvas/efl_canvas_surface_wayland.c \
lib/evas/canvas/efl_event_input.c \
lib/evas/canvas/efl_event_key.c \
lib/evas/canvas/efl_event_pointer.c \
$(NULL)

View File

@ -14,8 +14,8 @@
#include <Efl.h>
typedef struct _Efl_Event_Pointer_Data Efl_Event_Pointer_Data;
typedef struct _Efl_Event_Key_Data Efl_Event_Key_Data;
typedef struct _Efl_Input_Device_Data Efl_Input_Device_Data;
typedef struct _Efl_Input_State_Data Efl_Input_State_Data;
#ifndef _EVAS_TYPES_EOT_H_
typedef struct _Evas_Modifier Evas_Modifier;
@ -54,6 +54,27 @@ struct _Efl_Event_Pointer_Data
Eina_Bool evas_done; /* set by evas */
};
struct _Efl_Event_Key_Data
{
Eo *eo;
unsigned int timestamp; /* FIXME: store as double? */
Eina_Bool pressed; /* 1 = pressed/down, 0 = released/up */
Eina_Stringshare *keyname;
Eina_Stringshare *key;
Eina_Stringshare *string;
Eina_Stringshare *compose;
unsigned int keycode;
void *data;
Evas_Modifier *modifiers;
Evas_Lock *locks;
Efl_Event_Flags event_flags;
Efl_Input_Device *device;
void *legacy; /* DO NOT TOUCH (may contain the legacy event_info) */
Eina_Bool evas_done; /* set by evas */
};
struct _Efl_Input_Device_Data
{
Eo *eo;

View File

@ -300,4 +300,6 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
#include "canvas/efl_vg_gradient_linear.eo.h"
#include "canvas/efl_vg_gradient_radial.eo.h"
#include "canvas/efl_event_input.eo.h"
#include "canvas/efl_event_pointer.eo.h"
#include "canvas/efl_event_key.eo.h"

View File

@ -0,0 +1,12 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Evas.h>
#define EFL_INTERNAL_UNSTABLE
#include "interfaces/efl_common_internal.h"
#define MY_CLASS EFL_EVENT_INPUT_CLASS
#include "efl_event_input.eo.c"

View File

@ -0,0 +1,32 @@
import efl_event_types;
interface Efl.Event.Input (Efl.Event)
{
eo_prefix: efl_event;
methods {
@property device {
[[Input device that originated this event.]]
values {
dev: Efl.Input.Device;
}
}
@property event_flags {
[[Extra flags for this event, may be changed by the user.]]
values {
flags: Efl.Event.Flags;
}
}
@property on_hold {
[[$true if @.event_flags indicates the event is on hold.]]
values {
val: bool;
}
}
@property on_scroll {
[[$true if @.event_flags indicates the event happened while scrolling.]]
values {
val: bool;
}
}
}
}

View File

@ -0,0 +1,206 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Evas.h>
#define EFL_INTERNAL_UNSTABLE
#include "interfaces/efl_common_internal.h"
#define MY_CLASS EFL_EVENT_KEY_CLASS
EOLIAN static Eo_Base *
_efl_event_key_eo_base_constructor(Eo *obj, Efl_Event_Key_Data *pd EINA_UNUSED)
{
obj = eo_constructor(eo_super(obj, MY_CLASS));
efl_event_reset(obj);
return obj;
}
EOLIAN static void
_efl_event_key_pressed_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, Eina_Bool val)
{
pd->pressed = !!val;
}
EOLIAN static Eina_Bool
_efl_event_key_pressed_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->pressed;
}
EOLIAN static void
_efl_event_key_key_name_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char *val)
{
eina_stringshare_replace(&pd->keyname, val);
}
EOLIAN static const char *
_efl_event_key_key_name_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->keyname;
}
EOLIAN static void
_efl_event_key_key_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char *val)
{
eina_stringshare_replace(&pd->key, val);
}
EOLIAN static const char *
_efl_event_key_key_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->key;
}
EOLIAN static void
_efl_event_key_string_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char *val)
{
eina_stringshare_replace(&pd->string, val);
}
EOLIAN static const char *
_efl_event_key_string_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->string;
}
EOLIAN static void
_efl_event_key_compose_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char *val)
{
eina_stringshare_replace(&pd->compose, val);
}
EOLIAN static const char *
_efl_event_key_compose_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->compose;
}
EOLIAN static void
_efl_event_key_key_code_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, int val)
{
pd->keycode = val;
}
EOLIAN static int
_efl_event_key_key_code_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->keycode;
}
EOLIAN static void
_efl_event_key_efl_event_reset(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
eina_stringshare_del(pd->key);
eina_stringshare_del(pd->keyname);
eina_stringshare_del(pd->string);
eina_stringshare_del(pd->compose);
memset(pd, 0, sizeof(*pd));
pd->eo = obj;
}
EOLIAN static Efl_Event *
_efl_event_key_efl_event_dup(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
Efl_Event_Key_Data *pd2;
Efl_Event *ev;
ev = eo_add(MY_CLASS, NULL); // no parent
pd2 = eo_data_scope_get(ev, MY_CLASS);
if (pd2)
{
memcpy(pd2, pd, sizeof(*pd));
pd2->eo = ev;
pd2->key = eina_stringshare_add(pd->key);
pd2->keyname = eina_stringshare_add(pd->keyname);
pd2->string = eina_stringshare_add(pd->string);
pd2->compose = eina_stringshare_add(pd->compose);
pd2->legacy = NULL;
pd2->evas_done = 0;
}
return ev;
}
EOLIAN static void
_efl_event_key_efl_event_timestamp_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, double ms)
{
pd->timestamp = ms;
}
EOLIAN static double
_efl_event_key_efl_event_timestamp_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->timestamp;
}
EOLIAN static void
_efl_event_key_efl_event_input_event_flags_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, Efl_Event_Flags flags)
{
pd->event_flags = flags;
}
EOLIAN static Efl_Event_Flags
_efl_event_key_efl_event_input_event_flags_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->event_flags;
}
EOLIAN static void
_efl_event_key_efl_event_input_on_hold_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, Eina_Bool val)
{
if (val)
pd->event_flags |= EFL_EVENT_FLAGS_ON_HOLD;
else
pd->event_flags &= ~EFL_EVENT_FLAGS_ON_HOLD;
}
EOLIAN static Eina_Bool
_efl_event_key_efl_event_input_on_hold_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return !!(pd->event_flags & EFL_EVENT_FLAGS_ON_HOLD);
}
EOLIAN static void
_efl_event_key_efl_event_input_on_scroll_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, Eina_Bool val)
{
if (val)
pd->event_flags |= EFL_EVENT_FLAGS_ON_SCROLL;
else
pd->event_flags &= ~EFL_EVENT_FLAGS_ON_SCROLL;
}
EOLIAN static Eina_Bool
_efl_event_key_efl_event_input_on_scroll_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return !!(pd->event_flags & EFL_EVENT_FLAGS_ON_SCROLL);
}
EOLIAN static void
_efl_event_key_efl_event_input_device_set(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, Efl_Input_Device *dev)
{
pd->device = dev;
}
EOLIAN static Efl_Input_Device *
_efl_event_key_efl_event_input_device_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd)
{
return pd->device;
}
EOLIAN static Eina_Bool
_efl_event_key_efl_input_state_modifier_enabled_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char * name)
{
if (!pd->modifiers) return EINA_FALSE;
return evas_key_modifier_is_set(pd->modifiers, name);
}
EOLIAN static Eina_Bool
_efl_event_key_efl_input_state_lock_enabled_get(Eo *obj EINA_UNUSED, Efl_Event_Key_Data *pd, const char * name)
{
if (!pd->locks) return EINA_FALSE;
return evas_key_lock_is_set(pd->locks, name);
}
#include "efl_event_key.eo.c"

View File

@ -0,0 +1,71 @@
class Efl.Event.Key (Eo.Base, Efl.Event, Efl.Input.State, Efl.Event.Input)
{
[[Represents a single key event from a keyboard or similar device.
@since 1.18
]]
methods {
@property pressed {
[[$true if the key is down, $false if it is released.]]
values {
val: bool;
}
}
@property key_name {
[[Name string of the key.]]
values {
val: string;
}
}
@property key {
[[Logical key.
Eg. Shift + 1 = exclamation
]]
values {
val: string;
}
}
@property string {
[[A UTF8 string if this keystroke has produced a visible string to be
added.
]]
values {
val: string;
}
}
@property compose {
[[A UTF8 string if this keystroke has modified a string in the middle
of being composed.
Note: This string replaces the previous one
]]
values {
val: string;
}
}
@property key_code {
[[Key scan code numeric value.]]
values {
val: int;
}
}
}
implements {
Eo.Base.constructor;
Efl.Event.reset;
Efl.Event.dup;
Efl.Event.timestamp.set;
Efl.Event.timestamp.get;
Efl.Event.Input.event_flags.set;
Efl.Event.Input.event_flags.get;
Efl.Event.Input.on_hold.set;
Efl.Event.Input.on_hold.get;
Efl.Event.Input.on_scroll.set;
Efl.Event.Input.on_scroll.get;
Efl.Event.Input.device.set;
Efl.Event.Input.device.get;
Efl.Input.State.modifier_enabled.get;
Efl.Input.State.lock_enabled.get;
}
}

View File

@ -13,7 +13,7 @@
/* Pointer Event
*
* This is a storage class only, should not require ANY knowledge about
* Ecore, Evas or anything else.
* Ecore, Evas or anything else. Note: locks & modifiers require evas. :(
*
* This is intended to replace Ecore and Evas structs for mouse events.
*
@ -207,14 +207,14 @@ _efl_event_pointer_previous_position_precise_get(Eo *obj EINA_UNUSED, Efl_Event_
}
EOLIAN static void
_efl_event_pointer_device_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Efl_Input_Device *dev)
_efl_event_pointer_efl_event_input_device_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Efl_Input_Device *dev)
{
/* ref? */
pd->device = dev;
}
EOLIAN static Efl_Input_Device *
_efl_event_pointer_device_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
_efl_event_pointer_efl_event_input_device_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
{
return pd->device;
}
@ -245,13 +245,13 @@ _efl_event_pointer_button_flags_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data
}
EOLIAN static void
_efl_event_pointer_event_flags_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Efl_Event_Flags flags)
_efl_event_pointer_efl_event_input_event_flags_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Efl_Event_Flags flags)
{
pd->event_flags = flags;
}
EOLIAN static Efl_Event_Flags
_efl_event_pointer_event_flags_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
_efl_event_pointer_efl_event_input_event_flags_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
{
return pd->event_flags;
}
@ -369,7 +369,7 @@ _efl_event_pointer_triple_click_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data
}
EOLIAN static void
_efl_event_pointer_on_hold_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Eina_Bool val)
_efl_event_pointer_efl_event_input_on_hold_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Eina_Bool val)
{
if (val)
pd->event_flags |= EFL_EVENT_FLAGS_ON_HOLD;
@ -378,13 +378,13 @@ _efl_event_pointer_on_hold_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd,
}
EOLIAN static Eina_Bool
_efl_event_pointer_on_hold_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
_efl_event_pointer_efl_event_input_on_hold_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
{
return !!(pd->event_flags & EFL_EVENT_FLAGS_ON_HOLD);
}
EOLIAN static void
_efl_event_pointer_on_scroll_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Eina_Bool val)
_efl_event_pointer_efl_event_input_on_scroll_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd, Eina_Bool val)
{
if (val)
pd->event_flags |= EFL_EVENT_FLAGS_ON_SCROLL;
@ -393,7 +393,7 @@ _efl_event_pointer_on_scroll_set(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd
}
EOLIAN static Eina_Bool
_efl_event_pointer_on_scroll_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
_efl_event_pointer_efl_event_input_on_scroll_get(Eo *obj EINA_UNUSED, Efl_Event_Pointer_Data *pd)
{
return !!(pd->event_flags & EFL_EVENT_FLAGS_ON_SCROLL);
}

View File

@ -1,7 +1,7 @@
import efl_orientation;
import efl_event_types;
class Efl.Event.Pointer (Eo.Base, Efl.Event, Efl.Input.State)
class Efl.Event.Pointer (Eo.Base, Efl.Event, Efl.Input.State, Efl.Event.Input)
{
[[Event data carried over with any pointer event (mouse, touch, ...)
@ -67,12 +67,6 @@ class Efl.Event.Pointer (Eo.Base, Efl.Event, Efl.Input.State)
y: double;
}
}
@property device {
[[Pointing device that originated this event.]]
values {
dev: Efl.Input.Device;
}
}
@property finger {
[[Finger ID in case of a multi touch event.]]
values {
@ -121,24 +115,6 @@ class Efl.Event.Pointer (Eo.Base, Efl.Event, Efl.Input.State)
val: bool;
}
}
@property event_flags {
[[Extra flags for this event, may be changed by the user.]]
values {
flags: Efl.Event.Flags;
}
}
@property on_hold {
[[$true if @.event_flags indicates the event is on hold.]]
values {
val: bool;
}
}
@property on_scroll {
[[$true if @.event_flags indicates the event happened while scrolling.]]
values {
val: bool;
}
}
@property wheel_direction {
values {
dir: Efl.Orient; [[Horizontal or Vertical only.]]
@ -167,6 +143,14 @@ class Efl.Event.Pointer (Eo.Base, Efl.Event, Efl.Input.State)
Efl.Event.dup;
Efl.Event.timestamp.set;
Efl.Event.timestamp.get;
Efl.Event.Input.event_flags.set;
Efl.Event.Input.event_flags.get;
Efl.Event.Input.on_hold.set;
Efl.Event.Input.on_hold.get;
Efl.Event.Input.on_scroll.set;
Efl.Event.Input.on_scroll.get;
Efl.Event.Input.device.set;
Efl.Event.Input.device.get;
Efl.Input.State.modifier_enabled.get;
Efl.Input.State.lock_enabled.get;
}