Evas: Add Focus event type.
authorGuilherme Iscaro <iscaro@profusion.mobi>
Thu, 17 Nov 2016 19:29:58 +0000 (17:29 -0200)
committerBruno Dilly <bdilly@profusion.mobi>
Thu, 24 Nov 2016 21:18:47 +0000 (19:18 -0200)
src/Makefile_Evas.am
src/lib/efl/interfaces/efl_common_internal.h
src/lib/evas/Evas_Eo.h
src/lib/evas/canvas/efl_input_focus.c [new file with mode: 0644]
src/lib/evas/canvas/efl_input_focus.eo [new file with mode: 0644]
src/lib/evas/canvas/efl_input_interface.eo

index f690335..973ec6b 100644 (file)
@@ -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 += \
index dd1b29e..c7ae160 100644 (file)
@@ -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)
 {
index cc7273e..de9b786 100644 (file)
@@ -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 (file)
index 0000000..0bf4912
--- /dev/null
@@ -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"
diff --git a/src/lib/evas/canvas/efl_input_focus.eo b/src/lib/evas/canvas/efl_input_focus.eo
new file mode 100644 (file)
index 0000000..2d5a2d1
--- /dev/null
@@ -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
index 4f60188..49a7f1a 100644 (file)
@@ -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.]]
    }
 }