diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 1a0d28db0c..013ccc02b6 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -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) diff --git a/src/lib/efl/interfaces/efl_common_internal.h b/src/lib/efl/interfaces/efl_common_internal.h index c34efd1f7c..2523c5409a 100644 --- a/src/lib/efl/interfaces/efl_common_internal.h +++ b/src/lib/efl/interfaces/efl_common_internal.h @@ -14,8 +14,8 @@ #include 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; diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 3556936944..512dd3cfc5 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -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" diff --git a/src/lib/evas/canvas/efl_event_input.c b/src/lib/evas/canvas/efl_event_input.c new file mode 100644 index 0000000000..cc004f7738 --- /dev/null +++ b/src/lib/evas/canvas/efl_event_input.c @@ -0,0 +1,12 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#define EFL_INTERNAL_UNSTABLE +#include "interfaces/efl_common_internal.h" + +#define MY_CLASS EFL_EVENT_INPUT_CLASS + +#include "efl_event_input.eo.c" diff --git a/src/lib/evas/canvas/efl_event_input.eo b/src/lib/evas/canvas/efl_event_input.eo new file mode 100644 index 0000000000..6679d87dc4 --- /dev/null +++ b/src/lib/evas/canvas/efl_event_input.eo @@ -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; + } + } + } +} diff --git a/src/lib/evas/canvas/efl_event_key.c b/src/lib/evas/canvas/efl_event_key.c new file mode 100644 index 0000000000..677c6247e2 --- /dev/null +++ b/src/lib/evas/canvas/efl_event_key.c @@ -0,0 +1,206 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#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" diff --git a/src/lib/evas/canvas/efl_event_key.eo b/src/lib/evas/canvas/efl_event_key.eo new file mode 100644 index 0000000000..ef177209d6 --- /dev/null +++ b/src/lib/evas/canvas/efl_event_key.eo @@ -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; + } +} diff --git a/src/lib/evas/canvas/efl_event_pointer.c b/src/lib/evas/canvas/efl_event_pointer.c index 09adeefbb4..ca3a6c2266 100644 --- a/src/lib/evas/canvas/efl_event_pointer.c +++ b/src/lib/evas/canvas/efl_event_pointer.c @@ -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); } diff --git a/src/lib/evas/canvas/efl_event_pointer.eo b/src/lib/evas/canvas/efl_event_pointer.eo index b7675ee76a..811afe9c63 100644 --- a/src/lib/evas/canvas/efl_event_pointer.eo +++ b/src/lib/evas/canvas/efl_event_pointer.eo @@ -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; }