jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=1e1a611fdb340be17fef5d6037b0a5c2a80f77ce

commit 1e1a611fdb340be17fef5d6037b0a5c2a80f77ce
Author: Jean-Philippe Andre <[email protected]>
Date:   Wed May 24 13:26:51 2017 +0900

    evas: Add children_iterate to Efl.Input.Device
    
    This is a new method for EO that allows us to enumerate the
    children of a device, especially useful for seat devices.
    
    @feature
---
 src/lib/efl/interfaces/efl_input_device.c  | 57 ++++++++++++++++++++++++++++++
 src/lib/efl/interfaces/efl_input_device.eo | 16 +++++++--
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/lib/efl/interfaces/efl_input_device.c 
b/src/lib/efl/interfaces/efl_input_device.c
index b1f6c04..f78dbe2 100644
--- a/src/lib/efl/interfaces/efl_input_device.c
+++ b/src/lib/efl/interfaces/efl_input_device.c
@@ -9,6 +9,16 @@
 
 /* Efl Input Device = Evas Device */
 
+typedef struct _Child_Device_Iterator Child_Device_Iterator;
+
+struct _Child_Device_Iterator
+{
+   Eina_Iterator  iterator;
+   Eina_List     *list;
+   Eina_Iterator *real_iterator;
+   Eo            *object;
+};
+
 EOLIAN static Efl_Object *
 _efl_input_device_efl_object_constructor(Eo *obj, Efl_Input_Device_Data *pd)
 {
@@ -156,4 +166,51 @@ _efl_input_device_parent_set(Eo *obj, 
Efl_Input_Device_Data *pd, Efl_Input_Devic
      }
 }
 
+static Eina_Bool
+_child_device_iterator_next(Child_Device_Iterator *it, void **data)
+{
+   Eo *sub;
+
+   if (!eina_iterator_next(it->real_iterator, (void **) &sub))
+     return EINA_FALSE;
+
+   if (data) *data = sub;
+   return EINA_TRUE;
+}
+
+static Eo *
+_child_device_iterator_get_container(Child_Device_Iterator *it)
+{
+   return it->object;
+}
+
+static void
+_child_device_iterator_free(Child_Device_Iterator *it)
+{
+   eina_iterator_free(it->real_iterator);
+   eina_list_free(it->list);
+   free(it);
+}
+
+EOLIAN static Eina_Iterator *
+_efl_input_device_children_iterate(Eo *obj, Efl_Input_Device_Data *pd)
+{
+   Child_Device_Iterator *it;
+
+   it = calloc(1, sizeof(*it));
+   if (!it) return NULL;
+
+   EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+   it->list = pd->children;
+   it->real_iterator = eina_list_iterator_new(it->list);
+   it->iterator.version = EINA_ITERATOR_VERSION;
+   it->iterator.next = FUNC_ITERATOR_NEXT(_child_device_iterator_next);
+   it->iterator.get_container = 
FUNC_ITERATOR_GET_CONTAINER(_child_device_iterator_get_container);
+   it->iterator.free = FUNC_ITERATOR_FREE(_child_device_iterator_free);
+   it->object = obj;
+
+   return &it->iterator;
+}
+
 #include "interfaces/efl_input_device.eo.c"
diff --git a/src/lib/efl/interfaces/efl_input_device.eo 
b/src/lib/efl/interfaces/efl_input_device.eo
index 5a10d08..2473164 100644
--- a/src/lib/efl/interfaces/efl_input_device.eo
+++ b/src/lib/efl/interfaces/efl_input_device.eo
@@ -37,8 +37,10 @@ enum Efl.Input.Device.Sub_Class
    trackball,   [[A trackball style mouse.]]
 }
 
-
-/* FIXME: no children and no Evas */
+/* TODO: Add canvas property. Current problem is we need to return
+         Efl.Ui.Win and not Evas:
+  @property canvas { values { canvas: Efl.Canvas; } }
+*/
 
 class Efl.Input.Device (Efl.Object)
 {
@@ -108,6 +110,16 @@ class Efl.Input.Device (Efl.Object)
              id: uint; [[The id of the seat]]
           }
       }
+      children_iterate {
+         [[Lists the children attached to this device.
+
+           This is mostly meaningful with seat devices, as they are groups of
+           real input devices.
+
+           @since 1.20
+         ]]
+         return: own(free(iterator<const(Efl.Input.Device)>, 
eina_iterator_free));
+      }
    }
    implements {
       Efl.Object.constructor;

-- 


Reply via email to