Evas: Add storage class for Key events
authorJean-Philippe Andre <jp.andre@samsung.com>
Tue, 31 May 2016 11:08:22 +0000 (20:08 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Thu, 2 Jun 2016 04:31:40 +0000 (13:31 +0900)
This is for key up/down events' info.

src/Makefile_Evas.am
src/lib/efl/interfaces/efl_common_internal.h
src/lib/evas/Evas_Eo.h
src/lib/evas/canvas/efl_event_input.c [new file with mode: 0644]
src/lib/evas/canvas/efl_event_input.eo [new file with mode: 0644]
src/lib/evas/canvas/efl_event_key.c [new file with mode: 0644]
src/lib/evas/canvas/efl_event_key.eo [new file with mode: 0644]
src/lib/evas/canvas/efl_event_pointer.c
src/lib/evas/canvas/efl_event_pointer.eo

index 1a0d28d..013ccc0 100644 (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)
 
index c34efd1..2523c54 100644 (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;
index 3556936..512dd3c 100644 (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"
diff --git a/src/lib/evas/canvas/efl_event_input.c b/src/lib/evas/canvas/efl_event_input.c
new file mode 100644 (file)
index 0000000..cc004f7
--- /dev/null
@@ -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"
diff --git a/src/lib/evas/canvas/efl_event_input.eo b/src/lib/evas/canvas/efl_event_input.eo
new file mode 100644 (file)
index 0000000..6679d87
--- /dev/null
@@ -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 (file)
index 0000000..677c624
--- /dev/null
@@ -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"
diff --git a/src/lib/evas/canvas/efl_event_key.eo b/src/lib/evas/canvas/efl_event_key.eo
new file mode 100644 (file)
index 0000000..ef17720
--- /dev/null
@@ -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;
+   }
+}
index 09adeef..ca3a6c2 100644 (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);
 }
index b7675ee..811afe9 100644 (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;
    }